CPU 服务器#

本文档介绍如何在 CPU 服务器上设置 SGLang 环境并运行 LLM 推理。 SGLang 已在配备 Intel® AMX® 指令的 CPU 上启用和优化, 这些 CPU 是第 4 代或更新的 Intel® Xeon® 可扩展处理器。

优化模型列表#

以下流行的 LLM 已在 CPU 上优化并能高效运行, 包括最著名的开源模型,如 Llama 系列、Qwen 系列以及 DeepSeek 系列, 如 DeepSeek-R1 和 DeepSeek-V3.1-Terminus。

注意: 上表列出的模型标识符 已经在第 6 代 Intel® Xeon® P 核平台上进行了验证。

安装#

使用 Docker 安装#

建议使用 Docker 设置 SGLang 环境。 提供了一个 Dockerfile 以方便安装。 将下面的 <secret> 替换为您的 HuggingFace 访问令牌

# 克隆 SGLang 仓库
git clone https://github.com/sgl-project/sglang.git
cd sglang/docker

# 构建 docker 镜像
docker build -t sglang-cpu:latest -f xeon.Dockerfile .

# 启动一个 docker 容器
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, 命令列表如下。 值得注意的是,需要设置环境变量 SGLANG_USE_CPU_ENGINE=1 才能启用 CPU 引擎的 SGLang 服务。

# 创建并激活一个 conda 环境
conda create -n sgl-cpu python=3.12 -y
conda activate sgl-cpu

# 将 PyTorch CPU 设置为主要的 pip 安装渠道,以避免安装更大的 CUDA 版本并防止潜在的运行时问题。
pip config set global.index-url https://download.pytorch.org/whl/cpu
pip config set global.extra-index-url https://pypi.org/simple

# 检查是否已设置一些 conda 相关的环境变量
env | grep -i conda
# 如果没有正确设置,以下环境变量设置是必需的
export CONDA_EXE=$(which conda)
export CONDA_ROOT=${CONDA_EXE}/../..
export CONDA_PREFIX=${CONDA_ROOT}/envs/sgl-cpu
export PATH=${PATH}:${CONDA_ROOT}/bin:${CONDA_ROOT}/condabin

# 克隆 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 主包
pip install --upgrade pip setuptools
conda install -y libsqlite==3.48.0 gperftools tbb libnuma numactl
pip install .
pip install torch==2.9.0 torchvision==0.24.0 triton==3.5.0 --force-reinstall

# 构建 CPU 后端内核
cd ../sgl-kernel
cp pyproject_cpu.toml pyproject.toml
pip install .

# 其他必需的环境变量
# 建议设置在 ~/.bashrc 中,这样每次在新终端中就不必重复设置
export SGLANG_USE_CPU_ENGINE=1
export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libiomp5.so:${CONDA_PREFIX}/lib/libtcmalloc.so:${CONDA_PREFIX}/lib/libtbbmalloc.so.2

启动服务引擎#

启动 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 个等级(TP6)应用张量并行。 指定的 TP 数量是执行过程中将使用的 TP 等级数量。 在 CPU 平台上,一个 TP 等级表示一个子 NUMA 集群(SNC)。 通常我们可以从操作系统获取 SNC 信息(可用数量)。 用户可以将 TP 指定为不超过当前系统中总可用 SNC 数。

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

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

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

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

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

示例:运行 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                                               \
    --mem-fraction-static 0.8                                    \
    --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                             \
    --mem-fraction-static 0.8                  \
    --enable-torch-compile                     \
    --torch-compile-max-bs 4                   \
    --tp 6

注意:请将 --torch-compile-max-bs 设置为您部署所需的最大批处理大小, 最大可设置为 16。示例中的值 4 仅作说明。

然后您可以使用 bench_serving 命令进行测试, 或按照基准测试示例构建您自己的命令或脚本。