VisualGLM-6B——原理与部署

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.shsudo su - rootconda update condaconda listconda create -n visualglm python==3.10.6conda activate visualglmconda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidiagit clone --recursive https://github.com/THUDM/VisualGLM-6B; cd VisualGLM-6Bpip install wandb
pip install bitsandbytes
sudo apt-get install git-lfs
git lfs install

然后下载VisualGLM-6B运行所需的各种文件,并安装相关依赖:

git clone https://github.com/THUDM/VisualGLM-6B.gitpip 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.rhkb.cn/news/436214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内存占用估算方法

优质博文:IT-BLOG-CN 通过掌握每种数据类型的大小,就可以更准确地预测对象和数据的内存消耗。 一、基础数据类型 Java基础数据类型结构,在64位系统开启指针压缩情况下的内存占用字节数: booleanbytecharshortintlongfloatdoub…

linux下sudo执行的程序会有一个额外的进程的问题

当我们执行一个可执行文件时,有可能需要一些更高的权限,为此我们会用sudo ./test的方法执行,这时候我们通过ps aux | grep ./test去查看进程,会发现多出来一个 sudo ./test 的进程,该进程被杀死后,发现目标…

等保测评:企业数字安全的坚实盾牌

1.1 企业数字化转型的浪潮 在当今时代,企业数字化转型的浪潮正以前所未有的速度席卷全球,据IDC预测,到2023年,全球数字化转型支出将达到惊人的2.3万亿美元。这一趋势不仅重塑了企业的运营模式,更对企业的信息安全提出…

Mac通过ssh连接工具远程登录服务器( Royal TSX安装及使用)

一、Royal TSX软件下载地址 Royal Apps 二、Royal TSX 汉化 汉化包地址:GitCode - 全球开发者的开源社区,开源代码托管平台 三、基础配置 Royal TSX 是一款基于插件的应用,刚安装时还不具备使用条件,需要进行一些基础配置 1 安装基础插件…

【鸿蒙开发】05 登录Demo解析

文章目录 一、功能介绍 在鸿蒙开发中,一个完善的登录功能是许多应用程序的基础需求。本文将详细介绍一个鸿蒙 App 登录 Demo,包括其功能介绍、代码解析以及代码 demo 的下载地址。 本文初始代码从华为开发者网站下载,根据该Demo进行内容调整。…

无人机之数据提取篇

一、无人机平台与传感器 无人机是进行数据采集的基础设施,其稳定性、可靠性、灵活性和负载能力直接影响到数据采集的效果。根据实际需求,需选择适合的无人机类型,如固定翼无人机适合大范围、长时间的数据采集,而多旋翼无人机则更适…

windows系统下Telnet工具的安装步骤

通过控制面板启用Telnet客户端 点击“确定”按钮,按照系统提示完成安装。 打开cmd,输入telnet就可以了

影刀RPA实战:Excel拆分与合并工作表

1.影刀操作excel的优势 Excel,大家都不陌生,它是微软公司推出的一款电子表格软件,它是 Microsoft Office 套件的一部分。Excel 以其强大的数据处理、分析和可视化功能而闻名,广泛应用于商业、教育、科研等领域。可以说&#xff0…

基于Apache和Tomcat的负载均衡实验报告

说明:本实验为浙江科技大学软件工程本科专业课程《软件体系结构》的实验报告。 五、总结 负载均衡的基础是集群,集群就是一组连在一起的计算机,从外部看它是一个系统,各节点可以是不同的操作系统或不同的硬件构成的计算机。负载…

【网络安全】-访问控制-burp(1~6)

文章目录 前言   1.Lab: Unprotected admin functionality  2.Lab: Unprotected admin functionality with unpredictable URL   3.Lab: User role controlled by request parameter   4.Lab:User role can be modified in user profile  5.Lab: User ID controlled by…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中,每一座建筑都是文化的载体,无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求,更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上,巧妙融合现代元素&#xff0…

CSS文本格式化

通过 CSS 中的文本属性您可以像操作 Word 文档那样定义网页中文本的字符间距、对齐方式、缩进等等,CSS 中常用的文本属性如下所示: text-align:设置文本的水平对齐方式;text-decoration:设置文本的装饰;te…

PCL 索引空间采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 索引空间采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总&#xf…

XSS | XSS 常用语句以及绕过思路

关注这个漏洞的其他相关笔记&#xff1a;XSS 漏洞 - 学习手册-CSDN博客 0x01&#xff1a;干货 - XSS 测试常用标签语句 0x0101&#xff1a;<a> 标签 <!-- 点击链接触发 - JavaScript 伪协议 --><a hrefjavascript:console.log(1)>XSS1</a> <!-- 字…

Java | Leetcode Java题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {int n nums.length;for (int num : nums) {int x (num - 1) % n;nums[x] n;}List<Integer> ret new ArrayList<Integer>();for (int i …

易天智能eHR CreateUser 任意用户添加漏洞

漏洞描述 易天智能eHR管理平台 /BaseManage/UserAPI/CreateUser 接口存在任意用户添加漏洞&#xff0c;未经身份验证的远程攻击者可以利用此漏洞添加任意管理员用户&#xff0c;导致攻击者可直接管理后台&#xff0c;造成信息泄露&#xff0c;使系统处于极不安全的状态。 漏洞…

zi2zi-chain: 中国书法字体图片生成和字体制作的一站式开发

在zi2zi-pytorch的基础上&#xff0c;做了进一步的修复和完善。本项目github对应网址为https://github.com/not-bald-owl/zi2zi-chain/tree/master。 修复部分为&#xff1a;针对预处理部分的函数弃用、生僻字无法生成、训练和推理部分单卡支持改为多卡并行、以及扩展从本地的…

初识Linux · 进程等待

目录 前言&#xff1a; 进程等待是什么 为什么需要进程等待 进程等待都在做什么 前言&#xff1a; 通过上文的学习&#xff0c;我们了解了进程终止&#xff0c;知道终止是在干什么&#xff0c;终止的三种情况&#xff0c;以及有了退出码&#xff0c;错误码的概念&#xff…

基于Node.js+Express+MySQL+VUE实现的计算机毕业设计共享单车管理网站

单车信息选择骑行 骑行状态留言公告/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序 目录 功能图 界面展示 开发目标 开发背景意义 开发意义‌ 开发目的 项目概述‌ 技术选型与理由‌ 系统设计与功能实现‌ 项目可执行性分析 ‌系统架构需求‌ ‌性能需…

leetcode力扣刷题系列——【座位预约管理系统】

题目 请你设计一个管理 n 个座位预约的系统&#xff0c;座位编号从 1 到 n 。 请你实现 SeatManager 类&#xff1a; SeatManager(int n) 初始化一个 SeatManager 对象&#xff0c;它管理从 1 到 n 编号的 n 个座位。所有座位初始都是可预约的。 int reserve() 返回可以预约座…