首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >调查经济放缓

调查经济放缓
EN

Stack Overflow用户
提问于 2017-12-20 07:13:21
回答 1查看 882关注 0票数 0

我正在尝试使用强权b并行地制作一个定制的随机森林实现列车。

这个任务的并行性令人尴尬,所以我认为加速应该不会太难。

下面是一些示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class RandomForest(object):
    def __init__(self, settings, data):
        self.forest = [None] * settings.n_trees
        self.parallel = Parallel(n_jobs=settings.njobs, backend="threading")

    def fit(self, data, train_ids_current_minibatch, settings, param, cache):
        self.forest = self.parallel(
            delayed(_parallel_build_trees_batch)(
                i_t, data, train_ids_current_minibatch, settings, param, cache)
            for i_t, tree in enumerate(self.forest))

    def partial_fit(self, data, train_ids_current_minibatch, settings, param, cache):
        self.forest = self.parallel(
            delayed(_parallel_build_trees_partial)(
                tree, i_t, data, train_ids_current_minibatch, settings, param, cache)
            for i_t, tree in enumerate(self.forest))

但是,在批处理和增量情况下,使用多个作业时,培训要慢得多。数据和缓存参数是包含(大型) numpy数组的块,所以我想知道这是否是原因。

我尝试过使用multiprocessing.Pool编写同样的代码,结果甚至更糟,因为没有使用joblib的threading后端,我假设是因为fit函数大量使用了numpy/scipy代码。

对于如何调试/修正经济放缓有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-21 23:22:43

在我看来,您的分析是正确的:放缓是由于datacache是大对象造成的。现在,在多处理环境中,您没有共享内存,因此您需要以某种方式共享这些对象。Python通过共享对象支持这一点:有一个真正保存对象的“主进程”。但是,其他进程需要通过某种机制(AFAIK,对象被腌制,然后通过管道或队列发送)发送所有更新,从而减慢速度。

我看到了你的一些选择:

  • 转换您的代码,以便它使用分区:我不熟悉随机林。我猜每个进程都有data作为初始数据集,然后您尝试找到一个“最优”。如果您可以按process 1找到所有“类型A”优化,而进程2找到所有“类型B”优化,然后让每个进程(例如,将其结果写入文件rf_process_x.txt中),则不需要共享内存状态。
  • 转换代码,使其使用队列(参见此页上的最后一个示例):如果分区不起作用,那么也许可以:
    1. 启动n个工作进程
    2. 每个进程都为自己建立自己的data集(所以它不是在共享内存中)。
    3. 在主要过程中,您将“作业”放入task_queue中,例如,使用这组特定的参数查找随机林。工作人员从task_queue中获取作业,计算它并将其结果放到result_queue上。只有在任务和结果缓慢的情况下,这才是快速的,因为需要对这些对象进行腌制,并通过管道将这些对象从父进程发送到辅助进程。

  • 使用joblibs Joblibs支持将对象转储到磁盘上,然后赋予每个对象对该文件的内存映射访问权限。
  • 如果您的操作不受CPU约束(磁盘或网络操作繁重),则可以迁移到multithreading.。这样你就真的有了一个共享的记忆。但据我所见,您是cpu绑定的,并且会遇到"GIL锁“问题(在cpython中,一次只运行一个线程)。
  • 您可能会发现其他加速随机森林的方法,例如这就是答案提到了几个
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47909126

复制
相关文章
向DropDownList 下拉框添加新选项[通俗易懂]
大家有没有遇见过这样的情况,假如有一个下拉框,现在让你在下拉框里面添加一个新的选项如“请选择”,而数据库里面又不存在这一选项》要怎么做,下面为大家推荐两种写法:
全栈程序员站长
2022/10/03
2.1K0
向DropDownList 下拉框添加新选项[通俗易懂]
java如何向数组中添加元素[数组的添加]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说java如何向数组中添加元素[数组的添加],希望能够帮助大家进步!!!
Java架构师必看
2022/04/06
7.7K0
numpy中np.max和np.maximum
1.np.max(a, axis=None, out=None, keepdims=False)求序列的最值最少接受一个参数axis默认为axis=0即列向,如果axis=1即横向ex:>> np.max([-2, -1, 0, 1, 2])22.np.maximum(X, Y, out=None) X和Y逐位进行比较,选择最大值. 最少接受两个参数ex:>> np.maximum([-3, -2, 0, 1, 2], 0)array([0, 0, 0, 1, 2])
狼啸风云
2019/09/30
1.8K0
向mysql配置文件中添加日志配置
socket = usr/local/lnmp/mysql-5.7.21/mysql.sock
93年的老男孩
2019/12/18
3K0
Python 中如何向列表或数组添加元素
然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。
Python学习者
2023/09/11
3620
numpy中np.column_stack()和np.row_stack()
在numpy库中,对于矩阵的合并操作用两种方法:行合并:np.row_stack()列合并:np.column_stack()具体操作见下面的程序: >>> import numpy as np>>> a=np.arange(16).reshape(4,-1)>>> aarray([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11],[12, 13, 14, 15]])>>> b=np.arange(16,32).reshape(4,-1)>>> barray([[16,
狼啸风云
2021/03/03
1.2K0
【NumPy高级运用】NumPy的Matrix与Broadcast高级运用以及IO操作
Matrix函数的作用是返回给定大小的标识矩阵。 单位矩阵是一个方阵。从左上角到右下角的对角线上的元素(称为主对角线)均为1,其他所有元素均为0。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c157d43915c24198a13ee8904c348af4.png
上进小菜猪
2022/12/23
5690
【NumPy高级运用】NumPy的Matrix与Broadcast高级运用以及IO操作
向邮件添加附件
可以将附件添加到电子邮件或消息部分(具体地说,是添加到%Net.MailMessagePart或%Net.MailMessage的实例)。要执行此操作,请使用以下方法:
用户7741497
2022/06/09
2.1K0
numpy中np.finfo用法
例子:"""np.finfo使用方法eps是一个很小的非负数除法的分母不能为0的,不然会直接跳出显示错误。使用eps将可能出现的零用eps来替换,这样不会报错。"""import numpy as npx = np.array([1, 2, 3], dtype=float)eps = np.finfo(x.dtype).eps # eps = 2.220446049250313e-16 type = <class 'numpy.float64'>print(eps, type(eps))height = n
狼啸风云
2021/03/03
1.8K0
Python之numpy模块的添加及矩阵乘法的维数问题
在Python中,numpy 模块是需要自己安装的,在安装编程软件时,默认安装了pip,因此我们可以用pip命令来安装
用户7886150
2021/01/27
7730
np.random.rand均匀分布随机数和np.random.randn正态分布随机数函数使用方法
, 可以使用语句sigma * np.random.randn(...) + mu
演化计算与人工智能
2020/08/14
1.8K0
js给数组中对象添加新属性
let person =[{ id: 1, name: 'vhen' },{ id: 2, name: 'json' }] let newArr = obj.map((item,index) =>{ return Object.assign(item,{index:index}) }) 多添加了一些属性,是为了区别字符串单引号和双引号的, 用了.就不用中括号不用单引号 不用点 就要用中括号和单引号 var a =[{name: 'Tom',age:20},{name: 'Tom2'
用户1349575
2022/01/24
20.6K0
python脚本向influxdb写入数
python3使用requests模块向influxdb的http API发送接口请求实现数据写入,如下:
py3study
2020/01/07
1.7K0
numpy中np.array()与np.asarray的区别以及.tolist
array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会。
狼啸风云
2021/03/03
1.2K0
添加新磁盘
1.查看版本 [root@IBOYAA73 ~]# cat /proc/version
陈不成i
2021/05/25
9900
Spring 中的 @Import 注解及向容器中添加 Bean 的几种方式
这次介绍一下 Spring 中的一个重要的注解 @Import 以及向容器中添加 Bean 的几种方式 ,该注解在 SpringBoot 自动转配中起到重要的作用。
wsuo
2020/07/30
1.7K0
np.nanmean, np.nanmax
我们在对一个python numpy数组求均值或最大值的时候,如果这个数组里包含nan,那么程序就会报错或者求出来的值是nan,如下所示
狼啸风云
2021/05/11
5770
spring:如何用代码动态向容器中添加或移除Bean ?
先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F
菩提树下的杨过
2018/01/18
5.2K0
spring:如何用代码动态向容器中添加或移除Bean ?
小程序js添加新对象(读取一维数组数据,动态生成二维对象)
        “https://tx2.a.kwimgs.com/ufile/atlas/NTIxMjM1MzcwMTAyMTA3NjU1NV8xNjY0NTMyMjAxMDkx_0.jpg”,
超级小可爱
2023/02/20
2.5K0
点击加载更多

相似问题

叠加4维np阵列得到5维np阵列

12

三维np阵列中一维np阵列的搜索

14

如何向Numpy数组添加新的维数?

103

从二维阵列形成三维np阵列

24

利用np.einsum向三维阵列各片广播二维阵列行乘法

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文