Multi-Node Deployment
Multi-Node Deployment (멀티 노드 배포)
이 페이지는 여러 GPU 노드에 걸쳐 SGLang 서버를 배포하는 방법을 다뤄요. 특히 매우 큰 모델인 Llama 3.1 405B를 fp16으로 두 노드에 나눠 실행하는 예시와, SLURM 클러스터에서 멀티 노드 추론을 수행하는 방법을 소개해요. 대규모 모델을 단일 노드에 올리기엔 메모리가 부족할 때 유용한 방법이에요.
출처: 문서
본문
Llama 3.1 405B
두 노드에서 405B(fp16) 실행하기
# replace 172.16.4.52:20000 with your own node ip address and port of the first node
python3 -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3.1-405B-Instruct \
--tp 16 \
--dist-init-addr 172.16.4.52:20000 \
--nnodes 2 \
--node-rank 0
python3 -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3.1-405B-Instruct \
--tp 16 \
--dist-init-addr 172.16.4.52:20000 \
--nnodes 2 \
--node-rank 1
참고로 LLama 405B(fp8)는 단일 노드에서도 실행할 수 있어요.
python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-405B-Instruct-FP8 --tp 8
DeepSeek V3/R1
DeepSeek 관련 문서를 참고해 주세요.
SLURM에서의 멀티 노드 추론 (Multi-Node Inference on SLURM)
이 예시는 SLURM을 사용해 여러 노드에 걸쳐 SGLang 서버를 제공(serve)하는 방법을 보여줘요. 다음 작업(job)을 SLURM 클러스터에 제출하면 돼요.
#!/bin/bash -l
#SBATCH -o SLURM_Logs/%x_%j_master.out
#SBATCH -e SLURM_Logs/%x_%j_master.err
#SBATCH -D ./
#SBATCH -J Llama-405B-Online-Inference-TP16-SGL
#SBATCH --nodes=2
#SBATCH --ntasks=2
#SBATCH --ntasks-per-node=1 # Ensure 1 task per node
#SBATCH --cpus-per-task=18
#SBATCH --mem=224GB
#SBATCH --partition="lmsys.org"
#SBATCH --gres=gpu:8
#SBATCH --time=12:00:00
echo "[INFO] Activating environment on node $SLURM_PROCID"
if ! source ENV_FOLDER/bin/activate; then
echo "[ERROR] Failed to activate environment" >&2
exit 1
fi
# Define parameters
model=MODEL_PATH
tp_size=16
echo "[INFO] Running inference"
echo "[INFO] Model: $model"
echo "[INFO] TP Size: $tp_size"
# Set NCCL initialization address using the hostname of the head node
HEAD_NODE=$(scontrol show hostname "$SLURM_NODELIST" | head -n 1)
NCCL_INIT_ADDR="${HEAD_NODE}:8000"
echo "[INFO] NCCL_INIT_ADDR: $NCCL_INIT_ADDR"
# Launch the model server on each node using SLURM
srun --ntasks=2 --nodes=2 --output="SLURM_Logs/%x_%j_node$SLURM_NODEID.out" \
--error="SLURM_Logs/%x_%j_node$SLURM_NODEID.err" \
python3 -m sglang.launch_server \
--model-path "$model" \
--grammar-backend "xgrammar" \
--tp "$tp_size" \
--dist-init-addr "$NCCL_INIT_ADDR" \
--nnodes 2 \
--node-rank "$SLURM_NODEID" &
# Wait for the NCCL server to be ready on port 30000
while ! nc -z "$HEAD_NODE" 30000; do
sleep 1
echo "[INFO] Waiting for $HEAD_NODE:30000 to accept connections"
done
echo "[INFO] $HEAD_NODE:30000 is ready to accept connections"
# Keep the script running until the SLURM job times out
wait
그 후에는 다른 문서들을 따라 요청을 보내 서버를 테스트할 수 있어요.
이 예시를 제공해 준 aflah02에게 감사해요. 그의 블로그 글을 기반으로 만들어졌어요.