Gemma 3 多模态推理 通过vllm运行Gemma-3-27B-IT模型的推理服务
Gemma 3 多模态推理 通过vllm运行Gemma-3-27B-IT模型的推理服务
flyfish
例子
通过vllm启动Gemma-3-27B-IT模型的推理服务,在2个GPU上分布式加载Gemma-3-27B-IT模型,通过vllm启动一个高性能推理服务器(端口8102),支持最长16384 tokens的上下文。
vllm serve gemma-3-27b-it --tensor-parallel-size 2 --max-model-len 16384 --port 8102 --trust-remote-code --served-model-name gemma3-27b --enable-chunked-prefill --max-num-batched-tokens 2048 --gpu-memory-utilization 0.95
命令:vllm serve
这是vllm的核心指令,用于启动一个高性能的模型推理服务器,提供API接口(如OpenAI兼容的/v1/chat/completions
等),方便客户端通过HTTP请求调用模型。
参数:
-
gemma-3-27b-it
必选参数,指定要加载和服务的模型名称/路径。这里表示加载Gemma-3-27B-IT模型(需确保模型已下载到本地或可通过Hugging Face Hub访问)。 -
--tensor-parallel-size 2
用于大模型的“张量并行”配置,指定将模型的层拆分到2个GPU上运行。
由于Gemma-3-27B模型参数量大(270亿参数),单GPU内存可能无法容纳,通过张量并行将模型分散到多个GPU,实现分布式加载和推理。 -
--max-model-len 16384
限制模型支持的“最大序列长度”(输入+输出的总tokens数)。
这里设置为16384,意味着模型最多可处理16384个tokens的上下文(包括用户输入、历史对话和生成的回答),超过此长度会被截断。 -
--port 8102
指定vllm服务器监听的端口号。
客户端需通过http://localhost:8102
(或服务器IP:8102)访问API,与之前日志中显示的“Starting vLLM API server on http://0.0.0.0:8102”对应。 -
--trust-remote-code
允许执行模型仓库中的“远程代码”。
部分模型(尤其是自定义或非标准结构的模型)可能需要加载仓库中附带的Python代码(如modeling_*.py
)来正确初始化,此参数用于信任并执行这些代码(注意潜在安全风险)。 -
--served-model-name gemma3-27b
自定义API中使用的“模型名称”。
客户端调用时需指定此名称(如在/v1/chat/completions
请求中通过"model": "gemma3-27b"
指定),方便区分同一服务器上的多个模型。 -
--enable-chunked-prefill
启用“分块预填充”优化。
对于长输入(如长文本、多轮对话),vllm会将输入拆分为多个“块”进行预处理(prefill),减少一次性占用的内存,提升长序列推理的效率和稳定性。 -
--max-num-batched-tokens 2048
限制“批处理中最大的tokens总数”。
vllm通过“批处理”(将多个请求合并处理)提升GPU利用率,此参数控制一批请求中所有输入的tokens总和不超过2048,避免内存溢出。 -
--gpu-memory-utilization 0.95
设置GPU内存的“最大利用率”(0.95即95%)。
vllm会根据此比例分配GPU内存(预留5%避免内存碎片化或突发占用导致OOM错误),平衡内存使用效率和稳定性。
import requests
import base64
import jsondef encode_image(image_path):"""将图像文件编码为base64字符串"""with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')def read_prompt_from_file(prompt_path):"""从文本文件读取prompt内容"""with open(prompt_path, "r", encoding="utf-8") as file:return file.read().strip()def send_to_vllm(image_path, prompt_path, vllm_server_url="http://127.0.0.1:8102/v1/chat/completions"):# 读取并处理输入base64_image = encode_image(image_path)prompt_text = read_prompt_from_file(prompt_path)# 构造符合OpenAI格式的消息,包含图像和文本messages = [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": [{"type": "text","text": prompt_text},{"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}]}]# 构造vllm请求,符合OpenAI API格式payload = {"model": "gemma3-27b", # 模型名称"messages": messages,"max_tokens": 2048,"temperature": 0.7,"top_p": 0.9}headers = {"Content-Type": "application/json"}try:# 发送请求到vllm服务器response = requests.post(vllm_server_url, headers=headers, json=payload)response.raise_for_status() # 检查请求是否成功# 解析并返回结果result = response.json()return result['choices'][0]['message']['content']except requests.exceptions.RequestException as e:print(f"请求发生错误: {e}")if response is not None:print(f"响应内容: {response.text}")return Noneif __name__ == "__main__":# 替换为你的本地图像路径和prompt文本文件路径IMAGE_PATH = "local_image.jpg" # 本地图像文件PROMPT_PATH = "prompt.txt" # 包含prompt的文本文件# 发送请求并获取结果response_text = send_to_vllm(IMAGE_PATH, PROMPT_PATH)if response_text:print("模型响应:")print(response_text)
输入
使用中文描述这张图像
输出
模型响应:
这张图描述了一个知识蒸馏(Knowledge Distillation)的流程。图中包含以下几个主要元素:* **Dataset (数据集):** 一个圆柱体,代表用于训练模型的数据集。
* **Teacher model (教师模型):** 一个矩形,代表已经训练好的“教师”模型,它具有较高的准确性。
* **Student model (学生模型):** 一个矩形,代表需要训练的“学生”模型,目标是尽可能接近教师模型的性能。
* **Teacher logits (教师模型的输出):** 一个矩形,表示教师模型对数据的预测结果(未经softmax处理的输出)。
* **Student logits (学生模型的输出):** 一个矩形,表示学生模型对数据的预测结果(未经softmax处理的输出)。
* **Loss (损失函数):** 一个椭圆形,代表用于衡量学生模型预测结果与教师模型预测结果差异的损失函数。通常会结合教师模型logits和学生模型logits计算损失。
* **Weight updates (权重更新):** 一个菱形,代表通过损失函数计算出的梯度,用于更新学生模型的权重。**流程描述:**1. 数据集被输入到教师模型和学生模型中。
2. 教师模型和学生模型分别输出logits。
3. 教师模型logits和学生模型logits被输入到损失函数中,计算损失值。
4. 损失值被用于计算权重更新,从而更新学生模型的权重。
5. 整个过程重复进行,直到学生模型达到预期的性能。总而言之,这张图展示了知识蒸馏的核心思想:利用一个已经训练好的教师模型来指导一个学生模型的训练,使得学生模型能够学习到教师模型的知识,从而提高自身的性能。