LLM系列 | 23:多模态大模型:浦语·灵笔InternLM-XComposer解读、实战和思考

  • 引言

  • ​简介

  • 模型解读

    • 模型架构

    • 训练

  • 实战

    • 环境准备

    • 本地实测

    • 服务部署

  • 总结

引言

谁念西风独自凉,萧萧黄叶闭疏窗,沉思往事立残阳。

                                                         Created by DALL·E 3

小伙伴们好,我是《小窗幽记机器学习》的小编:卖热干面的小女孩。今天这篇小作文主要介绍由上海人工智能实验室推出的多模态模型浦语·灵笔。本文先介绍浦语·灵笔的模型细节,再以实战方式结束本地部署浦语·灵笔模型并实测各种任务上的效果。如果有疑问或者想要和小编进一步交流,欢迎通过《小窗幽记机器学习》找到小编。

简介

浦语·灵笔模型是基于书生·浦语大语言模型研发的视觉-语言大模型,提供图文理解和创作能力:

  • 图文交错创作:  浦语·灵笔可以为用户打造图文并貌的文章,具体是提供文章生成和配图选择的功能。这一能力由以下步骤实现:

    1. 理解用户指令,创作符合要求的文章

    2. 智能分析文章,自动规划插图的理想位置,确定图像内容需求。

    3. 基于以文搜图服务,从图库中检索出对应图片。

  • 图文理解: 浦语·灵笔设计了高效的训练策略,为模型注入海量的多模态概念和知识数据,赋予其强大的图文理解和对话能力。

从公布的技术报告可以获悉InternLM-XComposer在公开评测数据集上的战绩:在多项视觉语言大模型的主流评测上均取得了最佳性能,包括MME Benchmark (英文评测)、 MMBench (英文评测)、Seed-Bench (英文评测)、 CCBench(中文评测)、MMBench-CN (中文评测)。

截至目前(2023年10月14日)官方开源2个版本的浦语·灵笔模型:

  • InternLM-XComposer-VL-7B :该模型是基于书生·浦语大语言模型的多模态预训练和多任务训练模型,在多种评测上表现出杰出性能, 例如:MME Benchmark, MMBench Seed-Bench, CCBench, MMBench-CN。该模型是base模型,即常说的基座模型。

  • InternLM-XComposer-7B:进一步对InternLM-XComposer-VL进行指令微调得到nternLM-XComposer。该微调模型可以用于创作图文并茂的文章,也支持多模态对话(目前支持图文对话,更具体是围绕给定图片的讨论,暂不支持指令编辑给定的图片)。

以下为小编体验演示:

AI科技爱科学

GitHub: 

https://github.com/InternLM/InternLM-XComposer

技术报告: 

https://arxiv.org/abs/2309.15112

模型解读

模型架构

InternLM-XComposer整体架构由3部分组成,包括视觉编码器、LLM-model (本文即InternLM) 和对齐模块(报告中称为Perceive Sampler,感知采样器)。

1. 视觉编码器:InternLMXComposer 中的视觉编码器采用 EVA-CLIP,这是标准 CLIP的改进版本,用mask图像的方式增强了模型的建模能力,能够更有效地捕捉输入图像的视觉细节。在该模块中,图像被调整为统一的 224×224 尺寸,然后以步长为14的方式切割成图块。这些图块作为输入token,再利用transformer中的自注意力机制,从而提取图像embeddings。

2. Perceive 采样器:InternLM-XComposer中的感知采样器其实是一种池化机制,旨在将图像embeddings从初始的257维度压缩为64。这些压缩优化后的embeddings随后与大型语言模型理解的知识进行对齐。仿照BLIP2的做法,InternLM-XComposer利用BERT-base中cross-attention层作为感知采样器。

3. 大型语言模型:InternLM-XComposer用InternLM 作为其基础大型语言模型。值得注意的是,InternLM 是一种功能强大的多语言模型,擅长英语和中文。具体是使用已经公开的 InternLM-Chat-7B 作为大型语言模型。

训练

InternLM-XComposer的训练过程分为 A 阶段和 B 阶段。A 阶段作为预训练阶段,利用大量数据训练基座模型。B阶段是监督微调,先做多任务训练,再做指令微调。在多任务训练后得到InternLM-XComposer-VL模型,在指令微调得到InternLM-XComposer模型。

1. Pre-training阶段:预训练基座视觉语言模型阶段利用了大量的图像-文本对(网络爬取)和交错的图像-文本数据。这些数据包括中英文两种语言的多模态数据。为了保持大型语言模型的语言能力,在 InternLM 预训练阶段使用的部分文本数据也在 InternLM-XComposer 的预训练阶段中使用。如Table 1 所示:

图像-文本对方面,使用了 11 亿张图像和 677 亿个文本token(其中506亿个英文文本token和171亿个中文文本token),包括公开数据集和从内部数据(从网站爬取收集),总共超过 1100 万个语义概念。内部数据集In-house Data有一个开放的子集:书生·万卷文本数据集。这个开源数据集,包含三个部分:纯文本格式数据集、文本-图像对数据集和视频数据集,可以从官网下载到,相关的数据说明也可以在对应论文上查阅。此外,还加入了约100亿个从InternLM 预训练数据集中抽样的文本token,以维持模型的语言能力。在训练过程中,所有预训练数据都经过了严格的清洗流程,以确保其质量和可靠性。

在预训练阶段,视觉编码器参数固定,主要对感知采样器和大型语言模型进行优化。感知采样器和大型语言模型的初始权重分别来自BLIP2和InternLM。由于大型语言模型天然缺乏对图像embeddings的理解,因此在多模态预训练框架内做优化有助于提高理解这些embeddings的能力。模型的训练目标集中在下一个token预测上,使用交叉熵损失作为损失函数。采用的优化算法是 AdamW,超参数设置如下:β1=0.9,β2=0.95,eps=1e-8。感知采样器和大型语言模型的最大学习速率分别设置为 2e-4 和 4e-5,采用余弦学习率衰减策略,最小学习率设置为1e-5。此外,在最初的 200 步中使用线性预热。训练过程一个batch size中约 1570 万个token,并进行 8000 次迭代。使用如此大的batch size有助于稳定训练,同时也有助于维持InternLM的固有能力。

2. 监督微调阶段:在预训练阶段,图像embeddings与文本表征对齐,使大型语言模型具有初步具备理解图像内容的能力。为进一步指导模型在恰当时机使用图像信息的能力,引入了各种视觉-语言任务。所以,整个监督微调阶段,其实由多任务训练和指令微调组成。

多任务训练。多任务训练数据集如Table 2 所示,这些任务包括场景理解(例如 COCO Caption,SUB)、位置理解(例如 Visual Spatial Reasoning 数据集)、光学字符识别OCR(例如 OCR-VQA)以及开放式回答(例如 VQAv2 ,GQA)等。

每个任务都被设计成会话交互形式,具体格式如下:

其中和 分别表示用户和机器人结束token。对于每张图像具有多个问题的QVA数据集,将其构造成多轮对话,问题随机排序,从而大大提高了 SFT 过程的效率。在这个阶段,所有问题都通过人工编写的提示引入,以增加任务的多样性。为了实现稳定且高效的微调,将大型语言模型的权重冻结,然后使用 Low-Rank Adaption(LoRA)架构进行模型微调。当然,在这个过程中,感知采样器也同时进行训练,只是学习率不同。LoRA 应用于注意力层的 query、value 和 key 以及前馈网络。实验发现较高的LoRA rank有助于赋予模型新能力;因此,将 LoRA rank和 alpha 参数都设置为 256。模型在10,000次迭代训练中使用全局batch size,值为256。LoRA 层和感知采样器的学习速率分别设置为 5e-5和 2e-5。

指令微调。为了进一步提升上述模型的指令跟随和交错的图像-文本组合能力,使用来自纯文本对话语料库和LLava-150k 的数据进行指令微调。此外,使用 LRV 数据集减轻幻觉。交错的图像-文本组合数据集的构建方法,可以查阅原始技术报告,这里略过。Batch size=256,并在1000 次迭代中使用较小的学习速率=1e-5。

实战

环境准备

安装 flash-attention:参考官方项目安装flash-attention:

pip3 install flash-attn --no-cache-dir  --no-build-isolation -i https://mirrors.cloud.tencent.com/pypi/simple

安装 rotaty

pip3 install "git+https://github.com/Dao-AILab/flash-attention.git#subdirectory=csrc/rotary" -i https://mirrors.cloud.tencent.com/pypi/simple

如果不安装,可能报错:

  File "/root/.cache/huggingface/modules/transformers_modules/internlm-xcomposer-7b/modeling_InternLM.py", line 5, in <module>import rotary_emb
ModuleNotFoundError: No module named 'rotary_emb'

注意,如果需要设置代理,请提前设置:

export HTTPS_PROXY=XXX
export HTTP_PROXY=XXXX

本地实测

取如下图片进行测试:

测试代码:

"""
CUDA_VISIBLE_DEVICES=7 python3 examples/example_chat.py
"""
import torch
from transformers import AutoModel, AutoTokenizertorch.set_grad_enabled(False)# init model and tokenizer
model_id = "/home/model_zoo/LLM/internlm/internlm-xcomposer-7b/"
model = AutoModel.from_pretrained(model_id, trust_remote_code=True).cuda().eval()
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model.tokenizer = tokenizer# example image
image = 'examples/images/baoguoma.jpeg'# Single-Turn Pure-Text Dialogue
text = '请介绍下马保国'
response = model.generate(text)
print(f'User: {text}')
print(f'Bot: {response}')# Single-Turn Text-Image Dialogue
text = '请问这张图片里面的人是谁?并介绍下他。'
image = 'examples/images/baoguoma.jpeg'
response = model.generate(text, image)
print(f'User: {text}')
print(f'Bot: {response}')# Multi-Turn Text-Image Dialogue
# 1st turn
text = '图片里面的是谁?'
response, history = model.chat(text=text, image=image, history=None)
print(f'User: {text}')
print(f'Bot: {response}')# 2nd turn
text = '他有哪些成就?'
response, history = model.chat(text=text, image=None, history=history)
print(f'User: {text}')
print(f'Bot: {response}')# 3rd turn
text = '他是最伟大的物理学家吗?'
response, history = model.chat(text=text, image=None, history=history)
print(f'User: {text}')
print(f'Bot: {response}')

输出结果:

User: 请介绍下马保国
Bot: 马保国,男,汉族,1952年出生于河北省邯郸市大名县,中国武术家。2015年11月30日,马保国在一场业余搏击比赛中,被业余选手王庆民连续三拳打倒在地,随后倒地不起,被送往医院后抢救无效去世。User: 请问这张图片里面的人是谁?并介绍下他。
Bot: 这张图片里面的人是一位男子,他戴着墨镜,面带微笑,看起来心情不错。男子名叫郭德纲,是中国著名的相声演员和主持人。User: 图片里面的是谁?
Bot: 图片里面的是郭德纲。User: 他有哪些成就?
Bot: 郭德纲是中国相声演员、主持人、影视演员。User: 他是最伟大的物理学家吗?
Bot: 对不起,郭德纲并不是物理学家。

换成蔡某某的照片:

重新测试,输出结果如下:

User: 请介绍下蔡徐坤
Bot: 蔡徐坤(Cai Xukun),1998年8月2日出生于浙江省温州市,中国内地流行乐男歌手、影视演员。2012年,参加选秀节目《向上吧!少年》进入全国300强
。2013年,参加浙江卫视歌唱选秀节目《中国好声音第二季》,最终获得周杰伦组亚军、全国总决赛季军
。2018年4月6日,发行个人首支原创单曲《I Wanna Get Love》
;5月2日,发行原创单曲《Wait Wait Wait》
;8月2日,发行原创单曲《Hard To Get》
;12月21日,发行原创单曲《Pull Up》
。2019年1月1日,发行原创单曲《YOUNG》
;2月14日,发行原创单曲《情人》
;4月6日,发行原创单曲《重生》
;7月6日,发行原创
User: 请问这张图片里面的人是谁?并介绍下他。
Bot: 这张图片里的人是蔡徐坤。蔡徐坤是一位中国男歌手和演员,他在2018年通过选秀节目《偶像练习生》出道,成为NINE PERCENT成员之一。User: 图片里面的是谁?
Bot: 蔡徐坤User: 他有哪些成就?
Bot: 蔡徐坤是中国内地流行乐男歌手、音乐制作人、影视演员。User: 他是最伟大的篮球运动员吗?
Bot: 对不起,我无法回答这个问题。User: 描述下这张图片?
Bot: 这是一张蔡徐坤的照片,他正在打篮球。

服务部署

如果服务器因为网络原因只能使用本地模型,或者个人已经其他下载好模型,想要直接指定模型路径,那么需要进行几处修改。

  1. modeling_vit.py将原来的:

url = "https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/eva_vit_g.pth"cached_file = download_cached_file(url, check_hash=False, progress=True)

改为:

# 预先下载好 "https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/eva_vit_g.pth" 文件,然后存在机器上。cached_file = "/home/model_zoo/LLM/internlm/internlm-xcomposer-7b/eva_vit_g.pth"
  1. modeling_InternLM_XComposer.py:将原来的

encoder_config = BertConfig.from_pretrained("bert-base-uncased")

改为:

# 预先下载https://huggingface.co/bert-base-uncased/tree/main的模型存于 /home/model_zoo/LLM/bert-base-uncased
local_model_path = "/home/model_zoo/LLM/bert-base-uncased"  # "bert-base-uncased"
encoder_config = BertConfig.from_pretrained(local_model_path)

将原来的:

Qformer = BertLMHeadModel.from_pretrained("bert-base-uncased", config=encoder_config)

改为:

local_model_path = "/home/model_zoo/LLM/bert-base-uncased" 
Qformer = BertLMHeadModel.from_pretrained(local_model_path, config=encoder_config)

启动服务:

CUDA_VISIBLE_DEVICES=7 python3 examples/web_demo.py

图文交错创作功能测试:

其中文章生成的配图来自调用内部以文搜图模块,并非通过图片生成的方式。但是,以文搜图的图库和背后的逻辑并没有说明,目前只给出一个调用接口https://lingbi.openxlab.org.cn/image/similar,且caption字符串最多54个字符。

图文理解测试:

总结

虽然技术层面没有太多创新,但是图文交叉的产品应用形态,还是值得肯定和借鉴的。如果可以进一步支持文章配图生成,直接解决配图版权问题,在体验层面会有更多惊喜。其实,小编在每篇小作文开头的配图都是生成的,比如今天小作文开头诗句配图就是通过DALL·E 3直接生成的。至于图文理解方面效果还行,但是对于近期知识和图中图标等一些局部元素的理解不足。后续需要考虑如何增量的方式融入新知识或者使用类似LORA的方式挂载外部知识。

此外,在使用过程中发现,ORC效果很差,但是技术报告里面声称,在微调阶段使用了OCR数据:OCR-VQA,但是在实际使用的时候,为啥OCR能力如此差?同样有待后续提高。

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

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

相关文章

深入浅出排序算法之堆排序

目录 1. 算法介绍 2. 执行流程⭐⭐⭐⭐⭐✔ 3. 代码实现 4. 性能分析 1. 算法介绍 堆是一种数据结构&#xff0c;可以把堆看成一棵完全二叉树&#xff0c;这棵完全二叉树满足&#xff1a;任何一个非叶结点的值都不大于(或不小于)其左右孩子结点的值。若父亲大孩子小&#x…

【密评】商用密码应用安全性评估从业人员考核题库(十五)

商用密码应用安全性评估从业人员考核题库&#xff08;十五&#xff09; 国密局给的参考题库5000道只是基础题&#xff0c;后续更新完5000还会继续更其他高质量题库&#xff0c;持续学习&#xff0c;共同进步。 3501 单项选择题 根据GM/T 0115 《信息系统密码应用测评要求》&am…

如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 img STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例&#xff09;。 如下图所示&#xff1a;…

linux系统安装Googletest单元测试框架

环境信息 系统&#xff1a;ubuntn cmake版本&#xff1a;3.5.1 gcc版本&#xff1a;5.4.0 1、下载googletest git clone https://github.com/google/googletest.git注意&#xff01;不选branch的话默认下载最新版本&#xff08;需要编译器能够支持C14&#xff09;&#xff0c;…

Android framework服务命令行工具框架 - Android13

Android framework服务命令行工具框架 - Android13 1、framework服务命令行工具简介2、cmd 执行程序2.1 目录和Android.bp2.2 cmdMain 执行入口2.3 cmd命令 3、am命令工具&#xff0c;实质脚本执行cmd activity3.1 sh脚本3.2 activity服务注册3.3 onShellCommand执行 4、简易时…

javaEE -9(7000字详解TCP/IP协议)

一&#xff1a; IP 地址 IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一个逻辑地址&#xff0c;以此来屏蔽物…

使用pycharm远程连接到Linux服务器进行开发

预计达到的效果 本地的 PyCharm 能达到和远程服务器之间的文件同步&#xff1b;本地的 PyCharm 能够使用远程服务器的开发环境&#xff1b; 环境配置 PyCharm&#xff1a;PyCharm 2021.3 (Professional Edition)Linux服务器&#xff1a;Ubuntu20.04 步骤 1.进入配置项 配…

Python 算法高级篇:桶排序与基数排序

Python 算法高级篇&#xff1a;桶排序与基数排序 引言什么是桶排序&#xff1f;桶排序的基本步骤桶排序的示例 什么是基数排序&#xff1f;基数排序的基本步骤基数排序的示例 桶排序与基数排序的应用桶排序的应用基数排序的应用 Python 示例代码总结 引言 在算法高级篇的课程中…

从设计、制造到封测,XSKY 智能存储助力半导体行业数字化转型

近日&#xff0c;ECS2023 第五届中国电子通信与半导体 CIO 峰会在深圳召开&#xff0c;峰会以“数字科技与业务重塑”为主题&#xff0c;汇聚了 300来自电子通信与半导体行业知名企业高管、CIO、信息化与数字化负责人&#xff0c;交流电子通信与半导体行业的创新的产品和解决方…

【排序】js简单实现前端数组排序,多字段数组对象排序,字符串排序,数字排序等

数组对象排序&#xff08;多字段排序&#xff09; 排序前&#xff1a; 排序后&#xff1a; data() {return {list: [{ks: 外科,child_ks: 泌尿外科,xz: 外科一组,doctor: 小明,num: 18,num2: 19,num3: 20},{ks: 中医科,child_ks: 中医男科,xz: 外科一组,doctor: 小红,num: …

Hadoop、Hive安装

一、 工具 Linux系统&#xff1a;Centos&#xff0c;版本7.0及以上 JDK&#xff1a;jdk1.8 Hadoop&#xff1a;3.1.3 Hive&#xff1a;3.1.2 虚拟机&#xff1a;VMware mysql&#xff1a;5.7.11 工具下载地址: https://pan.baidu.com/s/1JYtUVf2aYl5–i7xO6LOAQ 提取码: xavd…

ORACLE-递归查询、树操作

1. 数据准备 -- 测试数据准备 DROP TABLE untifa_test;CREATE TABLE untifa_test(child_id NUMBER(10) NOT NULL, --子idtitle VARCHAR2(50), --标题relation_type VARCHAR(10) --关系,parent_id NUMBER(10) --父id );insert into untifa_test (CHILD_ID, TITLE, RELATION_TYP…

SpringBoot整合Gateway 的Demo(附源码)

源码&#xff0c;可直接下载 Gateway模块 Gateway 的父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 很喜欢‘万变不离其宗’这句话&#xff0c;希望在不断的思考和总结中找到Vue中的宗&#xff0c;来解答面试官抛出的…

2023MathorCup(妈妈杯) 数学建模挑战赛 解题思路

云顶数模最新解题思路免费分享~~ 2023妈妈杯数学建模A题B题思路&#xff0c;供大家参考~~ A题 B题

对mysql的联合索引的深刻理解

背景 对mysql的联合索引的考察是Java程序员面试高频考点&#xff01;必须深刻理解掌握否则容易丢分非常可惜。 技术难点 考察对最左侧匹配原理理解。 原理 暂且不表。网上讲这非常多。我理解就是&#xff0c;B树每个非叶子节点的值都是有序存放索引的值。 比如对A、B、C …

物联网和互联网医院小程序:如何实现医疗设备的远程监测和管理?

物联网&#xff08;IoT&#xff09;技术的发展为医疗设备的远程监测和管理提供了巨大的机会。结合互联网医院小程序&#xff0c;我们可以实现对医疗设备的远程访问、监控和管理&#xff0c;从而提高医疗服务的质量和效率。本文将介绍如何实现医疗设备的远程监测和管理&#xff…

appium操控微信小程序的坑

appium操控微信小程序的坑 打不开启动页面driver的context只有NATIVE_APP小程序上元素找不到 我打算使用appium操控微信小程序&#xff0c;只要能够获取到小程序的页面元素就算成功。下面都是我遇到的问题。 打不开启动页面 以下是我的appium的配置参数和代码&#xff1a; de…

Hyperledger Fabric搭建测试网络

本文使用的Fabric版本&#xff1a;V2.5.4 Ubuntu系统&#xff1a;16.04LTS 前序文章已经详细介绍了如何安装部署Hyperledger Fabric系统&#xff0c;这里不再赘述。本篇文章主要介绍如何使用Fabric的测试网络。在正式开始之前&#xff0c;有一点需要说明&#xff1a; Hyperled…

24 行为型模式-访问者模式

1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式。 2 访问者模式原理 3 访问者模式实现 我们以超市购物为例,假设超市中的三类商品: 水果,糖…