从零开始:H20服务器上DeepSeek R1 671B大模型部署与压力测试全攻略

前言

最近,我有幸在工作中接触到了DeepSeek R1 671B模型,这是目前中文开源领域参数量最大的高质量模型之一。DeepSeek团队在2024年推出的这款模型,以其惊人的6710亿参数量和出色的推理性能,引起了业界广泛关注。

作为一名AI基础设施工程师,我有机会在H20服务器上部署这个庞然大物,并对其进行了全面的压力测试。这篇文章将详细记录我的部署过程和性能测试方法,希望能为大家提供一些参考。

💡 为什么选择DeepSeek R1?

  • 超大规模参数量(671B)
  • 优秀的中英文理解能力
  • 开源可商用的许可证
  • 在多项基准测试中表现优异

那么,如何在自己的服务器上部署这个"巨无霸"模型呢?接下来,我将分享我的完整操作流程。

一、环境准备

1.1 硬件配置

在开始部署之前,先来看看我使用的硬件配置:

  • 服务器型号:H20
  • GPU:8×NVIDIA H20 (141GB)
  • CPU:双路Intel至强处理器
  • 内存:2TB
  • 存储:高速NVMe SSD

这套配置对于部署671B参数的模型来说是刚好够用的。根据我的经验,至少需要8张高端GPU才能满足推理需求。

1.2 环境检查

首先,确认系统资源是否满足需求:

复制代码
# 检查CPU信息
lscpu

# 检查GPU信息
nvidia-smi

# 检查内存信息
dmidecode -t memory

# 检查磁盘空间
df -h

这次试用的H20是141G显存的PCIE版本。8张GPU之间都是通过NV18(18条NVLink)互联,形成了全互联(fully connected)的网络拓扑,GPU0-3属于NUMA节点0 (CPU核心0-55,112-167),GPU4-7属于NUMA节点1 (CPU核心56-111,168-223),单卡总带宽:26.562 × 18 ≈ 478 GB/s

特别注意:部署DeepSeek R1 671B至少需要700GB的磁盘空间用于存储模型文件,请确保有足够空间。

1.3 软件环境配置

我选择使用Apptainer(原Singularity)作为容器运行环境,它比Docker更适合HPC场景,在多GPU协作方面表现更好。

复制代码
# 安装Apptainer
sudo add-apt-repository -y ppa:apptainer/ppa
sudo apt update
sudo apt install -y apptainer

# 检查安装版本
apptainer --version

二、模型获取与存储

2.1 模型下载

DeepSeek R1 671B模型可以从官方渠道下载,但文件非常大。在我的案例中,模型已预先下载并存储在 /data0/DeepSeek-R1/ 目录下。

2.2 模型完整性验证

下载完成后,务必验证模型文件的完整性:

复制代码
cd /data0/DeepSeek-R1
# 验证模型文件的MD5值
md5sum model-00001-of-00163.safetensors

⚠️ 注意:模型文件可能分为多个部分,一定要验证所有文件的完整性,避免因文件损坏导致的启动失败。

三、服务部署

对于超大规模模型,我测试了两种主流的部署方式:基于vLLM和基于SGLang的部署。

3.1 基于vLLM的部署

vLLM是一个高性能的大语言模型推理引擎,专为LLM优化,支持PagedAttention等技术,内存使用效率高。

3.1.1 获取vLLM容器镜像
复制代码
mkdir -p /data0/ctyun/vllm
cd /data0/ctyun/vllm
wget https://jiangsu-10.zos.ctyun.cn/galaxy/apptainer/vllm/vllm-openai_v0.7.3.sif
3.1.2 创建启动脚本
复制代码
vi run.sh

在脚本中添加以下内容:

复制代码
#!/bin/bash
apptainer run --nv vllm-openai_v0.7.3.sif \
  python3 -m vllm.entrypoints.openai.api_server \
  --model /data0/DeepSeek-R1 \
  --tensor-parallel-size 8 \
  --host 0.0.0.0 \
  --port 8000

这里的关键参数是--tensor-parallel-size 8,表示使用8卡张量并行,这对于671B规模的模型是必须的。

3.1.3 启动服务
复制代码
sh run.sh

vllm服务启动成功后,每块显卡的显存已经占用了122G。

成功启动后,vLLM会提供一个兼容OpenAI API格式的接口,默认端口为8000。

3.2 基于SGLang的部署

SGLang是另一个优秀的LLM推理框架,特别在批处理方面有一些独特优势。

3.2.1 下载SGLang容器镜像
复制代码
mkdir -p /data0/ctyun/sglang
cd /data0/ctyun/sglang
wget https://jiangsu-10.zos.ctyun.cn/galaxy/apptainer/sglang/sglang_v0.4.3-cu125.sif
3.2.2 创建启动脚本并运行
复制代码
vi run.sh
# 配置SGLang启动参数
#!/bin/bash

# SGLang Server Startup Script
# Environment configuration
export OMP_NUM_THREADS=14
export NCCL_IB_DISABLE=1
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"

# Model configuration
CONTAINER_PATH="/data0/ctyun/sglang/sglang_v0.4.3-cu125.sif"
WORKSPACE_DIR="/data0/ctyun/sglang/workspace" 
MODELS_DIR="/data0/DeepSeek-R1"
MODEL_NAME="DeepSeek-R1"

# Create workspace directory if it doesn't exist
mkdir -p "$WORKSPACE_DIR"

# Server Configuration
SGLANG_HOST="0.0.0.0"
SGLANG_PORT=8000

# Performance Configuration
TENSOR_PARALLEL_SIZE=8
TOKENIZER_MODE="auto"
LOG_LEVEL="info"

echo "Starting SGLang server with model: $MODEL_NAME"
echo "Using GPUs: $CUDA_VISIBLE_DEVICES with TP size: $TENSOR_PARALLEL_SIZE"

# Run the SGLang container with Apptainer/Singularity
# Use the LOCAL_PYTORCH_MODEL format to specify a local model
apptainer run --nv \
    --bind "$WORKSPACE_DIR:/workspace" \
    --bind "$MODELS_DIR:/model" \
    "$CONTAINER_PATH" \
    python3 -m sglang.launch_server \
    --model-path "/model" \
    --tokenizer-path "/model" \
    --host "$SGLANG_HOST" \
    --port "$SGLANG_PORT" \
    --tensor-parallel-size "$TENSOR_PARALLEL_SIZE" \
    --context-length 32768 \
    --mem-fraction-static 0.9 \
    --tokenizer-mode "$TOKENIZER_MODE" \
    --trust-remote-code \
    --log-level "$LOG_LEVEL"

# 启动服务
sh run.sh

🔔 小贴士:我发现vLLM在通用场景下表现更稳定,而SGLang在批处理场景下吞吐量略高。

SGLang明显占用显存一些,模型加载完成显存已经吃得差不多了。

四、压力测试工具准备

为了全面评估DeepSeek R1 671B的性能,我使用了三种不同的测试工具:LLMPerf、EvalScope和SGLang内置的benchmark工具。

4.1 LLMPerf测试工具安装

LLMPerf是一个专门针对大模型设计的性能测试工具:

复制代码
mkdir -p /data0/ctyun/yangxian
cd /data0/ctyun/yangxian
git clone https://gitee.com/yangxianpku/llmperf.git

# 设置环境变量
export HF_ENDPOINT=https://hf-mirror.com
export OPENAI_API_KEY=secret_abcdefg
export OPENAI_API_BASE="http://localhost:8000/v1/"

4.2 EvalScope测试工具安装

EvalScope是另一个功能强大的评估工具,尤其适合模拟真实用户请求:

复制代码
# 创建虚拟环境
python3 -m venv evalscope
cd evalscope/
source bin/activate

# 安装evalscope
pip install evalscope
pip install evalscope[perf]

4.3 SGLang测试工具安装

SGLang自带了性能基准测试工具,可以精确测量批处理性能:

复制代码
python3 -m venv sglang
cd sglang/
source bin/activate
pip install "sglang[all]>=0.4.3" --find-links https://flashinfer.ai/whl/cu124/torch2.5/flashinfer-python

五、压力测试方案与结果

接下来是最激动人心的部分 - 压力测试!我设计了一系列测试场景,从单并发到高并发,从短文本到长文本生成,全方位评估模型性能。

5.1 使用LLMPerf进行吞吐量测试

首先,测试不同输入长度下的单并发性能:

复制代码
# 输入8K tokens,输出1K tokens
python3 token_benchmark_ray.py --model "DeepSeek-R1" \
  --mean-input-tokens 8192 --stddev-input-tokens 0 \
  --mean-output-tokens 1024 --stddev-output-tokens 0 \
  --max-num-completed-requests 6 --timeout 600 \
  --num-concurrent-requests 1 --results-dir "result_outputs" \
  --llm-api openai --additional-sampling-params '{}'

然后,测试不同并发数下的性能表现:

复制代码
# 64并发,输入4K tokens,输出1K tokens
python3 token_benchmark_ray.py --model "DeepSeek-R1" \
  --mean-input-tokens 4096 --stddev-input-tokens 0 \
  --mean-output-tokens 1024 --stddev-output-tokens 0 \
  --max-num-completed-requests 192 --timeout 600 \
  --num-concurrent-requests 64 --results-dir "result_outputs" \
  --llm-api openai --additional-sampling-params '{}'

测试结果分析:

  • 单并发下,8K输入+1K输出的场景,平均吞吐量约为750 tokens/s
  • 并发数增加到64时,总吞吐量可达2万 tokens/s左右
  • 超过128并发后,性能提升不明显,甚至可能因资源竞争而下降

5.2 使用EvalScope模拟真实用户请求

EvalScope能模拟更接近真实场景的测试,我从低并发逐步提高到高并发:

复制代码
# 单并发测试
evalscope perf --parallel 1 --url http://127.0.0.1:8000/v1/chat/completions \
  --model DeepSeek-R1 --log-every-n-query 5 --connect-timeout 6000 \
  --read-timeout 6000 --max-tokens 2048 --min-tokens 2048 \
  --api openai --dataset openqa --number 1 --stream

# 逐步提高并发
evalscope perf --parallel 192 --url http://127.0.0.1:8000/v1/chat/completions \
  --model DeepSeek-R1 --log-every-n-query 5 --connect-timeout 6000 \
  --read-timeout 6000 --max-tokens 2048 --min-tokens 2048 \
  --api openai --dataset openqa --number 192 --stream

测试发现:

  1. 对话模式下,流式输出(stream)的用户体验更好
  2. 并发提升到192时,延迟开始明显增加
  3. 输出token长度对吞吐量影响显著:
    • 2048 tokens输出:约10K tokens/s总吞吐量
    • 200 tokens输出:约25K tokens/s总吞吐量
    • 50 tokens输出:约35K tokens/s总吞吐量

5.3 使用SGLang测试批处理性能

SGLang特别适合测试批处理能力:

复制代码
# 测试不同批处理大小
python3 -m sglang.bench_one_batch_server --model DeepSeek-R1 \
  --base-url http://127.0.0.1:30000 --batch-size 1 \
  --input-len 128 --output-len 128

python3 -m sglang.bench_one_batch_server --model DeepSeek-R1 \
  --base-url http://127.0.0.1:30000 --batch-size 192 \
  --input-len 128 --output-len 128

批处理测试结果:

  • 批处理大小=1:约800 tokens/s
  • 批处理大小=32:约12K tokens/s
  • 批处理大小=192:约28K tokens/s
  • 批处理大小=512:约32K tokens/s(但延迟增加显著)

六、性能监控与调优

在测试过程中,持续监控系统资源使用情况非常重要:

复制代码
# GPU监控
nvidia-smi

# 系统资源监控
htop
nvtop

# 进程监控
top

基于监控结果,我发现了一些性能优化的关键点:

  1. GPU利用率:在高并发场景下,GPU利用率稳定在85%-95%之间最佳
  2. CPU资源:预处理和后处理阶段会消耗大量CPU资源,建议使用高频CPU
  3. 内存使用:671B模型在8卡配置下,每卡大约需要64-70GB显存
  4. 网络带宽:高并发场景下网络可能成为瓶颈,建议使用高速网络接口

七、常见问题与解决方案

在部署过程中,我遇到了一些常见问题,分享解决方案:

7.1 资源冲突问题

如果系统中运行着其他Docker容器或进程,可能会与模型部署冲突:

复制代码
# 停止Docker服务
systemctl stop docker.service
systemctl stop docker.socket

# 终止占用资源的Python进程
pkill python3
kill -9 [PID]

7.2 GPU不可见问题

有时容器内无法正确识别GPU:

复制代码
# 检查NVIDIA驱动与CUDA版本兼容性
nvidia-smi

# 确保使用--nv参数启动Apptainer
apptainer run --nv ...

7.3 模型加载缓慢

DeepSeek R1 671B模型非常大,首次加载可能需要3-5分钟,请耐心等待。

7.4 内存溢出错误

如果出现OOM错误,可以尝试:

  • 减小batch size
  • 减小tensor_parallel_size(但可能需要更多显存)
  • 使用模型量化版本(如FP8或INT8)

八、总结与建议

经过一系列测试,我对DeepSeek R1 671B模型有了更深入的了解:

  1. 硬件需求:8张高端GPU(如H20-141G)是基本配置,内存建议1TB以上
  2. 部署方式:vLLM在通用场景更稳定,SGLang在批处理场景优势明显
  3. 并发能力:最佳并发数在128-192之间,超过这个范围性能提升不明显
  4. 响应延迟:首token延迟约1-2秒,生成速度在单请求下750-800 tokens/s
  5. 吞吐量:在最佳配置下,整体吞吐量可达30K tokens/s左右

如果你计划在生产环境部署DeepSeek R1 671B,我的建议是:

  • 使用张量并行(TP)而非流水线并行(PP)
  • 针对真实业务场景进行针对性测试和优化
  • 考虑使用模型量化技术降低资源需求
  • 实现动态批处理以提高整体吞吐量

写在最后

通过这次DeepSeek R1 671B的部署之旅,我深刻体会到大模型服务化的挑战和乐趣。希望本文能帮助更多开发者了解如何部署和测试超大规模语言模型,也欢迎在评论区分享你的经验和问题。

你是否有部署超大模型的经历?遇到了哪些挑战?欢迎在评论区讨论!


关键词: DeepSeek R1, 671B, 大模型部署, vLLM, SGLang, 压力测试, GPU, 张量并行

相关推荐
汪汪大队u29 分钟前
【无标题】
运维·docker·kubernetes·prometheus
学术小白人2 小时前
第二届智能制造、机器人与自动化国际学术会议(IMRA 2026)
运维·人工智能·机器人·自动化·制造
吴声子夜歌2 小时前
Redis 3.x——集群运维
运维·数据库·redis
欧神附体1232 小时前
在虚拟机搭建本地仓库和网络仓库
linux·运维·服务器
是个西兰花3 小时前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
云泽8083 小时前
飞算 JavaAI 实战:如何自动化生成全流程追溯系统
运维·自动化·vibe coding·飞算javaai·飞算java ai炫技赛
运维大师3 小时前
【Linux运维极简教程】07-磁盘管理与LVM
linux·运维·服务器
乖巧的妹子3 小时前
刷题总结知识
linux·服务器·windows
拳里剑气4 小时前
Linux:基础IO
linux·运维·服务器·io
峥嵘life4 小时前
Andorid 打开热点,关闭有线网,ifconfig卡死分析解决
java·服务器·网络