嵌套For Loop与全局字典并行

时间:2017-12-06 18:27:36

标签: python dictionary parallel-processing scikit-learn cross-validation

我正在尝试使这段代码并行运行。

目前每个型号的运行速度约为6分钟,这太慢了。

d_mtry={}
# ------------------------------------------------------------------------
pass; count = 0; itr = COUNT
while count < itr
    kf = KFold(n_splits = 10)
    # --------------------------------------------------------------------
    for j in range (2, 25):
        avg_acc = 0
        for train_index, test_index in kf.split(X_train):
            X_train_K, X_test_K = X_train[train_index], X_train[test_index]
            y_train_K, y_test_K = y_train[train_index], y_train[test_index]
            rotf = RRForestClassifier( n_estimators = 30,
                                       criterion    =  'entropy',
                                       max_features =  j,
                                       n_jobs       = -1,
                                       random_state =  1
                                       )
            rotf.fit(X_train_K, y_train_K)

            y_predict_K = rotf.predict(X_test_K)
            y_prob = rotf.predict_proba(X_test_K)

            acc_score = accuracy_score(y_test_K, y_predict_K)
            avg_acc += acc_score

        d_mtry[str(j)] = avg_acc/10

    # --------------------------------------------------------------------
    best_mtry = max(d_mtry.iteritems(), key=operator.itemgetter(1))[0]

    f.write("\n" + "Iteration: " + str(count+1) + " Best M_Try: " + str(best_mtry)+ "\n")
    f.write(str(d_mtry))

    rotf = RRForestClassifier( n_estimators = 30,
                               criterion    =  'entropy',
                               max_features =  int( best_mtry ),
                               n_jobs       = -1,
                               random_state =  1
                               )
    # there is more code after this
    # I don't think it is relevant,
    # it has to do with calculations on the model rotf
    # --------------------------------------------------------------------
    count += 1
# ------------------------------------------------------------------------

我遇到的主要问题是,对于我所做的尝试,词典并未正确更新。使用 multiprocessing.Pool() 实例进行方法时,它似乎运行得更快,我在另一篇文章中找到了。

此处的目标是根据折叠的平均准确度为 j (针对max_features类实例属性)找到最佳值,并在此时使用我创建了我的模型并在测试集上运行它。

最初,我尝试使用GridSearchCV(),但是在配件上遇到了问题而且从未完成运行,即使在AWS托管的设置上,也有36个内核。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我喜欢python以便于原型制作 我也知道,当需要改变架构设计优先级以获得最佳性能时。

事实#1:n_jobs == -1实际上占用了所有CPU核心

这就是说,没有免费的CPU资源(并且你可能属于财富中的那些孩子,如果不是也属于硬件约束的[SPACE]维度(是的,在谈论 - RAM计算,后来被翻译成[TIME] - 维度,一旦你的模型停止适应RAM并且在强化ML模型调整期间性能将跳跃许多数量级)。

如果没有可用的备用资源,任何进程调度都将采用纯 - [SERIAL]系统调度(一个接一个地进行)或最多采用“仅” - {{系统调度,当实际的执行块被O / S系统调度程序交错到一个受限制的(大小)CPU资源子集时,因为没有其他“免费”CPU核心不是可以做得更好。

在这种情况下,来自multiprocessing模块的Python代码可用的工具都不会提高代码执行性能,但恰恰相反(可能已经对此进行了基准测试,或者只是在您自己的基础上感受到了这一点)鞋子)。

以上两个命名的系统调度策略都不是真正的 - [CONCURRENT]系统调度示例。

事实#2:“只是” - [PARALLEL]帮助I / O绑定,而不是CPU绑定的情况

除了将初始DataSET加载到RAM之外,没有其他与I / O相关的性能阻塞。因此,任何“增加的”(也是注入的任何multiprocessing模块工具)并发性永远不会提高您的本地主机处理吞吐量(没有I / O延迟掩码似乎比增加的CPU作业调度交错时的性能损失更好)和上下文转换成本)。

解决方案:如果需要确实增加的原型生产量

制作了AI / ML原型制造工厂的原型,几乎每周7天,每天24小时都有BAU,这可能对您有所帮助。

考虑一种不同的架构,而不是让dict全局可访问。

可以协调流程:

host_00是“参数服务器”,告诉其他人[ aMlMODEL, aParamSET, DataSET ]

host_01是一个“工人池成员”,全速运行,n_jobs = -1 一个host_02是一个“工人池成员”,全速运行,n_jobs = -1 一个host_03是一个“工人池成员”,全速运行,n_jobs = -1 ..
一个host_NN是一个“工人池成员”,在全速运行,n_jobs = -1

拥有这种原型工厂概念:
- 吞吐量最大,
- 吞吐量可以动态扩展(夜间等),
- 吞吐量几乎与N
成比例的线性比例 - Factory架构有[CONCURRENT]