ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

021、InternVL开源VLM:具身智能场景中的部署与微调实战

021、InternVL开源VLM:具身智能场景中的部署与微调实战 021、InternVL开源VLM具身智能场景中的部署与微调实战兄弟们今天聊点硬核的。上周我在调试一台六轴机械臂让它根据桌面场景描述去抓取目标物体用的就是InternVL作为视觉语言底座。结果模型在仿真环境里跑得好好的一上真机就翻车——明明看到了红色杯子它愣是描述成“一个红色的物体”导致下游的动作规划模块直接懵了。后来发现不是模型笨是我在部署时把图像分辨率压得太狠InternVL的视觉编码器对细节的敏感度远超我想象。这篇文章就把我在具身智能场景里折腾InternVL的完整过程写出来包括部署踩坑、微调数据构造、以及一些只有真机调试才能悟出来的经验。先说部署。InternVL这个系列模型尤其是InternVL-Chat和InternVL2系列结构上就是视觉编码器加LLM中间过一层投影层。很多人上来就想着用transformers的AutoModel直接加载但具身智能场景里你往往需要把视觉特征和语言特征在特定层级上做融合而不是简单地把图像token塞给LLM。我建议直接用官方给的InternVLModel类它暴露了vision_model、mlp1、language_model这几个子模块方便你后续做特征级操作。加载的时候注意InternVL的视觉编码器是InternViT这个玩意儿对输入图像的尺寸有严格限制官方默认是448x448但实际部署时你会发现如果你直接resize到448很多小目标就丢了。我试过把分辨率提到672效果提升明显但显存占用直接翻倍A100都扛不住。这里有个折中方案保持448输入但在数据预处理时做中心裁剪加局部放大相当于给模型一个“放大镜”视角这个技巧在抓取小物体时特别管用。再说微调。具身智能场景里你通常不会直接微调整个InternVL因为参数量太大而且你手里的数据量往往不够。我试过全参数微调结果过拟合得一塌糊涂模型在训练集上能把场景描述得天花乱坠一到新环境就胡言乱语。后来改成LoRA只微调投影层和LLM的attention部分视觉编码器完全冻结效果反而好了很多。这里有个关键点LoRA的rank值不要贪大我试过rank64结果训练不稳定loss震荡得厉害降到32之后稳定性和效果都达到了平衡。另外微调数据构造是个大坑。具身智能场景里你需要的不是“图片-文本描述”这种通用数据而是“图片-任务相关描述”这种结构化数据。比如你不能只让模型说“桌上有三个物体”你要让它说“桌上有三个物体红色杯子在蓝色方块左侧距离约15厘米抓取时需避开右侧的障碍物”。这种描述才能直接喂给下游的动作规划模块。我构造数据时用了一个简单的模板场景全局描述 目标物体属性 空间关系 动作提示。这个模板看着简单但实际标注时非常耗时我建议用半自动方式先用InternVL自己生成初稿再人工修正效率能提升好几倍。训练过程中的调试经验也值得说说。我用的框架是DeepSpeed加ZeRO-3但InternVL的视觉编码器在ZeRO-3下有个问题它的权重更新频率很低导致通信开销巨大训练速度慢得离谱。后来我把视觉编码器单独拎出来用冻结模式跑只对投影层和LLM做梯度更新速度直接快了3倍。另外学习率设置上我踩过一个坑用默认的1e-5结果loss下降非常慢后来发现是因为投影层和LLM的收敛速度不一样投影层需要更大的学习率。我改成分层学习率投影层用5e-5LLM用1e-5收敛速度明显加快。还有混合精度训练一定要开但注意bf16比fp16稳定得多InternVL的某些层对fp16的精度损失特别敏感用bf16之后loss曲线平滑了很多。真机部署时还有一个容易忽略的点推理速度。InternVL的视觉编码器计算量很大在Jetson Orin这种边缘设备上单帧推理可能要200毫秒以上这对于实时控制来说太慢了。我试过TensorRT加速但InternVL的某些自定义算子不支持折腾了半天放弃了。后来用了vLLM的离线批处理模式把多帧图像打包推理虽然单帧延迟没降但吞吐量上去了对于“先观察再决策”的任务模式完全够用。如果你要做实时闭环控制建议把视觉编码器单独部署成一个服务用ONNX导出只保留前向推理能压到50毫秒以内但精度会有一点损失需要权衡。最后说点个人经验。InternVL在具身智能场景里最大的优势不是它的通用理解能力而是它的视觉特征对空间关系的编码比较友好。我在做抓取位姿预测时直接拿InternVL的视觉特征做回归比用CLIP特征准确率高了不少。但它的语言生成部分在具身场景里反而有点“话痨”经常生成一些无关紧要的描述比如“这是一个明亮的房间”。这时候你可以在解码时加一个惩罚项或者用prompt约束它只输出结构化信息。另外微调数据里一定要加入失败案例比如“抓取失败因为目标物体被遮挡”这样模型才能学会在描述中主动提示风险。我一开始只喂成功案例结果模型对遮挡场景完全无感后来加了20%的失败案例效果立竿见影。还有一点别迷信官方预训练权重。InternVL的通用权重在具身场景里表现一般尤其是对机械臂视角的俯拍图像它的理解能力明显不如对自然图像的理解。我建议你在自己的数据上先做一遍领域自适应预训练哪怕只是几千张图也能让视觉编码器适应你的相机角度和光照条件。这一步我当初偷懒跳过了后来在真机调试时花了两倍时间补回来得不偿失。最后如果你在调试中遇到模型输出不稳定比如同一张图两次推理结果不一样别急着调模型先检查一下你的图像预处理流程是不是有随机性。我遇到过因为数据加载时用了多线程导致图像顺序错乱模型输出跟着乱跳。这种问题排查起来非常隐蔽建议在数据加载器里加一个随机种子固定顺序能省很多事。InternVL这个模型在具身智能里绝对够用但别把它当黑盒你得理解它的视觉编码器对分辨率的敏感、投影层对特征融合的影响、以及LLM对结构化输出的偏好。把这些点摸透了你就能在真机上跑得又稳又快。这篇先写到这下一篇我打算聊聊怎么把InternVL和动作规划模块做端到端联合训练那个坑更多到时候再跟你们细说。
返回列表