标签 deepseek 下的文章

本文记录了在 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 依赖冲突,可以安全忽略,不影响实际运行。

- 阅读剩余部分 -

在 deepseek-r1:32b 中小尺寸模型下,A100 单卡可提供 1.8QPS,单问题 7 秒内完成响应。 对于小团队够用。 单卡推理比4090弱

2025-04-11T03:24:11.png

  • 服务器硬件配置:
    ○ CPU:Intel(R) Xeon(R) Platinum 8336C CPU @ 2.30GHz * 2
    ○ GPU:NVIDIA A100-SXM4-80GB * 8
    ○ MEM:1960G
  • 网络:本机
  • 测试工具:Apache Benchmark (ab)
  • 模型:deepseek-r1:32b
ab -n 1000 -c 10 -s 30000 -T "application/json" -p payload.json -v 4 http://1.1.1.1:11434/v1/completions > ab_detailed_log01.txt 2>&1

# payload.json
{
  "model": "deepseek-r1:32b",
  "prompt": "你好,你是谁?"
}

2025-04-11T03:26:27.png

并发数总请求数成功请求数失败请求数吞吐率 (请求/秒)平均响应时间 (毫秒)95% 响应时间 (毫秒)最长响应时间 (毫秒)
101000100001.825504.49570018423
501000100001.8227520.9912950632275
1001000100001.8354613.0305713258628
1501000100001.8182645.2948717090249
2001000100001.82110118.858113820117009
4001000100001.82220315.946222405224113
8001000100001.24644384.462688739698507

8卡A100,可运行deepseek-r1:671b(671b-q4_K_M 404GB),响应较慢
2025-04-11T03:23:50.png

背景

本地部署DeepSeek-Coder-V2-Lite-Instruct:14b。要求基础的高可用、监控、安全能力。ollama默认只能使用第一张显卡,多个模型同时调用会有bug(ollama ps显示100GPU,但使用CPU推理);无法高可用

具体方案

多GPU Ollama部署方案,通过系统服务化+负载均衡实现4块4090显卡的并行利用,边缘使用nginx负载均衡。

  • 服务器名:AIGC-01
  • 服务器硬件配置

    • CPU:AMD Ryzen Threadripper PRO 3955WX 16-Cores
    • GPU:4 x NVIDIA RTX 4090
    • MEM:128G
  • 模型:DeepSeek-Coder-V2-Lite-Instruct:14b

ollama配置

# 备份ollama
cd /etc/systemd/system/
mv ollama.service ollama.service.bak

# 创建4个独立服务文件(每个GPU对应一个端口)
for i in {0..3}; do
sudo tee /etc/systemd/system/ollama-gpu${i}.service > /dev/null <<EOF
[Unit]
Description=Ollama Service (GPU $i)

[Service]
# 关键参数配置
Environment="CUDA_VISIBLE_DEVICES=$i"
Environment="OLLAMA_HOST=0.0.0.0:$((11434+i))"
ExecStart=/usr/local/bin/ollama serve

Restart=always
User=ollama
Group=ollama

[Install]
WantedBy=multi-user.target
EOF
done


# 重载服务配置
sudo systemctl daemon-reload

# 启动所有GPU实例
sudo systemctl start ollama-gpu{0..3}.service

# 设置开机自启
sudo systemctl enable ollama-gpu{0..3}.service

nginx配置

nginx 需要编译额外模块,用于健康检查

root@sunmax-AIGC-01:/etc/systemd/system# nginx -V
nginx version: nginx/1.24.0
built by gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2) 
built with OpenSSL 1.1.1f  31 Mar 2020
TLS SNI support enabled
configure arguments: --with-http_ssl_module --add-module=./nginx_upstream_check_module
# /etc/nginx/sites-available/mga.maxiot-inc.com.conf

# 在http块中添加(如果放在server外请确保在http上下文中)
log_format detailed '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" '
                    'RT=$request_time URT=$upstream_response_time '
                    'Host=$host Proto=$server_protocol '
                    'Header={\"X-Forwarded-For\": \"$proxy_add_x_forwarded_for\", '
                    '\"X-Real-IP\": \"$remote_addr\", '
                    '\"User-Agent\": \"$http_user_agent\", '
                    '\"Content-Type\": \"$content_type\"} '
                    'SSL=$ssl_protocol/$ssl_cipher '
                    'Upstream=$upstream_addr '
                    'Request_Length=$request_length '
                    'Request_Method=$request_method '
                    'Server_Name=$server_name '
                    'Server_Port=$server_port ';

upstream ollama_backend {
    server 127.0.0.1:11436;
    server 127.0.0.1:11437;
}

server {
    listen 443 ssl;
    server_name mga.maxiot-inc.com;

    ssl_certificate /etc/nginx/ssl/maxiot-inc.com.pem;
    ssl_certificate_key /etc/nginx/ssl/maxiot-inc.com.key;
    # 访问日志
    access_log /var/log/nginx/mga_maxiot_inc_com_access.log detailed;

    # 错误日志
    error_log /var/log/nginx/mga_maxiot_inc_com_error.log;

    # 负载均衡设置,指向 ollama_backend
    location / {
        proxy_pass http://ollama_backend;  # 会在两个服务器之间轮询
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

}