最近被 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-4oClaude-3.5-Sonneto1-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 交流群,公众号后台「联系我」,拉你进群。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐