4. 部署多模型推理服务

任务目标

在单台GPU服务器上部署两个不同模型(Qwen2.5-7B-Instruct与Llama-3.1-8B-Instruct),通过vLLM分别启动为独立服务,并基于请求中的模型标识实现路由分发,确保模型间显存与进程隔离。

环境依赖

  • Python 3.10+,CUDA 12.1,GPU显存≥32GB(双模型并发加载)
  • vLLM 0.6.3+, SDK,Nginx(用于路由)
  • 模型权重已下载至本地:/models/Qwen2.5-7B-Instruct 与 /models/Llama-3.1-8B-Instruct

实现方案

采用双vLLM实例+反向代理路由:每个模型独占一个vLLM进程,绑定不同端口(8001/8002),通过Nginx按请求路径中的模型名转发至对应实例。该方案实现进程级隔离,任一模型OOM或崩溃不影响另一服务。

关键完整代码

# 1. 启动脚本 start_models.sh
#!/bin/bash
# 模型1:Qwen2.5-7B(端口8001,显存上限14GB)
CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints..api_server \
    --model /models/Qwen2.5-7B-Instruct \
    --port 8001 \
    --gpu-memory-utilization 0.45 \
    --max-model-len 8192 \
    --served-model-name qwen2.5-7b &

# 模型2:Llama-3.1-8B(端口8002,显存上限14GB)
CUDA_VISIBLE_DEVICES=0 python -m vllm.entrypoints..api_server \
    --model /models/Llama-3.1-8B-Instruct \
    --port 8002 \
    --gpu-memory-utilization 0.45 \
    --max-model-len 8192 \
    --served-model-name llama-3.1-8b &

wait
# 2. Nginx路由配置 /etc/nginx/conf.d/llm_router.conf
upstream qwen_backend {
    server 127.0.0.1:8001;
}
upstream llama_backend {
    server 127.0.0.1:8002;
}

server {
    listen 8000;

    # 按URL路径前缀路由
    location /v1/qwen/ {
        proxy_pass http://qwen_backend/v1/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /v1/llama/ {
        proxy_pass http://llama_backend/v1/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
# 3. 客户端调用示例 client_test.py
from  import 

# 通过路由端口8000访问Qwen
qwen_client = (base_url="http://localhost:8000/v1/qwen", ="EMPTY")
resp1 = qwen_client.chat.completions.create(
    model="qwen2.5-7b",
    messages=[{"role": "user", "content": "用一句话介绍量子计算"}]
)
print("Qwen响应:", resp1.choices[0].message.content)

# 通过路由端口8000访问Llama
llama_client = (base_url="http://localhost:8000/v1/llama", ="EMPTY")
resp2 = llama_client.chat.completions.create(
    model="llama-3.1-8b",
    messages=[{"role": "user", "content": "Explain quantum computing in one sentence."}]
)
print("Llama响应:", resp2.choices[0].message.content)

运行与验证

  1. 启动模型服务:bash start_models.sh,观察两个进程分别输出“Starting vLLM server on port 8001/8002”
  2. 加载Nginx配置:nginx -s reload
  3. 执行客户端测试:python client_test.py

通过判定标准:

  • 两个模型服务进程同时存活,nvidia-smi显示显存占用合计约28GB且互不重叠
  • Qwen返回中文回答,Llama返回英文回答,证明路由正确分发至不同模型
  • 分别请求http://localhost:8000/v1/qwen/models与/v1/llama/models,各自仅返回对应模型名
  • 杀掉Qwen进程(kill $(lsof -t -i:8001))后,Llama请求仍正常响应,验证进程隔离

常见问题

  • 显存不足:若GPU总显存小于32GB,可降低--gpu-memory-utilization至0.35,或改用量化版本模型
  • 路由404:检查Nginx配置中proxy_pass末尾的/v1/路径重写是否正确
  • 模型名不匹配:客户端请求中的model字段必须与启动参数--served-model-name一致