我们如何通过 kubernetes 上的 helm 在 dask distributed 运行 中选择每个工人的 --nthreads 和 --nprocs?

how do we choose --nthreads and --nprocs per worker in dask distributed running via helm on kubernetes?

我正在 运行 一些 I/O 密集型 Python Dask 代码,并希望增加每个工作线程的线程数。我已经部署了一个运行 Dask 的 Kubernetes 集群,该集群通过 helm. I see from the worker deployment template 分发,一个 worker 的线程数设置为 CPU 数,但我想将线程数设置得更高,除非这是反-图案。我怎么做?

开始,我似乎可以通过 ssh 连接到 dask 调度程序并使用 dask-worker 启动工作程序?但理想情况下,我能够通过 helm 配置 worker 资源,这样除了通过 Client 向其提交作业外,我不必与调度程序进行交互。

Python 中的线程化是一门细致的艺术,并且实际上取决于您的代码。做一个简单的,-nprocs 应该几乎肯定是 1,如果你想要更多的进程,启动更多的副本。对于线程数,首先要记住 GIL 意味着一次只能有一个线程 运行ning Python 代码。所以你只能在两个主要情况下获得并发收益:1)一些线程在 I/O 上被阻塞,比如等待从数据库或网络 API 或 2)一些线程正在 运行ning NumPy 或朋友中的非 GIL 绑定 C 代码。对于第二种情况,您仍然无法获得比 CPU 数量更多的并发性,因为这就是一次 运行 有多少插槽,但在某些情况下,第一种情况可以受益于比 CPU 更多的线程。

Kubernetes 资源限制和请求应与提供给 dask-worker 命令的 --memory-limit 和 --nthreads 参数相匹配。更多信息请关注link1 (Best practices described on Dask`s official documentation) and 2

Dask 的 helm 图表有一个限制,不允许在图表中设置 --nthreads。我与 Dask 团队确认了这一点并提出了一个问题:https://github.com/helm/charts/issues/18708.

同时,使用Dask Kubernetes进行更高程度的自定义。