欢迎光临散文网 会员登陆 & 注册

dask.LocalCluster参数解析

2023-06-22 20:28 作者:韭菜怎么卖  | 我要投稿

n_workers:节点数量,默认是None


threads_per_worker:节点线程数,默认是None


processes:是否开进程并发,默认是True


    dask的源码是这样的:

    然后我们看看n_wokers和threads_per_worker的处理逻辑:

    nprocesses_nthreads的源码:

    CPU_COUNT的源码:

    所以实际上你不用可以设置n_workers和threads_per_worker,它会自动利用到你所有的cpu核心线程数并且自动分配,比如六核十二线程的cpu,cpu_count = 12,它会分配成n_workers = 4 / threads_per_workers = 3。

    但你需要注意的是,这样的分配是一定不会把cpu性能跑满的,因为本质上对于12线程的cpu,如果希望它们同时并发地工作,能真正并发的最大进程数量就是12,所以只有当n_workers = 12的情况下,理论上你的cpu负载才可能达到100%。n_workers = 4 / threads_per_workers = 3本质上是4个节点使用进程,每个节点进程下开3个线程,线程之间是竞争同一个进程资源的。所以理论上假设你空闲时候的cpu占用是10%,那么你最高的cpu占用只能达到 10% + (4 / 12) = 43.3% ,你的并发也会更慢。

    所以实际上如果你希望你的cpu满载,那么n_workers = cpu_count,也就是cpu线程数,而threads_per_worker就设为1,多于1我认为是没有意义的,它们竞争的是同一个进程的资源,况且python还有GIL。以下是我的项目代码在不同n_workers和threads_per_worker下的运行速度(六核十二线程):

    当然更少的n_workers意味着在固定内存大小的情况下,每个节点的工作内存会更大,更大的工作内存能够避免dask在工作过程中出现memory leak的warning。


memory_limit:单个节点内存限制,

    不设就自适应,默认把你剩下能用的内存平均劈给每一个节点

    None或者0就不设限,能直接给你内存挤爆


scheduler_port: 调度器的监听端口

    默认是0,就是随机选端口

    本质上它在哪个端口不重要,因为我们只和dashboard交互


silence_logs:日志等级,默认是logging.WARN

    所以当你不知道怎么debug dask报出来的各种各样的warning时,你就把它调高,看不见就等于没有


host:调度器监听的主机名,默认是localhost

    本地集群下就不用管,调度器就在本机


ip:deprecated


dashboard_address:可视化界面地址

    模式是本机下的8787端口


worker_dashboard_address:可视化界面下的worker界面的地址

    默认禁用了该功能,因为本质上主界面就可以点到worker界面

    当然一般情况下我们就看主界面就行

    worker界面会详细显示每个节点的资源状况,一般情况不看那么细


diagnostics_port:deprecated


asynchronous:是否涉及异步

    也就是当你的并发操作是异步函数的时候,需要把它设为True

    其他情况下最好保持是False


worker_class:节点类

    本质上它就是个pipe line,你可以重写里面的get_data和compute方法来实现一些管道方法,比如数据预处理、结果存储

    不过一般我们还是把逻辑写在外部,可读性会高一点

    在使用进程作为节点的情况下,重写的父类叫做Nanny,否则重写的父类叫Worker



dask.LocalCluster参数解析的评论 (共 条)

分享到微博请遵守国家法律