【官方教程】VisualGLM技术讲解
https://www.bilibili.com/video/BV14L411q7fk/
关于 VisualGLM
Chinese and English multimodal conversational language model | 多模态中英双语对话语言模型
- 多模态预训练背景
- 多模态预训练思路一(CogView思路)
- 图像作为一种特殊的语言
- 多模态预训练思路二(VisualGLM思路)
- 图像对齐到预训练语言模型
- ChatGLM-6B的简单介绍
- 多模态预训练思路一(CogView思路)
- VisualGLM
- 训练过程
- 安装与使用
- 使用sat库进行微调
- 未来展望
背景: 多模态预训练
- 以BERT/GPT为代表的自回归模型展现出强大的理解生成能力
- 如何将这种成功“复制”到视觉/跨模态领域?
- 以DALL-E、CogView、BEiT等为代表的模型的思路为:
- 将图像当成一种语言进行预训练
- 离散化 token
- 优势:
- 图像为一等公民,同时进行图像生成和理解
- 劣势:
- 离散化有损,降低token利用率,需要 >1000tokens 来描述一张256分辨率的图
- 实际上,人类只对少量的视觉语义信息感兴趣
- 如何提升效率,并充分利用语言模型?
- BLIP2 提供了一种思路:
- 将图像特征对齐到预训练语言模型
- 优势:
- 充分利用语言模型
- 无缝接合原有的多轮对话能力
- 劣势:
- 提取图像语义特征损失底层信息
背景: ChatGLM-6B
- ChatGLM-6B是一个开源的、具有62亿参数的中英双语语言模型。
- 自3月14日发布之后一个月内,在 Github 上获得了 2.1 万 star,全球 下载量超过 100 万,登上Github Trending 榜第一、Hugging Face Trending 榜第一。
如何让ChatGLM拥有图像识别的能力?
- 通用领域
- 中英双语
- 与正常语言问答顺畅融合
基本思路:
- 通过中间模块构建起预训练视觉和语言模型的桥梁
- 中英双语图文数据大规模预训练
- 高质量指令数据微调
- 与纯语言类似的技术方案
- BLIP2、MiniGPT4等工作类似思路
VisualGLM-6B 训练
模型架构:
-
ViT + QFormer + ChatGLM-6B
-
几乎冻结 ViT 和 ChatGLM 参数
- 防止灾难性遗忘
-
预训练:QFormer 和 Vit Lora进行学习
-
微调:QFormer 和 ChatGLM Lora进行学习
训练目标:
- 自回归损失(根据图像生成正确的文本)
- 对比损失 (输入ChatGLM的视觉特征与对应文本的语义特征对齐)
训练数据:
- CogView工作积累的30M中文图文对
- 精选LAION+CC12M的100M英文图文对
- 来自其他工作和数据集的视觉问答指令微调 数据集
- 自己构建的高质量视觉问答指令微调数据集
多轮对话-效果
VisualGLM-6B能够
- 场景描述
- 进一步追问
- 联系知识
- 联系常识
- 发现异常
- 做出解释
模型调用:sat实现
VisualGLM-6B使用SwissArmyTransformer(sat)库开发,这个库对于Transformer变体的代码撰写和训 练非常方便, VisualGLM-6B中包含Vit、Qformer、ChatGLM-6B三种不同的Transformer,使用sat可以 极大降低开发难度。
import argparse
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
from model import chat, VisualGLMModel
model, model_args = VisualGLMModel.from_pretrained('visualglm-6b', args=argparse.Namespace(fp16=True, skip_init=True))
from sat.model.mixins import CachedAutoregressiveMixin model.add_mixin('auto-regressive', CachedAutoregressiveMixin())
image_path = "your image path or URL”
response, history, cache_image = chat(image_path, model, tokenizer, "描述这张图片。", history=[])
print(response)
response, history, cache_image = chat(None, model, tokenizer, "这张图片可能是在什么场所 拍摄的?", history=history, image=cache_image)
print(response)
Huggingface实现实际上是sat套壳
模型推理需要的资源
支持环境:
- Linux,无特殊需求
- Windows,需跳过或正确按照deepspeed
- Mac,需要有mps显卡或者使用cpu推理(需要代码中device稍作修改)
| GPU显存占用(batch=1)
- | -
fp16 | 16 GB
quant 8bit | 11.2 GB
quant 4bit | 8.7 GB
微调
- 多模态任务分布广、种类多,预训练往往不能面面俱到。 这里我们提供了一个小样本微调的例子,使用20张标注图增强模型回答“背景”问题的能力。
- bash finetune/finetune_visualglm.sh 目前支持三种方式的微调:
- LoRA:样例中为ChatGLM模型的第0层和第14层加入了rank=10的LoRA微调,可以根据具体情 景和数据量调整–layer_range和–lora_rank参数。
- QLoRA:如果资源有限,可以考虑使用
bash finetune/finetune_visualglm_qlora.sh
,QLoRA将 ChatGLM的线性层进行了4-bit量化,只需要9.8GB显存即可微调。 - P-tuning:可以将–use_lora替换为–use_ptuning,不过不推荐使用,除非模型应用场景非常固 定。
- 训练好以后可以使用如下命令推理:
python cli_demo.py --from_pretrained your_checkpoint_path --prompt_zh
这张图片的 背景里有什么内容? 微调前后的效果对比微调需要安装deepspeed库,目前本流 程仅支持linux系统,更多的样例说明和Windows系统的流程说明将在近期完成。
不同微调方案需要的资源
- 默认训练脚本中batch size较大,如果显存较小需要传入更小的batch size值
- 如果想在资源有限的情况下增大batch size,可以在bash里加入
--gradient-accumulation-steps
参数
GPU显存占用(batch=1) | |
---|---|
LoRA | 17.8 GB |
QLoRA | 9.8 GB |
P-tuning | 18.1 GB |
Lora merge
2023-10-03