image.png

1 主要贡献:

  • 高质量的训练数据:采集中文安卓APP(30+中文主流APP)轨迹数据55k个,包含470k步,再混合大量开源去重后的英文安卓APP数据;

  • 三阶段渐进式训练pipeline:

    • grounding-aware的预训练,增强模型视觉感知能力
    • SFT流程:增强模型的规划能力
    • RFT流程:强化学习流程提升推理能力
      image.png
  • 面向边缘设备的设计:设计了紧密的JSON输出格式,以减少输出token数,平均单步输出9.7tokens,在H100上单次推理耗时在0.5s左右,提升了任务执行效率

  • 开源了一个中文App GUI测试benchmark:CAGUI

2 模型架构

2.1 模型架构简介

AgentCPM-GUI基于MiniCPM-V-8B构建,具备很好的视觉感知和指令跟随能力。
image.png

  • Visual encoder:SigLIP SoViT-400m/14
  • LLM:Llama3

2.2 操作空间设计

AgentCPM基于以下的6个原子操作,部分原子操作之间可以相互组合,从而达到简化输出格式的目的:

  • POINT:用于表示操作的位置,输出未[x,y],均归一化到0-1000中,该字段单独出现表示点击click操作,与duration字段一起出现则表示长按long press操作,与to字段一起出现则表示滑动屏幕
  • to:用于表示屏幕滑动的方向,与POINT字段一起出现表示向不同的方向滑动屏幕
  • TYPE:表示需要输入的内容
  • PRESS:表示需要点击特殊的按钮,包括“HOME”、“BACK”、“ENTER”
  • STATUS:表示当前任务的执行状态,包括"continue", “finish”, “satisfied”,“impossible”, “interrupt”, “need_feedback”,默认为“continue”可以被忽略
  • duration:表示操作需要执行的时间,通常与POINT一起出现;当该字段单独出现时,表示空闲等待;
Action 必填字段 可选字段 功能说明 例子
Click POINT:[x,y] duration,thought,STATUS 在归一化坐标系 (0–1000,原点位于左上角) 执行一次轻触。 {"POINT":[480,320]}
Long Press POINT:[x,y]
duration:1000
duration,thought,STATUS 在指定坐标执行长按操作(需设置较长持续时间,例如 > 200 ms)。 {"POINT":[480,320]","duration":1000}
Swipe POINT:[x,y]
to:"up" | "down" | "left" | "right" to:[x,y]
duration,thought,STATUS 从起始点滑向指定方向 另一坐标。 {"POINT":[500,200],"to":"down"}
Press key PRESS:"HOME" | "BACK" | "ENTER" duration,thought,STATUS 触发硬件 / 导航按键。 {"PRESS":"HOME"}
Type text TYPE:"<text>" duration,thought,STATUS 在当前输入焦点处输入给定文本。 {"TYPE":"Hello, world!"}
Wait duration thought,STATUS 在指定时长内保持空闲,不执行任何其他动作。 {"duration":500}
Task-level status STATUS:"start" | "continue" | "finish" | "satisfied" | "impossible" | "interrupt" | "need_feedback" duration,thought 上报任务进度;可 单独 出现,也可与原子动作 同时 出现。 {"STATUS":"finish"}

2.3 训练策略

2.3.1 Stage1: Visual Perception and Grounding

第一阶段主要关注模型的感知能力和grounding能力。主要整理了visual-language对齐任务的数据集,包含OCR和GUI组件定位等。主要数据集有开源的AITZ、GUICourse、OS-Atlas、UGround、ScreenSpot和部分作者团队采集到的中文app数据,这些数据被构建为2种任务:

  • OCR任务:对图片上的指定区域,生成文本
  • widget-localization任务:针对指定UI元素,输出bounding box

同时还混合了50%的通用多模态STF数据(Chat、VQA、多模态推理等),共计12M数据

2.3.2 Stage2: SFT

该阶段使用GUI任务数据(自然语言描述的任务指令和对应的操作轨迹),该阶段使用监督微调的方式教会模型输出有效的操作字段。该阶段作者团队从30余个中文主流APP种采集了55k的任务数据,包含470k个步骤,平均每个任务8.5步。数据采集流程如下:

  • 生成任务描述:针对每一个app的核心功能设计任务指令模板,使用GPT-4o基于这些指令模板来生成任务描述,在通过人工标注员去检查这些任务描述,去除错误和重复的。再使用GPT-4o将这些被人工检查过的任务描述进行改写,增加指令描述的多样性
  • 操作轨迹采集:在真实的安卓设备上安装一个自定义的数据记录器,并由标注员在手机上完成一条条指令,记录每次操作和对应的屏幕截图
  • 数据质量保证:数据记录器只记录标注员确认过的操作,避免误触导致的异常数据;事后过滤那些缺少关键步骤、未完成的任务和重复的数据;

为了预热第三阶段模型的强化学习训练,在当前阶段,从采集的中文APP任务种选择24k任务(相当于从采集的数据中拿出一半),使用GPT-4o生成每一步的推理描述。并且使用带有推理思考的英文数据如AITZ和Android Control来扩充数据集。并且为了控制是否生成thought,在schema中通过添加"required": “thought"表示要输出推理思考,添加"optional”: "thought"表示不输出。

为了实现跨语言的泛化能力和减少过拟合,还加入了开源的英文数据:AITW、AITZ、AMEX、Android Control、GUI-Odyssey。并且由于AITW数据重复的太多,作者使用了一种去重策略,针对使用相同query的任务,使用Resnet-50提取同一个任务中的屏幕截图的特征,并求取均值,与上一个保留的任务计算余弦相似度,去除相似度过高的任务,通过这种方式只保留40%的AITW任务数据。

经验上,如果只使用GUI数据训练,可能会导致后续的RFT训练阶段出现明显的模式崩塌,具体表现为输出贫乏且重复的思考。所在SFT阶段还混合了50%的多模态SFT数据,SFT数据包含2中格式,一种是单轮对话(system-user-assistant),一种时多轮对话,多轮对话只保留最新的3次问答,以输入长度的限制。总体上,STF阶段使用了6.9M的训练数据

2.3.3 RFT

最后一个阶段使用强化学习微调,增强模型在复杂的GUI环境下的推理和决策制定能力,使用GPRO进行优化。为保证RFT在分布式环境中可以有效和稳定训练,作者提出了一个支持异步部署和2级负载均衡的训练框架。

2.3.3.1 奖励设计与验证

作者使用了一个2阶段的验证方案去评估模型的输出:(1)格式检查(2)语义正确性,奖励被隐射到[-1,1]之间。如果输出没有通过格式检查,奖励直接设置为-1;如果格式正确但是语义不对,奖励设置为0;如果两者都对,奖励则设置为1。如果输出由POINT,还需计算一个空间准确率,如果point落在gt的bbox中,奖励设置为1,否则设置为0。

2.3.3.2 系统优化

采用异步架构将部署执行和策略更新分离。对每一个任务ID,根据GPRO算法,随机采样n个候选reponse用于策略更新。当推理和奖励计算完成后,主进程使用GPRO的variance-reduced estimator来计算每个样本的advantage values。然后这些advantage values被送到节点级的主进程中用于策略更新。全局主进程收集所有必要的统计,当满足同步条件时,协调跨节点的统一策略更新。这个设计确保了GPRO优化逻辑和分布式异步训练框架的紧密集成。

  • Asynchronous Rollout

每个GPU组独立且异步地执行推理,推理结果先被同步到局部节点的主程序,然后再与全局主程序通讯以跟踪全局rollout进度,并协调训练更新。在推理时,每个GPU组也异步地请求下一个batch所需的数据用于计算策略梯度。一旦同步条件达成,全局主程序广播信号给所有GPU组以停止rollout并同步模型更新。这个异步rollout策略确保每一个GPU组高效运行,不用互相等待,极大地利用了计算资源。

  • Hierarchical Load Balancing

Intra-node(between GPU groups)balancing:通过构建全局任务队列来解决节点内不平衡的问题,推理任务可以从该队列分配到GPU组。确保每个GPU组都能持续获得有效任务,最小化等待时间。

Inter-node balancing:为了实现节点间的平衡,制定了一个工作窃取机制:未充分利用的节点可以向负担过重的节点请求推理结果。

3 实验结果

3.1 Grounding能力

在CAGUI上测试三种任务:

  • Fun2Point:给一个控件的功能描述,如点击某个按钮打开xx,模型需要输出这个控件的位置;
  • Text2Point:模型需要输出指定的文本在GUI上的位置;
  • Bbox2Text:模型根据输入的bbox,输出bbox内的文本内容;
    image.png

3.2 动作预测能力

主要在Android control、GUI Odyssey、AITZ和CAGUI上进行测试,主要关注两个指标:

  • Type Match(TM):操作类型匹配
  • Exact Match(TM):完全匹配,即操作类型、位置、方向、文本等完全匹配
    image.png

3.3 SFT和RFT对比

image.png

使用强化学习后,指标有显著的提升。

4 实测体验

  • 耗时:不使用vllm加速和不输出thought,单次推理耗时约为0.5s
  • 没有历史操作记录,针对多任务的prompt完成效果不好(如打开淘宝,将销量最高的垃圾袋和洗衣粉加入购物车),也比较符合直觉,因为模型也不知道任务完成到哪里了。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐