2020 年 12 月发布的 CPM-1 是国内首个中文大模型 ;2022 年 9 月发布的 CPM-Ant 仅微调 0.06% 参数就能超越全参数微调效果;2023 年 5 月发布的 WebCPM 是 中文首个基于搜索的问答开源模型。CPM-Bee 百亿大模型是团队最新发布的基座模型,中文能力登顶权威榜单 ZeroCLUE,英文能力打平 LLaMA。VisCPM是清华系面壁智能开源的多语言多模态大模型。它基于百亿参数基座模型 CPM-Bee 训练(CPM-Bee官方教程),融合视觉编码器(Q-Former 和视觉解码器(Diffusion-UNet)以支持视觉信号的输入和输出。得益于 CPM-Bee 底座优秀的双语能力,VisCPM 可以仅通过英文多模态数据预训练,泛化实现优秀的中文多模态能力。
开源使用:VisCPM 可以自由被用于个人和研究用途。
涵盖图文双向生成:VisCPM 模型系列较为全面地支持了图文多模态能力,涵盖多模态对话(图到文生成)能力和文到图生成能力。
中英双语性能优异:得益于语言模型基座 CPM-Bee 优秀的双语能力,VisCPM 在中英双语的多模态对话和文到图生成均取得亮眼的效果。
VisCPM-Chat在线体验地址:https://huggingface.co/spaces/openbmb/viscpm-chat
VisCPM-Paint在线体验地址:https://huggingface.co/spaces/openbmb/viscpm-paint
VisCPM-Chat:支持图像双语多模态对话
VisCPM-Chat 支持面向图像进行中英双语多模态对话。该模型使用Q-Former作为视觉编码器,使用CPM-Bee(10B)作为语言交互基底模型,并通过语言建模训练目标融合视觉和语言模型。模型训练包括预训练和指令精调两阶段:
预训练:使用约100M高质量英文图文对数据对VisCPM-Chat进行了预训练,数据包括CC3M、CC12M、COCO、Visual Genome、Laion等。在预训练阶段,语言模型参数保持固定,仅更新Q-Former部分参数,以支持大规模视觉-语言表示的高效对齐。
指令精调:采用LLaVA-150K英文指令精调数据,并混合相应翻译后的中文数据对模型进行指令精调,以对齐模型多模态基础能力和用户使用意图。在指令精调阶段,更新全部模型参数,以提升指令精调数据的利用效率。有趣的是,发现即使仅采用英文指令数据进行指令精调,模型也可以理解中文问题,但仅能用英文回答。这表明模型的多语言多模态能力已经得到良好的泛化。在指令精调阶段进一步加入少量中文翻译数据,可以将模型回复语言和用户问题语言对齐。
在LLaVA标准英文测试集和翻译的中文测试集对模型进行了评测,该评测基准考察模型在开放域对话、图像细节描述、复杂推理方面的表现,并使用GPT-4进行打分。可以观察到,VisCPM-Chat在中文多模态能力方面取得了最佳的平均性能,在通用域对话和复杂推理表现出色,同时也表现出了不错的英文多模态能力。
提供了两个模型版本,分别为 VisCPM-Chat-balance 和 VisCPM-Chat-zhplus,前者在英文和中文两种语言上的能力较为平衡,后者在中文能力上更加突出。两个模型在指令精调阶段使用的数据相同,VisCPM-Chat-zhplus 在预训练阶段额外加入了 20M 清洗后的原生中文图文对数据和 120M 翻译到中文的图文对数据。
下面是VisCPM-Chat 的多模态对话效果展示:
VisCPM-Paint :支持双语文到图生成
VisCPM-Paint 支持中英双语的文到图生成。该模型使用 CPM-Bee(10B)作为文本编码器,使用 UNet 作为图像解码器,并通过扩散模型训练目标融合语言和视觉模型。在训练过程中,语言模型参数始终保持固定。使用 Stable Diffusion 2.1 的 UNet 参数初始化视觉解码器,并通过逐步解冻其中关键的桥接参数将其与语言模型融合。该模型在 LAION 2B 英文图文对数据上进行了训练。
与 VisCPM-Chat 一样,得益于 CPM-Bee 的双语能力,VisCPM-Paint 可以仅通过英文图文对训练,泛化实现良好的中文文到图生成能力,达到中文开源模型的最佳效果。通过进一步加入 20M 清洗后的原生中文图文对数据,以及 120M 翻译到中文的图文对数据,模型的中文文到图生成能力可以获得进一步提升。
同样,VisCPM-Paint 有 balance和 zhplus 两个不同的版本。在标准图像生成测试集 MSCOCO 上采样了 3万张图片,计算了常用评估图像生成指标 FID (Fréchet Inception Distance) 评估生成图片的质量。
下面是 VisCPM-Paint 的图片生成效果展示:
VisCPM多模态大模型安装&使用
安装
克隆仓库并进入源码目录
git clone https://github.com/OpenBMB/VisCPM.git
cd VisCPM
创建conda环境
conda create -n viscpm python=3.10 -y
conda activate viscpm
安装依赖
pip install torch>=1.10
pip install -r requirements.txt
VisCPM目前需要单卡20GB以上的GPU运行,后续会支持更加节省显存的推理方式。
在下载模型权重后,可以使用如下代码运行VisCPM-Chat('/path/to/checkpoint'
改为模型存放路径)
单轮对话
VisCPM-Chat可以通过几行代码实现多模态对话,在代码中默认开启了对输入图片的安全检查。
# 如果您单卡显存不足40g,可以引入如下环境变量并将安全模块开关关闭。引入后显存占用约为5G,但推理所需时间会变长。此选项依赖bminf,需要安装bminf依赖库。
export CUDA_MEMERY_CPMBEE_MAX=1g
from VisCPM import VisCPMChat
from PIL import Image
model_path = '/path/to/checkpoint'
viscpm_chat = VisCPMChat(model_path, image_safety_checker=True)
# 默认开启对输入图片的安全检查
image_path = 'figures/vlu_case1.png'
image = Image.open(image_path).convert("RGB")
question = '如果用一句中国唐代的著名诗人"李白"的古诗来描述这幅图像,你能想到什么?'
answer, _, _ = viscpm_chat.chat(image, question)
print(answer)
可得到结果如下:
“黄河之水天上来,奔流到海不复回。” 李白的这句诗可以用来形容这幅图片中汹涌澎湃、波涛汹涌的景象:一条湍急的河流从山上奔腾而下,形成了一幅令人叹为观止的画面,展示出大自然的力量和雄伟壮丽。
多轮对话
from VisCPM import VisCPMChat
from PIL import Image
model_path = '/path/to/checkpoint'
viscpm_chat = VisCPMChat(model_path, image_safety_checker=True)
# 默认开启对输入图片的安全检查
image_path = 'figures/vlu_case2.jpeg'
image = Image.open(image_path).convert("RGB")
question = '这幅图像是在哪个节日拍摄的?'
answer, context, vision_hidden_states = viscpm_chat.chat(image, question)
# 多轮对话传入历史 context
question = '你能用什么古诗描述这幅画?'
answer, context, _ = viscpm_chat.chat(image, question, context, vision_hidden_states=vision_hidden_states)
print(context)
得到的结果如下:
User: 这幅图像是在哪个节日拍摄的?
AI: 这幅图像是在中秋节拍摄的, 也就是中国传统节日中的月圆之夜。
User: 你能用什么古诗描述这幅画?
AI: “明月几时有,把酒问青天。” 这是苏轼的《水调歌头》中的一句诗,用来形容这幅图片再贴切不过了:在中秋之夜,月亮高高地挂在天空中,一座古老的建筑沐浴着月光,营造出一种宁静祥和的气氛。
在下载模型权重后,可以使用如下代码运行VisCPM-Paint('/path/to/checkpoint'
改为模型存放路径)。
# 如果您单卡显存不足40g,可以引入如下环境变量并将安全模块开关关闭。引入后显存占用约为17G,但推理所需时间会变长。此选项依赖bminf,需要安装bminf依赖库。
export CUDA_MEMERY_CPMBEE_MAX=1g
from VisCPM import VisCPMPaint
painter = VisCPMPaint('/path/to/checkpoint', image_safety_checker=True, prompt_safety_checker=True, add_ranker=True)
# 默认对输入的文本和输出的图片进行安全检查,默认开启重排序
image = painter.generate('人闲桂花落,月静春山空') # 对应上图第一行第二张图片
image.save('/data/test.png')
参考文献:
[1] https://github.com/OpenBMB/VisCPM