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 기반 설치 명령을 가이드로 참고할 수 있어요.

  1. 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
  1. 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
  1. 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 .
  1. 필요한 환경 변수를 설정하세요.
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 빌드 과정에서 코드 컴파일 문제가 발생하면 gccg++ 버전을 확인하고 오래됐다면 업그레이드하세요. 공식 Docker 컨테이너에서 검증된 gcc-13g++-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

참고:

  1. W8A8 양자화 모델 실행 시 --quantization w8a8_int8 플래그를 추가하세요.

  2. --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를 설정해야 할 수 있어요.

  3. torch.compile로 디코딩을 최적화하려면 --enable-torch-compile 플래그를 추가하세요. torch.compile 사용 시 최대 배치 크기를 지정하려면 --torch-compile-max-bs 플래그를 설정하세요. 예를 들어 --enable-torch-compile --torch-compile-max-bs 4torch.compile을 사용하고 최대 배치 크기를 4로 설정하는 것을 의미해요.

  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 명령으로 테스트하거나, 벤치마킹 예시를 따라 여러분만의 명령이나 스크립트를 만들 수 있어요.

더 알아보기 (Learn more)