【问题标题】:Nested For Loop Parallel with global dictionary嵌套 For 循环与全局字典并行
【发布时间】:2017-12-06 18:27:35
【问题描述】:

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

目前每个模型的运行时间约为 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() 实例执行方法时,它似乎也没有运行得更快。

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

最初,我尝试使用 GridSearchCV(),但在安装时遇到了问题,并且从未完成运行,即使在 AWS 托管的设置中,也有 36 个内核。

感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    我喜欢 python,因为它易于制作原型。
    我也知道,当需要更改架构设计优先级以实现最终性能时。


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

    这就是说,没有免费的 CPU 资源(你可能属于那些财富的孩子,如果不是也头撞到硬件约束的[SPACE] 维度(是的,谈到内存计算,后来翻译成[TIME]-dimension,一旦你的模型停止以适应内存并且性能会在密集的 ML 模型调整期间跳出许多数量级)。

    在没有可用资源的情况下,任何进程调度都将求助于纯-[SERIAL] 系统调度(一个接一个地进行)或最多使用“公正”-[CONCURRENT] 系统-调度,当实际的执行块被 O/S 系统调度程序交错到 CPU 资源的受限(大小)子集时,因为没有其他“空闲”CPU 内核无法执行任何操作更好。

    在这种情况下,multiprocessing 模块中的 Python 代码可用的任何工具都不会提高代码执行性能,但恰恰相反(可能已经对此进行了基准测试,或者只是亲身感受了这一点) .

    上述两个系统调度策略都不是真正的-[PARALLEL] 系统调度示例。


    事实 #2:“just”-[CONCURRENT] 有助于 I/O 密集型,而不是 CPU 密集型案例

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


    解决方案:如果确实需要提高原型设计吞吐量

    已经构建了一个 AI/ML 原型制造工厂的原型,运行几乎 24/7/365 BAU,这也可能对您有所帮助。

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

    流程可以编排:

    host_00 是一个“参数服务器”,告诉别人什么[ aMlMODEL, aParamSET, DataSET ]

    host_01 是一个“worker-pool-member”,全速运行,拥有n_jobs = -1
    host_02 是“worker-pool-member”,全速运行,拥有n_jobs = -1
    host_03 是“worker-pool-member”,全速运行,拥有n_jobs = -1
    ..
    host_NN 是“worker-pool-member”,全速运行,拥有n_jobs = -1

    拥有这个原型工厂概念:
    - 吞吐量达到最大值,
    - 吞吐量可以动态扩展(通宵等),
    - 吞吐量几乎与 N 成线性比例
    - 工厂架构有lowest possible orchestration overheads, compared to any other naive attempts to "parallelise-a-code"

    【讨论】:

      猜你喜欢
      • 2020-09-13
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2019-03-29
      • 2022-01-03
      • 1970-01-01
      相关资源
      最近更新 更多