目录
引言
在当今人工智能领域,多模态大模型的发展正以惊人的速度改变着我们与技术交互的方式。阿里发布的 mPLUG-Owl3 通用多模态大模型,以其在多图、长视频理解等方面的卓越表现,成为了行业内的焦点。本文将深入探讨 mPLUG-Owl3 的技术特点、实现原理以及广泛的应用场景,带您领略这一强大模型的魅力。
一、mPLUG-Owl3 模型特点
1、高推理效率
mPLUG-Owl3 以 llava-next-interleave 为基准,将模型的 first token latency 缩小了 6 倍。这意味着在实际应用中,用户能够更快地获得模型的响应,极大地提升了交互体验。同时,单张 A100 能建模的图像数目提升了 8 倍,达到了 400 张图片。对于长视频的处理,实测 4 秒就能看完一部 2 小时的电影。这种高效的推理能力,使得 mPLUG-Owl3 在处理大规模多模态数据时具有明显的优势。
2、不牺牲准确性
在追求高推理效率的同时,mPLUG-Owl3 并没有牺牲模型的准确性。它在多模态大模型所涉及的各种场景,包括单图、多图、视频领域的诸多 benchmarks 上达到了 SOTA(State Of The Art,即当前最佳水平)。这意味着无论是对图像的识别、分类,还是对视频内容的理解和分析,mPLUG-Owl3 都能够提供准确可靠的结果。
二、技术实现
mPLUG-Owl3 与传统模型的不同之处在于,它不需要提前将视觉序列拼接到语言模型的文本序列中,从而规避了长视觉序列带来的巨额计算开销和显存占用。为了实现视觉信息融入语言模型,团队提出了一种轻量化的 hyperattention 模块。
1、hyperattention 模块的工作原理
通过在整个语言模型中稀疏地扩展 4 个 transformer block,就能用较小的代价将 LLM(Language Model)升级成多模态 LLM。视觉特征在从视觉编码器抽取出来后,会通过一个简单的线性映射把维度对齐到语言模型的维度。随后,视觉特征只会在这 4 层 transformer block 与文本交互,保留了细粒度的信息。
这种设计的优势在于,它既能够有效地融合视觉信息和语言信息,又能够避免传统方法中因拼接视觉序列而带来的计算负担。同时,通过稀疏扩展 transformer block,模型可以更加高效地处理多模态数据,提高推理速度。
2、共享语言模型的 layer norm
在 hyperattention 模块中,选择共享语言模型的 layer norm 对于稳定学习新引入的 cross-attention 至关重要。Layer norm 可以对输入数据进行归一化处理,使得模型在训练过程中更加稳定,避免了梯度消失或爆炸等问题。通过共享 layer norm,模型可以更好地融合视觉和语言信息,提高模型的性能。
3、并行 cross-attention 和 self-attention
hyperattention 采取了一种并行 cross-attention 和 self-attention 的策略。使用共享的 query 去与视觉特征交互,通过一个 adaptive gate 融合两者的特征,使得 query 可以根据自身语义针对性地选择与之相关的视觉特征。这种设计可以提高模型对多模态数据的理解能力,同时也能够提高模型的效率。
4、多模态交错的旋转位置编码 mi-rope
为了建模图像在原始上下文中与文本的相对位置关系,mPLUG-Owl3 引入了多模态交错的旋转位置编码 mi-rope。这种编码方式可以为视觉的 key 建模位置信息,并在 cross-attention 引入 attention mask,让原始上下文中在图片之前的文本不能看到后面的图片对应的特征。这些设计点为 mPLUG-Owl3 带来了进一步的效率提升,保障了它仍然能具备一流的多模态能力。
三、功能应用
1、多模态检索增强
对于模型没有学过的知识,mPLUG-Owl3 能通过检索系统进行补充。并且,它不仅能基于检索知识正确回复,还能给出它基于哪一条知识做出的判断,以及详细的判断依据。这对于下游研发人员开发和调试非常友好。
例如,在给定四张狗的照片和一个关于图片 5 中狗的分类问题时,mPLUG-Owl3 能根据已有的图片信息和知识进行准确分类并给出理由。这种多模态检索增强的功能,使得模型能够更好地处理复杂的多模态问题,提高了模型的实用性。
2、多图推理
mPLUG-Owl3 能够正确理解不同材料(多图)中的内容关系,并进行推理。比如,它能通过两张图像所见,激活语言模型的常识知识,并围绕两张图片进行推理,判断左边的动物能否在右边的环境中存活,并给出解释。还能察觉两张图片风格上的差异性,并且意识到两张图中的人物虽然风格不同,但其实是同一个角色。
这种多图推理的能力,使得 mPLUG-Owl3 在图像识别、分类、场景理解等方面具有广泛的应用前景。例如,在图像搜索、智能安防、医疗影像分析等领域,mPLUG-Owl3 可以通过对多张图片的分析和推理,提供更加准确和全面的结果。
3、长视频理解
mPLUG-Owl3 可以观看超长视频,并且能在 4 秒内开始回答用户关于视频的问题。无论是对开头、中间还是结尾的细致片段提问,都能对答如流。这种长视频理解的能力,使得 mPLUG-Owl3 在视频内容分析、智能推荐、视频监控等领域具有巨大的应用潜力。
例如,在视频内容分析中,mPLUG-Owl3 可以通过对视频的理解和分析,提取关键信息,进行视频分类、标签生成等任务。在智能推荐中,它可以根据用户的观看历史和兴趣爱好,推荐相关的视频内容。在视频监控中,mPLUG-Owl3 可以实时分析视频画面,检测异常行为,提高监控效率和安全性。
四、基准测试
1、视觉问答基准测试
在视觉问答基准测试中,选择了多个广泛使用的数据集,包括 VQAv2、OK - VQA、GQA 和 VizWizQA 等。这些数据集涵盖了不同类型的问题和图像场景,能够全面地评估模型的视觉问答能力。
mPLUG - Owl3 在这些数据集上表现出色,优于其他 8B 参数级别的语言模型。在 VQAv2、OK - VQA 和 GQA 等数据集上,mPLUG - Owl3 的准确率明显高于其他模型。在 VizWizQA 数据集上,mPLUG - Owl3 也取得了较好的成绩。虽然在 TextVQA 上略低于 Idefics2,但仍超过其他 8B 模型。
2、通用 MLLM 基准测试
在通用 MLLM 基准测试中,使用了 MMBench - EN、MMBench - CN、MM - Vet 和 POPE 等数据集。这些数据集涵盖了多种任务和场景,包括图像描述、图像分类、视觉推理等,能够全面地评估模型的通用多模态大语言模型能力。
mPLUG - Owl3 在这些数据集上达到了先进水平。在 MMBench - EN 和 MMBench - CN 数据集上,mPLUG - Owl3 的表现尤为突出,在多个任务上的准确率都高于其他模型。在 MM - Vet 和 POPE 数据集上,mPLUG - Owl3 也取得了较好的成绩。然而,在 AI2D 数据集上,mPLUG - Owl3 未达到先进水平,这可能是由于该数据集的特殊性和复杂性。
3、视频处理能力测试
在视频基准测试中,mPLUG - Owl3 展示了出色的处理能力。它能够有效地处理不同时长的视频,准确地回答与视频内容相关的问题。在处理长视频时,mPLUG - Owl3 能够保持较高的准确率,并且能够捕捉视频中的时间序列信息,进行有效的推理和回答。
4、多图像理解能力测试
在多图像理解基准测试中,mPLUG - Owl3 在 NLVR2 和 Mantis - Eval 数据集上超越了现有模型。它能够准确地理解不同图像之间的关系,进行跨图像推理,并且能够回答与多图像场景相关的问题。然而,在 BLINK 数据集上,mPLUG - Owl3 的表现较弱,这可能是由于该数据集的难度较大或者模型在处理某些特定类型的多图像场景时存在不足。
五、本地部署
以下是基于魔搭社区提供的 mPLUG-Owl3-7b-240728 模型进行本地部署测试的步骤:
1、下载代码
下载GitHub中mPLUG-Owl代码
git clone https://github.com/X-PLUG/mPLUG-Owl.git
2、安装依赖
使用以下命令安装相关依赖:
cd mPLUG-Owl/mPLUG-Owl3
pip install -r requirements.txt
安装modelscope用于下载模型文件
pip install modelscope
3、下载模型
使用 modelscope 中的 snapshot_download 函数下载模型。第一个参数为模型名称,参数 cache_dir 用于指定模型的下载路径。
#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('iic/mplug-owl3-7b-240728', cache_dir='/root/autodl-tmp', revision='master')
执行代码下载完成后模型文件会存放到 /root/autodl-tmp 路径下.
4、加载模型
使用以下代码加载 mPLUG-Owl3-7b-240728 模型,目前仅支持 attn_implementation 中的 .[‘sdpa’, ‘flash_attention_2’]
import torch
model_path = '/root/autodl-tmp/mPLUG/mPLUG-Owl3-7B-240728'
config = mPLUGOwl3Config.from_pretrained(model_path)
print(config)
# model = mPLUGOwl3Model(config).cuda().half()
model = mPLUGOwl3Model.from_pretrained(model_path, attn_implementation='sdpa', torch_dtype=torch.half)
model.eval().cuda()
5、图片对话
输入图片,与模型进行聊天对话
from PIL import Image
from transformers import AutoTokenizer, AutoProcessor
from decord import VideoReader, cpu # pip install decord
model_path = '/root/autodl-tmp/mPLUG/mPLUG-Owl3-7B-240728'
tokenizer = AutoTokenizer.from_pretrained(model_path)
processor = model.init_processor(tokenizer)
image = Image.new('RGB', (500, 500), color='red')
messages = [
{"role": "user", "content": """<|image|>
Describe this image."""},
{"role": "assistant", "content": ""}
]
inputs = processor(messages, images=image, videos=None)
inputs.to('cuda')
inputs.update({
'tokenizer': tokenizer,
'max_new_tokens':100,
'decode_text':True,
})
g = model.generate(**inputs)
print(g)
6、视频对话
输入视频,与模型进行聊天对话
from PIL import Image
from transformers import AutoTokenizer, AutoProcessor
from decord import VideoReader, cpu # pip install decord
model_path = '/root/autodl-tmp/mPLUG/mPLUG-Owl3-7B-240728'
tokenizer = AutoTokenizer.from_pretrained(model_path)
processor = model.init_processor(tokenizer)
messages = [
{"role": "user", "content": """<|video|>
Describe this video."""},
{"role": "assistant", "content": ""}
]
videos = ['/nas-mmu-data/examples/car_room.mp4']
MAX_NUM_FRAMES=16
def encode_video(video_path):
def uniform_sample(l, n):
gap = len(l) / n
idxs = [int(i * gap + gap / 2) for i in range(n)]
return [l[i] for i in idxs]
vr = VideoReader(video_path, ctx=cpu(0))
sample_fps = round(vr.get_avg_fps() / 1) # FPS
frame_idx = [i for i in range(0, len(vr), sample_fps)]
if len(frame_idx) > MAX_NUM_FRAMES:
frame_idx = uniform_sample(frame_idx, MAX_NUM_FRAMES)
frames = vr.get_batch(frame_idx).asnumpy()
frames = [Image.fromarray(v.astype('uint8')) for v in frames]
print('num frames:', len(frames))
return frames
video_frames = [encode_video(_) for _ in videos]
inputs = processor(messages, images=None, videos=video_frames)
inputs.to('cuda')
inputs.update({
'tokenizer': tokenizer,
'max_new_tokens':100,
'decode_text':True,
})
g = model.generate(**inputs)
print(g)
请注意,在实际部署和测试中,你需要确保图片路径的正确性,并根据具体的应用场景和需求对输入数据和输出结果进行适当的处理。此外,还可以参考官方关于该模型的详细文档和示例,以获取更准确的使用方法和最佳实践。
结语
阿里的 mPLUG-Owl3 通用多模态大模型以其高推理效率、不牺牲准确性的特点,以及创新的技术实现和广泛的应用场景,在人工智能领域树立了新的标杆。通过轻量化的 hyperattention 模块,mPLUG-Owl3 成功地实现了视觉信息与语言信息的高效融合,为多模态数据的处理提供了一种全新的解决方案。
在未来,随着多模态数据的不断增长和应用需求的不断提高,mPLUG-Owl3 有望在更多领域发挥重要作用,为人们的生活和工作带来更多的便利和创新。无论是在图像识别、视频理解、智能推荐还是其他多模态应用场景中,mPLUG-Owl3 都将展现出强大的实力和潜力。
相关资料
github仓库:https://github.com/X-PLUG/mPLUG-Owl/
Huggingface:Huggingface模型
Modelscope:Modelscope模型
arxiv论文:https://arxiv.org/pdf/2408.04840
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑
😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!