VisualGLM-6B——原理与部署

news2024/12/23 11:02:25

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论,也能对账户进行在线充值…

低代码可视化-uniapp蓝牙标签打印-代码生成器

蓝牙标签打印 蓝牙标签打印技术结合了蓝牙通信与标签打印的功能,为用户提供了一种便捷、高效的打印解决方案。以下是对蓝牙标签打印的详细解析: 蓝牙标签打印机的特点 无线连接:蓝牙标签打印机最大的亮点在于其无线连接方式。用户可以通过蓝…

【Redis基础篇】超详细♥Redis安装教程、5种常用数据结构和常见命令、Jedis和SpringDataRedis的使用

文章目录 一、Redis与客户端安装教程1、NoSQL介绍(1)结构化与非结构化(2)关联和非关联(3)查询方式(4)事务(5)总结 2、Redis介绍3、安装Redis(1&am…

毕业论文设计javaweb+VUE高校教师信息管理系统

目录 一、系统概述 二、功能详解 1. 教师管理 2. 部门管理 3. 奖惩管理 4. 业绩管理 5. 培训管理 6. 报表查询 三、总结 四、示例代码 1 前端VUE 2 后端SpringBootjava 3 数据库表 随着教育信息化的发展,传统的手工管理方式已经不能满足现代学校对教师…

Python安装流程(Windows + MAC)

目录 Windows 版 1.下载Python 2.开始安装 3.配置环境变量 4.测试python是否成功安装 MAC版 1.下载Python 2.开始安装 Windows 版 1.下载Python 进入Python官网下载:(Python更新频繁,下载最新版即可,安装流程一致&#x…

打印机共享错误11b解决方法介绍

共享打印机遇见各种错误,例如0x00000709,0x0000011b,浪费大量的时间去尝试各种方法去解决此问题,最终结果还是也连接共享失败?这个时候就说是不是系统有问题了,绝大多数的情况下是把电脑的系统重新安装了一遍&#xff…

前端工程规范-4:Git提交前代码规范检查(Husky + Lint-staged)

Git提交前代码规范检查 在前端项目开发中,规范git提交信息,也是经常使用的手段,如何确保团队成员都遵循ESint规则,且不会将不符合规范的代码推送到Git仓库? 答案是:使用带有git hooks功能的husky。git hoo…

文心一言 VS 讯飞星火 VS chatgpt (357)-- 算法导论24.2 3题

三、上面描述的 PERT 图的公式有一点不太自然。在一个更自然的结构下,图中的结点代表要执行的工作,边代表工作之间的次序限制,即边 (u,v) 表示工作 u 必须在工作 v 之前执行。在这种结构的图中,我们将权重赋给结点&…

SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题 SQL中基本SELECT语句的使用SQL语法简介DDL、DML、DCLSEECT SELECT常用关键词group by分组having筛选limit限定条数UION和UION ALL合并SQL执行顺序 联表查询多表查询示例特殊用法:笛卡尔积(交叉连接)等值连接vs非等值连接自连接…

ResNet18果蔬图像识别分类

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

接口隔离原则(学习笔记)

客户端不应该被迫依赖于它不使用的方法:一个类对另一个类的依赖应该建立在最小的接口上。 上面的设计我们发现他存在的问题,黑马品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一盒传智品牌的安全门&#xff0c…

王道-计网

2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了编号为0、1、2、3这4个帧后,而B接收了这4个帧,但仅应答了0、1两个帧,A继续发送4、5两个帧,且这两个帧已进入B的接收…

Oracle 表空间时间点恢复

已有一个数据库全备,在PDB中恢复被drop掉的表空间 1.新建表空间 create tablespace PITR_TBS datafile /u01/app/oracle/oradata/PRODCDB/PDBPROD2/PITR_TBS01.dbf size 10m; 2.使用RMAN备份. backup as compressed backupset database INCLUDE CURRENT CONTROLFI…

秘AI模型登顶评分网站:网友猜测是F.1新作诞生?

神秘的 AI 生成模型 就在近日,有一个“幽灵模型”直接登顶了模型评测网站,直接力压近期爆火的 Flux.1 等一众模型。但奇怪的是这个名为 Blueberry 的模型却没有任何一家公司或团队出来“认领”。这件事情也引发了众多人的讨论。 疑似 Flux 团队续作 幽灵…

ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【车载开发系列】ParaSoft单元测试环境配置(四)

【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四)一. 如何设置过滤二. 如何设置静态扫描的规则三. 如何设置单个测试用例的超时时间四. 如何获取测试用例的数量五. 如何设置Gc…

数字图像处理:边缘检测

数字图像处理:边缘检测 笔记来源: 1.Gradient and Laplacian Filter, Difference of Gaussians (DOG) 1.1 图像一阶梯度 水平方向的一阶导数 一阶导数滤波器在实际应用中难实现的原因 图像梯度中,一阶梯度中找局部极大值就是边缘所在处&a…

2、Stable Diffusion

2、Stable Diffusion Stable Diffusion 是一种高效的文本到图像生成模型,它利用扩散模型(Diffusion Model)技术将自然语言描述转换为高质量的图像。其工作原理是通过反向扩散过程,逐渐将噪声引导到符合输入文本描述的图像上。相比…

HTB:Three[WriteUP]

使用OpenVPN连接并启动机器 1.How many TCP ports are open? 使用nmap对靶机进行扫描:nmap -sV 10.129.233.85 可见仅开启了 22、80 共2个端口 2.What is the domain of the email address provided in the "Contact" section of the website? 直接对…

探索自闭症寄宿学校:为孩子的未来铺设坚实基石

在自闭症儿童教育的广阔天地中,寄宿学校以其独特的教育模式和全方位的关怀体系,为这些特殊孩子提供了一个安全、稳定且充满爱的成长环境。这些学校不仅关注孩子们的学习与康复,更致力于培养他们独立生活的能力,为他们的未来铺设坚…