变色龙chameleon模型的官方仓库(https://github.com/facebookresearch/chameleon)并未开源训练的源代码,需要做训练代码的开发。
开发方向
昇腾modellink(已改名MindSpeed-LLM)的代码仓(https://Ascend/MindSpeed-LLM)具备llm的训练能力,但不支持多模态,不适配变色龙模型。根据变色龙的论文,变色龙模型的结构与llama2的结构类似,但在tokenizer方面有所不同,变色龙的tokenizer是支持多模态的,而llama2的tokenizer不支持。于是选择在tokenizer层面适配变色龙模型。
开发过程
- 变色龙、modellink仓库克隆,安装依赖,环境搭建。
- 跑通llama2训练验证开发环境无异常。
- 阅读源码
- 阅读变色龙源码,定位tokenizer代码以及调用方式,处理逻辑。
- 阅读modellink源码。确定训练执行的流程,以及tokenizer的调用时机与调用点。确定数据预处理流程,以及数据输入格式与处理方法。
- 迁移变色龙的tokenizer部分,为适配开发做准备。
- 修改脚本调用参数,修改代码使得modellink在对应条件下引入变色龙的tokenizer。
- 观察分析输入输出
- 断点调试变色龙、modellink的tokenizer,观察tokenizer的输出,以及调用点引用的对象结构。
- 观察变色龙、modellink的tokenizer的输入数据,比较异同,分析需要兼容的部分。
- 观察训练数据的处理输出与对应tokenizer的输入,分析设计数据处理方案。
- 对齐输入输出
- 构造1000+条带图片和文本的训练数据,数据格式选用modellink支持的json格式,用作调试。
- 根据源码分析,modellink采用handler处理输入的训练数据。自定义新的ChameleonPretrainHandler类继承基类,重写_filter()方法,对齐输入数据与tokenizer的调用点。
- 根据数据输入,调整tokenizer对象的调用类结构。
- 训练部分引用变色龙的tokenizer,替换原有tokenizer。
- 新建工厂函数,调整训练需要的tokenzier格式,传入对应的vocab_size和eod_id参数。
- 调试训练,根据训练情况以及具体报错修改代码直至跑通。