首页 文章

在HPC上使用scikit-learn功能的并行选项的简便方法

提问于
浏览
24

在scikit-learn的许多功能中实现了用户友好的并行化 . 例如,在 sklearn.cross_validation.cross_val_score 中,您只需在 n_jobs 参数中传递所需数量的计算作业 . 对于具有多核处理器的PC,它将非常好用 . 但是,如果我想在高性能集群中使用这样的选项(安装了OpenMPI包并使用SLURM进行资源管理)?据我所知 sklearn 使用 joblib 进行并行化,使用 multiprocessing . 而且,据我所知(例如,Python multiprocessing within mpi)Python程序与 multiprocessing 并行化,易于扩展整个MPI架构和 mpirun 实用程序 . 我可以使用 mpirunn_jobs 参数在几个计算节点上传播 sklearn 函数的计算吗?

1 回答

  • 18

    SKLearn使用Joblib管理其并行性 . Joblib可以为其他分布式系统(如dask.distributedIPython Parallel)交换多处理后端 . 有关详细信息,请参阅 sklearn github页面上的this issue .

    使用带有Dask.distributed的Joblib的示例

    代码取自上面链接的问题页面 .

    from distributed.joblib import DistributedBackend 
    
    # it is important to import joblib from sklearn if we want the distributed features to work with sklearn!
    from sklearn.externals.joblib import Parallel, parallel_backend, register_parallel_backend
    
    ... 
    
    search = RandomizedSearchCV(model, param_space, cv=10, n_iter=1000, verbose=1)
    
    register_parallel_backend('distributed', DistributedBackend)
    
    with parallel_backend('distributed', scheduler_host='your_scheduler_host:your_port'):
            search.fit(digits.data, digits.target)
    

    这要求您在群集上设置 dask.distributed 调度程序和工作程序 . 一般说明可在此处获取:http://distributed.readthedocs.io/en/latest/setup.html

    使用带有ipyparallel的Joblib的示例

    代码取自同一问题页面 .

    from sklearn.externals.joblib import Parallel, parallel_backend, register_parallel_backend
    
    from ipyparallel import Client
    from ipyparallel.joblib import IPythonParallelBackend
    
    digits = load_digits()
    
    c = Client(profile='myprofile')
    print(c.ids)
    bview = c.load_balanced_view()
    
    # this is taken from the ipyparallel source code
    register_parallel_backend('ipyparallel', lambda : IPythonParallelBackend(view=bview))
    
    ...
    
    with parallel_backend('ipyparallel'):
            search.fit(digits.data, digits.target)
    

    Note: 在上面两个示例中, n_jobs 参数似乎都不重要了 .

    使用SLURM设置dask.distributed

    对于SLURM,最简单的方法是在本地运行 dask-scheduler

    $ dask-scheduler
    Scheduler running at 192.168.12.201:8786
    

    然后使用SLURM提交许多指向此过程的 dask-worker 作业 .

    $ sbatch --array=0-200 dask-worker 192.168.201:8786 --nthreads 1
    

    (我实际上并不了解SLURM,所以上面的语法可能不正确,希望意图明确)

    直接使用dask.distributed

    或者,您可以设置dask.distributed或IPyParallel集群,然后直接使用这些接口来并行化您的SKLearn代码 . 以下是SKLearn和Joblib开发人员Olivier Grisel的示例视频,正是在柏林PyData上做的那样:https://youtu.be/Ll6qWDbRTD0?t=1561

    试试dklearn

    您还可以尝试实验 dklearn 包,其中包含与scikit-learn API兼容的 RandomizedSearchCV 对象,但在Dask之上进行计算实现

    https://github.com/dask/dask-learn

    pip install git+https://github.com/dask/dask-learn
    

相关问题