多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

多模态大模型学习路线:从原理到微调部署

多模态大模型学习路线:从原理到微调部署 1. 先说清楚多模态大模型到底在解决什么问题这几年做大模型相关的工作单聊语言模型LLM的人还很多但真正让我觉得天花板远没到的方向其实就是多模态大模型。你去看热搜词、招聘需求、开源社区的热度几乎都在往“视觉语言”“视频语言”“语音语言”这种组合方向走。所谓多模态大模型简单说就是让模型不再只吃文字而是能同时理解图片、音频、视频和文字并且在理解之后还能按照人的指令完成推理、回答、生成内容。我在刚开始接触这个方向时也踩过坑以为多模态就是把图像识别模型和文本模型拼在一起用的时候先跑一遍图像识别再把结果扔给语言模型去生成文字。后来真正做了才发现这种“流水线式”方案和真正的多模态大模型之间差距非常大。真正意义上的多模态模型是在模型内部把不同模态的特征对齐到同一个语义空间里让模型能够跨模态进行推理而不是简单地在外部做拼接。这篇文章我打算按我自己的学习路线来写核心围绕多模态模型的概念、架构、数据准备、微调实操、评估和部署几个环节展开。不管你是刚入门大模型还是已经做过一些单模态的NLP或CV项目想转向多模态方向这都是一条可以照着走的路线。2. 多模态大模型的基础认知先搞懂这几个关键名词2.1 特征对齐到底是什么意思多模态模型最核心的动作是把来自不同模态的输入转换成向量然后在同一个向量空间里做对齐。什么是“对齐”你可以理解成把中文的“苹果”、英文的“apple”、一张红苹果的图片映射到同一个向量空间里距离比较近的位置。这样当模型看到图片里的苹果时它知道这个视觉特征和文字描述里的苹果是一回事。这个想法其实不是大模型时代才有的。早期有跨模态检索相关的思路后来CLIP这类模型真正把“图文对比学习”做成了范式。CLIP的做法是用大量的图片和文字配对数据训练一个图像编码器和一个文本编码器让配对样本的特征向量尽量接近不配对样本的距离尽量拉远。很多后来出现的多模态大模型视觉编码器部分依然沿用CLIP的训练思路或者在CLIP的基础上做继续训练。2.2 从“编码器-解码器”到“大语言模型底座”多模态模型演进到现在大致出现了几种典型结构。第一种是以Florence为代表视觉编码器和文本编码器并行输出时通过一个共同的接口来完成跨模态理解。第二种是以LLaVA为代表的架构把视觉编码器接到一个大语言模型上中间加一个可训练的投影层让视觉特征变成语言模型能理解的向量序列。第三种是以Qwen-VL、InternVL为代表的大一统模型架构上通常也是视觉编码器连接器LLM但在训练策略和数据规模上做了很多优化。从我个人学习经验来看如今主流的多模态大模型基本都是“视觉编码器连接器语言模型底座”这种三段式结构。理解了这个结构后面看任何模型的代码和论文都会轻松很多。语言模型底座负责推理和生成视觉编码器负责提取视觉特征连接器负责把视觉特征“翻译”成语言模型能读懂的形式。2.3 多模态大模型和传统视觉模型的本质区别传统视觉模型做图像分类、目标检测输出的是类别标签或检测框能力边界相对固定。多模态大模型则不同它把视觉理解能力和自然语言的开放式生成能力结合在一起。你给它一张图它不只会告诉你图里有什么还能根据你的问题做推理。比如你问“这张图里的人是在室内还是室外”它能结合人物周围的环境、光线、物体做综合判断。这种能力的背后是模型在大规模图文数据上训练出来的跨模态语义理解能力。所以如果有人问我多模态大模型学起来到底难在哪我的回答是难点不在某一个单独的模型结构而在于你要同时理解视觉特征提取、序列建模、指令微调、数据配比、分布式训练等多方面的知识。这也是为什么需要一条比较系统的学习路线。3. 学习路线的整体拆解别一上来就掉进源码里3.1 前置基础清单多模态大模型不是零基础就能直接上手的方向。我建议在动手之前先把下面这些基础打牢Python编程基础尤其是PyTorch的使用。不用精通到能手写反向传播但至少要能看懂模型定义、数据加载、训练循环。Transformer结构的基本原理。至少要知道自注意力机制是怎么工作的词嵌入是怎么映射的位置编码为什么需要。预训练和微调的基本概念。比如什么是指令微调SFT什么是冻结参数什么是低秩适配LoRA。基础的图像处理方法。不用会做复杂的图像处理算法但至少要了解图像在计算机里是怎么表达成数字张量的RGB通道、分辨率、归一化这些概念要清楚。可能有人觉得Transformer都学完了还看多模态干嘛其实多模态领域有一个额外门槛数据。单模态NLP的数据是一段文本单模态CV的数据是一张图加一个标签多模态的数据是图文对、视频文本对、指令数据数据的规模和质量直接决定模型效果而且处理起来比单模态复杂得多。3.2 我的学习阶段划分我把多模态大模型的学习过程分成四个阶段第一阶段是看懂。找几篇经典论文精读包括CLIP、BLIP-2、LLaVA、Qwen-VL搞清楚每个模型在结构上做了什么、训练数据长什么样、评测结果如何。这个阶段不用追求看懂所有公式重点是建立对模型架构的直观认知。第二阶段是跑通。找开源模型和代码把推理跑通。随便拿一张图片让模型输出一段描述再试几个问答感受一下多模态模型的能力边界。这是建立信心的关键一步也让你之后看源码时有个整体印象。第三阶段是改。把LLaVA或Qwen-VL这类模型拿来做微调换自己的数据改改超参数观察模型行为的变化。这个阶段会真刀真枪地碰代码、看日志、调bug也是收获最大的阶段。第四阶段是评估和部署。用公开评测集测模型效果然后把模型部署成服务测试推理速度、并发能力思考如何在资源受限的情况下优化。这条路线走下来大概需要两到三个月前提是你每天能保证两三小时的学习时间。如果全职学节奏可以快一个月左右。3.3 学习资料怎么选关于资料我的建议是优先看三样东西原版论文、官方代码、实验报告。很多人喜欢先看博客或视频课程但博客的问题是经过二次加工容易丢掉关键细节。尤其多模态领域发展极快一个模型出来没几个月就有新版本过时的博客反而会误导你。看论文时我有个习惯先看图和表格再读方法部分最后才看相关工作。图和表格能在几分钟内给你一个模型的核心思路。看代码时不要从头到尾一行行读而是先看模型定义部分找到视觉编码器、连接器、语言模型这三个结构分别在哪里再去看数据加载部分搞清楚输入数据是怎么被预处理和拼装的。4. 核心模块深度解析视觉编码器、连接器与语言模型底座4.1 视觉编码器怎么选多模态大模型里视觉编码器负责把图像转换成特征序列。目前主流的选择有CLIP的ViT系列、SigLIP、InternViT等。选择视觉编码器时要关注几个指标输入分辨率支持、参数量大小、特征维度以及在图文对齐任务上的表现。以LLaVA为例早期版本用的是CLIP ViT-L/14把224x224的图像切分成14x14的patch每个patch映射成一个特征向量最后得到256个视觉token输入给语言模型。后来很多模型为了提高细粒度理解能力会把输入分辨率提到336或448甚至更高。分辨率越高视觉token数量就越多计算开销也越大。这是一个需要在实际应用里权衡的问题。还有一个细节值得注意很多多模态模型会对视觉编码器做阶段性冻结。训练初期冻结视觉编码器只训练连接器和语言模型后期再解冻部分层做联合微调。这样做一方面是为了避免灾难性遗忘另一方面是视觉编码器已经在海量图文对上预训练过直接微调很容易把学好的特征搞坏。4.2 连接器的设计差异连接器是把视觉特征转化为语言模型输入的关键模块。你不要小看这个模块不同模型的设计差异很大效果也差很多。最简单的连接器就是一个线性投影层把视觉特征的维度映射到语言模型的嵌入维度。LLaVA早期用的就是这种方案实现简单效果也不错。复杂一点的是BLIP-2提出的Q-Former它用一组可学习的query向量去“查询”视觉特征得到若干和文本语义更对齐的向量再输入给语言模型。Q-Former的优点是能用更少的视觉token表达更多的语义信息缺点是结构复杂训练时要多一个阶段。我自己在实践里对比过线性投影层在数据充足的情况下并不比Q-Former差太多甚至训练更稳定。所以在自己的项目里不要盲目追复杂结构先跑通简单的再根据效果决定要不要升级。4.3 语言模型底座的选择逻辑语言模型底座决定了多模态模型的推理上限。同样是看图问答底座是2B还是14B效果差距非常明显。底座参数越多常识推理能力和指令跟随能力越强但对显存和算力的要求也越高。做学习路线时我建议先用7B或8B左右的底座比如Qwen2.5-7B、InternLM2.5-7B这个规模在24G显存上能做LoRA微调推理时甚至可以在16G显存上跑。等你把流程跑通再考虑更大的底座。千万不要一上来就试72B的模型那样大概率卡在环境配置上。语言模型底座还决定了模型的输出风格和指令遵循能力。同一个视觉编码器、同一份数据换不同的底座效果差异会非常明显。所以做微调时如果效果不好不要只想着调数据换底座也是一种常见操作。5. 动手实践多模态微调的全流程5.1 准备训练数据多模态模型的训练数据大体分两类一类是图文对数据用于预训练或继续训练数据格式就是一张图片配一段描述文本另一类是指令数据用于微调数据格式是一张图片配一组多轮对话对话中包含用户问题、模型回答。自己从零收集海量图文对不现实更好用的做法是使用公开数据集。比如LAION、CC3M、CC12M这些图文对数据集或者用LLaVA-Pretrain这种已经处理好的预训练数据。指令微调阶段可以用LLaVA-Instruct、ShareGPT4V这类公开数据也可以根据自己的业务场景构造小规模的高质量指令数据。在构造指令数据时我有一个建议质量永远比数量重要。几千条高质量、覆盖各种提问方式的数据效果往往比几万条重复模板数据要好。指令数据要多样化包含描述类问题、推理类问题、比较类问题、计数类问题等。我见过太多人拿一个模板生成几万条数据训出来的模型只会按模板说话换个问法就崩了。5.2 数据格式化示例以LLaVA系列的训练数据为例一般用一个JSON文件组织对话。每条数据大概长这样{ id: 00000001, image: path/to/image.jpg, conversations: [ { from: human, value: 请描述这张图片的内容。 }, { from: gpt, value: 图片中是一片海滩远处有几棵椰子树近处有一个人在海边散步。 } ] }不同框架的数据格式略有差异但核心思想一致图片路径加对话轮次。训练时模型会看到图片对应的视觉特征和全部对话历史基于前面的对话来生成当前轮的回复。指令数据里有些框架会区分“系统提示”和“用户消息”处理时要看清框架要求。5.3 微调工具的选择与上手现在做多模态微调不太需要自己从头写训练脚本。我常用的工具是LLaMA Factory和Xinference其中LLaMA Factory对多模态模型的支持比较完整界面友好文档也写得很清楚。用LLaMA Factory做多模态微调大致步骤是安装依赖包括PyTorch、transformers、peft、deepspeed等。准备训练数据按照框架规定的JSON格式组织。在配置界面选择模型名称、微调方法LoRA、数据集、学习率、批次大小等参数。启动训练监控损失曲线和显存占用。训练完成后合并LoRA权重导出完整模型。用评测集或实际图片测试模型效果。这里重点说两个容易被忽视的参数。第一个是image_resolution也就是输入图片的分辨率。不同模型对分辨率有不同要求盲目调高会导致视觉token数量暴增训练显存跟不上。第二个是lora_rankLoRA的秩大小。秩越大可训练参数越多模型能力上限越高但过拟合风险也增加。我一般先设64看验证集效果再调整。5.4 显存不够怎么办很多人在本地部署或微调多模态模型时卡在显存上。16G显存加32G内存能部署什么规模的多模态模型我的经验是纯推理情况下7B到8B的模型可以用4比特量化跑起来大概占用6G到8G显存剩余内存会被部分卸载到系统内存速度会慢一些但能用。如果是14B模型建议至少24G显存或者用CPU推理方案速度比较慢但至少能跑。微调比推理更吃显存。16G显存跑7B模型的LoRA微调开启梯度检查点把batch size设成1勉强可行。如果想跑14B的微调建议还是上24G或更高显存的显卡。这个资源门槛是客观存在的避不开。但不用为此焦虑先跑小模型把流程走通比什么都强。6. 评测指标与模型效果验证6.1 常用的公开评测基准多模态模型的评测比纯语言模型复杂因为既要看文本生成质量又要看图文匹配的准确性。目前常见的评测基准有MMMU涵盖多个学科领域的多模态理解基准题目涉及图表、几何、人文社科等难度较高。MMBench中文和英文都覆盖的多模态评测基准题目类型丰富适合衡量综合能力。SEED-Bench包含视频和图像理解任务侧重跨模态理解能力。TextVQA聚焦图片中的文字识别与问答测试模型对OCR结果的推理能力。这些基准都有公开的评测脚本可以直接跑。但要注意同一个模型在不同评测集上的表现差异可能很大因为评测题目的数据分布不同。选择评测基准时要结合自己的应用场景。如果你做的是文档理解TextVQA的参考价值就比MMMU更大。6.2 手动评测的意义公开评测集不能解决所有问题。我见过不少模型在公开评测集上分数很高但在真实业务数据上表现平平原因就是数据分布不匹配。所以除了跑公开集我强烈建议自己准备一批“私有评测数据”最好是从实际场景里抽出来的图片和问题。手动评测时不要只看答案对不对还要关注几点回答是否详细具体还是只会给模糊结论对同一张图片用不同问法问回答是否稳定面对图片里的文字、图表、复杂场景时是理解还是胡编。这些观察能帮你快速找到模型的短板再针对性地补充训练数据。比如发现模型总是把数字看错就多收集带数字的图片数据。这种“评测-发现问题-补充数据-再评测”的循环才是实际工作中提升模型效果最有效的方式。6.3 常见评价指标的坑多模态生成类任务里很多人喜欢用BLEU、ROUGE这类文本匹配指标但我要提醒一句这类指标在多模态问答场景下参考价值很有限。因为同一个问题可以有多种表达方式答案文字不同不代表语义错误。更好的做法是同时使用语义相似度指标和人工评测。另外准确率不等于能力。有时候模型在某个评测集上准确率提升只是因为它在答案模板上过拟合了。所以做评测时最好定期换一批新问题避免模型“记住”测试集。7. 部署落地把多模态模型跑起来7.1 部署框架选型训练完模型最终要部署成服务才能真正被业务使用。多模态模型的部署和纯语言模型类似核心目标都是在有限的硬件资源下尽量提高吞吐量和降低响应延迟。目前主流的部署工具有vLLM、SGLang、Xinference以及Ollama这类面向个人用户的产品级工具。它们都支持常见的多模态模型格式。vLLM的优势是吞吐量高支持连续批处理和PagedAttention适合并发请求较多的场景。SGLang在结构化推理方面有优势但社区生态和文档相对vLLM少一些。Ollama的优势是上手门槛极低适合个人电脑上体验但生产环境的灵活度和性能优化选项不够丰富。我实际用下来的体验是做生产环境优先考虑vLLM个人折腾Ollama就够了。如果你部署的是Qwen-VL或InternVL这类主流模型vLLM官方文档基本都有完整的部署示例照着做就行。7.2 部署一个多模态服务的操作示范以vLLM部署Qwen2-VL-7B-Instruct为例代码大致是这样的from vllm import LLM, SamplingParams llm LLM( modelQwen/Qwen2-VL-7B-Instruct, limit_mm_per_prompt{image: 4, video: 1}, ) sampling_params SamplingParams( temperature0.7, top_p0.8, max_tokens512, ) prompt [ { role: user, content: [ {type: image, image: https://example.com/cat.jpg}, {type: text, text: 请描述这张图片里的动物。} ] } ] outputs llm.chat(messagesprompt, sampling_paramssampling_params) print(outputs[0].outputs[0].text)这里几个参数值得解释一下。limit_mm_per_prompt限制了单次请求里能包含的图片或视频数量防止用户传入超大输入导致显存溢出。max_tokens控制生成的最大长度对于视觉问答场景我一般设256到512太长会拖慢响应速度。如果你要部署成HTTP服务vLLM还提供了OpenAI兼容的API服务启动方式一条命令就能完成vllm serve Qwen/Qwen2-VL-7B-Instruct --limit-mm-per-prompt image4启动之后可以按OpenAI接口格式发送请求这对于接入现有的应用框架非常方便。7.3 推理速度和并发优化多模态模型的推理速度瓶颈通常在两个地方视觉编码器的前向计算以及语言模型阶段的token生成。如果你发现服务响应很慢先判断慢在哪一步。一般图片尺寸越大视觉编码阶段越慢。优化手段包括控制输入图片的分辨率、对图片做预处理缩放、使用更小的视觉编码器。并发场景下显存是稀缺资源。如果多张卡并行可以使用张量并行tensor parallel或数据并行。vLLM会自动处理连续批处理但你要根据实际并发量调整max_num_seqs参数。设太大会把显存占满设太小又浪费算力。我一般是从默认值开始实测并发和延迟后再调。还有一个经验部署模型前先把精度测试和压力测试做一遍。精度测试看模型输出是否正确压力测试看并发上来后会不会OOM或超时。这两步在真实业务里非常重要但很多初学者容易忽略。8. 实操过程中最常踩的坑8.1 训练不收敛或Loss震荡多模态模型训练比纯语言模型更容易出现Loss不收敛的情况。第一个原因是学习率设置不当。多模态模型通常有两个或多个模块不同模块适合的学习率不同。比如连接器部分可以给稍大的学习率视觉编码器如果解冻则需要更小的学习率。我在训练时一般把基础学习率设为1e-5到2e-5LoRA层的学习率可以稍大一些。第二个原因是数据问题。图文数据不对齐、图片路径错误、文本与图片内容不相关都会导致训练不稳定。建议训练前先写一个数据验证脚本随机抽几百条数据检查图片能不能正常加载、文本是否有乱码、图文内容是否确实相关。第三个原因是精度问题。混合精度训练用的bf16和fp16在多模态场景下表现差异明显。如果模型加载后出现Loss跑飞可以尝试切到bf16它对数值溢出的容错性更好。8.2 模型输出“幻觉”严重多模态模型的幻觉问题非常常见具体表现是图片里根本没有的东西模型描述得头头是道图片里看不清的文字模型会脑补出内容。这个问题和训练数据的质量直接相关。如果训练数据里大量出现图文不匹配的情况模型就学会“编造”了。一个有效的缓解方法是在指令数据里加入明确的约束比如问“图片中有几条狗”时答案统一写“根据图像图中有一条狗”而不是简单写“一条狗”。这种带有推理过程的回答能帮助模型建立起“先看再答”的习惯。另外在推理时可以设置较低的温度参数比如0.1或0.2降低生成时的随机性减少幻觉。8.3 本地资源不足的应对策略如果你手头只有16G显存甚至更少别灰心有几个变通思路第一尽量用量化模型。4比特量化对多模态模型的视觉特征表达能力有影响但多数场景下可以接受。第二用小尺寸底座。3B、4B级别的多模态模型在普通显卡上也能跑得不错效果虽不如7B但对学习流程来说足够了。第三用云GPU。如果只是偶尔训练租一块40G以上显存的显卡按小时计费比自己买卡划算得多。我之前就是用16G显存跑了4比特量化后的7B模型微调batch size为1开了梯度检查点虽然每一步训练时间比大显存慢不少但流程完全跑通了。有些事不是条件完美才能做而是先跑起来再逐步优化。9. 从学到用的扩展建议我之前在本地用Ollama部署过几个多模态模型配合一些主流的RAG框架做图文混合检索效果出乎意料地好。比如把一份文档里的图片和文字分别抽出来图片用多模态模型生成文字描述再统一走向量检索这样用户在提问时既能命中文字段落也能通过图片描述找到相关图片。这套方案特别适合知识库、产品说明书、培训资料这类场景。多模态模型的应用范围还在快速扩展和Agent结合也是一个大方向。让模型不仅能看图说话还能根据图片内容调用工具、操作系统这个领域还处于比较早期的阶段值得持续关注。但我始终相信先把基础打牢把训练、微调、评测、部署这一整套流程走通无论后续技术怎么演进你都有能力快速跟上。对于正在规划学习路线的人我的建议是不要囤资料不要重复看教程找一个开源的多模态模型准备一批自己的数据从微调到部署亲手走一遍。这个过程会比看十篇论文都管用。踩过坑、看过崩溃日志、调过损失曲线这些经历才是真正让你从“知道”变成“会做”的关键。
返回列表