阿里国际开源Ovis2系列多模态大语言模型 共有六个版本 ...

打印 上一主题 下一主题

主题 1016|帖子 1016|积分 3048

2025 年 2 月 21 日,阿里巴巴国际化团队宣布其新型多模态大语言模型Ovis2 系列正式开源。
Ovis2 是阿里巴巴国际化团队提出的Ovis系列模型的最新版本。与前序1. 6 版本相比,Ovis2 在数据构造和练习方法上都有显著改进。它不仅强化了小规模模型的本事密度,还通过指令微调和偏好学习大幅提拔了头脑链(CoT)推理本事。此外,Ovis2 引入了视频和多图像处理本事,并增强了多语言本事和复杂场景下的OCR本事,显著提拔了模型的实用性。
此次开源的Ovis2 系列包括1B、2B、4B、8B、16B和34B六个版本,各个参数版本均达到了同尺寸的SOTA(State of the Art)水平。其中,Ovis2-34B在权威评测榜单OpenCompass上展现出了杰出的性能。在多模态通用本事榜单上,Ovis2-34B位列所有开源模型第二,以不到一半的参数尺寸高出了诸多70B开源旗舰模型。在多模态数学推理榜单上,Ovis2-34B更是位列所有开源模型第一,其他尺寸版本也展现出出色的推理本事。这些结果不仅证实白Ovis架构的有效性,也展示了开源社区在推动多模态大模型发展方面的巨大潜力。

Ovis2 的架构计划巧妙地办理了模态间嵌入计谋差异这一局限性。它由视觉tokenizer、视觉嵌入表和LLM三个关键组件构成。视觉tokenizer将输入图像分割成多个图像块,使用视觉Transformer提取特征,并通过视觉头层将特征匹配到“视觉单词”上,得到概率化的视觉token。视觉嵌入表存储每个视觉单词对应的嵌入向量,而LLM则将视觉嵌入向量与文本嵌入向量拼接后进行处理,天生文本输出,完成多模态使命。
在练习计谋上,Ovis2 采用了四阶段练习方法,以充实引发其多模态明白本事。第一阶段冻结大部门LLM和ViT参数,练习视觉模块,学习视觉特征到嵌入的转化。第二阶段进一步增强视觉模块的特征提取本事,提拔高分辨率图像明白、多语言和OCR本事。第三阶段通过对话形式的视觉Caption数据对齐视觉嵌入与LLM的对话格式。第四阶段则是多模态指令练习和偏好学习,进一步提拔模型在多种模态下对用户指令的遵循本事和输出质量。
为了提拔视频明白本事,Ovis2 开发了一种创新的关键帧选择算法。该算法基于帧与文本的相关性、帧之间的组合多样性和帧的序列性挑选最有用的视频帧。通过高维条件相似度计算、行列式点过程(DPP)和马尔可夫决策过程(MDP),算法能够在有限的视觉上下文中高效地选择关键帧,从而提拔视频明白的性能。
Ovis2 系列模型在OpenCompass多模态评测榜单上的表现尤为突出。不同尺寸的模型在多个Benchmark上均取得了SOTA结果。比方,Ovis2-34B在多模态通用本事和数学推理榜单上分别位列第二和第一,展现了其强盛的性能。此外,Ovis2 在视频明白榜单上也取得了领先性能,进一步证实白其在多模态使命中的优势。
阿里巴巴国际化团队表现,开源是推动AI技能进步的关键气力。通过公开分享Ovis2 的研究结果,团队等候与全球开发者共同探索多模态大模型的前沿,并引发更多创新应用。现在,Ovis2 的代码已开源至GitHub,模型可在Hugging Face和Modelscope平台上获取,同时提供了在线Demo供用户体验。相关研究论文也已发布在arXiv上,供开发者和研究者参考。
我们使用 OpenCompass 多模态和推理排行榜中使用的 VLMEvalKit 来评估 Ovis2。

图像基准

BenchmarkQwen2.5-VL-3BSAIL-VL-2BInternVL2.5-2B-MPOOvis1.6-3BInternVL2.5-1B-MPOOvis2-1BOvis2-2BMMBench-V1.1test77.173.670.774.165.868.476.9MMStar56.556.554.952.049.552.156.7MMMUval51.444.144.646.740.336.145.6MathVistatestmini60.162.853.458.947.759.464.1HallusionBench48.745.940.743.834.845.250.2AI2D81.477.475.177.868.576.482.7OCRBench83.183.183.880.184.389.087.3MMVet63.244.264.257.647.250.058.3MMBenchtest78.67772.876.667.970.278.9MMT-Benchval60.857.154.459.250.855.561.7RealWorldQA66.56261.366.75763.966.0BLINK48.446.443.843.84144.047.9QBench74.472.869.875.863.371.376.2ABench75.574.571.175.267.571.376.6MTVQA24.920.222.621.121.723.725.6 BenchmarkQwen2.5-VL-7BInternVL2.5-8B-MPOMiniCPM-o-2.6Ovis1.6-9BInternVL2.5-4B-MPOOvis2-4BOvis2-8BMMBench-V1.1test82.682.080.680.577.881.483.6MMStar64.165.263.362.96161.964.6MMMUval56.254.850.95551.849.057.4MathVistatestmini65.867.973.367.364.169.671.8HallusionBench56.351.751.152.247.553.856.3AI2D84.184.586.184.481.585.786.6OCRBench87.788.288.98387.991.189.1MMVet66.668.167.2656665.565.1MMBenchtest83.483.283.282.779.683.284.9MMT-Benchval62.762.562.364.961.665.266.6RealWorldQA68.871.168.070.764.471.172.5BLINK56.156.653.948.550.653.054.3QBench77.973.878.776.771.578.178.9ABench75.677.077.574.475.977.576.4MTVQA28.527.223.119.22829.429.7 BenchmarkQwen2.5-VL-72BInternVL2.5-38B-MPOInternVL2.5-26B-MPOOvis1.6-27BLLaVA-OV-72BOvis2-16BOvis2-34BMMBench-V1.1test87.885.484.282.284.485.686.6MMStar71.170.167.763.565.867.269.2MMMUval67.963.856.460.356.660.766.7MathVistatestmini70.873.671.570.268.473.776.1HallusionBench58.859.752.454.147.956.858.8AI2D88.287.986.286.686.286.388.3OCRBench88.189.490.585.674.187.989.4MMVet76.772.668.16860.668.477.1MMBenchtest88.286.485.484.685.687.187.8MMT-Benchval69.169.165.768.2-69.271.2RealWorldQA75.974.473.772.773.974.175.6BLINK62.363.262.648-59.060.1QBench-76.176.077.7-79.579.8ABench-78.679.476.5-79.478.7MTVQA-31.228.726.5-30.330.6 视频基准

BenchmarkQwen2.5-VL-3BInternVL2.5-2BInternVL2.5-1BOvis2-1BOvis2-2BVideoMME(wo/w-subs)61.5/67.651.9 / 54.150.3 / 52.348.6/49.557.2/60.8MVBench67.068.864.360.3264.9MLVU(M-Avg/G-Avg)68.2/-61.4/-57.3/-58.5/3.6668.6/3.86MMBench-Video1.631.441.361.261.57TempCompass64.4--51.4362.64 BenchmarkQwen2.5-VL-7BInternVL2.5-8BLLaVA-OV-7BInternVL2.5-4BOvis2-4BOvis2-8BVideoMME(wo/w-subs)65.1/71.664.2 / 66.958.2/61.562.3 / 63.664.0/66.368.0/71.6MVBench69.672.056.771.668.4568.15MLVU(M-Avg/G-Avg)70.2/-68.9/-64.7/-68.3/-70.8/4.2376.4/4.25MMBench-Video1.791.68-1.731.691.85TempCompass71.7---67.0269.28 BenchmarkQwen2.5-VL-72BInternVL2.5-38BInternVL2.5-26BLLaVA-OneVision-72BOvis2-16BOvis2-34BVideoMME(wo/w-subs)73.3/79.170.7 / 73.166.9 / 69.266.2/69.570.0/74.471.2/75.6MVBench70.474.475.259.468.670.3MLVU(M-Avg/G-Avg)74.6/-75.3/-72.3/-68.0/-77.7/4.4477.8/4.59MMBench-Video2.021.821.86-1.921.98TempCompass74.8---74.1675.97 使用

  1. pip install torch==2.4.0 transformers==4.46.2 numpy==1.25.0 pillow==10.3.0
  2. pip install flash-attn==2.7.0.post2 --no-build-isolation
复制代码
Ovis2-1B
  1. import torch
  2. from PIL import Image
  3. from transformers import AutoModelForCausalLM
  4. # load model
  5. model = AutoModelForCausalLM.from_pretrained("AIDC-AI/Ovis2-1B",
  6.                                              torch_dtype=torch.bfloat16,
  7.                                              multimodal_max_length=32768,
  8.                                              trust_remote_code=True).cuda()
  9. text_tokenizer = model.get_text_tokenizer()
  10. visual_tokenizer = model.get_visual_tokenizer()
  11. # single-image input
  12. image_path = '/data/images/example_1.jpg'
  13. images = [Image.open(image_path)]
  14. max_partition = 9
  15. text = 'Describe the image.'
  16. query = f'<image>\n{text}'
  17. ## cot-style input
  18. # cot_suffix = "Provide a step-by-step solution to the problem, and conclude with 'the answer is' followed by the final solution."
  19. # image_path = '/data/images/example_1.jpg'
  20. # images = [Image.open(image_path)]
  21. # max_partition = 9
  22. # text = "What's the area of the shape?"
  23. # query = f'<image>\n{text}\n{cot_suffix}'
  24. ## multiple-images input
  25. # image_paths = [
  26. #     '/data/images/example_1.jpg',
  27. #     '/data/images/example_2.jpg',
  28. #     '/data/images/example_3.jpg'
  29. # ]
  30. # images = [Image.open(image_path) for image_path in image_paths]
  31. # max_partition = 4
  32. # text = 'Describe each image.'
  33. # query = '\n'.join([f'Image {i+1}: <image>' for i in range(len(images))]) + '\n' + text
  34. ## video input (require `pip install moviepy==1.0.3`)
  35. # from moviepy.editor import VideoFileClip
  36. # video_path = '/data/videos/example_1.mp4'
  37. # num_frames = 12
  38. # max_partition = 1
  39. # text = 'Describe the video.'
  40. # with VideoFileClip(video_path) as clip:
  41. #     total_frames = int(clip.fps * clip.duration)
  42. #     if total_frames <= num_frames:
  43. #         sampled_indices = range(total_frames)
  44. #     else:
  45. #         stride = total_frames / num_frames
  46. #         sampled_indices = [min(total_frames - 1, int((stride * i + stride * (i + 1)) / 2)) for i in range(num_frames)]
  47. #     frames = [clip.get_frame(index / clip.fps) for index in sampled_indices]
  48. #     frames = [Image.fromarray(frame, mode='RGB') for frame in frames]
  49. # images = frames
  50. # query = '\n'.join(['<image>'] * len(images)) + '\n' + text
  51. ## text-only input
  52. # images = []
  53. # max_partition = None
  54. # text = 'Hello'
  55. # query = text
  56. # format conversation
  57. prompt, input_ids, pixel_values = model.preprocess_inputs(query, images, max_partition=max_partition)
  58. attention_mask = torch.ne(input_ids, text_tokenizer.pad_token_id)
  59. input_ids = input_ids.unsqueeze(0).to(device=model.device)
  60. attention_mask = attention_mask.unsqueeze(0).to(device=model.device)
  61. if pixel_values is not None:
  62.     pixel_values = pixel_values.to(dtype=visual_tokenizer.dtype, device=visual_tokenizer.device)
  63. pixel_values = [pixel_values]
  64. # generate output
  65. with torch.inference_mode():
  66.     gen_kwargs = dict(
  67.         max_new_tokens=1024,
  68.         do_sample=False,
  69.         top_p=None,
  70.         top_k=None,
  71.         temperature=None,
  72.         repetition_penalty=None,
  73.         eos_token_id=model.generation_config.eos_token_id,
  74.         pad_token_id=text_tokenizer.pad_token_id,
  75.         use_cache=True
  76.     )
  77.     output_ids = model.generate(input_ids, pixel_values=pixel_values, attention_mask=attention_mask, **gen_kwargs)[0]
  78.     output = text_tokenizer.decode(output_ids, skip_special_tokens=True)
  79.     print(f'Output:\n{output}')
复制代码
批推理
  1. import torch
  2. from PIL import Image
  3. from transformers import AutoModelForCausalLM
  4. # load model
  5. model = AutoModelForCausalLM.from_pretrained("AIDC-AI/Ovis2-1B",
  6.                                              torch_dtype=torch.bfloat16,
  7.                                              multimodal_max_length=32768,
  8.                                              trust_remote_code=True).cuda()
  9. text_tokenizer = model.get_text_tokenizer()
  10. visual_tokenizer = model.get_visual_tokenizer()
  11. # preprocess inputs
  12. batch_inputs = [
  13.     ('/data/images/example_1.jpg', 'What colors dominate the image?'),
  14.     ('/data/images/example_2.jpg', 'What objects are depicted in this image?'),
  15.     ('/data/images/example_3.jpg', 'Is there any text in the image?')
  16. ]
  17. batch_input_ids = []
  18. batch_attention_mask = []
  19. batch_pixel_values = []
  20. for image_path, text in batch_inputs:
  21.     image = Image.open(image_path)
  22.     query = f'<image>\n{text}'
  23.     prompt, input_ids, pixel_values = model.preprocess_inputs(query, [image], max_partition=9)
  24.     attention_mask = torch.ne(input_ids, text_tokenizer.pad_token_id)
  25.     batch_input_ids.append(input_ids.to(device=model.device))
  26.     batch_attention_mask.append(attention_mask.to(device=model.device))
  27.     batch_pixel_values.append(pixel_values.to(dtype=visual_tokenizer.dtype, device=visual_tokenizer.device))
  28. batch_input_ids = torch.nn.utils.rnn.pad_sequence([i.flip(dims=[0]) for i in batch_input_ids], batch_first=True,
  29.                                                   padding_value=0.0).flip(dims=[1])
  30. batch_input_ids = batch_input_ids[:, -model.config.multimodal_max_length:]
  31. batch_attention_mask = torch.nn.utils.rnn.pad_sequence([i.flip(dims=[0]) for i in batch_attention_mask],
  32.                                                        batch_first=True, padding_value=False).flip(dims=[1])
  33. batch_attention_mask = batch_attention_mask[:, -model.config.multimodal_max_length:]
  34. # generate outputs
  35. with torch.inference_mode():
  36.     gen_kwargs = dict(
  37.         max_new_tokens=1024,
  38.         do_sample=False,
  39.         top_p=None,
  40.         top_k=None,
  41.         temperature=None,
  42.         repetition_penalty=None,
  43.         eos_token_id=model.generation_config.eos_token_id,
  44.         pad_token_id=text_tokenizer.pad_token_id,
  45.         use_cache=True
  46.     )
  47.     output_ids = model.generate(batch_input_ids, pixel_values=batch_pixel_values, attention_mask=batch_attention_mask,
  48.                                 **gen_kwargs)
  49. for i in range(len(batch_inputs)):
  50.     output = text_tokenizer.decode(output_ids[i], skip_special_tokens=True)
  51.     print(f'Output {i + 1}:\n{output}\n')
复制代码
参考

代码:https://github.com/AIDC-AI/Ovis
模型(Huggingface):https://huggingface.co/AIDC-AI/Ovis2-34B
模型(Modelscope):https://modelscope.cn/collections/Ovis2-1e2840cb4f7d45
Demo:https://huggingface.co/spaces/AIDC-AI/Ovis2-16B
arXiv: https://arxiv.org/abs/2405.20797

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表