我的系统有 4 个 CPU,16 GB 内存。我的目标是部署 dask 分布式工作人员,每个工作人员仅使用 1 个 CPU 来运行分配给他们的代码。
我正在使用 docker 部署调度程序容器和工作容器来运行使用 Dask 延迟和 dask 数据帧的代码。
以下是两者的 Docker 运行命令:
调度程序
docker run --name dask-scheduler --network host daskdev/dask:2023.1.1-py3.10 dask-scheduler
工人 (尝试了多个 docker run 命令,以下命令的所有不同组合)
docker run --name dask-worker --network host dask-worker --nworkers 1 --nthreads 1 --resources "process=1" --memory-limit 2 GiB --name dask-worker daskdev/dask:2023.1.1-py3.10 10.76.8.50:8786
创建客户端并与调度程序建立连接。
client = Client("tcp://10.76.8.50:8786")
现在我想要的是,当运行 dask.compute(scheduler="processes") 时,worker 将仅使用 1 个 cpu 来运行代码。但是,在 100% 容量下至少可以看到 3 个 CPU。
我错过了什么吗?
我如何限制分布式工作人员仅使用 1 个 CPU 来完成此计算工作?
通过指定
--resources "process=1"
,这个数量的资源被分配给每个工人。但是,为确保每个任务都使用此资源,有必要指定任务使用的资源。例如,通过注释:
with dask.annotate(resources=dict(process=1)):
...
上面的代码片段将确保所有包装计算都使用 1 个单位的
process
资源每个任务。
您正在指定 scheduler="processes",这将完全忽略您的分布式集群。相反,在运行代码
client = dask.distributed.Client(...)
的python会话中使用调度程序的TCP地址创建一个分布式客户端,计算将在您的工作人员上运行,每个线程一个,自动。
找到解决方案。
在使用
compute(scheduler="processes")
时,
在计算中使用另一个参数:
num_workers
例子:
result = calculated_res.compute(scheduler="processes", num_workers= 2)
无论工人如何,这总共只使用 2 个 CPU。