在设置集群上的工作节点时,我对Dask和Dask.distributed中使用的不同术语感到有些困惑。
我遇到的术语有:线程、进程、处理器、节点、工作节点和调度器。
我的问题是如何设置每个工作节点的数量以及它们之间是否存在严格或建议的关系。例如:
- 每个节点一个工作节点,n个进程用于节点上的n个核心
- 线程和进程是相同的概念吗?在dask-mpi中,我必须设置nthreads,但它们显示为客户端中的进程
还有其他建议吗?
在设置集群上的工作节点时,我对Dask和Dask.distributed中使用的不同术语感到有些困惑。
我遇到的术语有:线程、进程、处理器、节点、工作节点和调度器。
我的问题是如何设置每个工作节点的数量以及它们之间是否存在严格或建议的关系。例如:
还有其他建议吗?
"节点"通常指的是物理或虚拟机器。该节点可以同时运行多个程序或进程(就像我的计算机可以同时运行网络浏览器和文本编辑器一样)。每个进程可以在自身内部并行化许多线程。进程具有隔离的内存环境,这意味着在进程内共享数据是免费的,而在进程之间共享数据则是昂贵的。
通常情况下,在更大的节点上运行会更好(例如36个核心的节点),如果您将它们分解成几个进程,每个进程都有多个线程。您希望进程数乘以线程数等于核心数。因此,例如对于36个核心的计算机,您可能会执行以下操作:
通常根据工作负载来决定这些选择。这里的差别是由于Python的全局解释器锁(GIL),它限制了某些数据类型的并行性。如果您主要使用Python中的Numpy、Pandas、Scikit-Learn或其他数值编程库,则无需担心GIL,而且可能更喜欢少量进程和每个线程都有很多个线程。这有助于因为它允许数据在您的核之间自由移动,因为它们都存在同一进程中。然而,如果您大部分时间都在进行纯Python编程,比如处理文本数据、字典/列表/集合,并在紧密的Python for循环中进行大部分计算,则需要更喜欢具有较少线程的多个进程。这会产生额外的通信成本,但可以让您绕过GIL。
简而言之,如果您主要使用numpy/pandas样式的数据,请尝试在一个进程中获得至少八个线程。否则,可以在一个进程中仅采用两个线程。