개발용 Nvidia GH200 설정하기
Nvidia GH200을 처음부터 설정하는 일은 다소 까다롭습니다. 결국 CUDA 12.4와 FlashAttention-2로 작동하게 만들었지만, 어느 정도 시행착오를 거쳐야 했습니다. 제가 한 작업은 다음과 같습니다.
GH200은 64K 커널 페이지 크기에서 최적의 성능을 발휘합니다. Nvidia는 Ubuntu 시스템용 전용 커널 패키지를 제공합니다. 먼저 기존 커널 패키지를 제거하고 Nvidia 64K 커널을 설치하십시오.
sudo DEBIAN_FRONTEND=noninteractive apt purge linux-image-$(uname -r) \
linux-headers-$(uname -r) linux-modules-$(uname -r) -y
sudo apt update
sudo apt install linux-nvidia-64k-hwe-22.04 -y
sudo reboot now
시스템이 재부팅되면 올바른 커널을 사용하고 있는지 확인하십시오.
uname -r
다음과 같이 표시되어야 합니다.
linux-nvidia-64k-hwe-22.04-555.42.06
이제 기본 시스템을 업데이트합시다.
apt-get update
GH200에는 특정 NVIDIA 드라이버와 MLNX_OFED 드라이버가 필요합니다. 다음 패키지를 설치하십시오. 여기서는 순서가 매우 중요합니다!
apt-get install -y mlnx-fw-updater mlnx-ofed-all
apt-get install -y cuda-drivers-555 nvidia-kernel-open-555 linux-tools-$(uname -r)
apt-get install -y cuda-toolkit nvidia-container-toolkit
NVIDIA persistence 데몬이 persistence 모드를 사용하도록 구성해야 합니다.
sudo mkdir /lib/systemd/system/nvidia-persistenced.service.d
sudo dd status=none of=/lib/systemd/system/nvidia-persistenced.service.d/override.conf << EOF
[Service]
ExecStart=
ExecStart=/usr/bin/nvidia-persistenced --persistence-mode --verbose
[Install]
WantedBy=multi-user.target
EOF
systemctl enable nvidia-persistenced --now
새 프로필 스크립트를 만들어 CUDA 경로를 구성하십시오.
echo "# Library Path for Nvidia CUDA" >> /etc/profile.d/cuda.sh
echo export LD_LIBRARY_PATH=/usr/local/cuda/lib64:'$LD_LIBRARY_PATH' >> /etc/profile.d/cuda.sh
echo export PATH=$HOME/.local/bin:/usr/local/cuda/bin:'$PATH' >> /etc/profile.d/cuda.sh
최적의 성능을 위해 IRQ balance 서비스를 비활성화하고 NUMA 설정을 구성하십시오.
systemctl disable irqbalance
echo "kernel.numa_balancing = 0" >> /etc/sysctl.conf
sysctl -p
이제 NVIDIA peer memory 모듈을 시스템에 추가하여 피어 메모리 접근을 활성화합시다.
echo "nvidia-peermem" >> /etc/modules-load.d/nvidia-peermem.conf
모듈이 로드되었는지 확인하십시오.
lsmod | grep nvidia_peermem
모든 구성을 마친 후 시스템을 재부팅하십시오.
systemctl disable first-boot.service
reboot
시스템이 재부팅되면 다음 명령을 실행하여 설치를 확인하십시오.
nvidia-smi
이 명령은 GPU 모델, 드라이버 버전, 현재 사용률을 포함한 GH200 정보를 표시해야 합니다.
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 555.42.06 Driver Version: 555.42.06 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GH200 480GB On | 00000009:01:00.0 Off | 0 |
| N/A 33C P0 76W / 900W | 1MiB / 97871MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
시스템 토폴로지를 살펴보면 GPU와 네트워킹 구성 요소 사이에서 데이터가 어떻게 이동하는지 파악할 수 있습니다.
nvidia-smi topo -m
이 명령은 GPU와 다른 PCIe 장치 사이의 연결 행렬을 보여 줍니다. GH200의 경우 다음과 비슷한 내용이 표시되어야 합니다.
GPU0 NIC0 NIC1 CPU Affinity NUMA Affinity GPU NUMA ID
GPU0 X NODE NODE 0-71 1
NIC0 NODE X PIX
NIC1 NODE PIX X
Legend:
X = Self
SYS = Connection traversing PCIe as well as the SMB interconnect between NUMA nodes (e.g., QPI/UPI)
NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
PHB = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
PXB = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
PIX = Connection traversing at most a single PCIe bridge
NV# = Connection traversing a bonded set of # NVLinks
NIC Legend:
NICO: mlx5_0
NIC1: mlx5_1
Flash 어텐션으로 vLLM 설정하기
먼저 Python 패키지 관리 도구를 업데이트하십시오.
python -m pip install -U pip
python -m pip install -U setuptools wheel
CUDA 12.4를 지원하는 PyTorch를 설치하십시오.
pip install torch --index-url https://download.pytorch.org/whl/cu124
Flash 어텐션을 설치하십시오:
pip install flash-attn --no-build-isolation
Flash 어텐션을 지원하도록 vLLM을 클론하고 빌드하십시오:
git clone git@github.com:vllm-project/vllm.git
cd vllm
sudo docker build --target build -t vllm_build .
container_id=$(sudo docker create --name vllm_temp vllm_build:latest)
sudo docker cp ${container_id}:/workspace/dist .
# Install vLLM with Flash Attention
pip install vllm-flash-attn
pip install dist/vllm-0.4.2+cu124-cp312-cp312-linux_x86_64.whl
소스에서 xformers를 설치하십시오.
pip install ninja
# Set TORCH_CUDA_ARCH_LIST if running and building on different GPU types
pip install -v -U git+https://github.com/facebookresearch/xformers.git@main#egg=xformers
~/.bashrc에 다음 내용을 추가하여 환경 변수를 설정하십시오.
export HF_TOKEN=<HF-TOKEN>
export HF_HOME="/home/ubuntu/.cache/huggingface"
export MODEL_REPO=meta-llama/Meta-Llama-3.1-70B-Instruct
변경 사항을 적용하십시오.
source ~/.bashrc
다음 명령으로 vLLM API 서버를 실행하십시오:
vllm serve $MODEL_REPO --dtype auto
이제 http://localhost:8000/v1/completions의 API 엔드포인트로 요청을 보낼 수 있습니다.
FlashInfer와 함께 sglang 설정하기
또는 SGLang과 FlashInfer를 사용하여 서빙할 수도 있습니다.
# Use the last release branch
git clone -b v0.3.5.post2 https://github.com/sgl-project/sglang.git
cd sglang
pip install -e "python[all]"
pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
다음 명령으로 SGLang 서버를 실행하십시오:
python -m sglang.launch_server --model-path meta-llama/Meta-Llama-3.1-70B-Instruct
마찬가지로 OpenAI API 형식을 사용하여 http://localhost:8000/v1/completions의 API 엔드포인트로 요청을 보낼 수 있습니다.