vLLM
vLLM 是一个开源的 LLM 推理和服务引擎。它特别适合作为在本地自行部署 Mistral 模型的平台。
前提条件
- vLLM 的硬件要求在其安装文档页面上列出。
- 默认情况下,vLLM 从 Hugging Face 获取模型权重。要访问 Mistral 模型仓库,您需要在 Hugging Face 上进行身份验证,因此需要一个具有 `READ` 权限的访问令牌 `HF_TOKEN`。您还应确保已在每个模型卡页面上接受访问条件。
- 如果您已经在您的基础设施上拥有模型文件,您可以直接使用它们,只需将 vLLM 指向它们的本地路径,而不是 Hugging Face 模型 ID。在这种情况下,您可以跳过所有与 Hugging Face 相关的设置步骤。
入门
以下部分将指导您在 vLLM 上部署和查询 Mistral 模型的过程。
安装 vLLM
-
创建一个 Python 虚拟环境并安装 `vllm` 包(版本 `>=0.6.1.post1` 以确保与所有 Mistral 模型最大兼容)。
-
使用您的访问令牌 `$HF_TOKEN` 在 HuggingFace Hub 上进行身份验证
huggingface-cli login --token $HF_TOKEN
离线模式推理
在使用 vLLM 的*离线模式*时,模型会被加载并用于一次性的批量推理工作负载。
- 文本输入 (Mistral NeMo)
- 文本输入 (Mistral Small)
- 图像 + 文本输入 (Pixtral-12B)
from vllm import LLM
from vllm.sampling_params import SamplingParams
model_name = "mistralai/Mistral-NeMo-Instruct-2407"
sampling_params = SamplingParams(max_tokens=8192)
llm = LLM(
model=model_name,
tokenizer_mode="mistral",
load_format="mistral",
config_format="mistral",
)
messages = [
{
"role": "user",
"content": "Who is the best French painter. Answer with detailed explanations.",
}
]
res = llm.chat(messages=messages, sampling_params=sampling_params)
print(res[0].outputs[0].text)
from vllm import LLM
from vllm.sampling_params import SamplingParams
model_name = "mistralai/Mistral-Small-Instruct-2409"
sampling_params = SamplingParams(max_tokens=8192)
llm = LLM(
model=model_name,
tokenizer_mode="mistral",
load_format="mistral",
config_format="mistral",
)
messages = [
{
"role": "user",
"content": "Who is the best French painter. Answer with detailed explanations.",
}
]
res = llm.chat(messages=messages, sampling_params=sampling_params)
print(res[0].outputs[0].text)
假设您想为以下图片添加字幕



您可以通过运行以下代码来实现
from vllm import LLM
from vllm.sampling_params import SamplingParams
model_name = "mistralai/Pixtral-12B-2409"
max_img_per_msg = 3
sampling_params = SamplingParams(max_tokens=8192)
llm = LLM(
model=model_name,
tokenizer_mode="mistral",
load_format="mistral",
config_format="mistral",
limit_mm_per_prompt={"image": max_img_per_msg},
)
urls = [f"https://picsum.photos/id/{id}/512/512" for id in ["1", "11", "111"]]
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image"},
] + [{"type": "image_url", "image_url": {"url": f"{u}"}} for u in urls],
},
]
res = llm.chat(messages=messages, sampling_params=sampling_params)
print(res[0].outputs[0].text)
服务模式推理
在*服务模式*下,vLLM 会启动一个 HTTP 服务器,该服务器持续等待客户端连接并并发发送请求。该服务器公开了一个实现 OpenAI 协议的 REST API,允许您直接重用依赖 OpenAI API 的现有代码。
- 文本输入 (Mistral NeMo)
- 文本输入 (Mistral Small)
- 图像 + 文本输入 (Pixtral-12B)
启动推理服务器以部署您的模型,例如 Mistral NeMo。
vllm serve mistralai/Mistral-Nemo-Instruct-2407 \
--tokenizer_mode mistral \
--config_format mistral \
--load_format mistral
您现在可以运行带有文本输入的推理请求。
- cURL
- Python
curl --location 'http://localhost:8000/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer token' \
--data '{
"model": "mistralai/Mistral-Nemo-Instruct-2407",
"messages": [
{
"role": "user",
"content": "Who is the best French painter? Answer in one short sentence."
}
]
}'
import httpx
url = 'http://localhost:8000/v1/chat/completions'
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
data = {
"model": "mistralai/Mistral-Nemo-Instruct-2407",
"messages": [
{
"role": "user",
"content": "Who is the best French painter? Answer in one short sentence."
}
]
}
response = httpx.post(url, headers=headers, json=data)
print(response.json())
启动推理服务器以部署您的模型,例如 Mistral Small。
vllm serve mistralai/Mistral-Small-Instruct-2409 \
--tokenizer_mode mistral \
--config_format mistral \
--load_format mistral
您现在可以运行带有文本输入的推理请求。
- cURL
- Python
curl --location 'http://localhost:8000/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer token' \
--data '{
"model": "mistralai/Mistral-Small-Instruct-2409",
"messages": [
{
"role": "user",
"content": "Who is the best French painter? Answer in one short sentence."
}
]
}'
import httpx
url = 'http://localhost:8000/v1/chat/completions'
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
}
data = {
"model": "mistralai/Mistral-Small-Instruct-2409",
"messages": [
{
"role": "user",
"content": "Who is the best French painter? Answer in one short sentence."
}
]
}
response = httpx.post(url, headers=headers, json=data)
print(response.json())
启动推理服务器以部署您的模型,例如 Pixtral-12B。
vllm serve mistralai/Pixtral-12B-2409 \
--tokenizer_mode mistral \
--config_format mistral \
--load_format mistral
-
每个 prompt 的默认图像输入数量设置为 1。要增加数量,请设置 `--limit_mm_per_prompt` 选项(例如 `--limit_mm_per_prompt 'image=4'`)。
-
如果您遇到内存问题,设置 `--max_model_len` 选项可以减少 vLLM 的内存需求(例如 `--max_model_len 16384`)。更多故障排除详情可在vLLM 文档中找到。
您现在可以运行带有图像和文本输入的推理请求。假设您想为以下图片添加字幕。

您可以像这样提示模型并获取其响应。
- cURL
- Python
curl --location 'http://localhost:8000/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer token' \
--data '{
"model": "mistralai/Pixtral-12B-2409",
"messages": [
{
"role": "user",
"content": [
{"type" : "text", "text": "Describe this image in a short sentence."},
{"type": "image_url", "image_url": {"url": "https://picsum.photos/id/237/200/300"}}
]
}
]
}'
import httpx
url = "http://localhost:8000/v1/chat/completions"
headers = {"Content-Type": "application/json", "Authorization": "Bearer token"}
data = {
"model": "mistralai/Pixtral-12B-2409",
"messages": [
{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image in a short sentence."},
{
"type": "image_url",
"image_url": {"url": "https://picsum.photos/id/237/200/300"},
},
],
}
],
}
response = httpx.post(url, headers=headers, json=data)
print(response.json())
使用 Docker 部署
如果您希望将 vLLM 部署为容器化推理服务器,您可以利用该项目的官方 Docker 镜像(更多详情请参阅vLLM Docker 文档)。
-
在您的 shell 中设置 HuggingFace 访问令牌环境变量。
export HF_TOKEN=your-access-token
-
运行 Docker 命令以启动容器。
- Mistral NeMo
- Mistral Small
- Pixtral-12B
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model mistralai/Mistral-NeMo-Instruct-2407 \
--tokenizer_mode mistral \
--load_format mistral \
--config_format mistraldocker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model mistralai/Mistral-Small-Instruct-2409 \
--tokenizer_mode mistral \
--load_format mistral \
--config_format mistraldocker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model mistralai/Pixtral-12B-2409 \
--tokenizer_mode mistral \
--load_format mistral \
--config_format mistral
容器启动并运行后,您就可以使用与独立部署相同的代码对您的模型运行推理。