从零训练一个多模态LLM:预训练+指令微调+对齐+融合多
你以为训多模态LLM全靠连接器?我烧了半年显卡,终于悟了
去年冬天,我一个人坐在机房,盯着屏幕上那条停滞不动的loss曲线,旁边32张A100风扇嗡嗡转着,烧的是真金白银啊!
当时我正用LLaMA-65B往Early Fusion那条路上死磕——就想把图像和文本在token级别就融在一起,听着多高级啊。结果呢?模型连“图上有几只猫”这种问题都答不对,数到3就开始胡扯。
后来我翻来覆去睡不着,终于想明白了——决定你成败的,根本不是那些听着就高级的连接器,而是你对数据和训练节奏的理解!
说到这儿,我得跟你掏心窝子说一句:现在开源社区里太多人被带偏了。一上来就怼Q-Former、Perceiver Resampler这些花哨玩意儿,结果训出来的模型一股“学术僵尸味”。
真的,Late Fusion才是我们小团队的“正确答案”
你想想,你手头就那么几张A100,敢动辄重新预训练65B的模型吗?
我一开始也跟风,觉得Early Fusion才是正道——把图像patch token和文本token在输入层就拼一块,用统一transformer处理。听起来很美吧?但我告诉你两个真实的问题:
第一,你得重新预训练全部参数。65B的模型从头训?你算过那账单吗?反正我算了,然后默默关掉了那个页面。
第二,视觉和语言的表示尺度都没对齐就硬融,模型学得那叫一个痛苦。你说,让一个刚学走路的娃,直接去跑马拉松——这不是强人所难吗?
所以我后来老老实实走了Late Fusion的路子:CLIP-ViT做视觉编码器,中间就一个简单的MLP投影层,然后接LLM。简单粗暴,但效果稳!你看LLaVA和Qwen-VL,不是都这么干的吗?
连接器这块我踩过两个版本。一开始用的BLIP-2的Q-Former,能让576个视觉token压缩到32个,听着多省算力啊。但训练起来呢?梯度传播跟过山车似的,动不动loss就卡死了,你说气不气人?
后来换成LLaVA那个线性MLP——就两层变换,简单得像个小学生作业。结果呢?训练稳得像老牛拉车,一步一个脚印。有人说“576个token太多,推理慢”,你别急,等指令微调阶段解冻LLM之后,LLM自己通过attention就给你稀疏化了,额外计算量真没那么大。
说到数据,这才是你显卡的真实成本
你知道Chinchilla scaling law说65B模型得训多少数据吗?1.4T tokens!
1.4T啊!你想想这个量级是什么意思。
而且大问题来了:中文数据尤其难搞。我参考了LLaMA的数据源比例,发现一个反直觉的事儿——Common Crawl这样的大体积数据,采样比例反而不高。反倒是Wikipedia、Books、GitHub这些高质量但量小的数据,要反复训好几个epoch。
最让我意外的是:代码数据能提升推理能力,这不是玄学!我做过对照组实验——在SFT阶段去掉代码数据,模型回答稍微复杂点的逻辑问题时,明显变蠢了。你说神奇不神奇?
从Common Crawl造数据集这个坑,我至少爬了两次。第一次直接从WET文件里抽纯文本,结果呢?导航菜单、广告模板、机器翻译垃圾全混进来了,模型训出来一股“僵尸味”。
后来老老实实按RefinedWeb论文的四部曲干:URL黑名单过滤成人内容和竞价页→fastText语言识别→模型检测NSFW→MinHashLSH去重。折腾完发现,最后能用的数据只有原始CC的15%!
所以我说一句大实话:别迷信开源数据集。 The Pile、C4质量参差不齐,有些子集是好的,但Pile-CC里很多就是从Common Crawl粗糙提取的。拿它训模型,等于吃别人嚼过的甘蔗,你品,你细品。
如果你有算力,自己从CC跑一遍RefinedWeb流程,跑出来的数据虽然和精心收集的比有差距,但做基线完全够用——这点自信我还是有的。
训练节奏这事儿,急不得也懒不得
Qwen-VL的三阶段训练法,我抄作业试过,效果真不一样。
第一阶段,冻住LLM,只训ViT和cross-attention层。用1.4B张图文对,让视觉编码器学会往LLM的空间里做“投影”。这个阶段就像建房子的地基,急不得。
第二阶段,很多人不理解——为什么训了那么多图文对还要加一个阶段?我告诉你为什么:第一阶段虽然对齐了特征,但模型只能做caption和简单的VQA。你说“图里有几只鸟”,它就傻眼了。第二阶段用448×448的高分辨率数据,加上6个vision任务加1个纯文本生成任务,全参数激活,相当于让模型在实战里学会推理。
我做过测试,跳过第二阶段直接跳到指令微调,VQA准确率掉了12%!你算算,这是多少显卡烧出来的代价?
第三阶段指令微调,我只用了350K数据,质量大于数量。这一步做好的话,模型就能从死板回答问题变成自然的多轮对话。但注意——别只用多模态数据,我试过,结果通用语言能力(翻译、代码)退化得厉害。加入10%的纯文本指令数据才补回来。
说到这有个坑:第一阶段要是解冻LLM参数量太大,内存直接爆炸。我用DeepSpeed ZeRO-3配合Megatron,把65B模型拆到32张A100上跑,ViT和连接器不分割,才稳下来。第二阶段全参数训练更夸张,io压力大到飞起。这里推荐用Mcore Bridge那套工具链,能省写并行代码的成本——当然这是另外的话题了。
别急着链接外部系统,先把基本功打扎实
Toolformer、HuggingGPT这些思路确实让人眼前一亮——让LLM学会输出API调用,把计算、搜索、图像生成外包出去。我在VisionLLM框架里试过集成Grounding DINO做视觉定位,效果比硬让LLM回归bbox坐标好一个量级。
但是!基础的多模态能力如果没到位,外部工具只会放大错误。
我亲眼见过一个项目,模型连“图中有几只猫”都数错,却让它调用计算器来算数,结果输出1+1=3——你说这工具链接得有意义吗?
所以,先搞定视觉-语言对齐和推理,再考虑链接外部。第二阶段里的多任务训练,尤其是grounding任务,就是给你的模型打底子的。
有人可能会问…
“Late Fusion模型性能天花板低啊,CLIP这种视觉编码器会丢失细粒度特征,空间关系和文字都认不准。”
说得对。CLIP对OCR和物体计数确实天生弱。但你可以通过第二阶段的粗到细分辨率训练和OCR数据微调来弥补,Qwen-VL的position-aware adapter就是这么设计的。再说了,你要真想端到端训Early Fusion,算力和数据量是百亿级别的——你确定你扛得住?
“你说的阶段划分也太繁琐了吧,现在不是有一步到位的LoRA微调吗?”
LoRA确实牛,我第二阶段全参数训练时也试过LoRA,参数量减少90%,但loss收敛比全参数慢,最终准确率低了3-4个百分点。如果你资源有限,LoRA能省成本,但别指望它追上全参数。阶段划分不是折腾你,是让模型在每个阶段专注学好一种能力——视觉对齐、多任务、对话。跳过任何一个,后期补救的成本更高。
动手吧,朋友!从一张纸开始
想自己训一个多模态LLM?别上来就拍脑袋设计连接器。
我给你画张路线图:
第一步,跑通一个最简Late Fusion baseline——CLIP-ViT-L加MLP加LLaMA-7B,用1M图文对验证整个数据流程,从Common Crawl清洗到格式化SFT数据。
第二步,逐步扩大到65B和1.4T tokens,但先小规模调通训练管线,包括分布式、混合精度、checkpoint。
第三步,别贪多。先把单图caption和VQA训练稳定,再加入OCR、grounding和纯文本多任务。
第四步,指令微调数据至少留几千条高质量人工标注的——别全依赖模型自生成,self-instruct噪声太大。
说实话,这个领域现在最大的问题不是模型不够强,而是太多人急着发布demo,却没人好好讲清楚怎么从零开始造数据、定训练策略。
先搞定基本功,再谈花活。
如果你想找个起点,我推荐LLaVA-1.5的代码库,已经集成了DeepSpeed和LoRA。配上自己从CC洗出来的数据,先跑一个7B模型看看效果。别一上来就冲65B——除非你手里有500+张A100每小时烧着不心疼。
多模态LLM这条路,远没到终点。方法每个月都在变。但有一件事,我赌它永远不会变——
数据和训练节奏,永远、永远比模型结构更能决定你能走多远!
读者评论 3