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

news2024/11/18 9:23:01
  • 引言

  • ​简介

  • 模型解读

    • 模型架构

    • 训练

  • 实战

    • 环境准备

    • 本地实测

    • 服务部署

  • 总结

引言

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

                                                         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, AutoTokenizer

torch.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.coloradmin.cn/o/1142207.html

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

相关文章

在Golang中理解错误处理

处理Golang中临时错误和最终错误的策略和示例 作为一名精通Golang的开发人员&#xff0c;您了解有效的错误处理是编写健壮可靠软件的关键因素。在复杂系统中&#xff0c;错误可能采取各种形式&#xff0c;包括临时故障和最终失败。在本文中&#xff0c;我们将探讨处理Golang中…

源码解析SpringMVC之RequestMapping注解原理

1、启动初始化 核心&#xff1a;得到应用上下文中存在的全部bean后依次遍历&#xff0c;分析每一个目标handler & 目标方法存在的注解RequestMapping&#xff0c;将其相关属性封装为实例RequestMappingInfo。最终将 uri & handler 之间的映射关系维护在类AbstractHand…

Java入门篇 之 数据类型(简单介绍)

博主回归学习状态的第三篇文章&#xff0c;希望对大家有所帮助 今日份励志文案:你若决定灿烂&#xff0c;山无遮&#xff0c;海无拦 加油&#xff01; Java中一共存在2种数据类型 1 . 基本数据类型,基本数据类型四种和八种之说(具体看下图) 四种说的是&#xff0c;整数型&…

vscode打开settings.json方法

cmd shift p&#xff0c;输入setting Open Workspace Settings 也会打开UI设置界面&#xff1b; Open User Settings (JSON) 会打开用户设置 settings.json 文件&#xff1b; Open Workspace Settings (JSON) 会打开工作区设置 settings.json 文件 vscode存在两种设置 sett…

损失函数和目标函数|知识补充

这张图中&#xff0c;横坐标size表示房屋的大小&#xff0c;纵坐标price表示房屋的价格&#xff0c;现在需要建立模型来表示两者之间的关系。 对于给定的输入x&#xff0c;模型会有一个输出f(x)&#xff0c;用一个函数来度量拟合的程度&#xff0c;也就是真实值和预测值之间的…

前端工程化面试题及答案【集合】

前言&#xff1a; 欢迎浏览和关注本专栏《 前端就业宝典 》&#xff0c; 不管是扭螺丝还是造火箭&#xff0c; 多学点知识总没错。 这个专栏是扭螺丝之上要造火箭级别的知识&#xff0c;会给前端工作学习的小伙伴带来意想不到的帮助。 本专栏将前端知识拆整为零&#xff0c;主要…

工业相机常见的工作模式、触发方式

参考&#xff1a;机器视觉——工业相机的触发应用(1) - 知乎 工业相机常见的工作模式一般分为&#xff1a; 触发模式连续模式同步模式授时同步模式 触发模式&#xff1a;相机收到外部的触发命令后&#xff0c;开始按照约定时长进行曝光&#xff0c;曝光结束后输出一帧图像。…

子集生成算法:给定一个集合,枚举所有可能的子集

给定一个集合&#xff0c;枚举所有可能的子集。 &#xff08;为简单起见&#xff0c;本文讨论的集合中没有重复元素&#xff09; 1、方法一&#xff1a;增量构造法 第一种思路是一次选出一个元素放到集合中&#xff0c;程序如下&#xff1a; void print_subset(int n, int …

C++系列之list的模拟实现

&#x1f497; &#x1f497; 博客:小怡同学 &#x1f497; &#x1f497; 个人简介:编程小萌新 &#x1f497; &#x1f497; 如果博客对大家有用的话&#xff0c;请点赞关注再收藏 &#x1f31e; list的节点类 template struct list_Node { public: list_Node* _prev; list_…

Tomcat服务部署和优化

目录 一、Tomcat&#xff1a; 1、Tomcat作用&#xff1a; 2、Tomcat的核心组件&#xff1a; 3、servlet作用&#xff1a; 4、Tomcat的核心功能&#xff1a; 二、tomcat配置 一、Tomcat&#xff1a; 是一个开源的web应用服务器&#xff0c;nginx主要处理静态页面&#xff…

不再受害:如何预防和应对.mallab勒索病毒攻击

导言&#xff1a; 我们的数据成了我们的珍宝&#xff0c;但也成了黑客们追逐的目标。其中&#xff0c;.mallab勒索病毒就是一个充满阴谋和神秘的数字威胁&#xff0c;它采用高度复杂的方法将您的数据锁在数字牢笼中。本文91数据恢复将深入探讨.mallab勒索病毒的起源、工作方式…

【RabbitMQ 实战】12 镜像队列

一、镜像队列的概念 RabbitMQ的镜像队列是将消息副本存储在一组节点上&#xff0c;以提高可用性和可靠性。镜像队列将队列中的消息复制到一个或多个其他节点上&#xff0c;并使这些节点上的队列保持同步。当一个节点失败时&#xff0c;其他节点上的队列不受影响&#xff0c;因…

视频转换器WinX HD Video Converter mac中文特点介绍

WinX HD Video Converter mac是一款功能强大的视频转换器&#xff0c;它可以将各种不同格式的视频文件转换为其他视频格式&#xff0c;以便用户在各种设备上进行播放。WinX HD Video Converter是一个功能强大、易于使用的视频转换器&#xff0c;适用于各种类型的用户&#xff0…

可图性判断(图论)

如图所示&#xff1a; 1.去arr[i]首元素&#xff0c; 后面arr[i]个元素减一 2.排序&#xff0c;以此类推 3.最后如果出现负数则不可图 4.最后元素为0&#xff0c;则可图 问题 L: Degree Sequence of Graph G代码如下&#xff1a;

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台&#xff0c;找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK&#xff1a;SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字节…

基于nodejs+vue全国公考岗位及报考人数分析

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

iOS的应用生命周期

在iOS的原生开发中&#xff0c;我们需要特别关注两个东西&#xff1a;AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示&#xff1a; AppDelegate是应用程序委托对象&#xff0c;它继承了UIResponder类…

抖音上怎么挂小程序?制作小程序挂载抖音视频

公司企业商家现在已经把抖音作为营销的渠道之一&#xff0c;目前抖音支持短视频挂载小程序&#xff0c;可方便做营销。以下给大家分享这一操作流程。 一、申请自主挂载能力 首先需要在抖音开放平台官网注册一个抖音小程序账号&#xff0c;然后申请短视频自主挂载能力。 二、搭…

Kubernetes技术与架构-存储 2

在Kubernetes集群中&#xff0c;一块持久化存储空间是可以被回收再利用&#xff0c;简称PV&#xff0c;即PersistentVolume&#xff0c;Pod实例需要使用PV的时候&#xff0c;可以使用PVC定义申请PV存储资源&#xff0c;PVC是PersistentVolumeClaim的简称&#xff0c;PV的申请分…

Git(SourceTree)变基操作使用

文章目录 一、变基的使用场景二、Source Tree上的变基操作1. 准备两个分支dev1和master2. 切换到dev1中&#xff0c;并选中master中提交的代码3. 鼠标右键&#xff0c;选择变基&#xff0c;弹出对话框选择确定。 变基就是rebase操作 一、变基的使用场景 假设分支a和分支b 在分…