基于triton vllm 部署qwen

2025-08-20  本文已影响0人  国服最坑开发

0x00 整体介绍

基于 triton 部署 qwen ,使用triton镜像中的 vllm 执行推理请求。
假设本地工作目录 /home/ubuntu/models, 用于最终映射到 triton 实例内部的 /models目录 
假设最终可请求的url 示例: http://10.1.1.10:8000/v2/models/qwen-7b/infer
上述url 中的 qwen-7b, 就对应 models路径下的 qwen-7b目录
但真正的大模型数据是保存在 qwen-7b/1/ 这个目录下

另外需要手动配置两个文件:

0x01 下载模型和镜像

1.首先准备模型文件

下载来源: https://modelscope.cn/models/Qwen/Qwen-7B-Chat

官方提供了几种方案,实测采用 pip modelscope 指令下载还是比较快的

# 安装ModelScope
pip3 install modelscope

# 下载整个库到默认位置 ~/.cache/modelscope
modelscope download --model Qwen/Qwen-7B-Chat

# 下载整个库到指定
modelscope download --model Qwen/Qwen-7B-Chat  --local_dir ./qwen-7b

# 下载单文件到指定目录
modelscope download --model Qwen/Qwen-7B-Chat README.md --local_dir ./dir

真正执行代码如下:

mkdir -p /home/ubuntu/models/qwen-7b
cd /home/ubuntu/models/qwen-7b
modelscope download --model Qwen/Qwen-7B-Chat  --local_dir ./1

2. triton镜像下载

参考: https://catalog.ngc.nvidia.com/orgs/nvidia/containers/tritonserver/tags
计划在 triton 中使用vllm ,所以选择下面的版本:

docker pull nvcr.io/nvidia/tritonserver:25.07-vllm-python-py3

0x02 配置文件

首先准备文件:

cd /home/ubuntu/models/qwen-7b
touch config.pbtxt
mkdir 1
cd 1
touch model.py

编辑文件 config.pbtxt

name: "qwen-7b"
backend: "python"
max_batch_size: 1
input [
  {
    name: "prompt"
    data_type: TYPE_STRING
    dims: [1]
  }
]
output [
  {
    name: "output_text"
    data_type: TYPE_STRING
    dims: [1]
  }
]
instance_group [
  {
    kind: KIND_GPU
    count: 1
  }
]

编辑文件 1/model.py

import numpy as np
import triton_python_backend_utils as pb_utils
from vllm import LLM, SamplingParams

class TritonPythonModel:
    def initialize(self, args):
        model_dir = "/models/qwen-7b/1"
        self.llm = LLM(
            model=model_dir,
            tensor_parallel_size=1,
            trust_remote_code=True
        )
        self.sampling_params = SamplingParams(
            temperature=0.7,
            top_p=0.9,
            max_tokens=512
        )

    def execute(self, requests):
        responses = []

        for request in requests:
            # 1. 获取输入
            prompt_tensor = pb_utils.get_input_tensor_by_name(request, "prompt")
            prompt = prompt_tensor.as_numpy()[0].item().decode("utf-8")

            # 2. 调用 vLLM 生成
            outputs = self.llm.generate([prompt], self.sampling_params)
            text_out = outputs[0].outputs[0].text

            # 3. 封装输出为 numpy array
            out_array = np.array([text_out.encode("utf-8")], dtype=object)
            out_tensor = pb_utils.Tensor("output_text", out_array)
            responses.append(pb_utils.InferenceResponse(output_tensors=[out_tensor]))

        return responses

0x03 启动Docker实例

docker run --gpus all -itd -p 8000-8002:8000-8002 \
  --name ai_triton \
  -v /home/ubuntu/models:/models \
  nvcr.io/nvidia/tritonserver:25.07-vllm-python-py3 \
  tritonserver --model-repository=/models --log-verbose=1

0x04 请求验证

curl --request POST \
  --url http://10.1.1.10:8000/v2/models/qwen-7b/infer \
  --header 'Content-Type: application/json' \
  --header 'User-Agent: insomnia/11.4.0' \
  --data '{
  "inputs": [
    {
      "name": "prompt",
      "shape": [1,1],
      "datatype": "BYTES",
      "data": ["你好,请介绍一下你自己"]
    }
  ]
}
'

结果如图:


image.png

0x05 251210更新: vllm 运行Qwen3-Coder

modelscope download --model Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8
python -m vllm.entrypoints.openai.api_server \
    --model ~/.cache/modelscope/hub/models/Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8 \
    --dtype auto \
    --max-model-len 32768 \
    --tensor-parallel-size 1 \
    --gpu-memory-utilization 0.95 \
    --port 8000
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen3-Coder-30B",
    "messages": [{"role": "user", "content": "用 Python 写一个快速排序"}],
    "max_tokens": 500,
    "temperature": 0.3
  }'
上一篇 下一篇

猜你喜欢

热点阅读