最近被 DeepSeek 官网平替的各种文章刷屏,原因无它:太火了!

服务器繁忙,请稍后再试。

为此,也催生了大量 DeepSeek 本地部署的需求。

尽管本地部署对资源要求较高,但优势也非常显著:

  • 敏感数据不出内网;
  • 无公网传输延迟;
  • 无调用限制。

前几篇和大家分享了如何采用 Ollama 本地部署 DeepSeek-R1。

如果只是自己玩玩,当然没问题。

如果要嵌入到自己的AI应用中,一旦并发量上来,就得考虑高可用性。

怎么搞?

今天分享,将采用以下三步走策略,演示如何实现高可用的大模型应用:

  • Ollama 部署多个 DeepSeek 实例(生产环境推荐 vLLM);
  • Nginx 实现负载均衡;
  • Locust 实现压力测试。

1. 写在前面

1.1 选多大的模型?

显卡、显存,决定了能跑多大的模型。

尽管 DeepSeek 已经完成了多国产 GPU 的适配,不过当前来看,普适性最高的还得是 Nvidia 家的显卡,简称 N 卡。

不同参数量模型对显存的需求,可参考下表(建议收藏):

显卡型号显存0.5B1B3B7B13B32B70B
RTX 509032GBFP16 2GBFP16 3GBFP16 8GBFP16 19GBINT8 17GBINT4 21GB❎
RTX 409024GBFP16 2GBFP16 3GBFP16 8GBFP16 19GBINT8 17GBINT4 21GB❎
RTX 408016GBFP16 2GBFP16 3GBFP16 8GBINT8 10GBINT4 9GB❎❎
RTX 308012GBFP16 2GBFP16 3GBFP16 8GBINT8 10GBINT4 9GB❎❎
RTX 20808GBFP16 2GBFP16 3GBFP16 8GBINT4 5GB❎❎❎
RTX 20606GBFP16 2GBFP16 3GBINT8 4GBINT4 5GB❎❎❎

1.2 为什么选 Ollama

相比 vLLM / SGLang 等部署方案,Ollama 的门槛最低,几乎人人均可上手。

模型默认采用 INT 4 量化,同等显存下可以跑更大的模型。

在单张显卡显存不足的情况下,支持自动将模型切分到多张显卡进行推理。

支持自动模型加载与卸载,推理时按需动态分配,闲置时降低显存占用,极大提高了资源利用率。

1.3 为什么是 DeepSeek-R1

简单梳理下 DeepSeek-R1 的前世今生。

所谓满血 DeepSeek-R1,即 DeepSeek-R1-671B,它基于 DeepSeek-V3-Base进行训练,并全面超越了 DeepSeek-V3。区别在于 R1 具备深度推理能力,而 V3 没有。

但 671B 的模型显然不是我等大众能玩的,所以 DeepSeek 团队又用 DeepSeek-R1 蒸馏得到了 6 个小模型,这就是你在 Ollama Library 中看到的:

从 1.5b 到 70b,分别来自开源的 Llama 和 Qwen 架构。比如 DeepSeek-R1-32b 就是来自 qwen2,你要知道这个开源模型,竟然击败了 GPT-4o、Claude-3.5-Sonnet、o1-mini 这三个闭源模型。

所以,在资源允许条件下,推荐选用 32b 模型,真的很强!

  • 一张 4090 能跑;
  • 两张 4080 也行。

2. Ollama 部署 DeepSeek 实例

关于 Ollama 的使用,可以翻看之前教程:本地部署大模型?Ollama 部署和实战,看这篇就够了

这里我们采用 docker 容器进行部署,方便动态扩缩容。

  • 根据自己的显存容量,指定显卡设备号:
# GPU 单卡
sudo docker run -d --gpus "device=1" -v ollama:/root/.ollama -p 3002:11434 --restart unless-stopped --name ollama ollama/ollama
# GPU 多卡
sudo docker run -d --gpus '"device=1,2"' -v ollama:/root/.ollama -p 3002:11434 --restart unless-stopped --name ollama ollama/ollama

假设要起两个 DeepSeek 实例,只需映射两个端口出来,并指定不同的实例名称:

  • 实例1:3001 端口
sudo docker run -d --gpus "device=0" -v ollama:/root/.ollama -p 3001:11434 --restart unless-stopped --name ollama1 ollama/ollama
  • 实例2:3002 端口
sudo docker run -d --gpus "device=1" -v ollama:/root/.ollama -p 3002:11434 --restart unless-stopped --name ollama2 ollama/ollama

然后,分别进入容器,拉起 DeepSeek 模型,根据显存拉对应参数量的模型:

sudo docker exec -it ollama1 /bin/bash
ollama run deepseek-r1:32b

3. Nginx 负载均衡

3.1 Nginx 安装

Linux 下推荐编译安装最新稳定版:

wget https://nginx.org/download/nginx-1.26.3.tar.gz
tar -xf nginx-1.26.3.tar.gz
cd nginx-1.26.3
./configure
make -j 4
sudo make install

默认安装位置:/usr/local/nginx/sbin/nginx

如果环境变量中找不到,需建立软连接:

sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

执行:nginx -v 返回版本号,说明安装成功。

nginx 服务启动 & 停止 & 重启命令如下:

nginx # 启动
nginx -s stop # 关闭
nginx -s reload # 重启
nginx -t # 测试配置文件

Nginx 依赖配置文件运行,因此在启动 nginx 服务之前,还需一番配置。

3.2 Nginx 配置

默认配置文件在哪?

sudo nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

不过,为了方便后续启用多个 nginx 服务,可以新建 deepseek 的配置文件,内容如下:

upstream deepseek_api {
    random;  # 负载均衡策略:随机选择一个服务器
    server 127.0.0.1:3002;
    server 127.0.0.1:3004;
}

server {
    listen 3008; # 当前nginx服务监听端口
    server_name _;  # 允许任何域名访问
    charset utf-8;
    access_log /var/log/nginx/deepseek.log; # 日志文件名称
    error_log /var/log/nginx/deepseek.error warn;  # 错误日志文件名称 warn级别 
    
    location / {
        proxy_pass http://deepseek_api;
    }
}

然后在默认的 nginx.conf 中用 include 指令引入这些配置文件。

再次检查配置文件是否有问题:

sudo nginx -t

最后,启动 nginx 服务:

sudo nginx

打开上方指定的 nginx 服务的端口号:http://localhost:3008/,出现下图,代表成功路由到了 ollama 实例。

4. Locust 压力测试

为了验证 负载均衡后,能抗住多大并发量,还需要进行压力测试。

这里采用Locust这款开源工具,pip 一键安装:

pip install locust

4.1 编成测试脚本

新建 ollama.py,脚本如下:

from locust import HttpUser, task, between

# 模拟 http 请求的用户
class OllamaUser(HttpUser):
    wait_time = between(0, 2)  # 每个请求的间隔时间
    @task
    def generate_text(self):
        headers = {"Content-Type":"application/json"}
        data = {
            "model": "deepseek-r1:1.5b",
            "prompt": "仿照苏轼写一首宋词",
            "stream": True
        }
        self.client.post("/api/generate", headers=headers, json=data, timeout=60)

4.2 启动 Web 界面

$ locust -f ollama.py
[2025-02-15 20:34:42,926] ps/INFO/locust.main: Starting Locust 2.32.9
[2025-02-15 20:34:42,927] ps/INFO/locust.main: Starting web interface at http://0.0.0.0:8089

默认端口号 8089,打开后进行模拟测试,填入刚才 Nginx 的服务地址:

4.3 开启测试

点击 start 即可,我这里模拟压测了 10 分钟,两个模型实例,峰值时 10 个用户并发,测试结果如下:

大家可以根据Failures情况,进行扩缩容。

写在最后

本文带大家采用 Ollama + Nginx 实现了高可用的大模型应用,并采用Locust 进行模拟压力测试,为应用上线做好准备。

如果对你有帮助,欢迎点赞收藏备用。


为方便大家交流,新建了一个 AI 交流群,公众号后台「联系我」,拉你进群。

更多推荐