小模型也能有类o1的慢思考能力?使用CAMEL生成CoT数据、Unsloth微调Qwen2.5-1.5B模型并上传至Hugging Face

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
视觉智能开放平台,图像资源包5000点
简介: 本项目利用CAMEL生成高质量的CoT数据,结合Unsloth对Qwen2.5-1.5B模型进行微调,并将结果上传至Hugging Face。通过详细步骤介绍从数据生成到模型微调的完整流程,涵盖环境配置、API密钥设置、ChatAgent配置、问答数据生成与验证、数据转换保存、模型微调及推理保存等内容。最终展示了如何优化问答系统并分享实用技巧。[CAMEL-AI](https://github.com/camel-ai/camel) 是一个开源社区,致力于智能体扩展研究。欢迎在GitHub上关注并加入我们!

小模型也能有类o1的慢思考能力?使用CAMEL生成CoT数据、Unsloth微调Qwen2.5-1.5B模型并上传至Hugging Face

在本项目中,我们将使用CAMEL的CotDataGenerator生成高质量的问答对数据,结合Unsloth对Qwen模型进行微调,并将生成的数据和微调后的模型上传至Hugging Face平台。本文将详细介绍从数据生成到模型微调的完整流程,并分享一些实用的技巧和注意事项。

1. 项目背景与工具介绍

1.1 CAMEL-AI

CAMEL-AI
是一个开源社区,致力于寻找智能体的扩展规律。我们相信,大规模研究这些智能体可以为了解它们的行为、能力和潜在风险提供有价值的见解。为了促进该领域的研究,我们实现并支持各种类型的智能体、任务、提示、模型和模拟环境。

CAMEL
是一个强大的多智能体系统,本文主要利用它的数据合成能力:生成类似CoT(Chain-of-Thought)的思维链数据。CAMEL支持多种模型,包括Openai、qwen模型等系列,能够高效地生成多样化的训练数据。

本文的完整cookbook在线运行链接:
https://drive.google.com/file/u/1/d/1AnpeyVcYpCTa8oN1Po20fIXya-pv9A1Q/view?usp=sharing

1.3 Qwen模型

Qwen是一个开源的大语言模型,具有多种参数规模(如1.5B、3B等),适合在各种自然语言处理任务中进行微调。我们将使用Unsloth对Qwen模型进行微调,使其能够更好地理解和生成与特定任务相关的内容。

2. 环境准备

首先,我们需要在Google Colab中设置环境,并安装所需的库。以下是安装步骤:

# 安装必要的库
!pip install camel-ai==0.2.15a0
!pip install unsloth
!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir --no-deps git+https://github.com/unslothai/unsloth.git

3. 设置API密钥

为了使用CAMEL和OpenAI的GPT模型,我们需要设置OpenAI的API密钥:

from getpass import getpass
import os

openai_api_key = getpass('Enter your OpenAI API key: ')
os.environ["OPENAI_API_KEY"] = openai_api_key

4. 配置ChatAgent

我们使用CAMEL的ChatAgent来生成数据。首先,定义一个系统消息来设置Agent的默认角色和行为:

sys_msg = 'You are a genius at slow-thinking data and code'

接下来,使用ModelFactory设置后端模型。CAMEL支持多种模型,这里我们使用GPT-4 Mini:

from camel.models import ModelFactory
from camel.types import ModelPlatformType, ModelType
from camel.configs import ChatGPTConfig

model = ModelFactory.create(
    model_platform=ModelPlatformType.OPENAI,
    model_type=ModelType.GPT_4O_MINI,
    model_config_dict=ChatGPTConfig().as_dict(),
)

然后,创建ChatAgent实例:

from camel.agents import ChatAgent
chat_agent = ChatAgent(
    system_message=sys_msg,
    model=model,
    message_window_size=10,
)

5. 加载问答数据

我们从一个JSON文件中加载问答数据。首先,从GitHub获取示例数据并保存到本地:

import requests
import json

url = 'https://raw.githubusercontent.com/zjrwtx/alldata/refs/heads/main/qa_data.json'
response = requests.get(url)

if response.status_code == 200:
    json_data = response.json()
    file_path = 'qa_data.json'
    with open(file_path, 'w', encoding='utf-8') as json_file:
        json.dump(json_data, json_file, ensure_ascii=False, indent=4)
    print(f"JSON data successfully saved to {file_path}")
else:
    print(f"Failed to retrieve JSON file. Status code: {response.status_code}")

加载数据:

with open(file_path, 'r', encoding='utf-8') as f:
    qa_data = json.load(f)

6. 生成CoT数据

我们使用CAMEL的CotDataGenerator生成CoT数据。首先,创建CotDataGenerator实例:

from camel.datagen.Cotdatagen import CotDataGenerator

testo1 = CotDataGenerator(chat_agent, golden_answers=qa_data)

然后,生成并验证问答对:

generated_answers = {
   }

for question in qa_data.keys():
    print(f"Question: {question}")
    answer = testo1.get_answer(question)
    generated_answers[question] = answer
    print(f"AI's thought process and answer:\n{answer}")
    is_correct = testo1.verify_answer(question, answer)
    print(f"Answer verification result: {'Correct' if is_correct else 'Incorrect'}")
    print("-" * 50)

7. 数据转换与保存

将生成的问答数据转换为Alpaca训练数据格式,并保存到JSON文件:

def transform_qa_format(input_file):
    with open(input_file, 'r', encoding='utf-8') as f:
        data = json.load(f)

    transformed_data = []
    for question, answer in data['qa_pairs'].items():
        transformed_pair = {
   
            "instruction": question,
            "input": "",
            "output": answer
        }
        transformed_data.append(transformed_pair)

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    output_file = f'transformed_qa_{timestamp}.json'

    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(transformed_data, f, ensure_ascii=False, indent=2)

    return output_file, transformed_data

output_file, transformed_data = transform_qa_format(simplified_file)
print(f"Transformation complete. Output saved to: {output_file}")

8. 上传数据至Hugging Face

我们使用Hugging Face的API将生成的数据上传至平台。首先,设置Hugging Face的API密钥:

HUGGING_FACE_TOKEN = getpass('Enter your HUGGING_FACE_TOKEN: ')
os.environ["HUGGING_FACE_TOKEN"] = HUGGING_FACE_TOKEN

然后,上传数据:

username = input("Enter your HuggingFace username: ")
dataset_name = input("Enter dataset name (press Enter to use default): ").strip()
if not dataset_name:
    dataset_name = None

try:
    dataset_url = upload_to_huggingface(transformed_data, username, dataset_name)
    print(f"\nData successfully uploaded to HuggingFace!")
    print(f"Dataset URL: {dataset_url}")
except Exception as e:
    print(f"Error uploading to HuggingFace: {str(e)}")

9. 模型微调

我们使用Unsloth对Qwen模型进行微调。首先,加载模型并配置LoRA:

from unsloth import FastLanguageModel
import torch

max_seq_length = 2048
dtype = None
load_in_4bit = True

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/Qwen2.5-1.5B",
    max_seq_length = max_seq_length,
    dtype = dtype,
    load_in_4bit = load_in_4bit,
)

model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 16,
    lora_dropout = 0,
    bias = "none",
    use_gradient_checkpointing = "unsloth",
    random_state = 3407,
    use_rslora = False,
    loftq_config = None,
)

然后,将数据转换为训练格式并开始训练:

from datasets import load_dataset
dataset = load_dataset("zjrwtxtechstudio/o1data06", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,)

from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    dataset_num_proc = 2,
    packing = False,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 5,
        max_steps = 60,
        learning_rate = 2e-4,
        fp16 = not is_bfloat16_supported(),
        bf16 = is_bfloat16_supported(),
        logging_steps = 1,
        optim = "adamw_8bit",
        weight_decay = 0.01,
        lr_scheduler_type = "linear",
        seed = 3407,
        output_dir = "outputs",
        report_to = "none",
    ),
)

trainer_stats = trainer.train()

10. 模型推理与保存

训练完成后,我们可以使用微调后的模型进行推理:

FastLanguageModel.for_inference(model)

inputs = tokenizer(
    [
        alpaca_prompt.format(
            "how many r in strawberry?",
            "",
            "",
        )
    ],
    return_tensors="pt"
).to("cuda")

outputs = model.generate(**inputs, max_new_tokens=4096, use_cache=True)
decoded_outputs = tokenizer.batch_decode(outputs, skip_special_tokens=True)
print(decoded_outputs[0])

最后,将微调后的模型保存并上传至Hugging Face:

model.save_pretrained("lora_model")
tokenizer.save_pretrained("lora_model")
model.push_to_hub("zjrwtxtechstudio/qwen2.5-1.5b-math-test", token = "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")
tokenizer.push_to_hub("zjrwtxtechstudio/qwen2.5-1.5b-math-test", token = "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")

11. 总结

通过本项目,我们展示了如何使用CAMEL生成高质量的CoT数据,并使用Unsloth对Qwen模型进行微调。整个过程涵盖了从数据生成、模型微调到模型部署的完整流程,展示了如何利用现代AI工具和平台构建和优化问答系统。

如果你对CAMEL感兴趣,欢迎在GitHub上给我们点个⭐️,并加入我们的社区!

本文的完整cookbook在线运行链接:
https://drive.google.com/file/u/1/d/1AnpeyVcYpCTa8oN1Po20fIXya-pv9A1Q/view?usp=sharing

相关文章
|
8月前
|
机器学习/深度学习 人工智能 开发工具
如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face
Hugging Face是一个机器学习(ML)和数据科学平台和社区,帮助用户构建、部署和训练机器学习模型。它提供基础设施,用于在实时应用中演示、运行和部署人工智能(AI)。用户还可以浏览其他用户上传的模型和数据集。Hugging Face通常被称为机器学习界的GitHub,因为它让开发人员公开分享和测试他们所训练的模型。 本次分享如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face。
如何快速部署本地训练的 Bert-VITS2 语音模型到 Hugging Face
|
8月前
|
存储 人工智能 机器人
使用CLIP和LLM构建多模态RAG系统
在本文中我们将探讨使用开源大型语言多模态模型(Large Language Multi-Modal)构建检索增强生成(RAG)系统。本文的重点是在不依赖LangChain或LLlama index的情况下实现这一目标,这样可以避免更多的框架依赖。
482 0
|
2月前
|
人工智能 JSON 算法
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
阿里云的人工智能平台 PAI,作为一站式、 AI Native 的大模型与 AIGC 工程平台,为开发者和企业客户提供了 Qwen2.5-Coder 系列模型的全链路最佳实践。本文以Qwen2.5-Coder-32B为例,详细介绍在 PAI-QuickStart 完成 Qwen2.5-Coder 的训练、评测和快速部署。
Qwen2.5-Coder 系列模型在 PAI-QuickStart 的训练、评测、压缩及部署实践
|
3天前
|
自然语言处理 物联网 API
使用CAMEL和Unsloth进行数据生成与Qwen模型微调
本项目结合CAMEL和Unsloth,生成高质量训练数据并对Qwen 7B模型进行微调,提升其在特定内容上的理解和生成能力。我们使用CAMEL生成指令-输入-输出三元组数据,并通过Unsloth的LoRA技术加速微调过程。详细步骤包括环境准备、API密钥设置、模型加载与配置、数据生成与保存、模型训练及推理。最终,微调后的Qwen 7B模型能更好地处理CAMEL社区相关文本。 更多详情请参考: - [CAMEL GitHub](https://github.com/camel-ai/camel)
|
2月前
|
机器学习/深度学习 人工智能 监控
AutoTrain:Hugging Face 开源的无代码模型训练平台
AutoTrain 是 Hugging Face 推出的开源无代码模型训练平台,旨在简化最先进模型的训练过程。用户无需编写代码,只需上传数据即可创建、微调和部署自己的 AI 模型。AutoTrain 支持多种机器学习任务,并提供自动化最佳实践,包括超参数调整、模型验证和分布式训练。
146 4
AutoTrain:Hugging Face 开源的无代码模型训练平台
|
7月前
|
自然语言处理 监控 并行计算
Qwen2大模型微调入门实战(完整代码)
该教程介绍了如何使用Qwen2,一个由阿里云通义实验室研发的开源大语言模型,进行指令微调以实现文本分类。微调是通过在(指令,输出)数据集上训练来改善LLMs理解人类指令的能力。教程中,使用Qwen2-1.5B-Instruct模型在zh_cls_fudan_news数据集上进行微调,并借助SwanLab进行监控和可视化。环境要求Python 3.8+和英伟达显卡。步骤包括安装所需库、准备数据、加载模型、配置训练可视化工具及运行完整代码。训练完成后,展示了一些示例以验证模型性能。相关资源链接也一并提供。
Qwen2大模型微调入门实战(完整代码)
|
5月前
|
API Python
LangChain 构建问题之训练自己的ToolLLaMA模型如何解决
LangChain 构建问题之训练自己的ToolLLaMA模型如何解决
27 0
|
5月前
|
机器学习/深度学习 数据采集 人工智能
【AI大模型】Transformers大模型库(十一):Trainer训练类
【AI大模型】Transformers大模型库(十一):Trainer训练类
126 0
|
5月前
|
人工智能 自然语言处理 API
【AI大模型】Transformers大模型库(十二):Evaluate模型评估
【AI大模型】Transformers大模型库(十二):Evaluate模型评估
134 0
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比
【AI大模型】Transformers大模型库(九):大模型微调之计算微调参数占比
67 0