客户端、调度器和工作节点之间需要一致的环境吗?
作者:Jacob Tomlinson, Rick Zamora, Florian Jetter
2023年5月3日更新: 澄清 GPU 建议。
随着 dask 和 distributed 2023.4.0
版本的发布,我们正在进行一项更改,这可能要求 Dask 调度器具备与客户端和工作节点一致的软硬件能力。
一直以来都建议客户端和工作节点拥有一致的软硬件环境,以便数据结构和依赖项可以在它们之间进行序列化(pickle)和传递。然而,近期 Dask 调度器的一些改动意味着我们现在也要求调度器拥有与所有其他组件一致的环境。
这对我有何影响?
对于大多数用户而言,这一变化应该不会被注意到,因为通常情况下,所有 Dask 组件都在同一个 conda 环境或 docker 镜像中运行,并且通常在同构的机器上。
然而,对于可能优化了其调度器以使用精简环境的人们,或者对于在客户端/工作节点上拥有专用硬件(如 GPU)但在调度器上没有的用户,可能会产生一些影响。
会有什么影响?
如果您遇到诸如 "RuntimeError: Error during deserialization of the task graph. This frequently occurs if the Scheduler and Client have different environments."
这样的错误,请确保您的客户端、调度器和工作节点之间的软件环境是一致的。
如果您在客户端和工作节点之间传递 GPU 对象,我们现在建议您的调度器也拥有一个 GPU。此建议仅是为了在必要时,可以在调度器上反序列化 Dask 图中包含的 GPU 支持的对象。通常,提供给调度器的 GPU 不需要像客户端和工作节点上的那样强大,只要它具有 类似的 CUDA 计算能力 即可。例如,出于成本优化的原因,您可能希望在客户端和工作节点上使用 A100,而在调度器上使用 T4。
客户端上没有 GPU 但利用 GPU 工作节点的用户不应该遇到这个问题,因为 GPU 对象只存在于工作节点上。
我们为何这样做?
我们现在建议调度器也具有相同的软硬件能力的原因是,我们正在赋予调度器在将图分发给工作节点之前对其进行反序列化的能力。这将使调度器能够通过更好地理解其正在执行的操作,在未来做出更智能的调度决策。
这样做的一个缺点是,图可以包含由客户端任意数量的依赖项创建的复杂 Python 对象,因此为了让调度器反序列化它们,需要安装相同的库。同样,如果客户端的软件包创建了 GPU 对象,那么调度器也需要一个。
我们相信您会同意,为了 Dask 的长期改进,对一小部分用户造成的这一中断是值得的。
博客评论由 Disqus 提供支持