Dask 如何在云中的多个虚拟机上执行代码

How does Dask execute code on multiple vm's in the cloud

我用 dask 和 delayed 编写了一个程序,现在我想 运行 在云端的多台机器上运行它。但是有一件事我不明白——dask 运行 云中多台机器上的代码没有代码的所有依赖项是如何实现的?

当 运行在多台机器上运行时,Dask 工作人员必须能够访问所有必需的依赖项才能 运行 您的代码。

您用 dask-kubernetes 标记了您的问题,所以我将以此为例。默认情况下 dask-kubernetes 使用 daskdev/dask Docker image 到 运行 你的工人。此图像包含 Python 和对 运行 Dask 分布式的最小依赖性。

如果您的代码需要外部依赖项,您必须确保它已安装在映像中。通过设置 EXTRA_APT_PACKAGESEXTRA_CONDA_PACKAGESEXTRA_PIP_PACKAGES 环境变量,Dask docker 映像支持在 运行 时安装额外的包。

# worker-spec.yml

kind: Pod
metadata:
  labels:
    foo: bar
spec:
  restartPolicy: Never
  containers:
  - image: daskdev/dask:latest
    imagePullPolicy: IfNotPresent
    args: [dask-worker, --nthreads, '2', --no-dashboard, --memory-limit, 6GB, --death-timeout, '60']
    name: dask
    env:
      - name: EXTRA_APT_PACKAGES
        value: packagename  # Some package to install with `apt install`
      - name: EXTRA_PIP_PACKAGES
        value: packagename  # Some package to install with `pip install`
      - name: EXTRA_CONDA_PACKAGES
        value: packagename  # Some package to install with `conda install`
    resources:
      limits:
        cpu: "2"
        memory: 6G
      requests:
        cpu: "2"
        memory: 6G
from dask_kubernetes import KubeCluster

cluster = KubeCluster.from_yaml('worker-spec.yml')

这样做的缺点是每次启动 worker 时都必须安装软件包,这会使 adaptive scaling 变慢。因此,您也可以创建自己的 Docker 图像,并安装所有依赖项并将其发布到 Docker Hub。然后在您的配置中使用它。

kind: Pod
metadata:
  labels:
    foo: bar
spec:
  restartPolicy: Never
  containers:
  - image: me/mycustomimage:latest
    imagePullPolicy: IfNotPresent
    args: [dask-worker, --nthreads, '2', --no-dashboard, --memory-limit, 6GB, --death-timeout, '60']
    name: dask
    resources:
      limits:
        cpu: "2"
        memory: 6G
      requests:
        cpu: "2"
        memory: 6G