NCCL (NVIDIA Collective Communications Library) เป็น library การสื่อสารแบบกลุ่มที่พัฒนาโดย NVIDIA สำหรับการทำ Parallel processing บน GPU โดยเฉพาะอย่างยิ่งในการ train deep learning model ที่ใช้ GPU หลายใบ NCCL ถูกออกแบบมาเพื่อเพิ่มประสิทธิภาพการสื่อสารระหว่าง GPU ในระบบที่มี GPU หลายใบ ทั้งภายใน single node และ multinode
...
ในการทดสอบของเรา เราได้ทำการทดสอบ parameter 2 ตัวได้แก่ NCCL_SOCKET_NTHREADS และ NCCL_NSOCKS_PERTHREAD
1.NCCL_SOCKET_NTHREADS
...
NCCL_SOCKET_NTHREADS
...
คือจำนวนการใช้งาน Thread ของ CPU ที่จะใช้ต่อ 1 การสื่อสาร ผ่าน network socket
2.NCCL_NSOCKS_PERTHREAD
The NCCL_NSOCKS_PERTHREAD
variable specifies the number of sockets opened by each helper thread of the socket transport. In environments where per-socket speed is limited, setting this variable larger than 1 may improve the network performance. คือจำนวน network socket ที่ถูกใช้สำหรับแต่ละ Thread ของ CPU
Panel | ||||||
---|---|---|---|---|---|---|
| ||||||
However, the product of ผลคูณของ |
โดย parameter 2 ตัวนี้ จะใช้ทรัพยากรส่วนหนึ่งของ CPU ในการสื่อสารกันระหว่าง GPU/node ซึ่งในการประมวลผล main task จะต้องใช้ทรัพยากรของ CPU เช่นกันจึงต้อง balance เพื่อหาค่า parameter ที่เหมาะสม
...
Code Block | ||
---|---|---|
| ||
module restore module load Mamba module load Apptainer module load PrgEnv-gnu module load cpe-cuda/23.03 module load cudatoolkit/23.3_11.8 conda deactivate conda activate ./env echo -------ENVIRONMENT------- echo myuser=$(whoami) echo COUNT_NODE=$COUNT_NODE echo LD_LIBRARY_PATH = $LD_LIBRARY_PATH echo PATH = $PATH echo which mpicc $(which mpicc) echo HOSTNAMES = $HOSTNAMES echo hostname = $(hostname) echo MASTER_ADDR= $MASTER_ADDR echo MASTER_PORT= $MASTER_PORT H=$(hostname) THEID=$(echo -e $HOSTNAMES | python -c "import sys;[sys.stdout.write(str(i)) for i,line in enumerate(next(sys.stdin).split(' ')) if line.strip() == '$H'.strip()]") echo THEID=$THEID echo SLURM_PROCID=$SLURM_PROCID echo ------------------------- export NCCL_TIMEOUT=3600000 export TORCH_NCCL_BLOCKING_WAIT=0 export TORCH_EXTENSIONS_DIR="./.cache" accelerate launch \ --num_processes $((4 * $COUNT_NODE)) \ --num_machines $COUNT_NODE \ --multi_gpu \ --mixed_precision bf16 \ --machine_rank $SLURM_PROCID \ --main_process_ip $MASTER_ADDR \ --main_process_port $MASTER_PORT \ --dynamo_backend inductor \ scripts/train.py |
...