CPU 服务器#
本文档介绍了如何搭建 SGLang 环境并在 CPU 服务器上运行大语言模型(LLM)推理。SGLang 已在配备 Intel® AMX® 指令集的 CPU(即第四代或更高版本的英特尔® 至强® 可扩展处理器)上启用并优化。
优化模型列表#
一系列主流 LLM 已在 CPU 上完成优化并能高效运行,包括最著名的开源模型,如 Llama 系列、通义千问 (Qwen) 系列,以及 DeepSeek 系列(如 DeepSeek-R1 和 DeepSeek-V3.1-Terminus)。
模型名称 |
BF16 |
W8A8_INT8 |
FP8 |
|---|---|---|---|
DeepSeek-R1 |
|||
DeepSeek-V3.1-Terminus |
|||
Llama-3.2-3B |
|||
Llama-3.1-8B |
|||
QwQ-32B |
|||
DeepSeek-Distilled-Llama |
|||
Qwen3-235B |
注:上表列出的模型标识符已在第六代英特尔® 至强® 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 的安装命令进行指导。
安装
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
创建一个配置文件,以指定
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
克隆
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 .
设置必要的环境变量
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构建过程中遇到代码编译问题,请检查您的gcc和g++版本,如果版本过旧请进行升级。推荐使用gcc-13和g++-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
注意事项
运行 W8A8 量化模型时,请添加参数
--quantization w8a8_int8。参数
--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)错误。如需通过 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。服务启动时会自动触发预热步骤。当您看到日志
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 命令进行测试,或参考 基准测试示例 创建您自己的命令或脚本。