Nginx 助力 DeepSeek 本地部署,实现高可用、负载均衡的大模型应用

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

### k6 和 JMeter 的特点与差异 #### 工具概述 k6 是一种现代化的压力测试工具,专注于简单易用的同时提供强大的脚本编写能力。它基于 JavaScript 编写测试逻辑,并支持分布式压力测试环境[^1]。 Apache JMeter 则是一款经典的开源性能测试工具,主要面向 Web 应用程序的负载测试和功能验证。其界面友好,适合初学者快速上手,同时也提供了丰富的插件生态系统来增强功能[^3]。 --- #### 脚本编写的灵活性 k6 提供了一种更接近现代编程范式的体验,允许用户通过 JavaScript (ESM) 来定义复杂的测试场景。这种设计使得开发者能够轻松集成外部库或自定义函数以满足特定需求。 相比之下,JMeter 主要依赖 GUI 配置或者 XML 文件形式的手动编辑来进行设置。虽然也支持 BeanShell 和 JSR223 脚本来实现高级操作,但对于熟悉传统编码方式的技术人员来说可能稍显繁琐。 --- #### 执行效率与资源消耗 由于 k6 完全由 Go 语言构建而成,在高并发请求处理过程中表现出较低内存占用率以及更快的速度特性;这使其成为大规模分布式压测的理想选择之一。另一方面,尽管经过多次优化改进版本发布之后,JMeter 对于硬件配置的要求仍然相对较高,尤其是在模拟大量虚拟用户时可能会遇到瓶颈问题[^4]. --- #### 社区支持与文档质量 两者都拥有活跃的社区贡献者群体为其持续更新维护最新特性和修复已知错误.不过值得注意的是,k6官方提供的教程资料更加直观简洁易于理解;而对于初次接触此类技术的新手而言,JMeter庞大的知识体系或许会让人感到有些不知所措.[^2] --- #### 报告生成与分析能力 K6内置了多种数据可视化选项(如图表展示),可以直接输出结构化的JSON格式结果文件以便进一步加工处理.此外还集成了Prometheus监控系统接口方便实时追踪指标变化趋势..与此同时,jmeter除了基本的文字型摘要报告之外也能借助第三方插件扩展图形化展现效果,但整体流程较为复杂耗时较长. --- #### 场景适用性 对于追求高效开发周期的小型项目或者是需要频繁调整参数重新运行试验的研发团队来讲,K6无疑是更好的解决方案因为它具备更高的自动化程度更低的学习成本等特点..然而当面临企业级复杂业务逻辑验证需求时,则应考虑采用功能更为全面成熟的jmeter平台因其广泛兼容各种协议类型并积累了众多实际案例经验可供借鉴参考价值更大一些.[^4] ```javascript // K6 示例代码片段 import http from 'k6/http'; import { sleep } from 'k6'; export default function () { const res = http.get('https://test-api.k6.io'); console.log(res.status); sleep(1); } ``` ```java // JMeter 示例代码片段(JSR223 Sampler) import org.apache.jmeter.samplers.SampleResult; SampleResult result = new SampleResult(); result.setSuccessful(true); System.out.println("This is a simple script example."); return null; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值