【发布】ChatGLM又开源了一个6B多模态版本

2023-11-16

点击蓝字

c4f9348ef1697867ea884cc3d0f26b4c.jpeg

关注我们

AI TIME欢迎每一位AI爱好者的加入!

ecce8eebc8069bddde9a5dd4c2e7bd53.png

OpenAI 的GPT-4样例中展现出令人印象深刻的多模态理解能力,但是能理解图像的中文开源对话模型仍是空白。

近期,智谱AI 和清华大学 KEG 实验室开源了基于 ChatGLM-6B 的多模态对话模型 VisualGLM-6B,供大家使用。

Github 链接:

https://github.com/THUDM/VisualGLM-6B

Huggingface 链接:

https://huggingface.co/THUDM/visualglm-6b

VisualGLM-6B 可以进行图像的描述及相关知识的问答:

2df550c8da9f00649e6ad5b176aac75c.png

也能结合常识或提出有趣的观点:

8c398e8bb6bd328301f9f6821d580f9d.png 0803a04bae4efb2738141308bf55249c.png

a2218b73f603711df92423a901b66007.png

一、简介

VisualGLM-6B 是一个开源的,支持图像、中文和英文的多模态对话语言模型,语言模型基于 ChatGLM-6B,具有 62 亿参数;图像部分通过训练 BLIP2-Qformer 构建起视觉模型与语言模型的桥梁,整体模型共 78 亿参数。

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

VisualGLM-6B 由 SwissArmyTransformer (简称 sat ) 库训练,这是一个支持 Transformer 灵活修改、训练的工具库,支持 Lora、P-tuning 等参数高效微调方法。本项目提供了符合用户习惯的 huggingface 接口,也提供了基于sat的接口。

不过,由于 VisualGLM-6B 仍处于v1版本,目前已知其具有相当多的局限性,如图像描述事实性/模型幻觉问题,图像细节信息捕捉不足,以及一些来自语言模型的局限性。请大家在使用前了解这些问题,评估可能存在的风险。在VisualGLM之后的版本中,将会着力对此类问题进行优化。

结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4量化级别下最低只需8.7G显存)。

二、使用

模型推理

使用pip安装依赖

pip install -r requirements.txt

此时默认会安装deepspeed库(支持sat库训练),此库对于模型推理并非必要,同时部分Windows环境安装此库时会遇到问题。如果想绕过deepspeed安装,我们可以将命令改为

pip install -r requirements_wo_ds.txt
pip install --no-deps 'SwissArmyTransformer>=0.3.6'

如果使用Huggingface transformers库调用模型,可以通过如下代码(其中图像路径为本地路径):

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/visualglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/visualglm-6b", trust_remote_code=True).half().cuda()
image_path = "your image path"
response, history = model.chat(tokenizer, image_path, "描述这张图片。", history=[])
print(response)
response, history = model.chat(tokenizer, "这张图片可能是在什么场所拍摄的?", history=history)
print(response)

如果使用SwissArmyTransformer库调用模型,方法类似,可以使用环境变量SAT_HOME决定模型下载位置。在本仓库目录下

>>> 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)

使用 sat 库也可以轻松进行进行参数高效微调。

请注意,Huggingface模型的实现位于Huggingface的仓库中,sat模型的实现包含于本仓库中。

三、部署工具

命令行 Demo

python cli_demo.py

程序会自动下载sat模型,并在命令行中进行交互式的对话,输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。

2b1d635232b8c856be8705d038e73ba1.png

程序提供如下超参数控制生成过程与量化精度:

usage: cli_demo.py [-h] [--max_length MAX_LENGTH] [--top_p TOP_P] [--top_k TOP_K] [--temperature TEMPERATURE] [--english] [--quant {8,4}]
optional arguments:
  -h, --help            show this help message and exit
  --max_length MAX_LENGTH
                        max length of the total sequence
  --top_p TOP_P         top p for nucleus sampling
  --top_k TOP_K         top k for top k sampling
  --temperature TEMPERATURE
                        temperature for sampling
  --english             only output English
  --quant {8,4}         quantization bits

我们也提供了继承自ChatGLM-6B的打字机效果命令行工具,此工具使用Huggingface模型:

python cli_demo_hf.py

网页版 Demo

ed52d6a742f29ac4957eb36b1298987e.png

我们提供了一个基于 Gradio 的网页版 Demo,首先安装 Gradio:pip install gradio。然后下载并进入本仓库运行web_demo.py:

git clone https://github.com/THUDM/VisualGLM-6B
cd VisualGLM-6B
python web_demo.py

程序会自动下载sat模型,并运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。--quant 4使用4比特量化减少显存占用。

我们也提供了继承自ChatGLM-6B的打字机效果网页版工具,此工具使用Huggingface模型:

python web_demo_hf.py

API部署

首先需要安装额外的依赖 pip install fastapi uvicorn,然后运行仓库中的 api.py:

python api.py

程序会自动下载sat模型,默认部署在本地的 8080 端口,通过 POST 方法进行调用。下面是用curl请求的例子,一般而言可以也可以使用代码方法进行POST。

echo "{\"image\":\"$(base64 path/to/example.jpg)\",\"text\":\"描述这张图片\",\"history\":[]}" > temp.json
curl -X POST -H "Content-Type: application/json" -d @temp.json http://127.0.0.1:8080

得到的返回值为

{
    "response":"这张图片展现了一只可爱的卡通羊驼,它站在一个透明的背景上。这只羊驼长着一张毛茸茸的耳朵和一双大大的眼睛,它的身体是白色的,带有棕色斑点。",
    "history":[('描述这张图片', '这张图片展现了一只可爱的卡通羊驼,它站在一个透明的背景上。这只羊驼长着一张毛茸茸的耳朵和一双大大的眼睛,它的身体是白色的,带有棕色斑点。')],
    "status":200,
    "time":"2023-05-16 20:20:10"
  }

四、模型量化

在Huggingface实现中,模型默认以 FP16 精度加载,运行上述代码需要大概 15GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型。使用方法如下:

# 按需修改,目前只支持 4/8 bit 量化。下面将只量化ChatGLM,ViT 量化时误差较大
model = AutoModel.from_pretrained("THUDM/visualglm-6b", trust_remote_code=True).quantize(8).half().cuda()

在sat实现中,需先传参将加载位置改为cpu,再进行量化。方法如下,详见cli_demo.py:

from sat.quantization.kernels import quantize
model = quantize(model.transformer, args.quant).cuda()
# 指定 model.transformer 只量化 ChatGLM,ViT 量化时误差较大

五、局限性

本项目正处于V1版本视觉和语言模型的参数、计算量都较小,我们总结了如下主要存在的改进方向:

  • 图像描述事实性/模型幻觉问题。在生成图像长描述的时候,距离图像较远时,语言模型的将占主导,有一定可能根据上下文生成并不存在于图像的内容。

  • 属性错配问题。在多物体的场景中,部分物体的某些属性,经常被错误安插到其他物体上。

  • 分辨率问题。本项目使用了224*224的分辨率,也是视觉模型中最为常用的尺寸;然而为了进行更细粒度的理解,更大的分辨率和计算量是必要的。


硬核招聘

欢迎优秀的人

一起用技术改变世界

5fc10a3037edef9e2a6856607ad5a553.jpeg

往期精彩文章推荐

a8ddfe1ab43f473b9ef44d4e22913068.jpeg

记得关注我们呀!每天都有新知识!

 关于AI TIME 

AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题进行探索,加强思想碰撞,链接全球AI学者、行业专家和爱好者,希望以辩论的形式,探讨人工智能和人类未来之间的矛盾,探索人工智能领域的未来。

迄今为止,AI TIME已经邀请了1000多位海内外讲者,举办了逾550场活动,超600万人次观看。

2b4d4bcc1afc6e9b581ebd92202a6091.png

我知道你

在看

~

0b6e017ada44cecfa8a21f8f0145b622.gif

点击 阅读原文 查看!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【发布】ChatGLM又开源了一个6B多模态版本 的相关文章

随机推荐

  • Spring Cloud Gateway学习

    文章大纲 为什么需要网关 传统的单体架构只有一个服务开放给客户端调用 但是在微服务架构体系中是将一个系统拆分成多个微服务 那么作为客户端如何去调用这些微服务呢 如果没有网关的存在 就只能在本地记录每个微服务的调用地址 无网关的微服务架构存在
  • C++之MFC学习

    问题1 stdafx h是怎么引入进来的 define h与stdafx h之间的关系 为什么在MuisicPlayer cpp中引入stdafx h 问题2 enum class的使用 问题3 列表初始化 int window trans
  • linux重做系统分区,搜索所有硬盘分区上的linux系统,重新安装grub的方法

    电脑硬盘上 非vmware 安装了Ubuntu Fedora Debian openSUSE linuxMint Mageia elementaryOS PearOS ZorinOS Bodhi Manjaro Sparky linuxDe
  • 【星球精选】如何高效构建 Roam 与 theBrain 间细粒度双向链接?

    Roam Research 作为卡片盒很好用 只是目前缺乏中观网络可视化能力 老牌知识管理应用TheBrian 可以很好补充上这个短板 因此我希望将二者结合起来使用 只是这个过程 有些曲折 在 Obsidian 中的 excalibrain
  • redis可视工具AnotherRedisDesktopManager的使用

    redis可视工具AnotherRedisDesktopManager的使用 系列文章 macm1安装redis过程 springboot整合redis及set map list key value和实体类操作 redis可视工具Anoth
  • 龙书11_chapter_6 一:一般绘制流程

    先看BoxDemo的前几节 1 vertex input Layout 2 vertexBuffer 3 IndexBuffer 4 vertexShader 5 constant Buffer 6 pixelShader 7 render
  • Hbase存储及元数据meta

    Hbase的列族式存储 列族就是多个数据列的组合 列族式可以说是表的schema的一部分 而列不是 Hbase可以说是列簇数据库 在创建表的时候要指定列族 而不需要指定具体的列 Hbase Table组成 Table rowkey fami
  • Sqli-labs之Less-25和Less-25a

    Less 25 GET 基于错误 您所有的OR AND都属于我们 字符串单引号 Notice Undefined variable hint in C phpStudy WWW sqli Less 25 index php on line
  • Android自动化测试框架实现

    背景介绍 最近打算梳理一下不同产品领域的自动化测试实现方案 如 Android终端 Web 服务端 智能硬件等 就先从Android终端产品开始梳理吧 本文主要介绍UI自动化测试的实现 因为这类测试解决方案比较通用 Android系统层 内
  • CentOS 7下安装nginx+php+mysql

    目录 一 安装Nginx 1 安装make 2 安装g 3 安装PCRE库 4 安装zlib库 5 安装ssl 6 下载和解压nginx 7 添加nginx用户和用户组 8 配置nginx安装参数 9 编译并且安装nginx 10 启动ng
  • Windows下的mingw-Qt开发环境安装及helloworld实现

    Windows下的mingw Qt开发环境安装及helloworld实现 我用的是Qt5 7 因此本次总结是基于Qt5 7 0的 我在自学的时候使用的IDE是Qt自带的Qt creator 上手简单 配置属于自己顺手的设置很方便 此外 如果
  • element主题色切换

    在网上搜了很多主题切换方案 发现没有适合自己项目的 不得已结合根据实际情况做一个子主题切换的功能 其中参考了element 官方的theme chalk preview 感兴趣的可以自己研究一下 主要功能是基于less切换主题色 可以自定义
  • 网络安全工程师需要学什么?零基础怎么从入门到精通,看这一篇就够了

    网络安全工程师需要学什么 零基础怎么从入门到精通 看这一篇就够了 我发现关于网络安全的学习路线网上有非常多看似高大上却无任何参考意义的回答 大多数的路线都是给了一个大概的框架 告诉你那些东西要考 以及建议了一个学习顺序 但是这对于小白来说是
  • 计算机退出程序的四种方法,退出windows10系统账户的四种方法

    网友反馈说Win10系统打开某些程序时 经常会弹出提示 你要允许以下程序对此计算机进行更改吗 每回都要手动关闭 而且频繁的弹出影响办公效率 有什么办法能将此窗口给永久关闭 退出微软账户即可 接下去看下具体操作方法 退出Win10账户的方法
  • 同步与异步的区别(一看则懂)

    前端面试经常被问 同步与异步的区别是什么 答案呢 大家都知道 只是在于你怎么表达 这种问题也不是很复杂 建议在回答的时候最好结合自己的实际项目开发以及自己的理解来回答 这样的效果会比较好 面试上提的问题本来目的就是想考察你是否熟悉 是否有用
  • TSN协议之冗余协议——IEEE 802.1 CB

    在车载通信领域 我们时常面临一个困惑 要是通信线路异常断开了怎么办 这里的异常断开不仅指物理上的断开 也可能是受电磁干扰等导致线路通信功能的异常等 解决此类问题 一个显而易见的解决方案就是增加冗余路径 即把数据传输2 N份以进行备份 这样就
  • 【转载】阿里数据技术大图详解

    架构图从下往上看 从数据采集和接入为始 抽取到计算平台 通过OneData体系 以 业务板块 分析维度 为架构去构建 公共数据中心 基于公共数据中心在上层根据业务需求去建设消费者数据体系 企业数据体系 内容数据体系等核心数据资产 深度加工后
  • JS判断数组是否包含其他数组中的一个值

    Test var a 2 3 4 5 6 7 8 9 10 var b 2 3 var c 1 var x S1 var y S2 c findIndex val gt x y a includes val Demo POC primary
  • 读取nacos配置_Nacos入门指南01 Nacos是什么?

    你好 欢迎阅读 本文是系列文章中的第1篇 Part1 Nacos 是什么 Part2 Nacos 环境搭建 Part3 Nacos 服务发现实践 Part4 Nacos 分布式配置实践 本文的目标是理解 Nacos 的概念作用 并理解服务发
  • 【发布】ChatGLM又开源了一个6B多模态版本

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 OpenAI 的GPT 4样例中展现出令人印象深刻的多模态理解能力 但是能理解图像的中文开源对话模型仍是空白 近期 智谱AI 和清华大学 KEG 实验室开源了基于 ChatGLM