点击下方
卡片
,关注“
慢慢学AIGC
”
前言
本文为 DeepSeek 本地部署最佳实践系列文章的完结篇,只关注 R1 671B 满血版模型部署, 建议有条件的读者阅读 。
本文实践最低硬件配置为 8 卡 H20(序列长度受限,不建议) , 推荐 16 卡 H100 或更高配置 。
对于老卡如 A100/A800,由于不支持 FP8 精度,显存开销将翻倍,因此需要至少 4 机 32 卡 A100/A800 才能运行本文案例。
SGLang 简介
SGLang 是一个专为大型语言模型和视觉语言模型设计的高速服务框架。它通过
协同设计后端运行时与前端语言
,使开发者与模型的交互更快速、更可控。核心功能包括:
- 高效后端运行时
:提供高性能服务支持,具备以下特性
- RadixAttention技术
:实现前缀缓存,加速重复模式的推理
- 约束式跳跃解码
:提升特定场景生成效率
- 零开销CPU调度器
:优化资源管理
- 连续批处理
:增强吞吐量
- 分页注意力机制
:高效内存管理
- 张量并行
:多GPU扩展
- FlashInfer内核
:加速注意力计算
- 分块预填充
:降低延迟
- 多重量化支持
:FP8/INT4/AWQ/GPTQ 量化部署
- 灵活前端语言
:为LLM应用开发提供直观编程接口,支持
- 链式生成调用
- 高级提示工程
- 流程控制(分支/循环)
- 多模态输入处理
- 并行执行
- 外部系统交互
- 广泛模型兼容性
:支持主流生成模型(Llama/Gemma/Mistral/千问/DeepSeek/LLaVA等)、嵌入模型(e5-mistral/gte/mcdse)和奖励模型(Skywork),并可轻松扩展新模型集成
- 活跃社区生态
:作为开源项目,SGLang 拥有活跃的开发者社区并已在工业界得到实际应用。
SGLang Github 代码仓库:
https://github.com/sgl-project/sglang
大模型推理框架众多,像 vllm、TensorRT-LLM 等,为什么我们选择 SGLang?
SGLang 团队与 DeepSeek 团队紧密协作,实现了
DeepSeek V3 FP8 模型在NVIDIA 和 AMD GPU 上的首日支持
。SGLang 通过 MLA(Multi Latent Attention)优化和 DP(数据并行)注意力机制支持,现已成为运行 DeepSeek 系列模型的
最佳开源 LLM 推理引擎
。该方案已获得 DeepSeek 官方团队推荐。
SGLang 环境搭建
首先需要保证每个 GPU 机器都已安装相同版本 Nvidia 驱动、
网卡驱动、
容器环境等,使用同一基础镜像(本文使用 nvcr.io/nvidia/pytorch:24.12-py3)。需要为每个节点额外配置 SGLang 环境:
conda create -n sglang python=3.10
conda activate sglang
pip install "sglang[all]>=0.4.1.post5" --find-links https://flashinfer.ai/whl/cu124/torch2.4/flashinfer
保证每个节点都可以访问 DeepSeek R1 671B 权重,大小 642GB。建议放在共享存储中。
在两个节点上分别运行:
# node 0
python -m sglang.launch_server --model-path DeepSeek-R1 --tp 16 --dist-init-addr [master_ip]:5000 --nnodes 2 --node-rank 0 --trust-remote-code
# node 1
python -m sglang.launch_server --model-path DeepSeek-R1 --tp 16 --dist-init-addr [master_ip]:5000 --nnodes 2 --node-rank 1 --trust-remote-code
需要将 [master_ip] 替换为你机器的真实 IP,一般将 node 0 设置为 master。
对于 IB/RoCE 网卡环境,启动前需要额外配置 NCCL 相关的环境变量:
NCCL_SOCKET_IFNAME=eth0
NCCL_NVLS_ENABLE=0
NCCL_DEBUG=INFO
NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7
NCCL_IB_QPS_PER_CONNECTION=8
NCCL_SOCKET_FAMILY=AF_INET
NCCL_IB_TIMEOUT=22
NCCL_IB_DISABLE=0
NCCL_IB_RETRY_CNT=12
SGLang 启动日志如下:
server_args=ServerArgs(
model_path='DeepSeek-R1',
tokenizer_path='DeepSeek-R1',
tokenizer_mode='auto',
load_format='auto',
trust_remote_code=True,
dtype='auto',
kv_cache_dtype='auto',
quantization=None,
context_length=None,
device='cuda',
served_model_name='DeepSeek-R1',
chat_template=None,
is_embedding=False,
revision=None,
skip_tokenizer_init=False,
return_token_ids=False,
host='0.0.0.0',
port=30000,
mem_fraction_static=0.79,
max_running_requests=None,
max_total_tokens=None,
chunked_prefill_size=8192,
max_prefill_tokens=16384,
schedule_policy='lpm',
schedule_conservativeness=1.0,
cpu_offload_gb=0,
prefill_only_one_req=False,
tp_size=16,
stream_interval=1,
random_seed=703813614,
constrained_json_whitespace_pattern=None,
watchdog_timeout=300,
download_dir=None,
base_gpu_id=0,
log_level='info',
log_level_http=None,
log_requests=False,
show_time_cost=False,
enable_metrics=False,
decode_log_interval=40,
api_key=None,
file_storage_pth='SGLang_storage',
enable_cache_report=False,
dp_size=1,
load_balance_method='round_robin',
ep_size=1,
dist_init_addr='master-0:22579',
nnodes=2,
node_rank=0,
json_model_override_args='{}',
lora_paths=None,
max_loras_per_batch=8,
attention_backend='flashinfer',
sampling_backend='flashinfer',
grammar_backend='outlines',
speculative_draft_model_path=None,
speculative_algorithm=None,
speculative_num_steps=5,
speculative_num_draft_tokens=64,
speculative_eagle_topk=8,
enable_double_sparsity=False,
ds_channel_config_path=None,
ds_heavy_channel_num=32,
ds_heavy_token_num=256,
ds_heavy_channel_type='qk',
ds_sparse_decode_threshold=4096,
disable_radix_cache=False,
disable_jump_forward=False,
disable_cuda_graph=False,
disable_cuda_graph_padding=False,
disable_outlines_disk_cache=False,
disable_custom_all_reduce=False,
disable_mla=False,
disable_overlap_schedule=False,
enable_mixed_chunk=False,
enable_dp_attention=False,
enable_ep_moe=False,
enable_torch_compile=False,
torch_compile_max_bs=32,
cuda_graph_max_bs=160,
torchao_config='',
enable_nan_detection=False,
enable_p2p_check=False,
triton_attention_reduce_in_fp32=False,
triton_attention_num_kv_splits=8,
num_continuous_decode_steps=1,
delete_ckpt_after_loading=False)
……
INFO: Started server process [118]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:30000 (Press CTRL+C to quit)
如果正确配置了 IB/RoCE 网络,在日志中会看到如下内容:
其中一个节点 GPU 显存占用情况(使用 nvidia-smi 命令):
由于开启了张量并行(TP=16),每张 GPU 上的显存开销基本相同,符合预期。
Open WebUI 接入本地部署满血版 R1
步骤和第二篇大同小异。SGLang 服务启动后,对外暴露的也是 OpenAI 兼容 API,因此可以直接通过 [服务器IP]:端口号方式访问。
下面是实际对话效果:
有了本地部署的满血版 R1,可以忘掉 ChatGPT,忘掉 Claude,忘掉“服务器繁忙”的 DeepSeek,忘掉第三方 api,忘掉蒸馏,忘掉量化,获得 token 自由。
总结
至此,DeepSeek 本地部署系列文章要画上句号了。
感觉还有点意犹未尽,用几张图来表达吧。
(凤雏卒)
参考链接
https://github.com/sgl-project/sglang/tree/main/benchmark/deepseek\_v3
扫描下方
二维码
,关注“
慢慢学AIGC
”