NCCL¶
NCCL is an optimized inter-GPU communication library for NVIDIA GPUs. It is commonly used in machine learning frameworks, but traditional scientific applications can also benefit from NCCL.
Using NCCL¶
To use the Slingshot network on Alps, the aws-ofi-nccl
plugin must be used.
With the container engine, the AWS OFI NCCL hook can be used to load the plugin into the container and configure NCCL to use it.
Most uenvs, like prgenv-gnu
, also contain the NCCL plugin.
When using e.g. the default
view of prgenv-gnu
the aws-ofi-nccl
plugin will be available in the environment.
Alternatively, loading the aws-ofi-nccl
module with the modules
view also makes the plugin available in the environment.
The environment variables described below must be set to ensure that NCCL uses the plugin.
While the container engine sets these automatically when using the NCCL hook, the following environment variables should always be set for correctness and optimal performance when using NCCL:
# This forces NCCL to use the libfabric plugin, enabling full use of the
# Slingshot network. If the plugin can not be found, applications will fail to
# start. With the default value, applications would instead fall back to e.g.
# TCP, which would be significantly slower than with the plugin. More information
# about `NCCL_NET` can be found at:
# https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-net
export NCCL_NET="AWS Libfabric"
# Use GPU Direct RDMA when GPU and NIC are on the same NUMA node. More
# information about `NCCL_NET_GDR_LEVEL` can be found at:
# https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-net-gdr-level-formerly-nccl-ib-gdr-level
export NCCL_NET_GDR_LEVEL=PHB
export NCCL_CROSS_NIC=1
# These `FI` (libfabric) environment variables have been found to give the best
# performance on the Alps network across a wide range of applications. Specific
# applications may perform better with other values.
export FI_CXI_DEFAULT_CQ_SIZE=131072
export FI_CXI_DEFAULT_TX_SIZE=32768
export FI_CXI_DISABLE_HOST_REGISTER=1
export FI_CXI_RX_MATCH_MODE=software
export FI_MR_CACHE_MONITOR=userfaultfd
Using NCCL with uenvs
The environment variables listed above are not set automatically when using uenvs.
GPU-aware MPI with NCCL
Using GPU-aware MPI together with NCCL can easily lead to deadlocks.
Unless care is taken to ensure that the two methods of communication are not used concurrently, we recommend not using GPU-aware MPI with NCCL.
To explicitly disable GPU-aware MPI with Cray MPICH, explicitly set MPICH_GPU_SUPPORT_ENABLED=0
.
Note that this option may be set to 1
by default on some Alps clusters.
See the Cray MPICH documentation for more details on GPU-aware MPI with Cray MPICH.
invalid usage
error with NCCL_NET="AWS Libfabric"
If you are getting error messages such as:
this may be due to the plugin not being found by NCCL. If this is the case, running the application with the recommendedNCCL_DEBUG=WARN
should print something similar to the following:
When using uenvs like prgenv-gnu
, make sure you are either using the default
view which loads aws-ofi-nccl
automatically, or, if using the modules
view, load the aws-ofi-nccl
module with module load aws-ofi-nccl
.
If the plugin is found correctly, running the application with NCCL_DEBUG=INFO
should print:
Do not use NCCL_NET_PLUGIN="ofi"
with uenvs
NCCL has an alternative way of specifying what plugin to use: NCCL_NET_PLUGIN
.
When using uenvs, do not set NCCL_NET_PLUGIN="ofi"
instead of, or in addition to, NCCL_NET="AWS Libfabric"
.
If you do, your application will fail to start since NCCL will:
- fail to find the plugin because of the name of the shared library in the uenv, and
- prefer
NCCL_NET_PLUGIN
overNCCL_NET
, so it will fail to find the plugin even ifNCCL_NET="AWS Libfabric"
is correctly set.
When both environment variables are set the error message, with NCCL_DEBUG=WARN
, will look similar to when the plugin isn't available:
With NCCL_DEBUG=INFO
, NCCL will print:
nid006365:180142:180163 [0] NCCL INFO NET/Plugin: Could not find: ofi libnccl-net-ofi.so. Using internal network plugin.
...
nid006365:180142:180163 [0] net.cc:626 NCCL WARN Error: network AWS Libfabric not found.
If you only set NCCL_NET="ofi"
, NCCL may silently fail to load the plugin but fall back to the default implementation.