作者:黑夜路人

时刻:2023年6月


最近几个月,整个AI职业的LLM(大言语模型)蓬勃发展,除了过去传统的纯文字的多模态能力的视觉言语模型,如 GPT-4,ImageBind等表现令人形象深刻。

ChatGLM-6B是中文用户运用非常舒服的一个开源中文LLM。2023年5月17日,智谱AI和清华大学KEG实验室开源了根据ChatGLM-6B的多模态对话模型VisualGLM-6B——不仅能够进行图画的描绘及相关常识的问答,也能结合常识或提出有趣的观念。智谱在 ChatGLM-6b根底上,开源了多模辨认的大模型 VisualGLM-6b。VisualGLM-6B 是一个开源的,支持图画、中文和英文的多模态对话言语模型,言语模型根据ChatGLM-6B,具有 62 亿参数;图画部分经过练习BLIP2-Qformer构建起视觉模型与言语模型的桥梁,整体模型共78亿参数。

VisualGLM-6B 依靠来自于CogView数据集的30M高质量中文图文对,与300M经过筛选的英文图文对进行预练习,中英文权重相同。该练习办法较好地将视觉信息对齐到ChatGLM的语义空间;之后的微调阶段,模型在长视觉问答数据上练习,以生成契合人类偏好的答案。

今日咱们就简略安装运用一下VisualGLM-6b,然后再了解一下其背面中心作业原理。

VisualGLM-6b 运用安装

体系环境(我的环境)

GPU:NVIDIA A30 24G

OS:Windows 11

Python: 3.8.13

PyTorch: 1.12.1+cu113

Transformers: 4.29.1

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

附:读取环境信息代码:

import sys
import torch   # pip install torch
import pynvml  # pip install pynvml
# 获取GPU信息
def get_gpu_info(gpu_id=0):
    pynvml.nvmlInit()
    handle = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)
    gpu_name = pynvml.nvmlDeviceGetName(handle)
    handler = pynvml.nvmlDeviceGetHandleByIndex(gpu_id)
    meminfo = pynvml.nvmlDeviceGetMemoryInfo(handler)
    gpu_mem_total = round(meminfo.total / 1024 / 1024, 2)
    gpu_mem_used = round(meminfo.used / 1024 / 1024, 2)
    gpu_mem_free = round(meminfo.free / 1024 / 1024, 2)
    print("GPU类型:\t",  gpu_name)
    print("显存总量:\t", gpu_mem_total, "MB")
    print("已用显存:\t", gpu_mem_used,  "MB")
    print("剩下显存:\t", gpu_mem_free,  "MB")
# 输出env信息
print("Python版别: \t", sys.version)
print("Pytorch版别: \t", torch.__version__)
print("Cuda版别: \t",    torch.version.cuda)
print("Cudnn版别: \t",   torch.backends.cudnn.version())
print("Cuda是否可用:\t", torch.cuda.is_available())
print("GPU数量: \t",     torch.cuda.device_count())
get_gpu_info()

假如想要顺利运用VisualGLM,建议Python版别3.6+,个人引荐 3.8.x或者3.10.x 更保险,然后依赖的cuda版别最好是11.3以上;GPU显存不能低于16G,否则无法正常运行。

操作体系引荐 Windows 或 Ubuntu 比较保险。

假如要监测NVIDIA显卡的内存情况,运用nvidia-smi指令:(每隔10秒显现一次显存剩下)

nvidia-smi -l 10

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

安装运用VisualGLM-6b

假如只是简略直接在指令行里测验VisualGLM-6b,能够直接下载调用源码和根底模型就能够了。假如想要运行web界面,还会依赖一个SAT模型,会主动下载安装。

调用源码:github.com/THUDM/Visua…

根底模型:huggingface.co/THUDM/visua…

SAT模型:cloud.tsinghua.edu.cn/f/348b98dff…

快速安装过程:(以为Windows环境为例)

    git clone https://github.com/THUDM/VisualGLM-6B
    cd VisualGLM-6B
    pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements_wo_ds.txt
    pip install -i https://mirrors.aliyun.com/pypi/simple/ --no-deps "SwissArmyTransformer>=0.3.6"

VisualGLM-6b 作用测验

手工模型测验代码:

from transformers import AutoModel, AutoTokenizer
import torch
# 模型文件和图片路径
# model_name = "THUDM/visualglm-6b"
model_path = "C:\Data\VisualGLM-6B\visualglm-6b"
# pic_path = "C:\Users\mat\Pictures\test\kld00.jpg"
# pic_path = "C:\Users\mat\Pictures\test\cat00.jpg"
# pic_path = "C:\Users\mat\Pictures\test\sl00.jpg"
# pic_path = "C:\Users\mat\Pictures\test\kh00.jpg"
pic_path = "C:\Users\mat\Pictures\test\code00.jpg"
# 加载模型
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).half().cuda()
image_path = pic_path
# 进行发问
response, history = model.chat(tokenizer, image_path, "描绘这张图片。", history=[])
print(response)
response, history = model.chat(tokenizer, image_path, "这张图片或许是在什么场所拍摄的?", history=history)
print(response)

代码中的 pic_path 便是需要测验的图片文件路径,能够支持 JPG/PNG/WEBP 等格式,提早把文件下载好指定目录。

假如根底模型下载到了本地,在Windows体系上面记得 model_path 有必要后面路径中斜线有必要是 \,假如是 / 则无法找到模型文件。

模型代码调用测验

人物辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

动物环境辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

猫咪辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

室内场景辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

代码辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

Web界面交互测验

执行过程代码:

    git clone https://github.com/THUDM/VisualGLM-6B
    cd VisualGLM-6B
    pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements_wo_ds.txt
    pip install -i https://mirrors.aliyun.com/pypi/simple/ --no-deps "SwissArmyTransformer>=0.3.6"
    python web_demo.py

然后等候主动下载安装SAT模型,完成后就会主动加载了,然后访问本地的:

    http://127.0.0.1:7860

就能够经过Web界面访问本地的 VisualGLM 了,假如交互很多次,或许GPU显存占用很大,记得点击“铲除”整理一下,能够减少显存占用。

动物辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

名人辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

代码辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

图片推理:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

人物着装辨认:

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

VisualGLM背面的技能原理

VisualGLM 能够进行图画的辨认和针对图画进行相关 交互,实质也是一个LLM(大言语模型),但是整个根据图画的大言语模型,跟传统的的ChatGPT这种还是有点不同,要了解神奇之处,就需要重视背面的中心技能:BLIP-2。

关于多模的大言语模型,除了常规的根据Transformer的LLM学习,VisualGLM中比较重要的是图画-文本的对应联系处理,有点类似于Stable Diffusion中的CLIP的联系,而VisualGLM-6b中首要运用的技能是 BLIP-2的练习办法来进行图片-文本的处理。

BLIP(Bootstrapping Language-Image Pre-training),引导式言语图画预练习办法,首要属于视觉言语预练习(Vision-language pre-training)的办法。

传统的视觉模型和办法还存在两个首要的缺陷:

1、从模型视点来看,大多数办法要么选用根据编码器的模型,要么选用编码器-解码器模型。然而,根据编码器的模型不太容易直接迁移到文本生成的使命中,如图画标题(image captioning)等;而编码器-解码器模型还没有被成功用于图画-文本检索使命。

2、从数据视点来看,大多数sota的办法,如CLIP, ALBEF, SimVLM 都是对从网上收集的图画-文本对(image-text pair)进行预练习。尽管能够经过扩展数据集的规模来获得功能上的提高,但研究结果显现,有噪声的网络文本关于视觉言语学习来说只能得到次优的结果。

为此,Junnan Li等人提出了一个新的模型BLIP(Bootstrapping Language-Image Pre-training)。

BLIP-2 一种通用的、核算效率高的视觉-言语预练习办法,它利用了冻住的预练习图画编码器和LLM,功能优于Flamingo、BEIT-3等网络。

BLIP2大概由这么几个部分组成,图画(Image)输入了图画编码器(Image Encoder),得到的结果与文本(Text)在Q-Former(BERT初始化)里进行交融,最终送入LLM模型。

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

BLIP-2 经过在冻住的预练习图画编码器和冻住的预练习大言语模型之间添加一个轻量级查询 Transformer (Query Transformer, Q-Former)来弥合视觉和言语模型之间的模态隔膜 (modality gap)。在整个模型中,Q-Former 是仅有的可练习模块,而图画编码器和言语模型始终保持冻住状态。

LLM(比如GLM和GPT)实质上是个言语模型,自然无法直接接受其他模态的信息。所以怎么把各个模态的信息,统一到LLM能了解的特征空间,便是第一步要处理的问题。为此,BLIP中就提出了Q-Former。

其中的Q-Former 是一个 transformer 模型,为了交融特征,那Transformer架构是最合适不过的了,Q-Former它由两个子模块组成,这两个子模块共享相同的自注意力层:

与冻住的图画编码器交互的图画 transformer,用于视觉特征提取文本 transformer,用作文本编码器和解码器。

关于Q-Former模型的练习,便是由以上三个使命组成,经过这几个使命,完成了关于特征的提取与交融,但现在模型还没见过LLM。

Q-Former的三个练习使命分别是:

Image-Text Contrastive Learning (ITC),图片文本对比学习

Image-grounded Text Generation (ITG),根据图画的文本生成

Image-Text Matching (ITM),图画文本的匹配

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

这几个使命都是以Query特征和文本特征作为输入得到的,只不过有不同的Mask组合。图画 transformer 从图画编码器中提取固定数量的输出特征,这儿特征的个数与输入图画分辨率无关。一起,图画 transformer 接收若干查询嵌入作为输入,这些查询嵌入是可练习的。这些查询还能够经过相同的自注意力层与文本进行交互。

【原创】构建自己的GPT-4:用 VisualGLM 进行多模AIGC使用及技术原理

经过第一阶段的练习,Query现已浓缩了图片的精华,现在要做的,便是把Query变成LLM认识的样子。

为什么不让LLM认识Query,而让Query变成LLM认识呢?这儿的原因有两:

(1)LLM模型的练习代价有点大;

(2)从 Prompt Learning 的观念来看,目前多模态的数据量不足以保证LLM练习的更好,反而或许会让其损失泛化性。假如不能让模型适应使命,那就让使命来适应模型。

BLIP-2针对两类不同LLM规划了不同的使命:

(1) Decoder类型的LLM(如OPT):以Query做输入,文本做方针;

(2) Encoder-Decoder类型的LLM(如FlanT5):以Query和一句话的前半段做输入,以后半段做方针;

经过整个练习过程,最终形成了图片-文本的中心相关联系模型,就能够“图文交互”了。

实质来说,BLIP-2 是一种零样本视觉言语模型,可用于各种含图画和文本提示的图画到文本使命。这是一种作用好且效率高的办法,可使用于多种场景下的图画了解,特别是当练习样本稀缺时。

该模型经过在预练习模型之间添加 transformer 来弥合视觉和自然言语模态之间的隔膜。这一新的预练习范式使它能够充分享受两种模态的各自的进展的盈利,也算是一种非常好的模型算法的创新。

完毕

今日概要学习了国内最新开源的 VisualGLM-6b,体会了一下多模的大言语模型,尽管很多人没法体会GPT-4,但是经过本文的基本学习,关于一般LLM的文本交互、图文交互 有了直观感觉,也能够进行自己的更深入的学习。

目前也有人根据VisualGLM-6b在医疗职业进行了深度学习探索,做出了能够主动辨认X片和进行确诊陈述的模型开源项目XrayGLM,也算是让VisualGLM-6b产生跟过价值贡献。

也希望本文能够带给你进入多模大言语模型,给自己技能学习和作业使用一些帮助,或者按照自己业务场景,迭代自己的中文多模大模型。

##End##


想重视更多技能信息,能够重视”黑夜路人技能” 公众号,后台发送“加群”,加入GPT和AI技能交流群