当前位置: 首页 > article >正文

【多模态】Magma多模态AI Agent

1. 前言

        微软杨建伟团队,最近在AI Agent方面动作连连,前两天开源了OmniParser V2,2月26日又开源了Magma,OmniParser专注在对GUI的识别解析,而Magma则是基于多模态技术,能够同时应对GUI和物理世界的交互,两者有一定的差异。后续也会带来OmniParser的实战分享,目前还在实测中。

        话不多说,先看下Magma能做什么?                主要是两类任务:

  • 多模态理解(Multimodal Understanding):能够理解来自不同领域(包括数字世界和物理世界)的多模态输入,不仅在语义层面,还具备空间和时间上的理解能力。
  • 多模态动作预测(Multimodal Action Prediction):能够将长时序任务分解为精准的动作序列,使 AI  Agent系统能够有效执行。

2. Magma是什么

        Magma 是一个多模态 AI  Agent的基础模型。具备感知多模态世界的能力,并能够执行目标驱动的行动。也就是说,Magma主要是实现以下目标:

  • 语言和时空智能:具备语言理解能力和时空智能,以理解图像和视频,将自身行动建立在观察的基础上,并进一步将外部目标转化为行动计划和执行方案。
  • 数字与物理世界:不局限于数字世界(如网页导航)或物理世界(如机器人操作),能够跨越这两个世界,就像人类一样自由切换和适应。

        基于上述理念,Magma构建了一个新的预训练数据集,其中主要包含来自真实世界的无标签视频,以及现有的带注释的智能体数据。同时,设计一种新的预训练框架,统一训练三种模态(文本、图像和动作),以训练一个全新的多模态 AI  Agent基础模型——Magma。

        可以看到,Magma是直接训练一个通用的基础模型,使其能够以零样本(zero-shot)方式适应不同的下游任务。但是简单地组合这些数据集并不能直接提升模型能力,因为多模态理解主要依赖文本(例如图像和视频的文本描述),而执行动作任务主要依赖空间信息(如 UI 的 2D 坐标或机器人手臂的 7-DoF 运动)。为了解决该问题,需要具备两种任务的能力:

  • 动作对齐(Action Grounding):模型需在给定视觉-空间观察的情况下预测下一步可能的可执行动作。
  • 动作规划(Action Planning):基于视觉观察生成合理的未来动作序列。

3. 怎么预训练Magma

        训练Magma,需要大规模异构训练数据,包括现有的多模态理解数据、UI 导航数据、机器人操作数据,以及无标签的真实世界视频。此外,也提出了一种新的数据采集流程,以可扩展且低成本的方式收集无标签视频。为了从原始视频和机器人轨迹中提取有用的动作监督信号,需要精确去除视频中的摄像机运动,然后将物体的运动转换为“动作”监督信号,用于模型训练。这些数据为模型提供独特的学习信号,帮助它理解跨模态关联,并提升其长时序动作预测与规划能力。

        此外,由于文本和动作在本质上存在巨大差异(文本是离散的,而视觉 token 是连续的),这导致了跨模态学习的鸿沟。为了解决这一问题,提出一种通用预训练框架,统一训练文本、图像和动作三种模态。更具体地说,提出了Set-of-Mark(SoM)和 Trace-of-Mark(ToM)作为辅助任务,使不同输出模态之间建立桥梁。不仅增强文本与动作模态之间的对齐,还促进了图像与动作模态的结合,从而实现更好的多模态协同理解和决策能力。

4. 安装Magma以及测试

clone项目到本地:

git clone https://github.com/microsoft/Magma

cd Magma

创建并激活conda环境

conda create -n magma python=3.10 -y

conda activate magma

升级 pip 并安装基础依赖

pip install --upgrade pip

pip install -e .

安装训练所需的依赖

pip install -e ".[train]"

安装agent相关的依赖

pip install -e ".[agent]"

使用 Huggingface Transformers 进行推理

加载模型和处理器:

from PIL import Image
import torch
from transformers import AutoModelForCausalLM
from transformers import AutoProcessor 

dtype = torch.bfloat16
model = AutoModelForCausalLM.from_pretrained("microsoft/Magma-8B", trust_remote_code=True, torch_dtype=dtype)
processor = AutoProcessor.from_pretrained("microsoft/Magma-8B", trust_remote_code=True)
model.to("cuda")

# Inference
image = Image.open("./assets/images/magma_logo.jpg").convert("RGB")

convs = [
    {"role": "system", "content": "You are agent that can see, talk and act."},            
    {"role": "user", "content": "<image_start><image><image_end>\nWhat is the letter on the robot?"},
]
prompt = processor.tokenizer.apply_chat_template(convs, tokenize=False, add_generation_prompt=True)
inputs = processor(images=[image], texts=prompt, return_tensors="pt")
inputs['pixel_values'] = inputs['pixel_values'].unsqueeze(0)
inputs['image_sizes'] = inputs['image_sizes'].unsqueeze(0)
inputs = inputs.to("cuda").to(dtype)

generation_args = { 
    "max_new_tokens": 500, 
    "temperature": 0.0, 
    "do_sample": False, 
    "use_cache": True,
    "num_beams": 1,
} 

with torch.inference_mode():
    generate_ids = model.generate(**inputs, **generation_args)

generate_ids = generate_ids[:, inputs["input_ids"].shape[-1] :]
response = processor.decode(generate_ids[0], skip_special_tokens=True).strip()

print(response)

5. UI Agent

        构建 UI Agent。由于模型经过 Set-of-Mark 和 Trace-of-Mark 预训练,因此它与 OmniParser 具有天然的协同作用。关于OmniParser,可以参考《OmniParserV2+DeepSeek:基于纯视觉的 GUI Agent解决方案》。将它们结合在一起后,可以获得一个 UI Agent,并运行以下命令:

python agents/ui_agent/app.py

        Magma 模型不仅具备 动作落地(action-grounding) 能力,还具备多模态理解和推理能力。因此,可以用文本让模型预测点击位置,例如:

        指令:跳转到排名最高的帖子        

        还可以自由提问,只需在文本提示的开头添加前缀 "Q:",例如:

        Q: 帖子标题是什么?

6. 参考材料

【1】GitHub - microsoft/Magma: [CVPR 2025] Magma: A Foundation Model for Multimodal AI Agents

【2】Magma: A Foundation Model for Multimodal AI Agents


http://www.kler.cn/a/566955.html

相关文章:

  • 黑马Java面试教程_P5_微服务
  • 用大白话解释缓存Redis +MongoDB是什么有什么用怎么用
  • [Lc双指针_2] 盛水最多的容器 | 有效三角形的个数 | 和为S的两个数字
  • Spring Boot 消息队列(以RabbitMQ为例)
  • Java注释/JDK开发工具生成API/关键字、标识符规范
  • 企业级本地知识库部署指南(Windows优化版)
  • 什么是 Prompt?——一篇详细的介绍
  • FloodFill 算法(典型算法思想)—— OJ例题算法解析思路
  • Win 11 C盘相邻的分区是恢复分区导致无法扩容
  • PDF文件转换为PNG图像
  • DH法建立6自由度机械臂正运动学模型
  • 数据库设计报告
  • 介绍一款飞算JavaAI编程工具,集成到idea,图文并茂
  • Graph Convolutional Networks(GCN)图卷积网络
  • 解释 Node.js 中的异步编程模型,如何使用回调、Promise 和async / await 处理异步操作?
  • PyCharm Python 环境配置指南
  • HTTP3.0 和 HTTP2.0,HTTP1.0区别
  • 前端存储方案全面对比:localStorage、sessionStorage、cookies与IndexedDB
  • 【 开发知识点 一 】 随机数生成器 /dev/urandom 和 /dev/random
  • 第一届启航杯-web-misc(全)