多模态大语言模型的崛起与vLLM高效服务
在本教程中,您将学习像LLaVA、GPT-4V和BakLLaVA这样的多模态大语言模型如何结合视觉和语言理解能力,为什么它们代表了AI能力的重大转变,以及vLLM框架如何通过OpenAI兼容的API实现这些模型的高效、可扩展部署。
多模态大语言模型简介
大语言模型(LLMs)彻底改变了我们与机器交互的方式——从写作助手到推理引擎。但直到最近,它们主要还停留在文本领域。
人类不是这样工作的。我们使用多种模态——视觉、语言、音频等——以无缝、统一的方式理解世界。这就是多模态大语言模型(MLLMs)的用武之地。
这些模型不仅能阅读;它们能看到、解释并响应多种类型的输入,特别是文本和图像。
什么是多模态大语言模型?
多模态大语言模型是设计用于处理和推理多种类型输入的模型——最常见的是文本和图像。
在实践中,这意味着:
- 您可以输入照片或图表,要求模型描述它
- 您可以询问模型关于图像的问题,如"这是什么品牌的鞋子?“或"可见多少个交通标志?”
- 您可以结合图像+文本提示来更自然地引导响应
这些模型通过结合两个主要组件工作:
- 视觉编码器(如CLIP、EVA或BLIP-2),从图像中提取特征
- 语言模型(如LLaMA、Vicuna、Mistral),基于这些特征和任何伴随的提示生成文本
通常在两者之间插入一个薄投影层,将视觉特征映射到语言模型的标记空间。
这种结构让多模态大语言模型能够"看到"和"说话"——实现强大的任务,如视觉问答(VQA)、文档理解、无OCR表单理解、医学图像描述等。
多模态大语言模型演进里程碑
让我们快速浏览塑造这一领域的模型。
Flamingo(DeepMind,2022)
Flamingo引入了这样的想法:您可以使用巧妙的格式和适配器将图像特征和文本馈送到相同的仅解码器语言模型中。
- 视觉编码器:冻结
- 少样本学习:在有限标记数据下表现强劲
- 解锁能力(如VQA、图像描述和图像文本推理)
Flamingo是一个转折点——它表明通过正确的技巧,您不需要从头开始重新训练所有内容。
GPT-4V(某机构,2023)
GPT-4V(带视觉的GPT-4)将多模态推理带入主流。
- 完全闭源
- 图像输入作为聊天提示的一部分被接受
- 能够处理高级任务(如图表阅读、表情包解释和无OCR表单分析)
它目前是通用图像+文本推理的黄金标准——但由于是封闭的,对于需要本地部署、透明或低成本解决方案的大多数实际应用来说不可用。
LLaVA(大型语言和视觉助手,2023)
LLaVA是社区对GPT-4V的回应。
- 开源
- 结合CLIP(ViT-L)作为视觉编码器和Vicuna(基于LLaMA)作为语言模型
- 使用GPT-4生成的图像文本指令对进行训练
- 架构:
- 视觉编码器(CLIP ViT-L)→投影→语言模型(Vicuna)
- 支持图像作为输入和基于聊天的提示
LLaVA证明可以使用开放组件实现类似GPT-4V的结果——关键的是,它是可微调的、可审计的和可部署的。
BakLLaVA(2024)
BakLLaVA建立在LLaVA蓝图之上,但更进一步:
- 完全在开放数据集上训练——不依赖GPT-4输出
- 支持LLaMA 2和基于Mistral的骨干网络
- 提供更多透明度和更广泛的许可自由
这是一个社区优先的倡议,符合开源精神,并作为专有多模态模型的真正替代品。
其他开源模型
这一领域正在迅速发展。一些关键参与者包括:
- CogVLM:具有开放权重和强大基准的高性能多模态模型
- MiniGPT-4:使用BLIP-2 + Vicuna的轻量级替代方案
- VisualGLM、BLIVA、PandaGPT:每个都有不同的编码器-解码器组合和训练策略
然而,这些模型中的一个共同限制是它们很难高效部署,特别是对于生产用例。
部署差距
像LLaVA和BakLLaVA这样的开源模型非常出色——但大多数都有:
- 在大图像上推理速度慢
- 缺乏批处理、流式传输或GPU内存效率
- 没有OpenAI风格的API用于简单的应用集成
这就是vLLM的用武之地——一个最初为纯文本大语言模型构建的高性能推理引擎,现在通过像llava_vllm这样的项目扩展到视觉语言模型。
配置您的开发环境
要遵循本指南,请确保您的系统上安装了Transformers和Pillow库。
幸运的是,所有库都可以通过pip安装:
$ pip install transformers==4.53.2 pillow==11.3.0
亲自尝试:使用LLaVA和BakLLaVA进行推理
让我们看看使用Hugging Face和Transformers运行开源多模态模型的推理是多么容易。我们将从LLaVA-1.5-7B开始,然后转向BakLLaVA-v1。
示例1:LLaVA-1.5-7B(通过pipeline)
在此示例中,我们将使用LLaVA-1.5-7B回答关于来自AI2D数据集的火山图的问题。
from transformers import pipeline
from PIL import Image
import requests
import matplotlib.pyplot as plt
# 通过pipeline加载模型
model_id = "llava-hf/llava-1.5-7b-hf"
pipe = pipeline("image-to-text", model=model_id)
# 下载演示图像(来自AI2D的火山横截面)
url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/ai2d-demo.jpg"
image = Image.open(requests.get(url, stream=True).raw)
# 显示图像,以便我们知道模型看到了什么
plt.imshow(image)
plt.axis("off")
plt.title("AI2D演示图像")
plt.show()
# 构建多模态提示(图表问答风格)
prompt = (
"USER: <image>\n"
"标签15代表什么?"
"(1) 熔岩 (2) 核心 (3) 隧道 (4) 灰云\n"
"ASSISTANT:"
)
# 运行推理
outputs = pipe(image, prompt=prompt, generate_kwargs={"max_new_tokens": 200})
print(outputs[0]["generated_text"])
我们首先将LLaVA模型加载到Hugging Face pipeline中。
获取并显示图像,让读者看到火山图。
提示将文本与<image>占位符混合,提出一个多项选择题。
然后模型生成一个答案——通常指向正确选项"灰云"。
输出:
USER:
标签15代表什么?(1) 熔岩 (2) 核心 (3) 隧道 (4) 灰云
ASSISTANT: 标签15代表灰云,这是火山喷发时产生的灰和碎片云。在图像中可以看到这个灰云,以及其他代表山体、熔岩和核心的标签。
示例2:BakLLaVA-v1(使用AutoProcessor)
接下来,让我们尝试BakLLaVA-v1,一个较新的开源多模态大语言模型。这里我们不使用pipeline API,而是直接使用AutoProcessor和模型的generate()方法。
import requests
from PIL import Image
import torch
import matplotlib.pyplot as plt
from transformers import AutoProcessor, LlavaForConditionalGeneration
# 模型和测试图像
model_id = "llava-hf/bakLlava-v1-hf"
image_url = "http://images.cocodataset.org/val2017/000000039769.jpg"
prompt = "USER: <image>\n这些是什么?\nASSISTANT:"
# 加载模型和处理器
model = LlavaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.float16,
low_cpu_mem_usage=True,
).to("cuda" if torch.cuda.is_available() else "cpu")
processor = AutoProcessor.from_pretrained(model_id)
# 获取并显示图像
raw_image = Image.open(requests.get(image_url, stream=True).raw)
plt.imshow(raw_image)
plt.axis("off")
plt.title("COCO样本图像")
plt.show()
# 准备输入(注意:为安全使用关键字参数)
inputs = processor(
images=raw_image,
text=prompt,
return_tensors="pt"
).to(model.device, torch.float16)
# 生成文本输出
output = model.generate(**inputs, max_new_tokens=200, do_sample=False)
print(processor.decode(output[0], skip_special_tokens=True))
- BakLLaVA通过
from_pretrained()直接加载 - 我们获取一个样本COCO图像(沙发上两只狗)并显示它
- 处理器将图像和提示都编码为张量
- 模型的
generate()方法产生自然语言响应(例如,“两只狗坐在沙发上”)
为什么多模态很重要
多模态大语言模型不仅仅是一种学术好奇心——它们代表了我们构建和与AI系统交互方式的重大转变。
通过将语言理解与视觉感知相结合,这些模型解锁了纯文本模型无法处理的全新应用类别。
实际用例
以下只是多模态大语言模型已经产生影响的几个领域:
图像描述
自动描述图像中的内容——不仅仅是列出对象,而是生成流畅、上下文相关的描述。
- “一只金毛猎犬在森林中跳过原木”
- “一位老人在长椅上看报纸”
用于:辅助工具、照片库、电子商务平台和图像搜索引擎。
视觉问答(VQA)
这些模型可以回答关于图像的自然语言问题,通常推理布局、对象关系和空间定位。
- 问:“有多少人戴着头盔?”
- 问:“交通灯是红色还是绿色?”
用于:自动驾驶车辆、工业检测、安全监控和教育工具。
文档和表单理解
多模态大语言模型可以直接解析表单、表格、扫描文档和收据——具有视觉和语言基础,而不是依赖脆弱的OCR+启发式流水线。
- “这张发票的总金额是多少?”
- “谁签署了这份合同?”
- “哪些字段缺失?”
用于:金融科技、保险、合规、智能文档处理(IDP)。
基础推理
多模态大语言模型可以基于文本线索理解图像中某些内容的重要性——从解释图表和表情包到推理流程图。
- “这个表情包有什么好笑的地方?”
- “在这个流程图中,氧化之后是哪个过程?”
用于:教育、技术支持和内容审核。
开发者和公司关心的原因
那么,为什么开源社区对多模态大语言模型有如此大的动力?
- 自然用户体验:上传图像+输入提示→获得答案。它反映了人类交流。
- 灵活输入:应用程序不再受限于仅文本输入框。
- 模型整合:多模态大语言模型将所有内容统一在一个模型中,而不是将多个模型(OCR+图像描述+推理)拼接在一起。
- 竞争优势:这些模型将类似GPT-4V的能力带到自托管堆栈——无需将敏感数据发送到第三方API。
- 开源速度:像LLaVA和BakLLaVA这样的工具正在迅速改进,社区渴望围绕它们构建工具。
简而言之:多模态大语言模型不仅仅是"更好"的模型——它们是全新智能应用类别的推动者。
服务多模态模型的挑战
多模态大语言模型(如LLaVA和BakLLaVA)已经打开了强大的视觉语言能力的大门——全部在开源生态系统中。但如果您曾经尝试部署一个,您会知道真相:
这些模型非常难以高效服务。
尽管它们具有突破性的性能,但大多数多模态大语言模型在设计时并未考虑生产部署。它们在笔记本中工作,当然——但尝试扩展它们、将它们与应用程序集成或在有限的GPU基础设施上服务它们……您很快就会碰壁。
让我们分析一下原因。
1. 视觉+语言的计算开销
多模态模型是双重需求的——因为它们处理图像和文本。您不再只是加载像LLaMA或Vicuna这样的大语言模型。
现在,您还需要:
- 视觉编码器(如CLIP或BLIP-2)——通常是一个大型ViT模型
- 投影层,将图像特征与语言模型的标记空间对齐
- 解码器(Vicuna、Mistral等)生成响应
这意味着:
- 更多GPU内存
- 更长的推理时间
- 更慢的冷启动
即使是一个小图像,一旦编码,也会向提示添加数百个密集标记——将模型推向上下文窗口限制。
2. 无批处理、无流式传输、吞吐量差
大多数基于LLaVA的存储库使用简单的Python推理循环——而不是优化的服务引擎。
这导致:
- 无请求批处理:每个用户调用都是顺序处理的
- 无标记流式传输:输出一次性返回,导致延迟
- GPU利用率差:即使在高端硬件上,您最终也可能等待空闲计算
对于像聊天机器人或视觉助手这样的实际应用程序,这种性能拖累是不可接受的。
3. 缺乏OpenAI兼容的API
大多数开源多模态模型暴露基本的HTTP端点或推理脚本。
但它们不使用OpenAI API语言,这意味着:
- 您不能将它们插入LangChain、LlamaIndex或Gradio组件而无需重大更改
- 您不能重用为GPT-4或其他某机构模型编写的前端代码
- 您失去了生态系统兼容性和工具
4. 无统一服务框架
与纯文本大语言模型(有Hugging Face文本生成推理、vLLM、TGI等)不同,多模态世界是分散的。
每个存储库重新发明:
- 自己的服务器
- 自己的API规范
- 自己的图像输入格式
没有标准,并且很少关注高性能服务。
5. 开发者痛苦,最终用户摩擦
结果?很多不必要的摩擦。
- 开发者花费数天调试慢速服务器、内存问题和JSON格式
- 用户获得延迟体验和无响应的应用程序
- 每个人都问:“为什么不能像调用某机构那样容易?”
要点
多模态大语言模型是革命性的——但它们需要适当的服务引擎才能使它们在现实世界中可用。
我们需要:
- 高吞吐量推理
- 标记流式传输
- OpenAI兼容的API
- 易于集成的UI工作流程
这就是vLLM的用武之地——在下一节中,我们将向您展示它如何 exactly 解决这些问题。
什么是vLLM?
vLLM是一个开源的高吞吐量大语言模型推理引擎,旨在提供极快的生成、高效的GPU内存使用和本机OpenAI兼容端点。由某中心的研究人员开发,它用专为生产规模大语言模型部署构建的服务堆栈取代了较慢、内存密集的解决方案,如Hugging Face流水线或简单的FastAPI后端——包括像LLaVA这样的多模态模型。
与传统方法不同,传统方法在实时工作负载下经常遭受低效内存使用和高延迟,vLLM从底层开始为规模优化。它包含了现代模型服务平台(如某机构和某机构)中使用的几种先进技术——为开发者在本地或云环境中复制该体验提供了一种方式。
为vLLM提供动力的核心功能
让我们仔细看看引擎盖下的创新:
分页注意力(高效KV缓存)
自回归大语言模型在生成更多标记时生成一组不断增长的键/值(KV)注意力缓存——导致碎片化和臃肿的内存占用,特别是在处理多用户工作负载时。
vLLM引入了分页注意力,一种新的内存管理方案,将KV缓存分块为固定大小的块,并将它们存储在分页、虚拟化的GPU内存结构中。
这使得:
- 跨并行提示更好地内存重用
- 更低的内存碎片
- 更高的批处理大小而不会耗尽VRAM
在实践中,分页注意力可以减少高达80%的内存开销,同时支持数十到数百个并发会话。
连续批处理
与传统批处理(请求必须一起到达)不同,vLLM支持连续、异步批处理。传入提示动态地即时分组为最优执行批处理——确保即使提示长度和到达时间变化,也接近100% GPU利用率。
这种批处理策略支持在规模上进行实时推理,并且在像聊天应用程序或RAG流水线这样的延迟敏感场景中特别重要。
推测解码
为了进一步加速推理,vLLM支持推测解码,一种轻量级草稿模型生成候选标记,然后由主模型验证的技术。
这通过流水线化生成步骤减少响应时间,并在不牺牲准确性的情况下提高响应能力——特别是在生成长格式内容期间。
流式响应
vLLM支持标记流式传输,允许模型在生成时增量发送输出——就像某机构的ChatGPT一样。
这对于像以下应用程序至关重要:
- 聊天机器人
- 代理循环
- 任何受益于渐进渲染的UI(如Streamlit、LangChain)
流式通过vllm-serve中的标志启用,并在其OpenAI风格端点中本机支持。
内置OpenAI兼容API
您可以使用与某机构GPT模型相同的/v1/chat/completions和/v1/completions API查询vLLM——这意味着像以下工具:
- LangChain
- OpenAI SDK
- 自定义UI(如Streamlit):开箱即用,只需最少的代码更改。
为什么这对多模态工作负载很重要
虽然vLLM最初是为仅语言模型开发的,但它现在通过--mm-vision-tower标志包括对像LLaVA这样的视觉语言模型的一流支持。这意味着:
- 您可以运行图像+文本提示
- 输出基础的多模态响应
- 无需任何模型特定的补丁或包装器
离线Python API(from vllm import LLM)和OpenAI兼容服务器模式(vllm serve)都与像以下模型无缝工作:
llava-hf/llava-1.5-7b-hfbakllava/llava-1.6- 和未来扩展(如CogVLM、LLaVA-Next)
这使得vLLM成为构建生产就绪多模态界面的开发者的首选服务解决方案。
vLLM GitHub存储库
您可以在GitHub上找到官方vLLM源代码:github.com/vllm-project/vllm
此存储库包含开始使用vLLM所需的一切:
- vLLM推理引擎和
vllm-serve入口点 - 通过Python和OpenAI兼容端点服务模型的示例脚本
- Docker设置和部署说明
- 使用不同模型类型(仅文本、视觉语言、MoE等)的指南
- 来自开源社区的活跃问题、讨论和贡献
该存储库积极维护,并定期更新新功能,如LLaVA集成、连续批处理改进和推测解码增强。如果您计划扩展vLLM、贡献功能或保持与路线图讨论的更新,GitHub存储库是关注的地方。
总结
在本课中,我们深入探讨了多模态大语言模型不断发展的前景——这些模型不仅理解文本。然而,我们也可以处理和推理图像。从早期突破如Flamingo到闭源系统如GPT-4V和开源挑战者如LLaVA和BakLLaVA,我们已经看到AI的前沿如何迅速扩展到语言之外。
我们探讨了为什么多模态很重要——不仅仅在理论上,而且在实践中。这些模型已经被用于构建更智能的助手、改进辅助功能、分析文档和为跨领域的下一代应用程序提供动力。并且对商业API的开放、自托管和可适应替代方案的需求只增长。
但随着机会而来的是复杂性。大多数开源多模态模型在设计时并未考虑高效部署。高内存使用、缺乏批处理和不兼容的API使得在规模上服务它们成为真正的挑战。
这就是vLLM进入画面的地方。创建用于以高吞吐量和低延迟服务大语言模型的vLLM,现在由于添加LLaVA模型支持的最近PR而支持视觉语言推理。虽然它不完全开箱即用地处理多模态模型,但它提供了一个强大的、OpenAI兼容的基础——并且通过一些有针对性的扩展,它可以适应在实际应用程序中服务LLaVA或BakLLaVA。
在下一课中,我们将把在这里学到的所有内容转化为具体的东西。我们将克隆存储库,设置vLLM后端,并部署一个完全工作的多模态服务器,接受图像和文本提示。无论您计划构建自定义视觉聊天机器人、文档问答工具,还是想尝试多模态推理,此设置将为您提供开始所需的一切。
让我们开始构建。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
1054

被折叠的 条评论
为什么被折叠?



