类图是一个项目代码的框架,可以站在更高的层次去看代码的逻辑流程,模块间相互关系。类似于下面这篇,我抽空把openvla的类图也画了一下,确实对理解代码非常有帮助。

自动驾驶多模态大模型Senna前向推理代码详解

openvla的类图分为2个,第一个适用于前向推理(vla-scripts/deploy.py)和lora微调(vla-scripts/finetune.py),下面简称精简版,第二个适用于全量微调(vla-scripts/train.py),下面简称复杂版。

为什么会这么复杂呢?

先说复杂版,作者在readme中也说了:For full fine-tuning,you will need to download a different version of the OpenVLA model checkpoint that is compatible with the Prismatic VLMs codebase, which we built on top of to develop the OpenVLA model。翻译一下就是作者在全量微调时,是基于Prismatic VLM(是一个通用的多模态大模型)的工作成果代码开发的,就是下面第二张图。同时这也解释了,为什么会有convert_openvla_weights_to_hf.py这个脚本来做模型格式转换,格式转换是复杂版转换为精简版。

精简版就是下面第一张图,它的类的数量会少很多,确实清爽一些(补充一下,复杂版式的类图其实比较复杂,下面的复杂版的图看起来简单是因为我把它画得简单了些,只画了重点,很多子类都没有画出来)。

总结一下,这2处版本其实是等价的:

OpenVLAForActionPrediction == OpenVLA

language_model == llm_backbone

projector == projector

vision_backbone == vision_backbone

精简版
复杂版
有了这些宏观的理解后,再看deploy或finetune或train的代码时,其实都是套路,就干了几件事情:

1,类的加载,包括初始化与pretrained weight加载,包括主类,vision backbone,projector,processor, tokenizer等

2,使用lora finetune时,就用peft包装一下或者甚至自己实现lora也可以,(可参考DeepSpeedExamples库中DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/opt/single_gpu/run_1.3b.sh,也挺简单的)

DeepSpeedExamples.git

3,适配分布式训练环境:如果使用deepspeed就用DDP包装一下,用fsdp就用FSDP包装。fsdp整体会比deepspeed复杂很多。

3,创建optimizer,dataset,datasampler,dataloader,lr_scheduler等组件

4,训练:可以直接for循环自己遍历数据集(openvla是这种),也可以使用transformers库的trainer(senna是这种)

5,保存模型,格式转换等

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐