探索面向开放型问题的推理模型Marco-o1,阿里国际AI团队最新开源!

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 阿里国际AI团队发布的新模型Marco-o1,不仅擅长解决具有标准答案的学科问题(如代码、数学等),更强调开放式问题的解决方案。该模型采用超长CoT数据微调、MCTS扩展解空间等技术,提升了模型在翻译任务及复杂问题解决上的表现。研究团队还开源了部分数据和模型,供社区使用和进一步研究。

阿里国际AI团队发布了最新的Marco-o1模型,Marco-o1不仅关注具有标准答案的学科(例如代码、数学等)领域,而且更加强调开放式问题的解决方案。研究团队的目标是解决:“o1这类模型能否有效的推广到难以量化且缺乏明确奖励的其他领域上”这一问题。


image.png


ModelScope:

https://modelscope.cn/models/AIDC-AI/Marco-o1


Arxiv:

https://arxiv.org/abs/2411.14405


Github:

https://github.com/AIDC-AI/Marco-o1


Hugging Face:

https://huggingface.co/AIDC-AI/Marco-o1


Marco-o1模型特色有:


1. 使用了超长CoT数据进行微调:通过self-play+MCTS构建了一批具备反思、改正能力的超长CoT数据。结合其他开源数据一同训练了Marco-o1-CoT。


2. 使用MCTS扩展解空间:在推理阶段,通过使用MCTS+reward引导模型(Marco-o1-MCTS)扩大解空间,输出更优秀的结果。


3. 细粒度解空间扩展:考虑到step级别依然具备较大的搜索细粒度,研究团队进一步的定义了mini-Step来进一步的扩大整个模型的解空间,引导并扩大模型(Marco-o1-MCTS mini-Step)具备输出更优秀答案的可能性。


4. 在翻译任务中应用:此外,研究团队创新地使用大型推理模型(LRM)到翻译任务中,这对于一些长难句翻译具有良好的效果。也是第一次将Inference time scaling应用到机器翻译任务中。


5. 开源:研究团队开源了部分CoT数据与目前最好的模型,稍晚些研究团队还会开源更多的数据与模型。


image.png


模型会对response做更深入的思考,比如下图中,对于单词‘strawberry’中有多少个r,模型在输出中逐步拆解单词中的每一个字母并且比较,在输出最终结果之前对之前的所有步骤进行确认,最终正确的输出了‘The answer is 3’。


image.png


另一个翻译的case。在机器翻译领域,如何处理例如‘踩屎感’、‘光腿神器’等这种国内特色表达方式一直是一个难点。通过这样一条推理链路,模型正确的识别了踩屎感这个难点,逐词翻译,解决了整体的翻译准确性,也在一定程度上防止了漏翻的出现。


image.png


此外,研究团队还在其他领域进行了尝试,证明了该模型具备一定的解决其他通用现实问题的能力。


整体方法



Marco-o1的整体结构如下,研究团队通过self-play+MCTS构建了一批具备反思、改正能力的超长CoT数据,结合其他开源数据一同训练了Marco-o1-CoT。考虑到模型整体的指令遵循能力十分重要,研究团队还融入了MarcoPolo家族的一些指令遵循数据集,整体模型指令遵循能力得到了显著的提升。


image.png


数据构造



研究团队使用self-play的形式,引导模型进行例如计划、执行、反思、纠错、输出答案等行为(Action as a Action),并使用MCTS进行搜索,当模型输出答案时,给予答案一个reward来更新这条MCTS搜索树上的V和N,也就是rollout。


具体来说,研究团队尝试了使用在初始prompt中引导模型执行例如计划、反思、纠错等行为。研究团队发现这对于一些较大模型(例如GPT4o、Qwen72B等)由于整体出色的模型能力和指令遵循能力,模型可以很好地完成既定指令。同时,研究团队还尝试了7B甚至1.5B模型的输出。模型也基本能够遵循设计好的PATTERN进行输出,经过MCTS的选择后,整体的输出基本满足了要求。


这里给出了一个早期版本的prompt供大家参考:

Begin by split the task into serval sub-tasks within <sub-task> tags, then enclosing all thoughts within <thinking> tags, exploring multiple angles andContinuously adjust your reasoning based on intermediate results and reflections, adapting your strategy as you progress.The hypothesis is presented within <hypothesis>.Regularly evaluate progress using <reflection> tags.Be critical and honest about your reasoning process.If unsure, backtrack and try a different approach, explaining your decision within <thinking> tags.Output should be markdown format and tags can not nested.   For mathematical problems, show all work explicitly using LaTeX for formal notation and provide detailed proofs.Explore multiple solutions individually if possible, comparing approaches in reflections.Use thoughts as a scratchpad, writing out all calculations and reasoning explicitly.Synthesize the final answer within <answer> tags, providing a clear, concise summary.Conclude with a final reflection on the overall solution, discussing effectiveness, challenges, and solutions.\n\nNow the Question is:\n4只小鸭子在一个大的圆形水池中,分别随机的出现在圆圈中的任意一点。4只鸭子出现在 同一半圆的概率是多少?


同时,研究团队还在MCTS搜索的中间引入了一些关键句进一步引导模型动作。比如在某个具体行为的搜索后主动拼接一些特征词,例如Wait! Maybe这类句子或者短语,强化模型对于例如标签的理解以及约束后续行为。


另外,研究团队认为模型的指令遵循能力对于o1来说依然重要(比如告诉模型你的计算预算,你需要在多少个token内输出答案,这对于简单问题的快速输出具有现实意义),因此研究团队还添加了指令遵循数据集强化指令遵循能力,还添加了少量常规sft数据作为playback使用。这部分数据直接使用MarcoPolo系列的数据集。


除此之外,MCTS进行数据搜索整体上的效率较低,成本较大,因此研究团队还对开源数据(例如Open O1)进行了清洗过滤。这些过滤包括启发式和llm as judge等,过滤掉一些低质量以及对模型没有帮助的数据。


这三组数据的混合构成了第一版Marco-o1的训练数据。由于时间关系,研究团队并没有进行特别细致的消融实验。不过研究团队人工对MCTS输出的数据进行了细致筛查,整体质量较高,研究团队相信会显著提升模型相关性能的。


最后,研究团队观察到实际上OpenAI o1的行为不止这几个,如何找到并设计这些行为是一个很大的挑战,并且为这些行为的行为树设计也是一个挑战(比如不可以直接)。有一些信息表明OpenAI为o1设计了数千个规则来引导模型进行搜索,这也会是研究团队后续的一个方向。


逻辑推理


推理阶段,研究团队设计了一个基于模型prob的reward来引导MCTS的搜索。但是研究团队观察到使用Action作为MCTS搜索细粒度是较粗的,往往导致较难搜索出正确答案——这一步在数据构造阶段影响有限,因为数据构造阶段是有ground truth信号作为引导的,但是推理阶段使用经过特殊设计的porb影响是显著的。因此研究团队进一步拆解了MCTS的搜索粒度,设计了3种粒度。


一种是类似于Verify Step by Step的以Step为单位进行搜索,每一个MCTS节点内为一句话(或者一个Action标签),此外,研究团队还特别的对Step也进行了拆分,称之为mini-Step,也就是固定每64/32个token为一个”step“,进一步扩大模型的搜索空间。


研究团队也发现,基于prob的reward设计具备较多局限性,研究团队观察到Llama-o1的基于prob的reward设计似乎是一个更优秀的方案。后续研究团队将持续探索其他reward设计以及Reward Model的训练与开源。


对于reward设计的更详细的说明欢迎移步Github。


结果展示


Marco-o1-CoT模型相比baseline有了一定的提升。其中mgsm-zh的性能下降是由于使用了中文CoT进行推理——研究团队认为推理路径遵循源语言是更容易被使用者所理解的。但是训练数据中中文CoT数据极少,这可能导致了性能下降。不过这部分性能下降在之后的MCTS搜索中得到了恢复。

image.png


在使用mini-Step进一步扩大解空间后,观察到了性能有一些波动。经过观察整个搜索树的结果,研究团队发现这主要是由于使用的reward计算方案导致的搜索路径选择错误。正如之前所说的,研究团队认为使用mini-Step继续扩大模型的解空间是有实际意义的,因此后续将使用更优秀的reward或者Reward Model来引导MCTS的搜索。


左侧为step level的MCTS,结果错误。右侧为mini-Step 32的MCTS,可以看到在value increase 150%后出现了错误。step level较难避免这类错误,而mini-Step的可以通过下一次搜索在一定程度上规避这一问题。


image.png

使用方法



推理代码:


import torch
from typing import List, Dict, Tuple
from modelscope import AutoModelForCausalLM, AutoTokenizer

def load_model_and_tokenizer(path):
    tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True)
    model = AutoModelForCausalLM.from_pretrained(path, trust_remote_code=True).to('cuda:0')
    model.eval()
    return tokenizer, model

def generate_response(model, tokenizer,
                      input_ids, attention_mask,
                      max_new_tokens=4096):
    generated_ids = input_ids
    with torch.inference_mode():
        for _ in range(max_new_tokens):
            outputs = model(input_ids=generated_ids, attention_mask=attention_mask)
            next_token_id = torch.argmax(outputs.logits[:, -1, :], dim=-1).unsqueeze(-1)
            generated_ids = torch.cat([generated_ids, next_token_id], dim=-1)
            attention_mask = torch.cat([attention_mask, torch.ones_like(next_token_id)], dim=-1)
            new_token = tokenizer.decode(next_token_id.squeeze(), skip_special_tokens=True)
            print(new_token, end='', flush=True)
            if next_token_id.item() == tokenizer.eos_token_id:
                break
                return tokenizer.decode(generated_ids[0][input_ids.shape[-1]:], 
                                        skip_special_tokens=True)

def chat(model, tokenizer):
    history: List[Dict[str, str]] = []
    print("Enter 'q' to quit, 'c' to clear chat history.")
    while True:
        user_input = input("User: ").strip().lower()
        if user_input == 'q':
            print("Exiting chat.")
            break
            if user_input == 'c':
                print("Clearing chat history.")
                history.clear()
                continue
                if not user_input:
                    print("Input cannot be empty.")
                    continue
        history.append({"role": "user", "content": user_input})
        text = tokenizer.apply_chat_template(history, tokenize=False, add_generation_prompt=True)
        model_inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=4096).to('cuda:0')
        print('Assistant:', end=' ', flush=True)
        response = generate_response(model, tokenizer, model_inputs.input_ids, model_inputs.attention_mask)
        print()
        history.append({"role": "assistant", "content": response})

def main():
    path = "AIDC-AI/Marco-o1"
    tokenizer, model = load_model_and_tokenizer(path)
    print('Starting chat.')
    chat(model, tokenizer)

if __name__ == "__main__":
    main()


Ollama直接运行



该模型也可以使用ModelScope上的GGUF版本直接运行

  1. 设置ollama下启用
ollama serve


  1. 通过 ollama run命令直接运行macro-o1模型的GGUF版本
ollama run modelscope.cn/QuantFactory/Marco-o1-GGUF

3. Ollama运行示例

image.png



更多通过Ollama直接运行ModelScope上任意GGUF模型的方法,可以参考文档:

https://www.modelscope.cn/docs/models/advanced-usage/ollama-integration


微调代码



本文介绍使用ms-swift对macro-o1进行微调。swift是魔搭社区官方提供的LLM与MLLM微调框架,支持400+大语言模型和100+多模态大模型的微调到部署。


swift开源地址:

https://github.com/modelscope/ms-swift


在开始微调之前,请确保您的环境已正确安装ms-swift

git clone https://github.com/modelscope/ms-swift.gitcd swiftpip install -e .[llm]


首先下载macro-o1的demo数据集:

https://github.com/AIDC-AI/Marco-o1/blob/main/data/CoT_demo.json

wget https://raw.githubusercontent.com/AIDC-AI/Marco-o1/refs/heads/main/data/CoT_demo.json
# 移动到`swift/llm/data/`目录下mv CoT_demo.json swift/llm/data/


然后在swift/llm/data中的dataset_info.json中增加以下内容,对数据集进行注册:


自定义数据集的文档可以查看:

https://github.com/modelscope/ms-swift/blob/main/docs/source/Instruction/%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%8E%E6%8B%93%E5%B1%95.md

{
    "cot_demo": {
        "dataset_path": "CoT_demo.json",
        "columns": {
            "instruction": "query"
        }
    },
    ...
}


运行以下微调脚本,即可开启微调:

# Experimental environment: A100
# 35GB GPU memory
CUDA_VISIBLE_DEVICES=0 swift sft \
    --model_type marco-o1 \
    --model_id_or_path AIDC-AI/Marco-o1 \
    --dataset cot_demo \
    --logging_steps 5 \
    --max_length 8192 \
    --learning_rate 1e-4 \
    --output_dir output \
    --lora_target_modules ALL \
    --num_train_epochs 10


显存占用:

image.png


相关文章
|
6天前
|
人工智能
AniDoc:蚂蚁集团开源 2D 动画上色 AI 模型,基于视频扩散模型自动将草图序列转换成彩色动画,保持动画的连贯性
AniDoc 是一款基于视频扩散模型的 2D 动画上色 AI 模型,能够自动将草图序列转换为彩色动画。该模型通过对应匹配技术和背景增强策略,实现了色彩和风格的准确传递,适用于动画制作、游戏开发和数字艺术创作等多个领域。
61 16
AniDoc:蚂蚁集团开源 2D 动画上色 AI 模型,基于视频扩散模型自动将草图序列转换成彩色动画,保持动画的连贯性
|
2天前
|
人工智能 自然语言处理 JavaScript
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
Univer 是一款开源的 AI 办公工具,支持 Word、Excel 等文档处理的全栈解决方案。它具有强大的功能、高度的可扩展性和跨平台兼容性,适用于个人和企业用户,能够显著提高工作效率。
31 7
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
|
4天前
|
人工智能 Linux API
PromptWizard:微软开源 AI 提示词自动化优化框架,能够迭代优化提示指令和上下文示例,提升 LLMs 特定任务的表现
PromptWizard 是微软开源的 AI 提示词自动化优化框架,通过自我演变和自我适应机制,迭代优化提示指令和上下文示例,提升大型语言模型(LLMs)在特定任务中的表现。本文详细介绍了 PromptWizard 的主要功能、技术原理以及如何运行该框架。
51 8
PromptWizard:微软开源 AI 提示词自动化优化框架,能够迭代优化提示指令和上下文示例,提升 LLMs 特定任务的表现
|
9天前
|
机器学习/深度学习 人工智能
Leffa:Meta AI 开源精确控制人物外观和姿势的图像生成框架,在生成穿着的同时保持人物特征
Leffa 是 Meta 开源的图像生成框架,通过引入流场学习在注意力机制中精确控制人物的外观和姿势。该框架不增加额外参数和推理成本,适用于多种扩散模型,展现了良好的模型无关性和泛化能力。
53 11
Leffa:Meta AI 开源精确控制人物外观和姿势的图像生成框架,在生成穿着的同时保持人物特征
|
7天前
|
机器学习/深度学习 人工智能 算法
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
X-AnyLabeling是一款集成了多种深度学习算法的图像标注工具,支持图像和视频的多样化标注样式,适用于多种AI训练场景。本文将详细介绍X-AnyLabeling的功能、技术原理以及如何运行该工具。
48 2
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
|
1天前
|
人工智能 数据挖掘 BI
结构化表格也成模态!浙大TableGPT2开源,最强表格AI问世
在AI快速发展中,大型语言模型(LLMs)如GPTs等展现了巨大潜力。然而,表格数据整合这一关键领域发展不足。浙江大学提出TableGPT2,使用593.8K张表格和2.36M查询-表格-输出三元组进行预训练和微调。该模型创新性地引入了表格编码器,增强了处理模糊查询、缺失列名和不规则表格的能力。TableGPT2在23个基准测试指标上表现出色,7B模型性能提升35.20%,72B模型提升49.32%。其开源代码和模型为社区提供了强大的研究工具。
21 12
|
6天前
|
人工智能 大数据 测试技术
自主和开放并举 探索下一代阿里云AI基础设施固件创新
12月13日,固件产业技术创新联盟产业峰会在杭州举行,阿里云主导的开源固件测试平台发布和PCIe Switch固件技术亮相,成为会议焦点。
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
MetaGPT开源SELA,用AI设计AI,效果超越OpenAI使用的AIDE
MetaGPT团队开源了Tree-Search Enhanced LLM Agents(SELA)系统,通过蒙特卡罗树搜索(MCTS)优化AutoML过程,显著提升了机器学习模型的构建效率和性能。SELA在20个数据集上的实验结果表明,其性能优于传统AutoML方法和基于LLM的代理,为AutoML领域带来了新的突破。
31 4
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
67 10
|
3天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
12月14日,由中国软件行业校园招聘与实习公共服务平台携手魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·湖南大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营

热门文章

最新文章