本文以最新的医学领域最强模型Baichuan-M2-32B为例,记录使用vLLM部署大模型并创建API服务。

创建uv环境

1
2
3
uv init
# 添加modelscope包
uv add modelscope

下载模型

  • 去modelscope官网,找到对应模型的网页:https://www.modelscope.cn/models/baichuan-inc/Baichuan-M2-32B

  • 自定义模型下载位置:

    1
    uv run modelscope download --model baichuan-inc/Baichuan-M2-32B --local_dir /mnt/nfs_share/tlj/llms/models/
  • 如果不指定--local_dir,默认情况下,模型被下到了这里:

    1
    ~/.cache/modelscope/hub/models/baichuan-inc/Baichuan-M2-32B

安装环境

  • uv安装pytorch

    uv pip install 会在当前 uv 管理的虚拟环境中调用 pip 去安装 Python 包

    1
    uv pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu124
  • 安装vllm以部署大模型

    1
    uv add vllm

启动vLLM服务

1
2
3
4
5
6
7
8
9
10
11
12
cd /mnt/nfs_share/tlj/llms/
source .venv/bin/activate

VLLM_USE_MODELSCOPE=true vllm serve /mnt/nfs_share/tlj/llms/models/baichuan-inc/Baichuan-M2-32B \
--served-model-name "Baichuan-M2-32B" \
--host 0.0.0.0 \
--port 9000 \
--api-key "123456" \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.9 \
--max-model-len 20000 \
--reasoning-parser qwen3

解释:

  • 加载本地模型
  • 服务开放在 0.0.0.0:9000
  • 访问需 API 密钥 123456
  • 使用 2 张 GPU 并行
  • 显存最多占 90%
  • 最大上下文长度 20000
  • 推理解析器用 qwen3。影响工具调用,如果不指定也能跑

调用接口

启动vllm服务后,即可通过python代码调用大模型
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from openai import OpenAI

LLM_API_URL = "http://192.168.205.185:9000/v1"
LLM_MODEL_NAME = "Baichuan-M2-32B" # 与模型启动参数--served-model-name一致
MAX_TOKENS = 10000
API_KEY = "123456"

client = OpenAI(
api_key=API_KEY, # 替换为你的实际 API Key
base_url=LLM_API_URL
)

from system_prompt_simple import system_prompt
system_prompt = system_prompt

def get_output(user_prompt):
completion = client.chat.completions.create(
model=LLM_MODEL_NAME,
messages=[
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': user_prompt}
],
temperature=0.05, # 控制输出的随机性,值越高越随机,值越低越确定(建议范围:0~2)
top_p=0.7, # 核采样方法的比例阈值,与 temperature 类似,通常和 temperature 二选一使用
n=1, # 生成多少个候选答案(默认为1)
max_tokens=MAX_TOKENS, # 最大生成 token 数量,None 表示无限制(根据模型最大长度限制)
stop=None, # 遇到指定字符串时停止生成,例如 ['\n', '。'],None 表示不指定
stream=False, # 是否启用流式输出(逐字返回结果),默认 False
presence_penalty=0.0, # 对已经出现的内容进行惩罚,防止重复(-2.0 ~ 2.0)
frequency_penalty=0.0, # 对高频词汇进行惩罚,鼓励多样性(-2.0 ~ 2.0)
# no_thinking=True
)
content = completion.choices[0].message.content
return content