当前位置: 首页 > news >正文

Nginx 单一端点上高效部署多个 LLM 模型

https://zhuanlan.zhihu.com/p/1890170569292501148

本指南将为您详细介绍如何使用 Nginx 设置多个 vLLM 实例,确保请求得到最优分配。

为什么要使用 Nginx 实现 vLLM 多模型服务?

  • 负载均衡: 在多个 vLLM 实例之间分配请求。
  • 可扩展性: 可以轻松通过添加更多模型实例来扩展。
  • 简化的 API 网关: 客户端只需向单一端点发送请求,使集成更加简单。

第一步:设置 Docker 网络

为了实现 Nginx 和 vLLM 实例之间的通信,创建一个专用的 Docker 网络:

docker network create vllm_nginx

这确保了 Nginx 可以在网络内部正确路由流量。

第二步:启动 vLLM 实例

我们将运行两个 vLLM 实例(vllm0vllm1),每个实例服务于不同的模型。关于如何启动 vLLM 实例的详细指南,可以参考我的另一篇博客。

创建一个脚本(run_vllm.sh)来启动 vLLM 实例:

# Model and GPU Configurations
GPU_ID=$1
PORT=$2
MODEL_PATH=$3
SERVED_MODEL_NAME=$4
docker run --runtime nvidia --gpus "device=$GPU_ID" \-v ~/.cache/huggingface:/root/.cache/huggingface \--env "HUGGING_FACE_HUB_TOKEN=$HUGGING_FACE_HUB_TOKEN" \-p $PORT:8000 \--network vllm_nginx \--name vllm$GPU_ID \--ipc=host \vllm/vllm-openai:v0.7.3 \--model $MODEL_PATH \--trust-remote-code \--served-model-name $SERVED_MODEL_NAME \--gpu-memory-utilization 0.9 \--max-num-seqs 256 \--tensor-parallel-size 1

现在,启动 vLLM 服务器:

bash run_vllm.sh 0 8081 "meta-llama/Llama-3.1-8B-Instruct" "Llama-3.1-8B"
bash run_vllm.sh 1 8082 "meta-llama/Llama-3.1-8B-Instruct" "Llama-3.1-8B"

这将运行:

  • vllm0 在 GPU 0 上,暴露端口 8081
  • vllm1 在 GPU 1 上,暴露端口 8082

验证两个服务器是否正在运行:

docker logs vllm0 | grep Uvicorn
docker logs vllm1 | grep Uvicorn

预期输出:

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

第三步:配置 Nginx 负载均衡

创建一个 Nginx 配置文件nginx_conf/nginx.conf)来分配 vLLM 实例之间的请求。

worker_processes auto;
events {worker_connections 1024;
}http {upstream backend {least_conn;server vllm0:8000 max_fails=3 fail_timeout=10s;server vllm1:8000 max_fails=3 fail_timeout=10s;}server {listen 80;location / {proxy_pass http://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;}}
}

1. worker_processes auto;

  • 此指令使 Nginx 能够根据可用的 CPU 核心自动确定工作进程数。
  • 默认值通常是 1,但设置为 auto 可以在多核环境中优化性能。

2. **worker_connections 1024**;

  • 限制每个工作进程可以处理的并发连接数。
  • 增加此值可以让 Nginx 处理更多并发请求,适用于高流量应用。

3. upstream 配置块

  • 此块定义了处理传入请求的后端服务器(vLLM 实例;名称可由用户决定)。
  • least_conn; 确保流量被发送到活动连接最少的服务器,提高负载均衡效率。
  • max_fails=3 fail_timeout=10000s; 在连续三次失败后,将在 10000 秒内停止向失败的服务器发送请求。

4. server 块中的代理设置

  • proxy_pass http://backend; 将传入请求路由到定义的上游后端。
  • proxy_set_header 指令确保保留重要的请求信息:
  • proxy_set_header Host $host 保留客户端请求的原始 Host 头。
  • proxy_set_header X-Real-IP $remote_addr 将客户端的真实 IP 地址传递给后端服务器。
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 在涉及多个代理服务器时维护客户端 IP 地址链。
  • proxy_set_header X-Forwarded-Proto $scheme 指示客户端请求是通过 HTTP 还是 HTTPS 发送的。

Docker 网络注意事项

  • 后端服务器(vllm0vllm1)假定在 Docker 网络内运行。
  • 在此设置中,vllm0:8000vllm1:8000 指的是 Docker 网络内的内部主机名和端口。
  • 即使 vLLM 容器在主机上暴露了不同的端口(如 8081:8000),Nginx 也必须引用内部端口(8000)以进行正确路由,因为 vLLM 的默认内部端口是 8000

第四步:在 Docker 中启动 Nginx

在 Docker 中运行 Nginx,将其映射到外部端口(例如 8040)(内部端口默认通常是 80):

docker run -itd -p 8040:80 --network vllm_nginx \
-v $(pwd)/nginx_conf/nginx.conf:/etc/nginx/nginx.conf:ro \
--name nginx-lb nginx:latest

验证 Nginx 是否正在运行:

docker logs nginx-lb

第五步:测试多模型服务设置

首先,向 localhost:8040 的 Nginx 端点发送一个请求。

curl http://localhost:8040/v1/completions -H "Content-Type:application/json" \
-d '{"model":"Llama-3.1-8B","prompt":"Who are you?", "max_tokens":256}'

现在,向 localhost:8040 的 Nginx 端点发送批量请求。

import asyncio
import httpx
import jsonurl = "http://localhost:8040/v1/completions"async def generate_text_async(client, prompt):payload = {"model": "Llama-3.1-8B","prompt": prompt,"max_tokens": 150}headers = {"Content-Type": "application/json"}response = await client.post(url, headers=headers, json=payload)return response.json()async def main():prompts = ["Who are you?", "Tell me a joke.", "What is AI?", "Translate 'Hello' to French."]async with httpx.AsyncClient() as client:tasks = [generate_text_async(client, p) for p in prompts]responses = await asyncio.gather(*tasks)  # 同时执行所有请求for idx, res in enumerate(responses):print(f"Prompt: {prompts[idx]}\nResponse: {res['choices'][0]['text']}\n")asyncio.run(main())

Nginx 将在 vllm0vllm1 之间平均分配请求。

docker logs -f vllm0 
docker logs -f vllm1 

总结

通过利用 vLLM 和 Nginx,我们创建了一个高效的多模型服务架构,它:

  • 支持在单一端点上运行多个模型
  • 均衡分配流量
  • 通过添加更多 vLLM 实例实现水平扩展

这种设置非常适合多模型 LLM API,在最大化硬件利用率的同时降低了运维复杂性。

http://www.dtcms.com/a/316567.html

相关文章:

  • ES 模块动态导入
  • 海上电磁波传播:两径模型 vs 抛物方程模型传播损耗对比
  • 37.字典树
  • Redis集群模式下确保Key在同一Slot的实现方法
  • 按位运算 - C++
  • Velero 简介和部署
  • Linux进程信号——初步认识信号、信号的产生
  • 《UE教程》第一章第六回——迁移独立项目(资源)
  • IAR软件中变量监控的几种方法
  • 如何在 FastAPI 中优雅处理后台任务异常并实现智能重试?
  • Wireshark安装过程 Npcap Setup: Failed to create the npcap service: 0x8007007e.
  • 信息系统项目管理中的沟通管理实战精解
  • 智慧能源场景设备缺陷漏检率↓76%:陌讯多模态融合检测方案实战解析
  • SpringCloud学习------Gateway详解
  • Claude Code 完整指南:入门到应用
  • Qt事件系统学习笔记
  • 嵌入式软件架构设计之七:双机通信及通信协议之字符串协议
  • 大语言模型安全攻防:从提示词注入到模型窃取的全面防御浅谈
  • 与功能包相关的指令ros2 pkg
  • 女性成长赛道:现状与发展趋势|创客匠人
  • NumPy 中的取整函数
  • 如何在Android设备上删除多个联系人(3种方法)
  • Java项目:基于SSM框架实现的公益网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】
  • 解锁高效敏捷:2025年Scrum项目管理工具的核心应用解析
  • 智慧社区物业管理平台登录流程全解析:从验证码到JWT认证
  • 关于熵减 - 双线线圈
  • 前端性能测试:从工具到实战全解析
  • 类内部方法调用,自注入避免AOP失效
  • Flutter 国际化
  • OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具