DeepSeek 本地部署最佳实践(三):SGLang + 分布式推理部署满血版模型

向量数据库大模型容器

点击下方

卡片

,关注“

慢慢学AIGC

前言

本文为 DeepSeek 本地部署最佳实践系列文章的完结篇,只关注 R1 671B 满血版模型部署, 建议有条件的读者阅读

本文实践最低硬件配置为 8 卡 H20(序列长度受限,不建议)推荐 16 卡 H100 或更高配置

对于老卡如 A100/A800,由于不支持 FP8 精度,显存开销将翻倍,因此需要至少 4 机 32 卡 A100/A800 才能运行本文案例。

SGLang 简介

picture.image

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 网络,在日志中会看到如下内容:

picture.image

其中一个节点 GPU 显存占用情况(使用 nvidia-smi 命令):

picture.image

由于开启了张量并行(TP=16),每张 GPU 上的显存开销基本相同,符合预期。

Open WebUI 接入本地部署满血版 R1

步骤和第二篇大同小异。SGLang 服务启动后,对外暴露的也是 OpenAI 兼容 API,因此可以直接通过 [服务器IP]:端口号方式访问。

下面是实际对话效果:

picture.image

picture.image

有了本地部署的满血版 R1,可以忘掉 ChatGPT,忘掉 Claude,忘掉“服务器繁忙”的 DeepSeek,忘掉第三方 api,忘掉蒸馏,忘掉量化,获得 token 自由。

总结

至此,DeepSeek 本地部署系列文章要画上句号了。

感觉还有点意犹未尽,用几张图来表达吧。

picture.image

picture.image

picture.image

picture.image

picture.image

picture.image

picture.image

picture.image

(凤雏卒)

参考链接

https://github.com/sgl-project/sglang/tree/main/benchmark/deepseek\_v3


扫描下方

二维码

,关注“

慢慢学AIGC

picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
在火山引擎云搜索服务上构建混合搜索的设计与实现
本次演讲将重点介绍字节跳动在混合搜索领域的探索,并探讨如何在多模态数据场景下进行海量数据搜索。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论