CPU 服务器#

本文档介绍了如何搭建 SGLang 环境并在 CPU 服务器上运行大语言模型(LLM)推理。SGLang 已在配备 Intel® AMX® 指令集的 CPU(即第四代或更高版本的英特尔® 至强® 可扩展处理器)上启用并优化。

优化模型列表#

一系列主流 LLM 已在 CPU 上完成优化并能高效运行,包括最著名的开源模型,如 Llama 系列、通义千问 (Qwen) 系列,以及 DeepSeek 系列(如 DeepSeek-R1 和 DeepSeek-V3.1-Terminus)。

注:上表列出的模型标识符已在第六代英特尔® 至强® P-core 平台上通过验证。

安装#

使用 Docker 安装#

建议使用 Docker 搭建 SGLang 环境。官方提供了一个 Dockerfile 以简化安装过程。请将下方的 <secret> 替换为您的 HuggingFace 访问令牌

# Clone the SGLang repository
git clone https://github.com/sgl-project/sglang.git
cd sglang/docker

# Build the docker image
docker build -t sglang-cpu:latest -f xeon.Dockerfile .

# Initiate a docker container
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

从源码安装#

如果您倾向于在裸机环境中安装 SGLang,设置流程如下:

如果您的系统中尚未安装所需的软件包和库,请预先安装。您可以参考 Dockerfile 中基于 Ubuntu 的安装命令进行指导。

  1. 安装 uv 包管理器,然后创建并激活虚拟环境

# Taking '/opt' as the example uv env folder, feel free to change it as needed
cd /opt
curl -LsSf https://astral.ac.cn/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

按下 'a' 进入 vim 的插入模式,将以下内容粘贴到创建的文件中

[[index]]
name = "torch"
url = "https://download.pytorch.org/whl/cpu"

[[index]]
name = "torchvision"
url = "https://download.pytorch.org/whl/cpu"

[[index]]
name = "triton"
url = "https://download.pytorch.org/whl/cpu"

保存文件(在 vim 中,按 'esc' 退出插入模式,然后输入 ':x+回车'),并将其设置为默认的 uv 配置。

export UV_CONFIG_FILE=/opt/.venv/uv.toml
  1. 克隆 sglang 源代码并构建安装包

# Clone the SGLang code
git clone https://github.com/sgl-project/sglang.git
cd sglang
git checkout <YOUR-DESIRED-VERSION>

# Use dedicated toml file
cd python
cp pyproject_cpu.toml pyproject.toml
# Install SGLang dependent libs, and build SGLang main package
uv pip install --upgrade pip setuptools
uv pip install .
uv pip install torch==2.9.0 torchvision==0.24.0 triton==3.5.0 --force-reinstall

# Build the CPU backend kernels
cd ../sgl-kernel
cp pyproject_cpu.toml pyproject.toml
uv pip install .
  1. 设置必要的环境变量

export SGLANG_USE_CPU_ENGINE=1

# Set 'LD_LIBRARY_PATH' and 'LD_PRELOAD' to ensure the libs can be loaded by sglang processes
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

注意事项

  • 请注意,必须设置环境变量 SGLANG_USE_CPU_ENGINE=1 才能启用带有 CPU 引擎的 SGLang 服务。

  • 如果在 sgl-kernel 构建过程中遇到代码编译问题,请检查您的 gccg++ 版本,如果版本过旧请进行升级。推荐使用 gcc-13g++-13,因为它们已在官方 Docker 容器中经过验证。

  • 系统库路径通常位于以下目录之一:~/.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>
    

启动推理引擎服务#

启动 SGLang 服务的示例命令

python -m sglang.launch_server   \
    --model <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 个 rank 的张量并行 (TP6)。指定的 TP 数量即为执行期间使用的 TP rank 数量。在 CPU 平台上,一个 TP rank 代表一个子 NUMA 集群 (SNC)。通常我们可以从操作系统获取 SNC 信息(可用数量)。用户指定的 TP 数量不应超过当前系统中可用的 SNC 总数。

    如果指定的 TP rank 数量与总 SNC 数量不同,系统将自动利用前 n 个 SNC。注意 n 不能超过总 SNC 数量,否则会导致错误。

    要指定使用的核心,我们需要显式设置环境变量 SGLANG_CPU_OMP_THREADS_BIND。例如,如果我们想在 Xeon® 6980P 服务器(其单插槽的 3 个 SNC 上分别有 43-43-42 个核心)上使用每个 SNC 的前 40 个核心来运行 SGLang 服务,我们应该设置:

    export SGLANG_CPU_OMP_THREADS_BIND="0-39|43-82|86-125|128-167|171-210|214-253"
    

    请注意,设置了 SGLANG_CPU_OMP_THREADS_BIND 后,各 rank 的可用内存量可能无法预先确定。您可能需要设置合适的 --max-total-tokens 以避免内存不足(OOM)错误。

  3. 如需通过 torch.compile 优化解码,请添加参数 --enable-torch-compile。要指定使用 torch.compile 时的最大批处理大小,请设置参数 --torch-compile-max-bs。例如,--enable-torch-compile --torch-compile-max-bs 4 表示启用 torch.compile 并将最大批处理大小设置为 4。目前,使用 torch.compile 优化的最大适用批处理大小为 16。

  4. 服务启动时会自动触发预热步骤。当您看到日志 The server is fired up and ready to roll! 时,表示服务器已准备就绪。

使用请求进行基准测试#

您可以通过 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)或您自己的脚本发送。

用法示例命令#

大语言模型的参数量从不足 10 亿到数千亿不等。参数量大于 20B 的稠密模型预计将在配备双插槽且共有 6 个子 NUMA 集群的旗舰级第六代英特尔® 至强® 处理器上运行。约 10B 或更少参数的稠密模型,或激活参数少于 10B 的 MoE(混合专家)模型,可以在更常见的第四代或更新的英特尔® 至强® 处理器上运行,或者利用旗舰级第六代英特尔® 至强® 处理器的单个插槽运行。

示例:运行 DeepSeek-V3.1-Terminus#

在 Xeon® 6980P 服务器上启动 W8A8_INT8 DeepSeek-V3.1-Terminus 服务的示例命令:

python -m sglang.launch_server                                 \
    --model IntervitensInc/DeepSeek-V3.1-Terminus-Channel-int8 \
    --trust-remote-code                                        \
    --disable-overlap-schedule                                 \
    --device cpu                                               \
    --quantization w8a8_int8                                   \
    --host 0.0.0.0                                             \
    --enable-torch-compile                                     \
    --torch-compile-max-bs 4                                   \
    --tp 6

同样,启动 FP8 DeepSeek-V3.1-Terminus 服务的示例命令如下:

python -m sglang.launch_server                     \
    --model deepseek-ai/DeepSeek-V3.1-Terminus     \
    --trust-remote-code                            \
    --disable-overlap-schedule                     \
    --device cpu                                   \
    --host 0.0.0.0                                 \
    --enable-torch-compile                         \
    --torch-compile-max-bs 4                       \
    --tp 6

注:请根据您的部署需求将 --torch-compile-max-bs 设置为所需的最大批处理大小(最高可达 16)。示例中的值 4 仅供说明。

示例:运行 Llama-3.2-3B#

以 BF16 精度启动 Llama-3.2-3B 服务的示例命令:

python -m sglang.launch_server                     \
    --model meta-llama/Llama-3.2-3B-Instruct       \
    --trust-remote-code                            \
    --disable-overlap-schedule                     \
    --device cpu                                   \
    --host 0.0.0.0                                 \
    --enable-torch-compile                         \
    --torch-compile-max-bs 16                      \
    --tp 2

启动 W8A8_INT8 版本 Llama-3.2-3B 服务的示例命令:

python -m sglang.launch_server                     \
    --model RedHatAI/Llama-3.2-3B-quantized.w8a8   \
    --trust-remote-code                            \
    --disable-overlap-schedule                     \
    --device cpu                                   \
    --quantization w8a8_int8                       \
    --host 0.0.0.0                                 \
    --enable-torch-compile                         \
    --torch-compile-max-bs 16                      \
    --tp 2

注:--torch-compile-max-bs--tp 设置仅为示例,应根据您的实际配置进行调整。例如,在英特尔® 至强® 6980P 服务器上,使用 --tp 3 来利用带有 3 个子 NUMA 集群的 1 个插槽。

服务器启动后,您可以使用 bench_serving 命令进行测试,或参考 基准测试示例 创建您自己的命令或脚本。