CPU 서버
CPU 서버 (CPU Servers)
이 문서는 SGLang 환경을 CPU 서버에서 설정하고 LLM 추론을 실행하는 방법을 다루어요. SGLang은 Intel® AMX® 명령어를 지원하는 CPU(4세대 이상 Intel® Xeon® 스케일러블 프로세서)에서 활성화되고 최적화되어 있어요.
출처: 문서
본문
Llama 시리즈, Qwen 시리즈 같은 널리 알려진 오픈소스 모델과 DeepSeek-R1, DeepSeek-V3.1-Terminus 같은 DeepSeek 시리즈를 포함해 많은 인기 LLM이 CPU에서 최적화되어 효율적으로 실행돼요. 지원 상태와 예시 명령은 SGLang Cookbook 페이지에서 확인할 수 있어요.
설치 (Installation)
Docker로 설치 (Install Using Docker)
SGLang 환경을 구성할 때는 Docker를 사용하는 것을 권장해요.
Docker Hub에서 받아오기 (Pull from Docker Hub)
lmsysorg/sglang 저장소에서 미리 빌드된 SGLang 패키지 릴리스 Docker 이미지를 받아오세요. CPU 이미지 태그는 xeon 접미사로 끝나요. 이미지 받아오기 명령은 다음과 같아요:
docker pull lmsysorg/sglang:v0.5.13-xeon
Dockerfile에서 빌드하기 (Build from Dockerfile)
최신 소스 코드로부터 설치하기 위한 Dockerfile 이 제공돼요. 아래의 <secret>을 여러분의 HuggingFace access token 으로 바꾸세요.
# SGLang 저장소 클론
git clone https://github.com/sgl-project/sglang.git
cd sglang/docker
# 도커 이미지 빌드
docker build -t sglang-cpu:latest -f xeon.Dockerfile .
# 도커 컨테이너 시작
docker run \
-it \
--privileged \
--ipc=host \
--network=host \
-v /dev/shm:/dev/shm \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 30000:30000 \
-e "HF_TOKEN=<secret>" \
sglang-cpu:latest /bin/bash
소스에서 설치 (Install From Source)
베어 메탈 환경에 SGLang을 설치하고 싶다면 설정 과정은 다음과 같아요.
시스템에 필요 패키지와 라이브러리가 없다면 먼저 설치하세요. Dockerfile의 Ubuntu 기반 설치 명령을 가이드로 참고할 수 있어요.
uv패키지 매니저를 설치하고 가상 환경을 만들고 활성화하세요:
# 예시로 '/opt'를 uv 환경 폴더로 사용. 필요에 따라 바꿔도 됨
cd /opt
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv venv --python 3.12
source .venv/bin/activate
torch관련 패키지의 설치 채널(즉 index-url)을 지정하는 구성 파일을 만드세요:
vim .venv/uv.toml
vim에서 'a'를 눌러 삽입 모드로 들어가 다음 내용을 만든 파일에 붙여넣으세요.
[[index]]
name = "torch"
url = "https://download.pytorch.org/whl/cpu"
[[index]]
name = "torchvision"
url = "https://download.pytorch.org/whl/cpu"
[[index]]
name = "torchaudio"
url = "https://download.pytorch.org/whl/cpu"
[[index]]
name = "triton"
url = "https://download.pytorch.org/whl/cpu"
파일을 저장하고(vim에서 'esc'를 눌러 삽입 모드를 나간 후 ':x+Enter'), 기본 uv 구성으로 설정하세요.
export UV_CONFIG_FILE=/opt/.venv/uv.toml
sglang소스 코드를 클론하고 패키지를 빌드하세요.
# SGLang 코드 클론
git clone https://github.com/sgl-project/sglang.git
cd sglang
git checkout <YOUR-DESIRED-VERSION>
# 전용 toml 파일 사용
cd python
cp pyproject_cpu.toml pyproject.toml
# SGLang 의존 라이브러리 설치 및 SGLang 메인 패키지 빌드
uv pip install --upgrade pip setuptools
uv pip install .
# CPU 백엔드 커널 빌드
cd sglang/kernels/aot
cp pyproject_cpu.toml pyproject.toml
uv pip install .
- 필요한 환경 변수를 설정하세요.
export SGLANG_USE_CPU_ENGINE=1
# 'LD_LIBRARY_PATH'와 'LD_PRELOAD'를 설정해 sglang 프로세스가 라이브러리를 로드할 수 있게 함
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
export LD_PRELOAD=${LD_PRELOAD}:/opt/.venv/lib/libiomp5.so:${LD_LIBRARY_PATH}/libtcmalloc.so.4:${LD_LIBRARY_PATH}/libtbbmalloc.so.2
참고:
-
CPU 엔진으로 SGLang 서비스를 활성화하려면 환경 변수
SGLANG_USE_CPU_ENGINE=1이 필요해요. -
sgl-kernel빌드 과정에서 코드 컴파일 문제가 발생하면gcc와g++버전을 확인하고 오래됐다면 업그레이드하세요. 공식 Docker 컨테이너에서 검증된gcc-13과g++-13을 권장해요. -
시스템 라이브러리 경로는 보통
~/.local/lib/,/usr/local/lib/,/usr/local/lib64/,/usr/lib/,/usr/lib64/,/usr/lib/x86_64-linux-gnu/중 한 곳에 있어요. 위 예시 명령에서는/usr/lib/x86_64-linux-gnu를 사용했어요. 서버 설정에 맞게 경로를 조정하세요. -
새 터미널을 열 때마다 이 변수들을 설정하지 않도록
~/.bashrc파일에 다음을 추가하는 것을 권장해요:source .venv/bin/activate export SGLANG_USE_CPU_ENGINE=1 export LD_LIBRARY_PATH=<YOUR-SYSTEM-LIBRARY-FOLDER> export LD_PRELOAD=<YOUR-LIBS-PATHS>
서빙 엔진 실행 (Launch of the Serving Engine)
SGLang 서빙을 실행하는 예시 명령:
sglang serve \
--model-path <MODEL_ID_OR_PATH> \
--trust-remote-code \
--disable-overlap-schedule \
--device cpu \
--host 0.0.0.0 \
--tp 6
참고:
-
W8A8 양자화 모델 실행 시
--quantization w8a8_int8플래그를 추가하세요. -
--tp 6플래그는 텐서 병렬 처리를 6개 랭크로 적용한다는 뜻이에요(TP6). 지정된 TP 수는 실행 중 사용되는 TP 랭크 수를 의미해요. CPU 플랫폼에서 TP 랭크는 서브-NUMA 클러스터(SNC)를 의미해요. 보통 OS에서lscpu명령 같은 것으로 SNC 정보(사용 가능한 수)를 얻을 수 있어요.지정된 TP 랭크 수가 총 SNC 수와 다르면 시스템이 자동으로 처음
n개 SNC를 사용해요.n은 총 SNC 수를 초과할 수 없으며, 초과하면 오류가 발생해요.SGLANG_CPU_OMP_THREADS_BIND는 각 텐서 병렬(TP) 랭크의 CPU 코어를 명시적으로 제어할 수 있게 해줘요.예시 1: 소켓의 3개 SNC에서 43-43-42 코어를 가진 Xeon® 6980P 서버에서 TP=6으로 SGLang 서비스를 실행하고 각 SNC의 처음 40개 코어를 사용하려면:
export SGLANG_CPU_OMP_THREADS_BIND="0-39|43-82|86-125|128-167|171-210|214-253"이 구성은 다음과 같아요:
- rank 0:
numactl -C 0-39 -m 0 - rank 1:
numactl -C 43-82 -m 1 - rank 2:
numactl -C 86-125 -m 2 - rank 3:
numactl -C 128-167 -m 3 - rank 4:
numactl -C 171-210 -m 4 - rank 5:
numactl -C 214-253 -m 5
예시 2: 소켓의 3개 SNC에서 32-32-32 코어를 가진 Xeon® 6972P 서버에서 3개 SNC에 걸쳐 96개 코어로 TP=2 SGLang 서비스를 실행하려면:
export SGLANG_CPU_OMP_THREADS_BIND="0-95|96-191"이 구성은 다음과 같아요:
- rank 0:
numactl -C 0-95 -m 0-2 - rank 1:
numactl -C 96-191 -m 3-5
SGLANG_CPU_OMP_THREADS_BIND가 설정되면 랭크의 사용 가능한 메모리 양을 미리 알 수 없을 수 있어요. 메모리 부족(out-of-memory) 오류를 피하려면 적절한--max-total-tokens를 설정해야 할 수 있어요. - rank 0:
-
torch.compile로 디코딩을 최적화하려면--enable-torch-compile플래그를 추가하세요.torch.compile사용 시 최대 배치 크기를 지정하려면--torch-compile-max-bs플래그를 설정하세요. 예를 들어--enable-torch-compile --torch-compile-max-bs 4는torch.compile을 사용하고 최대 배치 크기를 4로 설정하는 것을 의미해요. -
서비스 시작 시 워밍업 스텝이 자동으로 실행돼요. 로그에
The server is fired up and ready to roll!이 보이면 서버가 준비된 거예요.
요청으로 벤치마킹 (Benchmarking with Requests)
bench_serving 스크립트로 성능을 벤치마킹할 수 있어요. 다른 터미널에서 명령을 실행하세요. 예시 명령:
python -m sglang.bench_serving \
--dataset-name random \
--random-input-len 1024 \
--random-output-len 1024 \
--num-prompts 1 \
--request-rate inf \
--random-range-ratio 1.0
자세한 파라미터 설명은 다음 명령으로 확인할 수 있어요:
python -m sglang.bench_serving -h
또한 요청은 OpenAI Completions API를 사용해 형식을 만들 수 있고, 커맨드라인(예: curl)이나 여러분만의 스크립트로 보낼 수 있어요.
예시 사용 명령 (Example Usage Commands)
LLM은 10억 미만에서 수백억 파라미터까지 다양해요. 20B보다 큰 전체(dense) 모델은 소켓 2개와 총 6개 서브-NUMA 클러스터를 가진 플래그십 6세대 Intel® Xeon® 프로세서에서 실행하는 것이 좋아요. 약 10B 파라미터 이하의 dense 모델이나 10B 미만 활성 파라미터의 MoE(Mixture of Experts) 모델은 더 흔한 4세대 이상 Intel® Xeon® 프로세서에서 실행하거나, 플래그십 6세대 Intel® Xeon® 프로세서의 단일 소켓을 사용할 수 있어요.
예시: DeepSeek-V3.1-Terminus 실행
Xeon® 6980P 서버에서 W8A8_INT8 DeepSeek-V3.1-Terminus 서비스를 실행하는 예시 명령:
sglang serve \
--model-path IntervitensInc/DeepSeek-V3.1-Terminus-Channel-int8 \
--trust-remote-code \
--disable-overlap-schedule \
--device cpu \
--quantization w8a8_int8 \
--enable-torch-compile \
--torch-compile-max-bs 4 \
--host 0.0.0.0 \
--tp 6
마찬가지로 FP8 DeepSeek-V3.1-Terminus 서비스를 실행하는 예시 명령:
sglang serve \
--model-path deepseek-ai/DeepSeek-V3.1-Terminus \
--trust-remote-code \
--disable-overlap-schedule \
--device cpu \
--enable-torch-compile \
--torch-compile-max-bs 4 \
--host 0.0.0.0 \
--tp 6
참고: --torch-compile-max-bs는 배포에서 원하는 최대 배치 크기로 설정하세요. 예시의 4 값은 설명용이에요.
예시: Llama-3.2-3B 실행
BF16 정밀도로 Llama-3.2-3B 서비스를 실행하는 예시 명령:
sglang serve \
--model-path meta-llama/Llama-3.2-3B-Instruct \
--trust-remote-code \
--disable-overlap-schedule \
--device cpu \
--enable-torch-compile \
--torch-compile-max-bs 16 \
--host 0.0.0.0 \
--tp 3
W8A8_INT8 버전의 Llama-3.2-3B를 실행하는 예시 명령:
sglang serve \
--model-path RedHatAI/Llama-3.2-3B-quantized.w8a8 \
--trust-remote-code \
--disable-overlap-schedule \
--device cpu \
--quantization w8a8_int8 \
--enable-torch-compile \
--torch-compile-max-bs 16 \
--host 0.0.0.0 \
--tp 3
참고: --torch-compile-max-bs와 --tp 설정은 여러분의 환경에 맞게 조정해야 하는 예시예요. 예를 들어 Intel® Xeon® 6980P 서버에서 소켓 1개와 3개 서브-NUMA 클러스터를 사용하려면 --tp 3을 사용하세요.
서버가 실행되면 bench_serving 명령으로 테스트하거나, 벤치마킹 예시를 따라 여러분만의 명령이나 스크립트를 만들 수 있어요.