VisualGLM - 多模态中英双语对话语言模型


【官方教程】VisualGLM技术讲解
https://www.bilibili.com/video/BV14L411q7fk/


关于 VisualGLM

Chinese and English multimodal conversational language model | 多模态中英双语对话语言模型


  • 多模态预训练背景
    • 多模态预训练思路一(CogView思路)
      • 图像作为一种特殊的语言
    • 多模态预训练思路二(VisualGLM思路)
      • 图像对齐到预训练语言模型
      • ChatGLM-6B的简单介绍
  • 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

猜你喜欢

转载自blog.csdn.net/lovechris00/article/details/133530364
今日推荐