赞
踩
多模态模型CogVLM-17B(开源):
Github:https://github.com/THUDM/CogVLM
Huggingface:https://huggingface.co/THUDM/CogVLM
魔搭社区:https://www.modelscope.cn/models/ZhipuAI/CogVLM
Paper:https://github.com/THUDM/CogVLM/blob/main/assets/cogvlm-paper.pdf
开源的对应模型:
模型名称 | 输入分辨率 | 介绍 | Huggingface model | SAT model |
---|---|---|---|---|
cogvlm-chat-v1.1 | 490 | 支持同时进行多轮聊天和视觉问答,支持自由的提示词。 | link | link |
cogvlm-base-224 | 224 | 文本-图像预训练后的原始检查点。 | link | link |
cogvlm-base-490 | 490 | 通过从 cogvlm-base-224 进行位置编码插值,将分辨率提升到490。 | link | link |
cogvlm-grounding-generalist | 490 | 此检查点支持不同的视觉定位任务,例如REC,定位字幕等。 | link | link |
CogVLM 可以在不牺牲任何 NLP 任务性能的情况下,实现视觉语言特征的深度融合。训练的 CogVLM-17B 是目前多模态权威学术榜单上综合成绩第一的模型,在14个数据集上取得了state-of-the-art或者第二名的成绩。这些基准大致分为三类(共 14 个),包括图像字幕(Image Captioning)、视觉问答(Visual QA)、视觉定位(Visual Grounding)。
CogVLM-SFT-311K:CogVLM SFT 中的双语视觉指令数据集
链接: CogVLM-SFT-311K
CogVLM-SFT-311K 是在训练 CogVLM v1.0 最初版本时使用的主要对齐语料库。此数据集的构建过程如下:
数据集共有三个文件夹,分别对应混合 minigpt4-3500 与llava混合的一部分数据集,llava 单论对话和多轮对话数据集。其布局如下:
.CogVLM-SFT-311K
├── llava_details-minigpt4_3500_formate
├── llava_instruction_multi_conversations_formate
└── llava_instruction_single_conversation_formate
在开源的数据中,数据集按照以下格式分布
.llava_details-minigpt4_3500_formate
├── images
│ └── 00000001.jpg
└── labels
└── 00000001.json
其中,images存储图像数据,而labels存储这张图像对应的描述或对话。
图像描述 Caption 格式:
{
"captions": [
{
"role": "caption",
"content": "这张照片展示了一男一女,他们都穿着红嘿色衣服,坐在桌子旁,在参加活动时面带微笑。这对情侣正在一起摆姿势,背景中还有其他人。在整个场景中可以看到另外几个人,一些人坐在附近的桌子旁,另一些人坐得离这对夫妇更近。各种餐桌设置,如酒杯和杯子,被放置在桌子上。排在最前面的男子打着领带。"
}
]
}
图像对话 Json 格式:
{
"conversations": [
{
"role": "user",
"content": "在尝试保持这个浴室有序时可能会遇到哪些挑战?",
},
{
"role": "assistant",
"content": "在尝试保持这空间和各种物品的存在,例如杯子和手机占用了可用的空间。在图像中,浴室柜台上只有一个水槽可用,这导致多个用户可能必须共享空间放置自己的物品。这可能导致杂乱和混乱外的储物解决方案,如架子、橱柜或墙壁挂架,以保持浴室有序并最小化柜台上的杂乱。"
},
]
}
这些任务主要是基于图像理解和语言生成的任务:
这些任务在图像-语言建模的下游应用中扮演重要角色,需要模型理解深层的视觉语义信息。其中,视觉定位任务比较独特,需要确保文本描述与图像区域之间的对齐匹配。
思想:视觉优先
之前的多模态模型:通常都是将图像特征直接对齐到文本特征的输入空间去,并且图像特征的编码器通常规模较小,这种情况下图像可以看成是文本的“附庸”,效果自然有限。
Cogvlm模型共包含四个基本组件:ViT 编码器,MLP 适配器,预训练大语言模型(GPT-style)和视觉专家模块。
class CogVLMModel(LLaMAModel): def __init__(self, args, transformer=None, parallel_output=True, **kwargs): super().__init__(args, transformer=transformer, parallel_output=parallel_output, **kwargs) self.image_length = args.image_length self.add_mixin("eva", ImageMixin(args)) self.del_mixin("mlp") self.add_mixin("mlp", LlamaVisionExpertFCMixin(args.hidden_size, args.inner_hidden_size, args.num_layers, 32)) self.del_mixin("rotary") self.add_mixin("rotary", LlamaVisionExpertAttnMixin(args.hidden_size, args.num_attention_heads, args.num_layers, 32)) @classmethod def add_model_specific_args(cls, parser): group = parser.add_argument_group('CogVLM', 'CogVLM Configurations') group.add_argument('--image_length', type=int, default=256) group.add_argument('--eva_args', type=json.loads, default={}) return super().add_model_specific_args(parser) def forward(self, input_ids, vision_expert_mask, image_embed_mask, **kwargs): if input_ids.shape[1] > 1: return super().forward(input_ids=input_ids, vision_expert_mask=vision_expert_mask, image_embed_mask=image_embed_mask, **kwargs) return super().forward(input_ids=input_ids, **kwargs) class FineTuneTrainCogVLMModel(CogVLMModel): def __init__(self, args, transformer=None, parallel_output=True, **kw_args): super().__init__(args, transformer=transformer, parallel_output=parallel_output, **kw_args) self.args = args # If you want to use model parallel with a mp_size=1 checkpoint, and meanwhile you also want to use lora, # you have to add_mixin after loading model checkpoint. @classmethod def add_model_specific_args(cls, parser): group = parser.add_argument_group('CogVLM-finetune', 'CogVLM finetune Configurations') group.add_argument('--pre_seq_len', type=int, default=8) group.add_argument('--lora_rank', type=int, default=10) group.add_argument('--use_ptuning', action="store_true") group.add_argument('--use_lora', action="store_true") group.add_argument('--use_qlora', action="store_true") group.add_argument('--layer_range', nargs='+', type=int, default=None) return super().add_model_specific_args(parser)
训练数据:图像文本对
spaCy
提取名词,使用GLIPv2预测边界框。这些图像文本对是从LAION-400M的子集LAION-115M中抽取的,LAION-115M是由Li等人进行了筛选的。筛选后,保留了4000万张图像的子集,以确保超过75%的图像至少包含两个边界框。预训练超参数:
在预训练的第一阶段中,模型训练的是图像描述损失函数(image captioning loss),即对文本部分进行下一个标记的预测。预训练的第一阶段使用了上述提及的15亿个图像文本对,共进行了12万次迭代,批量大小为8192。
预训练的第二阶段涉及图像描述(image captioning)和指代表达理解(REC)任务。REC任务是根据物体的文本描述来预测图像中的边界框位置。这个任务以VQA的形式进行训练,即"问题:物体在哪里?“和"答案:[[x0,y0,x1,y1]]”。其中,x和y坐标的取值范围从000到999,表示在图像中的归一化位置。在答案的部分,只考虑了下一个标记的预测损失。
预训练的第二阶段同时涵盖了图像描述和REC任务,进行了6万次迭代,批量大小为1024。在最后的3万次迭代中,将输入分辨率从224×224改变为490×490(分辨率提升,增加图片的大小和细节,提供模型对细节的捕捉能力、增强模型的泛化能力,适应各种尺寸的输入图像等)。整个预训练过程中可训练参数总数为65亿,预训练过程消耗了约4096个A100×天。
数据:可以参考1.2的 CogVLM-SFT-311K数据介绍。
在SFT期间:除VIT(Vision Transformer)编码器外,所有的参数都是可以训练的。
sft训练的超参数设置:
在每一层中,视觉专家模块由两部分组成:一个QKV矩阵和一个MLP。这里的QKV代表“查询-键-数值”,是用于注意力计算的重要矩阵。其工作模式:
batch_size
sequence_len
from torchvision import transforms from torchvision.transforms.functional import InterpolationMode import torch class BlipImageEvalProcessor: def __init__(self, image_size=384, mean=None, std=None): super().__init__() if mean is None: mean = (0.48145466, 0.4578275, 0.40821073) if std is None: std = (0.26862954, 0.26130258, 0.27577711) self.normalize = transforms.Normalize(mean, std) self.transform = transforms.Compose( [ transforms.Resize( # 将图片大小调整,使用双三次插值 (image_size, image_size), interpolation=InterpolationMode.BICUBIC ), transforms.ToTensor(), self.normalize, ] ) def __call__(self, item): return self.transform(item) from functools import partial def blip2_image_processor_func_with_inputs(image_processor, image): return {'image': image_processor(image).unsqueeze(0), 'input_ids': torch.zeros(1, 1, dtype=torch.long), 'position_ids': None, 'attention_mask': torch.ones(1, 1, dtype=torch.long)} def get_image_processor(image_size): return partial(blip2_image_processor_func_with_inputs, BlipImageEvalProcessor(image_size))
函数 get_image_processor
的返回部分是:
return partial(blip2_image_processor_func_with_inputs, BlipImageEvalProcessor(image_size))
这行代码使用 Python 的 functools.partial
函数来创建一个新的偏函数。partial
的作用是“冻结”一个函数的某些参数,从而返回一个新的函数,这个新函数在调用时会忽略被冻结的参数。在这个例子中,partial
被用来创建一个新的函数,这个新函数将 BlipImageEvalProcessor
的 image_size
参数固定,并且只接受一个参数 image
。
具体来说:
blip2_image_processor_func_with_inputs
是一个函数,它需要两个参数:image_processor
和 image
。BlipImageEvalProcessor(image_size)
创建了一个图像处理器实例,该实例已经被初始化为特定的 image_size
。partial
将 BlipImageEvalProcessor(image_size)
作为第一个参数传递给 blip2_image_processor_func_with_inputs
,这样 image_processor
参数就被固定了。因此,当 get_image_processor
被调用时,它返回一个新的函数,这个新函数接受一个图像作为输入,然后使用 BlipImageEvalProcessor
对图像进行处理,最后通过 blip2_image_processor_func_with_inputs
函数生成所需的字典输出。这种设计模式允许你创建一个可重用的图像处理流程,可以轻松地应用于不同的图像数据,而不需要每次调用时都重新指定图像处理器的配置。
当面对特定场景(如路牌识别)且可用的图片数据集较小时,微调CogVLM前可以做的:
数据增强(Data Augmentation):
使用预训练任务:利用预训练阶段的数据集,这些数据集可能包含与路牌识别相关的图像,即使它们不是专门为路牌识别而设计的。
模型正则化:应用正则化技术,如Dropout或权重衰减,以防止模型在有限数据上过拟合。
一些消融实验发现:
图像自监督损失没有帮助
图像序列中使用下三角注意力>全注意力(有点反直觉)
不同视觉编码器差异较小
Model structure and tuned parameters(模型结构和调整后的参数) :作者研究了仅调整MLP Adapter层或调整所有LLM参数和Adapter而不添加VE的有效性,以及修改VE架构以在每个第四个LLM层添加完整VE或仅在所有层中添加配备了FFN的VE。结果显示,仅微调adapted layer(如BLIP2模型)可能导致较差的浅层对齐效果。
Initialization Method(初始化方法) :作者研究了从LLM初始化VE权重的有效性。结果表明,这种方法略微降低了性能,这表明了这种方法的积极影响。
Visual Attention Mask(视觉注意力掩码) :作者在视觉标记上使用因果掩码(causal mask)会产生比full mask更好的结果。作者假设这种现象的可能解释是因果掩码更好地适应了LLM的内在结构。
Image SSL Loss(图像自我监督损失) :作者还研究了图像特征上的自我监督学习损失,其中每个视觉特征预测下一个位置的CLIP特征以进行视觉自我监督。与观察到的来自PaLI-X的观察一致,我们发现它对下游任务没有改善,尽管我们在早期实验证明了在小模型中确实有所改善。
EMA(指数移动平均) :作者在预训练期间使用了EMA,通常在各种任务中带来了改善。
cogvlm用到的一些评测集如下:
代码仓库:
Github:https://github.com/THUDM/CogVLM2
模型下载:
Huggingface:huggingface.co/THUDM
魔搭社区:modelscope.cn/models/ZhipuAI
始智社区:wisemodel.cn/models/ZhipuAI
Demo体验:
https://modelscope.cn/studios/ZhipuAI/Cogvlm2-llama3-chinese-chat-Demo/summary
CogVLM2 技术文档:
https://zhipu-ai.feishu.cn/wiki/OQJ9wk5dYiqk93kp3SKcBGDPnGf
如何桥接视觉和语言特征:
特点:
benchmark:TextVQA、DocVQA、ChartQA、OCRbench、MMMU、MMVet、MMBench等
GLM-4V-9B 具备 1120 * 1120 高分辨率下的中英双语多轮对话能力,在中英文综合能力、感知推理、文字识别、图表理解等多方面多模态评测中,GLM-4V-9B 表现出超越 GPT-4-turbo-2024-04-09、Gemini 1.0 Pro、Qwen-VL-Max 和 Claude 3 Opus 的卓越性能。
GLM-4V-9B模型权重:https://huggingface.co/THUDM/glm-4v-9b
GLM-4V-9B 是一个多模态语言模型,具备视觉理解能力,其相关经典任务的评测结果如下:
MMBench-EN-Test | MMBench-CN-Test | SEEDBench_IMG | MMStar | MMMU | MME | HallusionBench | AI2D | OCRBench | |
---|---|---|---|---|---|---|---|---|---|
gpt-4o-2024-05-13 | 83.4 | 82.1 | 77.1 | 63.9 | 69.2 | 2310.3 | 55.0 | 84.6 | 736 |
gpt-4-turbo-2024-04-09 | 81.0 | 80.2 | 73.0 | 56.0 | 61.7 | 2070.2 | 43.9 | 78.6 | 656 |
gpt-4-1106-preview | 77.0 | 74.4 | 72.3 | 49.7 | 53.8 | 1771.5 | 46.5 | 75.9 | 516 |
InternVL-Chat-V1.5 | 82.3 | 80.7 | 75.2 | 57.1 | 46.8 | 2189.6 | 47.4 | 80.6 | 720 |
LLaVA-Next-Yi-34B | 81.1 | 79.0 | 75.7 | 51.6 | 48.8 | 2050.2 | 34.8 | 78.9 | 574 |
Step-1V | 80.7 | 79.9 | 70.3 | 50.0 | 49.9 | 2206.4 | 48.4 | 79.2 | 625 |
MiniCPM-Llama3-V2.5 | 77.6 | 73.8 | 72.3 | 51.8 | 45.8 | 2024.6 | 42.4 | 78.4 | 725 |
Qwen-VL-Max | 77.6 | 75.7 | 72.7 | 49.5 | 52.0 | 2281.7 | 41.2 | 75.7 | 684 |
Gemini 1.0 Pro | 73.6 | 74.3 | 70.7 | 38.6 | 49.0 | 2148.9 | 45.7 | 72.9 | 680 |
Claude 3 Opus | 63.3 | 59.2 | 64.0 | 45.7 | 54.9 | 1586.8 | 37.8 | 70.6 | 694 |
GLM-4V-9B | 81.1 | 79.4 | 76.8 | 58.7 | 47.2 | 2163.8 | 46.6 | 81.1 | 786 |
快速使用:
import torch from PIL import Image from transformers import AutoModelForCausalLM, AutoTokenizer device = "cuda" tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4v-9b", trust_remote_code=True) query = '描述这张图片' image = Image.open("your image").convert('RGB') inputs = tokenizer.apply_chat_template([{"role": "user", "image": image, "content": query}], add_generation_prompt=True, tokenize=True, return_tensors="pt", return_dict=True) # chat mode inputs = inputs.to(device) model = AutoModelForCausalLM.from_pretrained( "THUDM/glm-4v-9b", torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, trust_remote_code=True ).to(device).eval() gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1} with torch.no_grad(): outputs = model.generate(**inputs, **gen_kwargs) outputs = outputs[:, inputs['input_ids'].shape[1]:] print(tokenizer.decode(outputs[0]))
在图片序列中引入2d RoPE位置编码
[1] CogVLM:深度融合引领视觉语言模型革新,多领域性能创新高
[2] 多模态融合新方向!21篇2024年最新顶会论文汇总!
[3] https://github.com/THUDM/CogVLM/blob/main/assets/cogvlm-paper.pdf
[4] minigpt-4模型论文:https://arxiv.org/pdf/2304.10592.pdf
[5] https://huggingface.co/datasets/THUDM/CogVLM-SFT-311K
[6] https://huggingface.co/THUDM/cogvlm-chat-hf/
[7] https://huggingface.co/THUDM/CogVLM/tree/main
[8] https://huggingface.co/THUDM/cogvlm-base-490-hf/blob/main/modeling_cogvlm.py
[9] CogVLM大模推理代码详细解读
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。