L20部署deepseek-v4-flash
本文记录了在 8 卡 NVIDIA L20 服务器上部署 DeepSeek-V4-Flash 的完整过程。前半部分是可直接复制到新机器的部署步骤,后半部分是部署过程中遇到的踩坑记录与根因分析(vLLM 不兼容、MXFP4 算子加载失败等),方便排错时回查。
1. 环境信息
| 项目 | 配置 |
|---|---|
| 服务器 | L20 推理节点(10.0.0.x,内网) |
| GPU | 8 × NVIDIA L20(每卡 48GB,CC 8.9) |
| OS | Ubuntu,CUDA 13.2 |
| Conda 环境 | ktrans(Python 3.11) |
| 模型 | DeepSeek-V4-Flash(ModelScope 下载) |
| 模型路径 | /data1/models/DeepSeek-V4-Flash |
| 服务端口 | 30000 |
2. 安装指南(迁移部署)
重要: 以下步骤可用于在另一台服务器上复制本套部署。
前置条件
| 前置条件 | 最低要求 |
|---|---|
| GPU | ≥ 8 × NVIDIA L20 (48GB) 或同等算力 |
| CUDA | ≥ 12.4(推荐 13.x) |
| 系统内存 | ≥ 128 GB |
| 磁盘空间 | ≥ 200 GB(模型约 100GB + 环境约 20GB) |
| OS | Ubuntu 20.04 / 22.04 |
| Conda | Miniconda3 或 Anaconda |
第一步:检查硬件环境
# 确认 GPU 数量和型号
nvidia-smi
# 确认 CUDA 版本
nvcc --version
# 确认内存
free -h
# 确认磁盘空间
df -h /data1 # 或你存放模型的目录第二步:安装 Miniconda(如果没有)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3
eval "$($HOME/miniconda3/bin/conda shell.bash hook)"
conda init
source ~/.bashrc第三步:创建 Conda 环境并设置 CUDA 路径
# 创建 Python 3.11 环境
conda create -n ktrans python=3.11 -y
conda activate ktrans
# 设置 CUDA 路径(根据你的 CUDA 安装位置调整)
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH第四步:安装 Python 包
重要: 包的安装顺序很重要。先装sglang-kt(会自动拉flashinfer 0.6.3),然后再升级flashinfer。
# 国内环境建议使用清华源
PIP_MIRROR="-i https://pypi.tuna.tsinghua.edu.cn/simple"
# 1. 安装核心框架
pip install sglang-kt ktransformers $PIP_MIRROR
# 2. 安装辅助依赖
pip install tilelang transformers==4.57.1 $PIP_MIRROR
# 3. 【关键】升级 flashinfer 到 >= 0.6.9(否则 MXFP4 算子无法加载)
pip install --upgrade flashinfer-python flashinfer-cubin $PIP_MIRROR
# 4. 验证安装
python3 -c "import flashinfer; print(f'flashinfer version: {flashinfer.__version__}')"
python3 -c "import sglang; print('sglang imported successfully')"
python3 -c "import ktransformers; print('ktransformers imported successfully')"警告: 升级flashinfer后会提示sglang-kt 0.6.2.post3 requires flashinfer_cubin==0.6.3依赖冲突,可以安全忽略,不影响实际运行。
第五步:下载模型
# 方式一:ModelScope(国内推荐,速度快)
pip install modelscope $PIP_MIRROR
python3 -c "
from modelscope import snapshot_download
snapshot_download('deepseek-ai/DeepSeek-V4-Flash', local_dir='/data1/models/DeepSeek-V4-Flash')
"
# 方式二:HuggingFace(需要科学上网)
# pip install huggingface_hub
# huggingface-cli download deepseek-ai/DeepSeek-V4-Flash --local-dir /data1/models/DeepSeek-V4-Flash说明: 模型约 100GB,下载时间取决于网络带宽。ModelScope 国内速度通常在 50–100MB/s。
3. 启动与验证服务
一键启动脚本
将以下内容保存为 /home/admin/start_deepseek_v4_flash.sh:
#!/bin/bash
# DeepSeek-V4-Flash 启动脚本
# 使用方式:bash start_deepseek_v4_flash.sh
set -e
# ====== 配置区域(根据实际情况修改)======
MODEL_PATH="/data1/models/DeepSeek-V4-Flash" # 模型路径
PORT=30000 # 服务端口
TP_SIZE=8 # 张量并行度(= GPU 数量)
CONDA_ENV="ktrans" # Conda 环境名
CPU_INFER_THREADS=112 # CPU 推理线程数(建议 = 物理核心数)
MEM_FRACTION=0.75 # GPU 显存占用比例
LOG_FILE="/home/admin/sglang.log" # 日志文件路径
# ============================================
# 激活环境
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
source $HOME/miniconda3/bin/activate $CONDA_ENV
# 设置 DeepSeek-V4 专用环境变量
export SGLANG_DSV4_MODE=2604
export SGLANG_DSV4_2604_SUBMODE=2604B
export SGLANG_DSV4_FP4_EXPERTS=True
export SGLANG_APPLY_CONFIG_BACKUP=none
export PYTHONUNBUFFERED=1
# 停止旧进程
pkill -f sglang.launch_server 2>/dev/null || true
sleep 2
# 启动服务
echo "[$(date)] 启动 DeepSeek-V4-Flash 服务..."
echo "[$(date)] 模型路径: $MODEL_PATH"
echo "[$(date)] 服务端口: $PORT"
echo "[$(date)] TP 并行度: $TP_SIZE"
echo "[$(date)] 日志文件: $LOG_FILE"
nohup python3 -m sglang.launch_server \
--model-path $MODEL_PATH \
--host 0.0.0.0 \
--port $PORT \
--tp $TP_SIZE \
--kt-method MXFP4 \
--kt-gpu-experts-ratio 1.0 \
--mem-fraction-static $MEM_FRACTION \
--kt-cpuinfer $CPU_INFER_THREADS \
--kt-threadpool-count 4 \
--trust-remote-code > $LOG_FILE 2>&1 &
echo "[$(date)] 服务已在后台启动,PID: $!"
echo "[$(date)] 首次启动需要约 5 分钟完成 CUDA Graph 捕获,请耐心等待"
echo ""
echo "查看日志: tail -f $LOG_FILE"
echo "检查健康: curl http://localhost:$PORT/health"
echo "停止服务: pkill -f sglang.launch_server"赋予执行权限并启动:
chmod +x /home/admin/start_deepseek_v4_flash.sh
bash /home/admin/start_deepseek_v4_flash.sh验证服务
# 等待服务启动(首次约 5 分钟)
# 观察日志,看到 "The server is fired up and ready to roll!" 即启动成功
tail -f /home/admin/sglang.log
# 健康检查
curl http://localhost:30000/health
# 简单对话测试
curl -s http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/data1/models/DeepSeek-V4-Flash",
"messages": [{"role": "user", "content": "你好,请介绍一下你自己"}],
"max_tokens": 128
}' | python3 -m json.tool设置开机自启(可选)
# 创建 systemd 服务
sudo tee /etc/systemd/system/deepseek-v4-flash.service << 'EOF'
[Unit]
Description=DeepSeek-V4-Flash LLM Service
After=network.target
[Service]
Type=forking
User=admin
WorkingDirectory=/home/admin
ExecStart=/bin/bash /home/admin/start_deepseek_v4_flash.sh
ExecStop=/usr/bin/pkill -f sglang.launch_server
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable deepseek-v4-flash
sudo systemctl start deepseek-v4-flash4. 关键环境变量说明
| 环境变量 | 值 | 说明 |
|---|---|---|
SGLANG_DSV4_MODE | 2604 | 启用 DeepSeek-V4 专用模式 |
SGLANG_DSV4_2604_SUBMODE | 2604B | V4-Flash 子模式(区别于 V4 完整版) |
SGLANG_DSV4_FP4_EXPERTS | True | 指定 routed experts 使用 FP4 量化 |
SGLANG_APPLY_CONFIG_BACKUP | none | 防止 sglang 劫持 config.json |
5. 性能数据
| 指标 | 数值 |
|---|---|
| CUDA Graph 捕获时间 | ~246 秒(首次启动) |
max_total_num_tokens | 755,200 |
| 每卡可用显存(KV Cache) | ~9 GB |
| 短文本生成(26 tokens) | 2.6 秒(TTFT ~1s) |
| 中等文本生成(256 tokens) | 7.1 秒(~36 tokens/s) |
| 长文本生成(512 tokens) | 12.8 秒(~40 tokens/s) |
6. 踩坑记录与根因分析
坑 1:vLLM 完全不支持 DeepSeek-V4-Flash
现象:使用 vLLM 启动时直接报错,模型架构 DeepseekV4ForCausalLM 不被支持。
原因:DeepSeek-V4-Flash 采用了全新的低秩 MoE 专家架构(routed expert 维度为 [256, 512, 2048]),并使用 MXFP4 量化格式存储权重。vLLM 的 FusedMoE 算子不支持这种非对齐维度。
尝试过的方案:
- 标准 vLLM:不支持模型架构
- vLLM 专用镜像
docker.m.daocloud.io/vllm/vllm-openai:deepseekv4-cu130:仍然不支持 - 各种 vLLM 启动参数调优:无效
结论: 放弃 vLLM 方案,改用 sglang-kt + ktransformers。坑 2:sglang-kt 框架选型与环境搭建
方案来源:参考社区(Reddit、GitHub Issues)中使用 L20 成功部署 V4-Flash 的案例,确定使用 sglang-kt + ktransformers 框架。
搭建过程:
# 创建 conda 环境
conda create -n ktrans python=3.11
conda activate ktrans
# 安装核心包
pip install sglang-kt ktransformers flashinfer-python flashinfer-cubin
pip install tilelang transformers==4.57.1说明:
- 需要从清华镜像源安装:
-i https://pypi.tuna.tsinghua.edu.cn/simplektransformers需要 CUDA toolkit 和 C++ 编译工具链
坑 3:MXFP4 算子导入失败 → 维度断言崩溃(核心问题)
现象:服务启动后在 CUDA Graph 捕获阶段崩溃,报错:
Exception: Capture cuda graph failed: DEBUG_DIM_ERROR:
hidden_states.shape=torch.Size([160, 4096]),
w1.shape=torch.Size([256, 512, 2048]), padded_size=0排查过程:
- 初步分析:
w1.shape=[256, 512, 2048]是 V4-Flash 低秩 MoE 专家在 TP=8 下切分后的维度,而hidden_states=4096与w1最后一维2048不对齐。 - 注入调试日志:在
kt_ep_wrapper.py中注入logger.error调试信息,追踪gpu_method的真实类型。 - 发现关键线索:在
sglang.log中发现了被忽略的启动警告:
DSV4 side-effect import failed: sglang.srt.layers.quantization.mxfp4_deepseek
-> DeepSeek-V4-Flash MXFP4 MoE requires flashinfer >= 0.6.9 (found 0.6.3)根因定位:
flashinfer版本0.6.3过低,MXFP4 量化模块DeepSeekMxfp4MoEMethod导入失败- sglang 降级使用传统 FP8 MoE 算子
Fp8MoEMethod - FP8 算子的
fused_experts_impl不支持低秩 MoE 的非对齐维度 → 断言崩溃
解决方案:
pip install --upgrade flashinfer-python flashinfer-cubin
# 从 0.6.3 → 0.6.12警告: 升级后会出现 sglang-kt 0.6.2.post3 requires flashinfer_cubin==0.6.3 的依赖冲突警告,但实际运行不受影响。坑 4:启动脚本中的 Heredoc 转义问题
现象:通过 Jumpserver 堡垒机使用 expect 脚本创建远端 shell 脚本时,\\ 双反斜杠被原样写入文件,导致续行符失效,每个 --flag 被当作独立命令。
解决方案:改为在远端 shell 中直接运行一行完整的启动命令,绕过 heredoc 双重转义的坑。
坑 5:Base64 传输补丁脚本时的字符丢失
现象:通过堡垒机传输长 Base64 编码的 Python 补丁脚本时,终端输入缓冲区溢出导致字符丢失,base64 -d 解码失败。
解决方案:改用 expect 的 cat << 'EOF' heredoc + 逐行同步发送机制,每发送一行等待回显后再发下一行。
7. 常见问题排查清单
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
DEBUG_DIM_ERROR 维度断言 | flashinfer 版本过低 | pip install --upgrade flashinfer-python flashinfer-cubin |
MXFP4 MoE requires flashinfer >= 0.6.9 | 同上 | 同上 |
CUDA out of memory | 显存不足 | 降低 --mem-fraction-static(如 0.6) |
No module named 'ktransformers' | 未安装 ktransformers | pip install ktransformers |
| 启动后无日志 | nohup 重定向问题 | 检查日志路径是否有写权限 |
| 端口被占用 | 旧进程未退出 | pkill -f sglang.launch_server |
| 模型加载慢 | 磁盘 IO 瓶颈 | 将模型放在 SSD / NVMe 上 |
| CUDA Graph 捕获超时 | 首次启动正常现象 | 耐心等待 ~5 分钟 |
8. 一键安装脚本
如果你想在新机器上一键完成全部安装,可以将以下内容保存为 install_deepseek_v4_flash.sh:
#!/bin/bash
# DeepSeek-V4-Flash 一键安装脚本
set -e
MODEL_DIR="/data1/models/DeepSeek-V4-Flash"
PIP_MIRROR="-i https://pypi.tuna.tsinghua.edu.cn/simple"
echo "===== 1/5 创建 Conda 环境 ====="
conda create -n ktrans python=3.11 -y
source $HOME/miniconda3/bin/activate ktrans
echo "===== 2/5 安装核心框架 ====="
pip install sglang-kt ktransformers $PIP_MIRROR
pip install tilelang transformers==4.57.1 $PIP_MIRROR
echo "===== 3/5 升级 flashinfer(关键!)====="
pip install --upgrade flashinfer-python flashinfer-cubin $PIP_MIRROR
echo "===== 4/5 验证安装 ====="
python3 -c "import flashinfer; print(f'flashinfer: {flashinfer.__version__}')"
python3 -c "import sglang; print('sglang: OK')"
python3 -c "import ktransformers; print('ktransformers: OK')"
echo "===== 5/5 下载模型(如果不存在)====="
if [ ! -d "$MODEL_DIR" ]; then
pip install modelscope $PIP_MIRROR
python3 -c "
from modelscope import snapshot_download
snapshot_download('deepseek-ai/DeepSeek-V4-Flash', local_dir='$MODEL_DIR')
"
else
echo "模型已存在: $MODEL_DIR"
fi
echo ""
echo "===== 安装完成!====="
echo "启动服务: bash /home/admin/start_deepseek_v4_flash.sh"写在最后:核心经验
- 模型架构超前时,先验证推理框架支持情况——V4-Flash 的低秩 MoE + MXFP4 量化目前只有
sglang-kt + ktransformers链路能跑通,vLLM 暂不支持。 - 认真读启动日志里的
import failed警告——本次核心问题正是被「静默降级」掩盖的flashinfer版本过低,错误表象(维度断言崩溃)离根因很远。 - flashinfer 必须 ≥ 0.6.9,否则 MXFP4 算子加载失败、回退到不兼容的 FP8 算子。依赖冲突警告可忽略。
- 通过堡垒机传脚本要防转义与缓冲区丢字符——直接跑单行命令、或逐行同步 heredoc,比 base64 更稳。
可以的, 中间下载依赖可能有一些报错, 解决了就成功部署了. 非常感谢博主
博主,4卡的话推荐用什么模型啊,100人并发用场景,可以用llama.cpp吗?
看场景,不追求多模态就deepseek-v4-flash,推荐的步骤是去百炼、火山等平台测,觉得不错再考虑硬件
L20*8 46g 部署deepseek-v4-flash 性能怎么样
| 并发 | 成功/请求 | 错误 | 总 tok/s | 输出 tok/s | TTFT p50/p95 | 延迟 p50/p95 |
|---|---|---|---|---|---|---|
| 1 | 1/1 | 0 | 58.2 | 15.9 | 877/877 ms | 94.6/94.6 s |
| 2 | 3/3 | 0 | 84.0 | 22.9 | 1155/1389 ms | 98.3/98.4 s |
| 4 | 8/8 | 0 | 213.1 | 58.1 | 876/1062 ms | 103.3/103.3 s |
| 8 | 16/16 | 0 | 280.7 | 76.5 | 5653/7927 ms | 156.5/159.1 s |
| 16 | 32/32 | 0 | 322.6 | 87.9 | 5516/14761 ms | 219.4/231.4 s |
为什么我启动后无法开启思考?参数没有默认开启思考?还是说不支持
很感谢分享,我现在能启动正式版的。export LD_LIBRARY_PATH=/ollama/newmodels/condavllm1/lib:$LD_LIBRARY_PATH
export NVCC_PREPEND_FLAGS="-ccbin /ollama/newmodels/condavllm1/bin/g++"
export CC=/ollama/newmodels/condavllm1/bin/gcc
export CXX=/ollama/newmodels/condavllm1/bin/g++
export SGLANG_DSV4_MODE=2604
export SGLANG_DSV4_2604_SUBMODE=2604B
export SGLANG_DSV4_FP4_EXPERTS=True
export PYTHONUNBUFFERED=1
export FLASHINFER_DISABLE_VERSION_CHECK=1
python3 -m sglang.launch_server --model-path /ollama/models/newmodels/vllmds/0731 --host 0.0.0.0 --port 8000 --tp 8 --kt-method MXFP4 --kt-gpu-experts-ratio 1.0 --mem-fraction-static 0.85 --kt-cpuinfer 112 --kt-threadpool-count 4 --trust-remote-code --reasoning-parser deepseek-v4 --max-running-requests 32 --watchdog-timeout 300 --tool-call-parser deepseekv4;怎么调都是无思考
开不开max思考,差别真的太大了,甚至感觉不如用最新的qwen3.8-27b,接入到dsh或者其他agent也开不了思考,很奇怪