我正在尝试使用强权b并行地制作一个定制的随机森林实现列车。
这个任务的并行性令人尴尬,所以我认为加速应该不会太难。
下面是一些示例代码:
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代码。
对于如何调试/修正经济放缓有什么想法吗?
发布于 2017-12-21 23:22:43
在我看来,您的分析是正确的:放缓是由于data
和cache
是大对象造成的。现在,在多处理环境中,您没有共享内存,因此您需要以某种方式共享这些对象。Python通过共享对象支持这一点:有一个真正保存对象的“主进程”。但是,其他进程需要通过某种机制(AFAIK,对象被腌制,然后通过管道或队列发送)发送所有更新,从而减慢速度。
我看到了你的一些选择:
data
作为初始数据集,然后您尝试找到一个“最优”。如果您可以按process 1找到所有“类型A”优化,而进程2找到所有“类型B”优化,然后让每个进程(例如,将其结果写入文件rf_process_x.txt
中),则不需要共享内存状态。data
集(所以它不是在共享内存中)。
https://stackoverflow.com/questions/47909126
复制