如何增加 GKE 中 DASK 的调度程序内存

0 python google-kubernetes-engine dask mlops prefect

我在 GCP 上部署了一个 kubernetes 集群,结合了 prefect 和 dask。这些作业在正常情况下运行良好,但无法扩展到 2 倍的数据。到目前为止,我已将范围缩小到调度程序因内存使用率过高而关闭。 Dask 调度程序内存 一旦内存使用量达到 2GB,作业就会失败并出现“未检测到心跳”错误。

有一个单独的构建 python 文件可用,我们可以在其中设置工作内存和 cpu。有一个 dask-gateway 软件包,我们可以在其中获取网关选项并设置工作内存。

options.worker_memory = 32
options.worker_cores = 10
cluster = gateway.new_cluster(options)
cluster.adapt(minimum=4, maximum=20)
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚在哪里以及如何增加 dask-scheduler 的内存分配。

Specs:
Cluster Version: 1.19.14-gke.1900
Machine type - n1-highmem-64
Autoscaling set to 6 - 1000 nodes per zone
all nodes are allocated 63.77 CPU and 423.26 GB
Run Code Online (Sandbox Code Playgroud)

Ann*_*ler 5

首先解释为什么存在 Flow 心跳:\nPrefect 使用心跳来检查您的流程是否仍在运行。如果 Prefect 没有\xe2\x80\x99t 心跳,则在 Kubernetes 作业等远程执行环境中失去通信并终止的流将在 UI 中永久显示为“正在运行”。通常,“未检测到心跳”是由于内存不足或流程执行长时间运行的作业时发生的。

\n

您可以尝试的一种解决方案是在运行配置中设置以下环境变量 - 这会将心跳行为从进程更改为线程,并有助于解决问题:

\n
from prefect.run_configs import UniversalRun\n\nflow.run_config = UniversalRun(env={"PREFECT__CLOUD__HEARTBEAT_MODE": "thread"})\n
Run Code Online (Sandbox Code Playgroud)\n

正如您提到的,最好的解决方案是增加 Dask 工作线程的内存。如果您使用长时间运行的集群,可以这样设置:

\n
dask-worker tcp://scheduler:port --memory-limit="4 GiB"\n
Run Code Online (Sandbox Code Playgroud)\n

如果您将集群类传递给 Dask 执行器,例如coiled.Cluster,您可以同时设置:

\n
    \n
  • Scheduler_memory - 默认为 4 GiB
  • \n
  • worker_memory - 默认为 8 GiB
  • \n
\n

您可以按照以下方式在流程中进行设置:

\n
dask-worker tcp://scheduler:port --memory-limit="4 GiB"\n
Run Code Online (Sandbox Code Playgroud)\n