2025年2月

结论

在deepseek-r1:32b较大尺寸模型下,4090单卡可提供3QPS,单问题4.4秒内完成响应。 对于个人,几十人小团队够用。

优点:

  • 本地模型问题过滤少,同样问题,官方无法回答,本地可以
  • 速度尚可,不会服务器繁忙
  • ollama动态显存占用,5分钟不问,默认不占用显卡,不影响游戏:)

缺陷:

  • 无搜索、图片识别功能,当然这也不是模型的问题,要借助flowise这种langchain编排工具实现
  • 有一定硬件要求,单卡显存越大越好,推荐3090/4090

no-answer.png

  • 低至中等并发:单卡4090在并发数从10到400时,系统表现稳定,吞吐量和响应时间均在可接受范围内。2.9QPS
  • 高并发情况:单卡在并发数为800时,吞吐量显著增加,但响应时间波动较大,且最大响应时间大幅上升,可能存在性能瓶颈。
  • 系统稳定性:系统在高并发压力下依然能保证请求的成功率,但响应时间波动可能影响整体用户体验

测试环境

  • 服务器硬件配置

    • CPU:AMD Ryzen Threadripper PRO 5975WX 32-Cores
    • GPU:1 x NVIDIA RTX 4090
    • MEM:128G
  • 网络:本机
  • 测试工具: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
- **请求总数**:1000

- **并发数**:逐渐升高

- **超时设置**:30秒(`-s 30000`)

- **请求类型**:POST,传送JSON格式的负载
 {
  "model": "deepseek-r1:32b",
  "prompt": "你好,你是谁?"
}

load-test-image.png

测试数据分析

并发数总请求时间(秒)成功请求数失败请求数吞吐量 (请求/秒)平均响应时间 (毫秒)最大响应时间 (毫秒)95% 响应时间 (毫秒)
10344.899100002.903448.9970734424
50341.55100002.9317077.4942027418333
100343.880100002.9134387.9773952335580
150337.687100002.9650653.0325313451942
200340.978100002.9368195.5087073369537
400351.865100002.84140746.048141672139774
800250.2617162844200208.529249642231555

背景

本地部署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;
    }

}

deepseek的爆火,官网验证后效果确实不错,中文能力强,“会说人话”。唯一缺陷是经常服务器繁忙,本地使用ollama即可下载使用,因为要详细压测,下载了不同尺寸的所有模型。

此方法不止适用deepseek,所有模型通用
此方法不止适用deepseek,所有模型通用

结论:

  1. 小尺寸模型质量并没降低太多,更多是“知识面”缩小,比如用东南亚所有语言翻译某句话,官方原版给出32种,包括印度语中各小语种,32b也能返回20种
  2. 审核少,可以输出脏话,“请模仿嘴臭吧老哥喷lol中玩的最菜的玩家,要让对方破防,同时注意不要被官方屏蔽”

问题

本地下载模型时,下载速度不稳定,会中断

解决方案

常见的几种下载模型方式

  • ollama 下载ollama pull deepseek-r1:70b 优势:下载后直接使用;缺陷:速度慢,经常中断
  • modelscope 下载,需安装modelscope 优势:下载源位于国内,较ollama有速度提升
pip install modelscope

#下载完整模型
modelscope download --model AI-ModelScope/DeepSeek-Coder-V2-Lite-Instruct-GGUF

#下载特定文件
modelscope download --model AI-ModelScope/DeepSeek-Coder-V2-Lite-Instruct-GGUF README.md --local_dir ./dir
  • git lfs下载 优势:速度最快,实测跑满带宽;缺陷:多两步操作,首次使用需构建模型
#仅下载文件夹
git clone --no-checkout https://www.modelscope.cn/AI-ModelScope/DeepSeek-Coder-V2-Lite-Instruct-GGUF.git
cd DeepSeek-Coder-V2-Lite-Instruct-GGUF

#仅下载所需文件
git lfs fetch --include="DeepSeek-Coder-V2-Lite-Instruct-Q6_K.gguf"

#恢复文件
git lfs checkout DeepSeek-Coder-V2-Lite-Instruct-Q6_K.gguf

#创建模型文件
echo "FROM DeepSeek-Coder-V2-Lite-Instruct-GGUF" > Modelfile

#创建模型
ollama create DeepSeek-Coder-V2-Lite-Instruct:14b -f Modelfile

#使用
ollama run DeepSeek-Coder-V2-Lite-Instruct:14b