本文记录了在 8 卡 NVIDIA L20 服务器上部署 DeepSeek-V4-Flash 的完整过程。前半部分是可直接复制到新机器的部署步骤,后半部分是部署过程中遇到的踩坑记录与根因分析(vLLM 不兼容、MXFP4 算子加载失败等),方便排错时回查。

1. 环境信息

项目配置
服务器L20 推理节点(10.0.0.x,内网)
GPU8 × NVIDIA L20(每卡 48GB,CC 8.9)
OSUbuntu,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)
OSUbuntu 20.04 / 22.04
CondaMiniconda3 或 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-flash

4. 关键环境变量说明

环境变量说明
SGLANG_DSV4_MODE2604启用 DeepSeek-V4 专用模式
SGLANG_DSV4_2604_SUBMODE2604BV4-Flash 子模式(区别于 V4 完整版)
SGLANG_DSV4_FP4_EXPERTSTrue指定 routed experts 使用 FP4 量化
SGLANG_APPLY_CONFIG_BACKUPnone防止 sglang 劫持 config.json

5. 性能数据

指标数值
CUDA Graph 捕获时间~246 秒(首次启动)
max_total_num_tokens755,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/simple
  • ktransformers 需要 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

排查过程

  1. 初步分析w1.shape=[256, 512, 2048] 是 V4-Flash 低秩 MoE 专家在 TP=8 下切分后的维度,而 hidden_states=4096w1 最后一维 2048 不对齐。
  2. 注入调试日志:在 kt_ep_wrapper.py 中注入 logger.error 调试信息,追踪 gpu_method 的真实类型。
  3. 发现关键线索:在 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)
  1. 根因定位

    • 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 解码失败。

解决方案:改用 expectcat << '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'未安装 ktransformerspip 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"

写在最后:核心经验

  1. 模型架构超前时,先验证推理框架支持情况——V4-Flash 的低秩 MoE + MXFP4 量化目前只有 sglang-kt + ktransformers 链路能跑通,vLLM 暂不支持。
  2. 认真读启动日志里的 import failed 警告——本次核心问题正是被「静默降级」掩盖的 flashinfer 版本过低,错误表象(维度断言崩溃)离根因很远。
  3. flashinfer 必须 ≥ 0.6.9,否则 MXFP4 算子加载失败、回退到不兼容的 FP8 算子。依赖冲突警告可忽略。
  4. 通过堡垒机传脚本要防转义与缓冲区丢字符——直接跑单行命令、或逐行同步 heredoc,比 base64 更稳。

标签: deepseek, 本地大模型, deepseek-v4-flash

已有 8 条评论

  1. 可以的, 中间下载依赖可能有一些报错, 解决了就成功部署了. 非常感谢博主

  2. 冰蓝弧影

    博主,4卡的话推荐用什么模型啊,100人并发用场景,可以用llama.cpp吗?

    1. 看场景,不追求多模态就deepseek-v4-flash,推荐的步骤是去百炼、火山等平台测,觉得不错再考虑硬件

  3. 三桑无枝

    L20*8 46g 部署deepseek-v4-flash 性能怎么样

    1. | 并发 | 成功/请求 | 错误 | 总 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 |

  4. cc

    为什么我启动后无法开启思考?参数没有默认开启思考?还是说不支持

    1. cc

      很感谢分享,我现在能启动正式版的。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;怎么调都是无思考

      1. cc

        开不开max思考,差别真的太大了,甚至感觉不如用最新的qwen3.8-27b,接入到dsh或者其他agent也开不了思考,很奇怪

添加新评论