如何从零训练多模态大模型(预训练方向)

作者:HelloWorl 编辑:包包算法笔记

链接:https://zhuanlan.zhihu.com/p/698218006

本文参考官方教程[1]介绍如何训练 LLaVA v1.5 多模态模型。LLaVA 训练包括特征对齐阶段(feature alignment stage)和视觉指令微调阶段(visual instruction tuning stage),其中特征对齐阶段使用 LAION-CC-SBU 数据集的 558K 子集(记为 LLaVA-Pretrain),目的是训练 MLP connector(或称为 projector),而视觉指令微调阶段使用 GPT-4 生成的 150K 条多模态指令跟随数据和来自学术任务的 515K 条 VQA 数据引导 LLaVA 模型遵从多模态指令。

官方给出的 LLaVA v1.5 使用了 8 个 A100 GPU(80G)进行训练,如果我们没有 8 个 GPU 或者足够的显存(80G),可以减小per_device_train_batch_size的值并增大gradient_accumulation_steps,始终保证全局 batch size 不变,其中 batch size 的大小等于 per_device_train_batch_sizexgradient_accumulation_stepsxnum_gpus 。

下面以 LLaVA-v1.5-13B 为例介绍 LLaVA 模型的训练。

特征对齐阶段

准备数据

下载 LLaVA-Pretrain[2] 数据集
# 将数据下载到 ./playground/data/LLaVA-Pretrain,否则需要修改启动脚本的 data_path 参数
huggingface-cli download --repo-type dataset liuhaotian/LLaVA-Pretrain --local-dir ./playground/data/LLaVA-Pretrain

LLaVA-Pretrain 包含 3 个文件:

  • • blip_laion_cc_sbu_558k.json:此数据的构造过程是将 image-caption 数据添加随机选择的指令(例如:“Describe this image”)转换成多模态对话,下面是数据示例:

在这里插入图片描述

  • • blip_laion_cc_sbu_558k_meta.json:包含 3 种元数据,分别是图像路径、图像 URL 和 blip_caption
{
    'id': '004539375',    
    'image': '00453/004539375.jpg',    
    'blip_caption': 'select luxury furniture 3 - inch gel memory foam mattress topper',    
    'url': 'http://ec1.ostkcdn.com/images/products/8111140/P15459545.jpg'  
  }
  • • images.zip:LAION/CC/SBU 筛选后的子集
解压images.zip
# 解压到 ./playground/data/LLaVA-Pretrain/images,否则需要修改启动脚本的 image_folder 参数
unzip ./playground/data/LLaVA-Pretrain/images.zip -d ./playground/data/LLaVA-Pretrain/images

启动训练

在这个阶段,使用 8 个 A100(80G)训练 LLaVA-v1.5-13B 大约需要 5.5 小时。

启动的脚本是scripts/v1_5/pretrain.sh,它的内容如下:

#!/bin/bash
deepspeed llava/train/train_mem.py \
    --deepspeed ./scripts/zero2.json \  # 使用 DeepSpeed ZeRO-2    
    --model_name_or_path lmsys/vicuna-13b-v1.5 \  # 语言模型是 lmsys/vicuna-13b-v1.5    
    --version plain \    
    --data_path ./playground/data/LLaVA-Pretrain/blip_laion_cc_sbu_558k.json \  # 训练样本文件    
    --image_folder ./playground/data/LLaVA-Pretrain/images \  # 存放图像的目录    --vision_tower openai/clip-vit-large-patch14-336 \  # 视觉编码器    
    --mm_projector_type mlp2x_gelu \  # projector 的类型    
    --tune_mm_mlp_adapter True \  # 是否训练 projector    
    --mm_vision_select_layer -2 \    
    --mm_use_im_start_end False \    
    --mm_use_im_patch_token False \    
    --bf16 True \    
    --output_dir ./checkpoints/llava-v1.5-13b-pretrain \  # 保存的路径    
    --num_train_epochs 1 \    
    --per_device_train_batch_size 32 \    
    --per_device_eval_batch_size 4 \    
    --gradient_accumulation_steps 1 \   
    --evaluation_strategy 'no' \    
    --save_strategy 'steps' \    
    --save_steps 24000 \    
    --save_total_limit 1 \    
    --learning_rate 1e-3 \   
    --weight_decay 0. \    
    --warmup_ratio 0.03 \    
    --lr_scheduler_type 'cosine' \    
    --logging_steps 1 \    
    --tf32 True \    
    --model_max_length 2048 \    
    --gradient_checkpointing True \    
    --dataloader_num_workers 4 \    
    --lazy_preprocess True \    
    --report_to wandb

启动脚本:

sh ./scripts/v1_5/pretrain.sh

启动训练后,会自动下载语言模型视觉编码器的权重,完成权重的下载后会提示是否需要使用 wandb 可视化结果,这里按需选择即可。

图片

接下来就开始了训练,下面是 loss 的部分日志:

图片

训练完成后,权重会保存在./checkpoints/llava-v1.5-13b-pretrain目录。

视觉指令微调阶段

完成特征对齐阶段的训练后,我们进入视觉指令微调阶段。注意:如果我们跳过特征对齐阶段的训练,则需要将对应的 projector 下载到./checkpoints目录,下载的命令如下:

huggingface-cli download liuhaotian/llava-v1.5-mlp2x-336px-pretrain-vicuna-13b-v1.5 --local-dir ./checkpoints/llava-v1.5-13b-pretrain

准备数据

下载数据集
  • • 下载 llava_v1_5_mix665k.json[3]
# 将数据下载到 ./playground/data/LLaVA-Instruct-150K
huggingface-cli download --repo-type dataset liuhaotian/LLaVA-Instruct-150K --local-dir ./playground/data/LLaVA-Instruct-150K
cp ./playground/data/LLaVA-Instruct-150K/llava_v1_5_mix665k.json ./playground/data/llava_v1_5_mix665k.json

下面是 llava_v1_5_mix665k.json 的示例:

{
    'id': '000000033471',  // 样本的唯一 id    
    'image': 'coco/train2017/000000033471.jpg',  // 可以是绝对路径,也可以是相对于 image_folder 的路径    
    'conversations': [      
      {      
        'from': 'human',        
        'value': '<image>\nWhat are the colors of the bus in the image?'      
      },      
      {      
        'from': 'gpt',        
        'value': 'The bus in the image is white and red.'      
      },      
      {        
        'from': 'human',        
        'value': 'What feature can be seen on the back of the bus?'      
      },      
      {      
        'from': 'gpt',        
        'value': 'The back of the bus features an advertisement.'      
      },      
      {      
        'from': 'human',        
        'value': 'Is the bus driving down the street or pulled off to the side?'      
      },      
      {     
        'from': 'gpt',        
        'value': 'The bus is driving down the street, which is crowded with people and other vehicles.'      
      }    
    ]  
  },
  • • 下载 COCO train2017[4]
wget http://images.cocodataset.org/zips/train2017.zip -P ./playground/data/coco
unzip ./playground/data/coco/train2017.zip -d ./playground/data/coco
  • • 下载 GQA images[5]
wget https://downloads.cs.stanford.edu/nlp/data/gqa/images.zip -P ./playground/data/gqa
unzip ./playground/data/gqa/images.zip -d ./playground/data/gqa
  • • 下载 OCR-VQA[6] 将 OCR-VQA 中的 dataset.json 和 loadDataset.py 文件下载到 ./playground/data/ocr_vqa 目录。注释 loadDataset.py 中的 pdb.set_trace()后执行下面的命令:
cd ./playground/data/ocr_vqa
python loadDataset.py
# 回到 LLaVA 目录
cd ../../../

使用下面的代码处理 OCR-VQA 图像的后缀问题[7]:

在这里插入图片描述

也可以参考 https://github.com/haotian-liu/LLaVA/pull/1458 给出的路径下载 ORC-VQA 数据。

  • • 下载 TextVQA[8]
wget https://dl.fbaipublicfiles.com/textvqa/images/train_val_images.zip -P ./playground/data/textvqa
unzip ./playground/data/textvqa/train_val_images.zip -d ./playground/data/textvqa
  • • 下载 VisualGenome part1[9] 和 part2[10]
wget https://cs.stanford.edu/people/rak248/VG_100K_2/images.zip -P ./playground/data/vg
wget https://cs.stanford.edu/people/rak248/VG_100K_2/images2.zip -P ./playground/data/vg
unzip ./playground/data/vg/images.zip -d ./playground/data/vg
unzip ./playground/data/vg/images2.zip -d ./playground/data/vg
数据集结构

完成数据集的下载后,检查数据集的目录结构是否和下面的一致:

在这里插入图片描述

使用下面的代码检查数据目录结构:

在这里插入图片描述

如果 missing_cnt 为 0,则说明数据的目录结构是正确的。

启动训练

在启动训练前,请查看 https://github.com/haotian-liu/LLaVA/issues/1144 以避免训练结束后权重保存出错。

在这个阶段,使用 8 个 A100(80G)训练 LLaVA-v1.5-13B 大约需要 20 小时。启动的脚本是scripts/v1_5/finetune.sh,它的内容如下:

#!/bin/bash

deepspeed llava/train/train_mem.py \
    --deepspeed ./scripts/zero3.json \  # 使用 DeepSpeed ZeRO-3    
    --model_name_or_path lmsys/vicuna-13b-v1.5 \    
    --version v1 \    
    --data_path ./playground/data/llava_v1_5_mix665k.json \  # 训练样本    
    --image_folder ./playground/data \  # 存放图像的目录    
    --vision_tower openai/clip-vit-large-patch14-336 \    
    --pretrain_mm_mlp_adapter ./checkpoints/llava-v1.5-13b-pretrain/mm_projector.bin \    
    --mm_projector_type mlp2x_gelu \  # projector 的类型    
    --mm_vision_select_layer -2 \    
    --mm_use_im_start_end False \    
    --mm_use_im_patch_token False \    
    --image_aspect_ratio pad \    
    --group_by_modality_length True \    
    --bf16 True \    
    --output_dir ./checkpoints/llava-v1.5-13b \    
    --num_train_epochs 1 \    
    --per_device_train_batch_size 16 \    
    --per_device_eval_batch_size 4 \    
    --gradient_accumulation_steps 1 \    
    --evaluation_strategy 'no' \    
    --save_strategy 'steps' \    
    --save_steps 50000 \    
    --save_total_limit 1 \    
    --learning_rate 2e-5 \    
    --weight_decay 0. \    
    --warmup_ratio 0.03 \    
    --lr_scheduler_type 'cosine' \    
    --logging_steps 1 \    
    --tf32 True \    
    --model_max_length 2048 \    
    --gradient_checkpointing True \    
    --dataloader_num_workers 4 \    
    --lazy_preprocess True \    
    --report_to wandb

启动脚本:

sh ./scripts/v1_5/finetune.sh

启动训练后,会询问是否需要使用 wandb 可视化结果,这里按需选择即可。

图片

接下来就开始了训练,下面是 loss 的部分日志:

图片

训练完成后,权重会保存在./checkpoints/llava-v1.5-13b目录。注意:如果单卡显存不足 80G,可以使用 LoRA 微调脚本 finetune_lora.sh[11]。完成训练后,可以参考 LLaVA 评测[12]对模型的性能进行评测。

微调自定义数据集

参考 Finetune LLaVA on Custom Datasets[13]

将训练样本以列表的形式保存到 json 文件,其中每一个样本是一个字典,它至少包含三个字段:

  • • id:全局唯一的字符串
  • • image:图片的路径,可以是绝对路径,也可以是相对于image_folder的相对路径
  • • conversations:人类和语言模型的对话

下面是一个示例:

[
  {  
    'id': '997bb945-628d-4724-b370-b84de974a19f',    
    'image': 'part-000001/997bb945-628d-4724-b370-b84de974a19f.jpg',    
    'conversations': [     
      {     
        'from': 'human',        
        'value': '<image>\nWrite a prompt for Stable Diffusion to generate this image.'      
      },      
      {     
        'from': 'gpt',        
        'value': 'a beautiful painting of chernobyl by nekro, pascal blanche, john harris, greg rutkowski, sin jong hun, moebius, simon stalenhag. in style of cg art. ray tracing. cel shading. hyper detailed. realistic. ue 5. maya. octane render. '      
      },    
    ]  
  }, 
  ...
]

完成数据的处理后,修改 finetune.sh[14] 中的 data_path 参数(必须)以及其他想要调整的参数(可选,例如学习率)。

修改完成后,即可启动训练:

sh ./scripts/v1_5/finetune.sh

以上就是 LLaVA 的训练流程。

如何学习大模型 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。

但是具体到个人,只能说是:

“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。

这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段(10天):初阶应用

该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。

  • 大模型 AI 能干什么?
  • 大模型是怎样获得「智能」的?
  • 用好 AI 的核心心法
  • 大模型应用业务架构
  • 大模型应用技术架构
  • 代码示例:向 GPT-3.5 灌入新知识
  • 提示工程的意义和核心思想
  • Prompt 典型构成
  • 指令调优方法论
  • 思维链和思维树
  • Prompt 攻击和防范

第二阶段(30天):高阶应用

该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。

  • 为什么要做 RAG
  • 搭建一个简单的 ChatPDF
  • 检索的基础概念
  • 什么是向量表示(Embeddings)
  • 向量数据库与向量检索
  • 基于向量检索的 RAG
  • 搭建 RAG 系统的扩展知识
  • 混合检索与 RAG-Fusion 简介
  • 向量模型本地部署

第三阶段(30天):模型训练

恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。

到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?

  • 为什么要做 RAG
  • 什么是模型
  • 什么是模型训练
  • 求解器 & 损失函数简介
  • 小实验2:手写一个简单的神经网络并训练它
  • 什么是训练/预训练/微调/轻量化微调
  • Transformer结构简介
  • 轻量化微调
  • 实验数据集的构建

第四阶段(20天):商业闭环

对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。

  • 硬件选型
  • 带你了解全球大模型
  • 使用国产大模型服务
  • 搭建 OpenAI 代理
  • 热身:基于阿里云 PAI 部署 Stable Diffusion
  • 在本地计算机运行大模型
  • 大模型的私有化部署
  • 基于 vLLM 部署大模型
  • 案例:如何优雅地在阿里云私有部署开源大模型
  • 部署一套开源 LLM 项目
  • 内容安全
  • 互联网信息服务算法备案

学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。

如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值