Horovod 与英特尔(R) oneCCL

要使用Horovod与英特尔(R) oneAPI集合通信库(oneCCL),请按照以下步骤操作。

  1. 安装 oneCCL

要安装 oneCCL,请遵循这些步骤

Source setvars.sh 以开始使用 oneCCL。

source <install_dir>/env/setvars.sh
  1. 设置 HOROVOD_CPU_OPERATIONS 变量

export HOROVOD_CPU_OPERATIONS=CCL
  1. 从源代码安装 Horovod

python setup.py build
python setup.py install

或通过 pip

pip install horovod

高级设置

亲和性

你可以通过HOROVOD_THREAD_AFFINITY环境变量来指定Horovod后台线程的亲和性。 请参阅以下说明。

根据规则设置Horovod后台线程亲和性 - 如果每个节点有N个Horovod进程,该变量应包含所有本地进程的值,使用逗号作为分隔符:

export HOROVOD_THREAD_AFFINITY=c0,c1,...,c(N-1)

其中c0,…,c(N-1)是用于固定本地进程中后台线程的核心ID。

设置 oneCCL 工作进程的数量:

export CCL_WORKER_COUNT=X

其中 X 是每个进程中您希望专用于驱动通信的 oneCCL 工作线程(workers)数量。

自动设置 oneCCL 工作线程的亲和性:

export CCL_WORKER_AFFINITY=auto

这是默认模式。确切的核ID将取决于所使用的进程启动器。

显式设置 oneCCL 工作线程的亲和性:

export CCL_WORKER_AFFINITY=c0,c1,..,c(X-1)

其中c0,c1,..,c(X-1)是分配给本地oneCCL工作者的核心ID,即X = CCL_WORKER_COUNT * 每个节点的进程数。

更多信息请参考通信操作的执行

例如,我们有两个节点,每个节点有两个插槽:插槽0的CPU:0-17,36-53 和插槽1的CPU:18-35,54-71。我们将每个插槽的最后两个核心专用于两个oneCCL工作进程,并将Horovod后台线程固定到oneCCL工作进程核心的一个超线程核心上。使用I_MPI_PIN_PROCESSOR_EXCLUDE_LIST将所有这些核心从Intel MPI固定中排除,仅专用于oneCCL和Horovod任务,从而避免与框架的计算线程发生冲突。

export CCL_WORKER_COUNT=2
export CCL_WORKER_AFFINITY="16,17,34,35"
export HOROVOD_THREAD_AFFINITY="53,71"
export I_MPI_PIN_DOMAIN=socket
export I_MPI_PIN_PROCESSOR_EXCLUDE_LIST="16,17,34,35,52,53,70,71"

mpirun -n 4 -ppn 2 -hostfile hosts python ./run_example.py

缓存

为一CCL操作设置缓存提示:

export HOROVOD_CCL_CACHE=0|1

目前仅适用于 allreduce。默认禁用。

请参考Caching of Communication Operations获取更多信息。