曂沅仴駦 发表于 2024-9-1 19:54:36

单卡 3 小时训练专属大模子 Agent:基于 LLaMA Factory 实战

弁言

Agent(智能体)是当今 LLM(大模子)应用的热门话题,通过任务分解(task planning)、工具调用(tool using)和多智能体协作(multi-agent cooperation)等途径,LLM Agent 有望突破传统语言模子能力边界,体现出更强的智能水平。在这之中,调用外部工具办理问题成为 LLM Agent 必不可缺的一项技能,模子根据用户问题从工具列表中选择恰当的工具,同时生成工具调用参数,综合工具返回效果和上下文信息总结出答案。通过调用外部工具,LLM 可以大概获取到实时、准确的知识,大大低沉了生成中的幻觉(hallucination)现象,使 LLM 的任务办理能力得到长足的提升。工具调用能力的得到离不开模子微调,尽管使用 ReAct 提示或其他预训练模子也能实现类似效果,但对于定制化或更加广泛的工具,对模子做进一步微调能有效地提升工具使用能力。本文将会带领各人使用 LLaMA Factory 的 Agent Tuning 功能,使用单张 GPU 在 3 小时内训练出本身专属的 LLM Agent。
训练框架

之前文章已经讲到,LLaMA Factory 是一个涵盖预训练、指令微调到 RLHF 阶段的开源全栈大模子微调框架,具备高效、易用、可扩展的优点,配备有零代码可视化的一站式网页微调界面 LLaMA Board。颠末半年多的升级迭代,LLaMA Board 网页微调界面在原先的基础上,丰富了多种新的功能,包括:


[*]支持约 120 种模子以及约 50 种数据集,包括最新的 DeepSeek MoE 混合专家模子
[*]使用 Flash Attention2 和算子优化技能,实现约 200% 的 LoRA 训练速率,大幅超越同类框架
[*]集成魔搭社区(ModelScope)下载渠道,国内用户可享受 100% 带宽的模子和数据下载
[*]同时包罗预训练、监督微调、RLHF、DPO 四种训练方法,支持 0-1 复现 ChatGPT 训练流程
[*]丰富的中英文参数提示,实时的状态监控和简洁的模子断点管理,支持网页重连和刷新
读者可以在 HuggingFace Spaces 或 魔搭社区 预览 LLaMA Board 网页微调界面。
模子与数据

本次我们选用零一万物发布的 Yi-6B 开源双语基座模子,该模子于 2023 年 11 月发布,拥有约 60 亿参数,通过在 3T 多语言语料上的预训练,取得了划一规模下优秀的中英文 Benchmark 效果,且允许免费商用。由于 Yi-6B 是一个预训练基座模子,并不具备对话能力,因此我们选用多个开源数据集对模子做指令监督微调(SFT)。在这些数据集中最关键的是工具调用数据集,该数据集包罗约十万条由 Glaive AI生成的关于工具调用的对话样本,我们将数据集处置惩罚为多角色的多轮对话样本,包罗用户(human)、模子(gpt)、工具调用(function_call)和工具返回效果(observation)四种差别角色,同时还有一个工具列表(tools)字段,以 OpenAI 的格式界说了可选工具。下面是数据集中的一个样本示例:
{
"conversations": [
    {
      "from": "human",
      "value": "I saw a dress that I liked. It was originally priced at $200 but it's on sale for 20% off. Can you tell me how much it will cost after the discount?"
    },
    {
      "from": "function_call",
      "value": "{\"name\": \"calculate_discount\", \"arguments\": {\"original_price\": 200, \"discount_percentage\": 20}}"
    },
    {
      "from": "observation",
      "value": "{\"discounted_price\": 160}"
    },
    {
      "from": "gpt",
      "value": "The dress will cost you $160 after the 20% discount."
    }
],
"tools": "[{\"name\": \"calculate_discount\", \"description\": \"Calculate the discounted price\", \"parameters\": {\"type\": \"object\", \"properties\": {\"original_price\": {\"type\": \"number\", \"description\": \"The original price of the item\"}, \"discount_percentage\": {\"type\": \"number\", \"description\": \"The percentage of discount\"}}, \"required\": [\"original_price\", \"discount_percentage\"]}}]"
}
如果读者想要加入自界说工具,只必要按照上述格式构造数据集即可。除此之外,我们也在本次训练中加入 Alpaca-GPT-4 数据集和 Open-Assistant 数据集以提升模子的通用对话能力。
情况预备

文章默认读者有至少不弱于 RTX 3090 24GB 的显卡和充足的系统内存,且安装了 CUDA 11.1-12.3 任一版本,关于 CUDA 情况的配置此处不予赘述。
我们已经将全部的程序打包,您可以选择本身的 Anaconda 情况,运行以下下令安装 LLaMA Factory。
pip install llmtuner==0.5.1
接着从 GitHub 下载数据集文件,这里以 Linux 下令行方法为示例,您也可以选择从 GitHub 网页下载,下载后切换到新的文件目录,运行 ls 下令应当显示同一级目录中存在 data 文件夹。
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
ls # data src tests ...
由于 LLaMA Board 网页微调界面仅支持单卡训练,必要设置情况变量指定使用的显卡序号。别的可以选择模子下载源,这里推荐国内用户使用魔搭社区下载渠道。
export CUDA_VISIBLE_DEVICES=0 # 使用第一块 GPU
export USE_MODELSCOPE_HUB=1 # 使用魔搭社区下载渠道
如果您使用的是 Windows 系统,同样必要配置相干情况变量。
set CUDA_VISIBLE_DEVICES=0
set USE_MODELSCOPE_HUB=1
然后使用下述下令启动 LLaMA Board 网页微调界面。
unset http_proxy https_proxy all_proxy # 关闭代理
python -m llmtuner.webui.interface
训练流程

① 打开浏览器,在地点栏输入 localhost:7860 进入 LLaMA Board,可以看到以下界面,点击左上角的 lang 选项中将界面语言切换为中文。
https://img-blog.csdnimg.cn/img_convert/258b252e39a9ad5728c1d1925d8b863e.webp?x-oss-process=image/format,png
② 点击模子名称,选择 Yi-6B 模子,此时模子路径默认会显示远程模子地点,如果您已经将模子文件全部下载至本地,可以手动将其修改为本地文件夹路径。
https://img-blog.csdnimg.cn/img_convert/fd2268be9bb27127e8eee49e8fb98409.webp?x-oss-process=image/format,png
③ 如果您已经安装过 Flash Attention-2 或 Unsloth,可以点击高级设置-加快方式提升训练速率,其中 Flash Attention-2可提升至 120% 左右的速率,Unsloth可提升至 170% 左右的速率。此处我们略过安装过程,请各位读者自行查阅参考文献中的 GitHub 仓库安装,如果两者均未安装,请保持加快方式为 None。
https://img-blog.csdnimg.cn/img_convert/e5576f5b4d48a7cb0f5d16ece8f10adc.webp?x-oss-process=image/format,png
④ 点击数据集,选择我们此次要使用的四个数据集 glaive_toolcall、alpaca_gpt4_en、alpaca_gpt4_zh 和 oaast_sft_zh,如果数据集下拉框为空缺,请检查数据路径是否精确。选择后点击预览数据集按钮可预览数据集。
https://img-blog.csdnimg.cn/img_convert/8ad0ca70ef1c19abf6d8f2386cf8b8ac.webp?x-oss-process=image/format,png
https://img-blog.csdnimg.cn/img_convert/1dac2b996f1144b6bfae7ed862e7953a.webp?x-oss-process=image/format,png
⑤ 训练参数中与显存占用有紧密关联的是截断长度和批处置惩罚巨细选项,我们临时保持默认。这里仅将训练轮数设置为 2.0,最大样本数设置为 8000,LoRA 参数设置-LoRA 作用模块设置为 all。
https://img-blog.csdnimg.cn/img_convert/04d6492b10f6af038f2fcb3484b67743.webp?x-oss-process=image/format,png
⑥ 将页面翻到底部,将输出目录设置为 yi-agent-6b,训练后的模子文件会生存在 saves/Yi-6B/lora/yi-agent-6b 中。点击预览下令按钮可以看到当前配置对应的下令行脚本,如果您想使用多卡训练,可以参考下述下令来编写多卡训练脚本。
https://img-blog.csdnimg.cn/img_convert/089fa0c2951bc55a39af3749e9ffd070.webp?x-oss-process=image/format,png
⑦ 点击开始按钮启动模子训练,训练日志和丧失变化图会实时显如今页面中,此时可以自由关闭或刷新网页,在本文的测试情况(A100 40GB * 1)下,约 3 小时即可完成模子训练。
https://img-blog.csdnimg.cn/img_convert/a0b6420c4a67ba3315a284f5c7684548.webp?x-oss-process=image/format,png
⑧ 训练结束后,我们切换到 Chat 栏,点击刷新适配器按钮,将适配器路径切换至 yi-agent-6b,点击加载模子按钮载入刚刚训练好的模子。
https://img-blog.csdnimg.cn/img_convert/9578c93a2e84c0b658ec7da619cdec4e.webp?x-oss-process=image/format,png
如果模子可以正常加载,那么恭喜你!仅花费一部影戏的时间,就成功训练出了本身专属的 LLM Agent。
效果展示

① 基本对话
https://img-blog.csdnimg.cn/img_convert/c6d1ffcd1f4394de748dc7047f13ed1f.webp?x-oss-process=image/format,png
② 工具调用 - 查询天气


[*]Yi-Agent-6B(本文微调的模子):精确理解工具返回效果并得出答案。
https://img-blog.csdnimg.cn/img_convert/21c7f17597e81ac452c7f8d6e27ad0fc.webp?x-oss-process=image/format,png


[*]Yi-6B-Chat(零一万物发布的指令模子):无法理解工具返回效果。
https://img-blog.csdnimg.cn/img_convert/5fc483ba77b9979ed4df42ccd3aee190.webp?x-oss-process=image/format,png
③ 工具调用 - 计算 GPA


[*]Yi-Agent 6B(本文微调的模子):精确生成工具调用并得到答案。
https://img-blog.csdnimg.cn/img_convert/8392a7e134a512f3bf06327ed2b68884.webp?x-oss-process=image/format,png


[*]Yi-6B-Chat(零一万物发布的指令模子):无法生成工具调用。
https://img-blog.csdnimg.cn/img_convert/766b172d10aa93fe55632cd3962f180c.webp?x-oss-process=image/format,png
从上述几个例子中可以看出,颠末微调后的 Yi-6B 模子成功具备了选择工具-调用工具-总结答案的精彩能力,在 Agent 方面的性能显著超越原始 Yi-6B-Chat 模子。由于网页界面功能有限,我们这里手动输入了工具调用效果,在下面的章节,我们将会展示怎样使用 LLaMA Factory 将 LLM Agent 部署到实际生产情况中。
模子部署

① 切换到 Export 栏,选择最大分块巨细为 2GB,填写导出目录为 models/yi-agent-6b,点击开始导出按钮,将 LoRA 权重合并到模子中,同时生存完整模子文件,生存后的模子可以通过 transformers 等直接加载。
https://img-blog.csdnimg.cn/img_convert/0cce40de3337724d5a7543f3a2a7e884.webp?x-oss-process=image/format,png
② 在终端输入以下下令启动 API 服务。
python -m llmtuner.api.app --model_name_or_path models/yi-agent-6b --template default
该下令会在本地启动一个和 OpenAI 格式相同的 RESTFul API,这时我们可以直接用本地模子来替代 GPT-3.5 的函数调用功能!下面是一个使用 openai-python 库来调用本地模子,实现 LLM Agent 功能的示例代码。
import os
import json
from openai import OpenAI
from typing import Sequence

os.environ["OPENAI_BASE_URL"] = "http://192.168.0.1:8000/v1" # 替换为本地主机 IP
os.environ["OPENAI_API_KEY"] = "0"

def calculate_gpa(grades: Sequence, hours: Sequence) -> float:
    grade_to_score = {"A": 4, "B": 3, "C": 2}
    total_score, total_hour = 0, 0
    for grade, hour in zip(grades, hours):
      total_score += grade_to_score * hour
      total_hour += hour
    return total_score / total_hour

tool_map = {
    "calculate_gpa": calculate_gpa
}

if __name__ == "__main__":
    client = OpenAI()
    tools = [
      {
            "type": "function",
            "function": {
                "name": "calculate_gpa",
                "description": "根据课程成绩和学时计算 GPA",
                "parameters": {
                  "type": "object",
                  "properties": {
                        "grades": {"type": "array", "items": {"type": "string"}, "description": "课程成绩"},
                        "hours": {"type": "array", "items": {"type": "integer"}, "description": "课程学时"},
                  },
                  "required": ["grades", "hours"],
                },
            },
      }
    ]
    messages = []
    messages.append({"role": "user", "content": "我的成绩是 A, A, B, C,学时是 3, 4, 3, 2"})
    result = client.chat.completions.create(messages=messages, model="yi-agent-6b", tools=tools)
    tool_call = result.choices.message.tool_calls.function
    name, arguments = tool_call.name, json.loads(tool_call.arguments)
    messages.append({"role": "function", "content": json.dumps({"name": name, "argument": arguments}, ensure_ascii=False)})
    tool_result = tool_map(**arguments)
    messages.append({"role": "tool", "content": json.dumps({"gpa": tool_result}, ensure_ascii=False)})
    result = client.chat.completions.create(messages=messages, model="yi-agent-6b", tools=tools)
    print(result.choices.message.content)
    # 根据你的成绩和学时,你的平均绩点 (GPA) 为 3.4166666666666665。
LLaMA Factory 在今后还将不断升级,欢迎各人关注我们的 GitHub 项目:
https://github.com/hiyouga/LLaMA-Factory​github.com/hiyouga/LLaMA-Factory
同时,我们也将本文的模子上传到了 Hugging Face,如果您有资源,肯定要亲主动手训练一个大模子 Agent!
https://huggingface.co/hiyouga/Yi-Agent-6B​huggingface.co/hiyouga/Yi-Agent-6B
怎样学习大模子 AI ?

由于新岗位的生产效率,要优于被取代岗位的生产效率,以是实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先把握AI的人,将会比较晚把握AI的人有竞争上风”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的原理。
我在一线互联网企业工作十余年里,引导过不少同行后辈。资助很多人得到了学习和发展。
我意识到有很多经验和知识值得分享给各人,也可以通过我们的能力和经验解答各人在人工智能学习中的很多狐疑,以是在工作繁忙的情况下还是对峙各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋侪无法得到精确的资料得到学习提升,故此将并将告急的AI大模子资料包括AI大模子入门学习头脑导图、佳构AI大模子学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
https://img-blog.csdnimg.cn/direct/80dfd54ec491457faa956c46afad1163.png#pic_center
第一阶段(10天):初阶应用

该阶段让各人对大模子 AI有一个最前沿的熟悉,对大模子 AI 的理解凌驾 95% 的人,可以在相干讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模子和业务衔接。


[*]大模子 AI 醒目什么?
[*]大模子是怎样得到「智能」的?
[*]用好 AI 的核心心法
[*]大模子应用业务架构
[*]大模子应用技能架构
[*]代码示例:向 GPT-3.5 灌入新知识
[*]提示工程的意义和核心思想
[*]Prompt 典型构成
[*]指令调优方法论
[*]头脑链和头脑树
[*]Prompt 攻击和防范
[*]…
第二阶段(30天):高阶应用

该阶段我们正式进入大模子 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话呆板人。把握功能最强的大模子开发框架,抓住最新的技能希望,得当 Python 和 JavaScript 程序员。


[*]为什么要做 RAG
[*]搭建一个简单的 ChatPDF
[*]检索的基础概念
[*]什么是向量表示(Embeddings)
[*]向量数据库与向量检索
[*]基于向量检索的 RAG
[*]搭建 RAG 系统的扩展知识
[*]混合检索与 RAG-Fusion 简介
[*]向量模子本地部署
[*]…
第三阶段(30天):模子训练

恭喜你,如果学到这里,你基本可以找到一份大模子 AI相干的工作,本身也能训练 GPT 了!通过微调,训练本身的垂直大模子,能独立训练开源多模态大模子,把握更多技能方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?


[*]为什么要做 RAG
[*]什么是模子
[*]什么是模子训练
[*]求解器 & 丧失函数简介
[*]小实验2:手写一个简单的神经网络并训练它
[*]什么是训练/预训练/微调/轻量化微调
[*]Transformer结构简介
[*]轻量化微调
[*]实验数据集的构建
[*]…
第四阶段(20天):贸易闭环

对全球大模子从性能、吞吐量、资本等方面有肯定的认知,可以在云端和本地等多种情况下部署大模子,找到得当本身的项目/创业方向,做一名被 AI 武装的产品司理。


[*]硬件选型
[*]带你了解全球大模子
[*]使用国产大模子服务
[*]搭建 OpenAI 代理
[*]热身:基于阿里云 PAI 部署 Stable Diffusion
[*]在本地计算机运行大模子
[*]大模子的私有化部署
[*]基于 vLLM 部署大模子
[*]案例:怎样优雅地在阿里云私有部署开源大模子
[*]部署一套开源 LLM 项目
[*]内容安全
[*]互联网信息服务算法备案
[*]…
学习是一个过程,只要学习就会有挑战。天道酬勤,你越积极,就会成为越优秀的本身。
如果你能在15天内完玉成部的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模子 AI 的精确特征了。
这份完整版的大模子 AI 学习资料已经上传CSDN,朋侪们如果必要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

https://img-blog.csdnimg.cn/img_convert/0dc35641cd2d85e39db6e8cb368fa5cb.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 单卡 3 小时训练专属大模子 Agent:基于 LLaMA Factory 实战