- 统一多模态 ========
在上一篇内容中,我们以 OpenAI 为例,进行了常见的多模态场景的实战,主要涉及了 DALL-E、TTS 和 GPT-4o 这几个大模型。 不知道大家有没有发现一个问题:通过这种方式实现的多模态,没有办法在同一个模型中同时完成多模态的输入输出,而是需要为每一种模态单独部署一个模型,这实际上会造成大量的资源浪费!例如,用户使用文生图功能时,只需要调用 DALL-E 模型,而此时 TTS 模型就是闲置状态,算力利用率非常低。
那有没有什么解决方案呢?这就是统一多模态大模型要解决的问题。
统一多模态大模型是近年来人工智能领域的重要发展方向,旨在通过一个统一的架构处理和融合多种模态的数据(如文本、图像、视频、音频等),实现跨模态的理解、推理与生成能力。这类模型的核心目标是打破传统单模态模型的局限性,通过多模态联合学习提升模型的通用性和智能化水平。
传统多模态模型通常依赖多个独立模块分别处理不同模态的数据(如单独处理文本和图像的编码器),而统一多模态大模型采用 单一模型架构 ,通过共享的神经网络参数和跨模态注意力机制,直接实现多模态数据的联合编码与解码。例如,输入可以是“文本+图像”,输出可以是“文本+视频”的组合。
Google 是最早开始研究统一多模态的团队之一,它早在2023年12月发布的 Gemini 1.0,就是一款 原生多模态(natively multimodal)大模型, 从训练初期即支持文本、图像、视频、音频、代码等多种模态的联合理解与生成,无需依赖单模态模型的拼接。它最新发布的 Gemini 2.0 的多模态能力非常强大,大家感兴趣可以去官网了解下。
而在国内,DeepSeek 开源的 Janus 模型,也是通用多模态模型的佼佼者。下面我们就来介绍一下 Jenus。
- Janus-Pro 简介 ===============
Janus-Pro 是由 DeepSeek 团队开发的一款统一多模态大模型,于 2025.01.27 发布,它在上一个版本的基础上进行了全方位的增强,显著提高了多模态理解和视觉生成能力。
在 Janus 的 Github 主页上,可以看到官方发布的评测结果:
- 图片识别方面超越TokenFlow和开源的Llava架构等;
- 在图片生成方面,根据权威榜单GenEval和DPG-Bench的评测结果, 超越了DALL-E 3和Stable Difusion 3 Medium。
可以说,Janus-Pro 是目前国内最成熟的统一多模态大模型。
而且,Janus-Pro 发布了 1B 和 7B 两个版本,其中 1B 的版本因为模型规模较小、推理成本低,非常适合用于端侧部署的小模型,这对于智能设备开发多模态的功能来说,是一个非常大的福音。
- Janus-Pro 图像识别 =================
下面,我们就使用 Janus-Pro 进行一下图像识别功能的实战。为了便于演示,我使用 1B 这个版本,理论上 7B 的效果会比 1B 强一些。
由于 DeepSeek 官方并没有提供 Janus 的在线 API,所以我们需要将模型下载到本地,通过私有部署的方式进行调用 。话不多说,直接开始。
资源准备
首先需要把资源准备好,主要就是 GPU。这里我列了一个表格,给出了不同模型对于不同功能下的资源预估,大家可以作为参考。
我们使用的是 1B 的模型,应该不需要太多资源,所以我在 AutoDL 上直接租一块 32G 显存的 GPU 应该就足够了。下面是具体的环境配置:
模型代码下载
首先,从 Github 上将 Janus 的代码 clone 下来。
git clone https://github.com/deepseek-ai/Janus.git
接下来,安装依赖
pip install -e .
执行到这里,模型的代码及相关依赖就 ready 了。之后,我们需要下载模型的权重文件。
因为 Janus 是国产的 DeepSeek 出品的模型,所以我们从 ModelScope平台上下载是最方便的。
权重文件下载
想要从 ModelScope 上面下载模型,可以直接安装 ModelScope 的依赖库:
pip install modelscope
我们在 ModelScope 上面搜索,就可以找到 Janus-Pro-1B 这个模型。
复制模型名称,直接下载到本地即可。因为权重文件比较大,所以这个过程可能比较耗时,请大家耐心等待。
modelscope download --model deepseek-ai/Janus-Pro-1B --local\_dir ./Janus-Pro-1B
图像识别实战
至此,模型的代码和权重文件都有了,万事俱备,我们可以开始调用模型了。我准备了这样一张梗图,看看 Janus 是否能捕捉到其中的内涵。
参考代码如下:
# 导入依赖
import torch
from transformers import AutoModelForCausalLM
from janus.models import MultiModalityCausalLM, VLChatProcessor
from janus.utils.io import load_pil_images
# 指定模型路径
model_path = "./Janus-Pro-1B"
# 加载VLChatProcessor
vl_chat_processor: VLChatProcessor = VLChatProcessor.from_pretrained(model_path)
# 加载分词器
tokenizer = vl_chat_processor.tokenizer
# 加载vl_gpt
vl_gpt: MultiModalityCausalLM = AutoModelForCausalLM.from_pretrained(
model_path, trust_remote_code=True
)
vl_gpt = vl_gpt.to(torch.bfloat16).cuda().eval()
# 读取图片,构造Prompt
image = "./梗图.png"
question = "帮我解释下这张图的内涵,使用中文回答"
conversation = [
{
"role": "<|User|>",
"content": f"<image_placeholder>\n{question}",
"images": [image],
},
{"role": "<|Assistant|>", "content": ""},
]
pil_images = load_pil_images(conversation)
prepare_inputs = vl_chat_processor(
conversations=conversation, images=pil_images, force_batchify=True
).to(vl_gpt.device)
# 生成输入内容的Embedding,使得模型能够理解
inputs_embeds = vl_gpt.prepare_inputs_embeds(**prepare_inputs)
# 调用模型,生成响应
outputs = vl_gpt.language_model.generate(
inputs_embeds=inputs_embeds,
attention_mask=prepare_inputs.attention_mask,
pad_token_id=tokenizer.eos_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
max_new_tokens=512,
do_sample=False,
use_cache=True,
)
# 对响应内容进行解码
answer = tokenizer.decode(outputs[0].cpu().tolist(), skip_special_tokens=True)
# 打印最终结果
print(f"{prepare_inputs['sft_format'][0]}", answer)
Janus 最终生成了如下回答:
这张图片通过对比展示了大脑在学习前后的变化。
上半部分显示了一个正常的大脑,
下半部分则幽默地展示了一个平滑、类似果冻的物体,
暗示大脑在毕业后变得“平滑”或“没有皱纹”。
图片上的文字意思是:“研究指出:每当你学会某些事情时,大脑的褶皱就会增加;
我从学校毕业之后:”,这表明作者自嘲地说自己在毕业后停止了学习,
导致大脑失去了复杂性。
整个图片以幽默的方式表达了对于停止学习的调侃。
可以看出,即使是 Janus-Pro-1B 这么小的模型,也仍然具备了非常强的图像理解能力。
本篇文章中,我们详细介绍了统一多模态的概念及优势,并且以 Janus-Pro 为例,演示了如何进行模型的本地部署与图像识别,可以看出,效果还是非常不错的。
多模态是目前大模型领域非常热门的一个方向,并且还在快速发展中,经常会有新的技术突破出现。其中,统一多模态是一条比较重要的技术路线,它力求通过一种通用的模型架构,来实现多种不同模态输入输出之间的互相转换,通过整合多种感知与生成能力,推动AI向更接近人类认知的多模态智能迈进。目前 Google 的 Gemini 和 DeepSeek 的 Janus 都在主推这种架构,我们可以持续关注相关的进展。