Dask - 独家资源访问?

Dask - exclusive resource access?

某些资源(如 GPU 或某些数据存储)最好单独使用,即一次一个客户端。

Dask 支持按名称 1(别名)选择工作人员子集,因此我可以将 GPU 工作限制为 GPU 工作人员。

在这种情况下,我将如何锁定资源? IE。给定的工作人员一次只能 运行 一个任务,即使两个不同的客户提交工作也是如此。

今天处理这个问题的最佳方法是为每个 GPU 创建一个单独的线程

user@host1$ dask-worker scheduler:8786
user@host1$ dask-worker scheduler:8786 --nthreads 1 --name gpu-1

user@host2$ dask-worker scheduler:8786
user@host2$ dask-worker scheduler:8786 --nthreads 1 --name gpu-2

user@host3$ dask-worker scheduler:8786
user@host3$ dask-worker scheduler:8786 --nthreads 1 --name gpu-3

然后将一些任务提交给整个集群,将其他任务提交给那些 GPU 工作人员

>>> gpu_workers = ['gpu-1', 'gpu-2', 'gpu-3']

>>> client = Client('scheduler:8786')

>>> data = client.map(load, filenames)
>>> futures = client.map(process, data, workers=gpu_workers)

(有关将任务提交到特定机器的更多方法,请参阅 data locality docs

这在几个方面不太理想:

  1. 我们将不必要地跨进程边界移动数据以到达拥有 GPU 的特殊进程。追踪 dask/distributed #400 应该最终解决这个问题。
  2. 您必须自己维护一个 gpu-workers 列表。跟踪 dask/distributed #505 应该可以解决此问题