Horovod 与英特尔(R) oneCCL¶
要使用Horovod与英特尔(R) oneAPI集合通信库(oneCCL),请按照以下步骤操作。
安装 oneCCL。
要安装 oneCCL,请遵循这些步骤。
Source setvars.sh 以开始使用 oneCCL。
source <install_dir>/env/setvars.sh
设置
HOROVOD_CPU_OPERATIONS变量
export HOROVOD_CPU_OPERATIONS=CCL
从源代码安装 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获取更多信息。