VisualGLM-6B技术原理介绍
VisualGLM-6B 是一种多模态预训练模型,它旨在将视觉和语言模型进行结合,使得语言模型能够理解图像信息并与文本对话无缝结合。为了更好地理解 VisualGLM-6B 的内容,我们可以从以下几个方面来解析它的原理、结构、训练和微调等内容。
一、多模态预训练背景
多模态预训练模型的目标是将图像和文本信息结合,使得模型可以处理同时包含这两种信息的任务,比如描述图像、问答或生成相关内容。常见的多模态预训练思路有以下两种:
多模态预训练思路一(CogView 思路)
-
核心思想:将图像看作一种特殊的语言,把它们编码成序列进行处理。具体方法是将图像分成若干小块(像素块),每个块转化为一个token(符号),然后使用像 GPT 这样的语言模型进行训练和生成。
-
优点:模型能够直接利用已有的语言模型架构,处理图像生成和描述等任务。
-
缺点:由于图像本身的复杂性,将图像分成token的过程中会有信息丢失。此外,为了描述一张高分辨率图像,需要大量的token,这会导致训练和推理的效率低下。
多模态预训练思路二(VisualGLM 思路)
-
核心思想:将图像特征对齐到预训练语言模型,使得模型能够理解和利用图像语义信息。这种方法通过特定的视觉编码器(如 ViT)提取图像的高级特征,然后将这些特征对齐到语言模型的输入。
-
优点:充分利用了语言模型的强大能力,并且能够无缝地与多轮对话等语言任务结合。相比直接将图像看作语言的方式,这种方法更高效。
-
缺点:在提取图像特征的过程中,会损失部分底层信息,导致图像细节的理解不够充分。
二、ChatGLM-6B 简介
ChatGLM-6B 是一个开源的中英双语语言模型,具有62亿参数。它在多轮对话、问答生成等任务中表现出色。VisualGLM-6B 基于 ChatGLM-6B 进行了扩展,使其能够处理图像和文本的多模态任务。
三、VisualGLM-6B 的结构与训练
模型架构
VisualGLM-6B 的架构主要包括以下三个部分:
-
ViT(Vision Transformer):用于提取图像的视觉特征。
-
Q-Former:作为中间模块,将 ViT 提取的视觉特征转化为语言模型可以理解的表示。
-
ChatGLM-6B:语言模型部分,用于生成文本或回答问题。
在训练过程中,ViT 和 ChatGLM-6B 的参数几乎是冻结的,主要对 Q-Former 进行微调。这样做是为了防止“灾难性遗忘”,即模型在新任务上的微调会导致原有能力的丧失。
训练目标
训练 VisualGLM-6B 时,使用以下两种损失函数:
-
自回归损失:让模型根据图像生成与之对应的正确文本。
-
对比损失:确保输入 ChatGLM-6B 的视觉特征与对应文本的语义特征对齐,从而提高模型的理解能力。
训练数据
VisualGLM-6B 使用了多种数据集进行训练,包括:
-
CogView 积累的 3000 万中文图文对。
-
精选的 LAION 和 CC12M 的 1 亿英文图文对。
-
其他公开数据集的视觉问答指令数据。
-
自己构建的高质量视觉问答指令微调数据。
四、微调与使用
VisualGLM-6B 提供了多种微调方式,能够在不同资源和数据条件下进行优化。常见的微调方法包括:
LORA(Low-Rank Adaptation)
-
在 ChatGLM-6B 的部分层中加入低秩矩阵,使模型在低资源情况下进行微调。
-
优点是微调效率高,显存占用小。
-
适用于通用任务的微调。
QLORA(Quantized LORA)
-
对模型的线性层进行量化(如 4-bit),进一步降低显存占用。
-
适用于显存资源有限的场景。
P-Tuning
-
通过在模型中加入可学习的前缀(Prompt),将其与模型的输入结合进行训练。
-
适用于特定场景的微调,但不适合通用任务。
五、安装与使用
VisualGLM-6B 使用了 SwissArmyTransformer(SAT)库,该库能够简化 Transformer 模型的开发和训练。使用时可以按以下步骤操作:
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)
六、未来展望
VisualGLM-6B 在未来可以有以下几个改进方向:
-
中文OCR能力:进一步提升对中文文本的识别和理解。
-
表格理解能力:在表格数据的理解和问答上进行扩展。
-
高分辨率图像处理:提升对高分辨率图像的描述能力。
-
更准确的描述和遵循指令:进一步提升模型在多轮对话和复杂场景下的表现。
VisualGLM-6B 通过将 ViT、Q-Former 和 ChatGLM-6B 结合,实现了对图像和语言的双重理解能力。在架构上采用了模块化设计,使得模型能够在有限的资源下进行有效训练和推理。未来,它在中文OCR、表格理解、高分辨率图像描述等方面还有很大的提升空间。
VisualGLM-6B部署
项目地址:GitHub - THUDM/VisualGLM-6B: Chinese and English multimodal conversational language model | 多模态中英双语对话语言模型
一、配置虚拟环境
首先配好配好conda还有虚拟环境:
wget [https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh](https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh)
bash Miniconda3-latest-Linux-x86_64.sh
sudo su - root
conda update conda
conda list
conda create -n visualglm python==3.10.6
conda activate visualglm
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
git clone --recursive https://github.com/THUDM/VisualGLM-6B;
cd VisualGLM-6B
pip install wandb
pip install bitsandbytes
sudo apt-get install git-lfs
git lfs install
然后下载VisualGLM-6B运行所需的各种文件,并安装相关依赖:
git clone https://github.com/THUDM/VisualGLM-6B.git
pip install requirements.txt
# 或者采用阿里的镜像源,会快一点
pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
接下来,关于模型文件的下载,可以从THUDM/visualglm-6b at main (huggingface.co)下载所有文件,因为hugging face是国外的网站,所以直接在云服务器上拉取基本上都会显示网络连接超时,开了学术加速成功可能性大一些。如果不行的话就只能一个一个文件的下载到本地,然后再一点点上传到云服务器了,大概会花三四个小时的时间。
当然,还有另一种解决办法,不用下载到本地再上传,可以选择从魔塔直接拉取:
git clone https://www.modelscope.cn/ZhipuAI/visualglm-6b.git
二、推理
下载完模型文件之后,就可以开始尝试推理模型。
推理模型主要分为三种方式:测试、多轮对话测试(demo)、网页版测试。
由于是部署在云服务上,我的网页版测试虽然成功,但是无法打开本地8080网址,就不作展示,主要讲讲前两种方式。
运行 python test.py的含义是直接测试读片能力,运行python cli_demo.py是测试命令行demo,应该就是多轮对话。
1、测试test
注意,使用的Huggingface模型,所有都执行带-hf的文件
还需要注意,修改transformers的版本如下,否则不兼容:
pip install transformers==4.33.2 -i https://mirrors.aliyun.com/pypi/simple/
接下来自己创建一个新的python文件,注意,文件中的相关模型文件路径都需要修改成你自己的路径,建议使用绝对路径:
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/THUDM/models/XrayGLM-300", trust_remote_code=True)
model = AutoModel.from_pretrained("/root/autodl-tmp/THUDM/models/XrayGLM-300", trust_remote_code=True).half().cuda()
image_path = "/root/autodl-tmp/VisualGLM-6B/examples/4.jpeg"
response, history = model.chat(tokenizer, image_path, "描述这张图片。", history=[])
print(response)
response, history = model.chat(tokenizer, image_path, "这张图片可能是在什么场所拍摄的?", history=history)
print(response)
还有VisualGLM-6B的各种文件,凡涉及到模型文件的都建议做出路径修改,改成你自己文件的绝对路径。当发生报错“找不到……文件”/“无法从hugging face网页拉取……文件”,而你的模型文件里面又确实已经包含了该文件时,一般都是文件路径出错。
另外,图片路径官方其实给出了部分图片在如下目录,可以直接用:
运行test.py文件:python test.py
2、多轮对话命令行demo
注意,如果运行cli_demo.py文件,发现出现了如下报错:
AttributeError: 'ChatGLMTokenizer' object has no attribute'sp_tokenizer'. Did you mean: '_tokenize'?
return self.sp_tokenizer.num_tokens
解决方法:修改 tokenization_chatglm.py文件中的ChatGLMTokenizer类,将该类中关于 __init__ 方法的定义中的 super.__init__ 放到 __init__ 方法的最后。
之前提到过,当你下载上传的模型是hugging face的时候,运行cli demo_hf.py,而不是cli_demo.py。同时注意更改模型文件路径:
多轮对话demo命令行成功!
clear表示重新开启一个新对话,而stop表示停止对话:
注意问答的时候输入要小心,否则会报错:
最后,其实官方已经在某站发过了该模型的相关讲解视频,主要是关于该模型的技术背景介绍以及模型的部署和微调的大致流程,可参考:【官方教程】VisualGLM技术讲解_哔哩哔哩_bilibili
同时,官方的报告文件下载: https://pan.baidu.com/s/1gfdpyfT6EVnygMPDO_iwvQ?pwd=8wpc
提取码: 8wpc