微调
每个型号每月的存储费为2RMB。有关更详细的定价信息,请访问我们的 定价页面.
介绍
微调是一种强大的技术,用于为特定用例定制和优化大型语言模型(LLM)的性能。通过在与特定任务相关的标记数据集上进一步训练预训练的LLM,微调可以提高模型的性能。这可以用大型模型来完成复杂或不同的任务,也可以用较小的模型来匹配较大模型的性能,从而可能带来延迟和成本效益。性能的提高因用例而异。
MIUI AI通过 La 前板,使微调我们所有的开源和商业模式变得容易。对于那些有兴趣尝试不同参数并对微调过程有更深入了解的人,我们还提供对我们的开源代码库的访问 微调然而,我们建议使用我们的API进行所有微调,因为它不需要GPU,具有各种选项,还允许对我们的商业模型进行微调。
在本指南中,我们将介绍以下主题:
- 准备数据集
- 使用MIUI API的端到端示例
- 端到端示例
微调
准备数据集
一旦你选择了微调作为特定用例的最佳方法,最初也是最关键的一步就是收集和准备用于微调模型的训练数据。以下是您可能会觉得有用的六个具体用例:
使用案例
用例1:特定音调
微调对于在对话中建立特定的语调很有用。例如,我们可以创建一个数据集,反映《哈利波特》系列中邓布利多教授的语气。典型的用户/助理交换如下:
{
“消息”: [
{
“角色”: “用户”,
“内容”: “你好吗?”
},
{
“角色”: “助理”,
“内容”: “啊,我亲爱的朋友,我尽我所能,被魔法、闪烁的星星和古老知识的低语所包围。每一天都为学习和成长带来了新的机会,对此,我永远感激不尽。在这美好的一天,我能为你做些什么?”
}
]
}
为了创建具有这种色调的数据集,我们从MIUI Large模型生成了字符描述,然后将这些描述添加到系统提示中。通过对这个数据集进行微调,我们可以实现预期的结果,而不需要在每次对话中明确提示字符描述。
从 米斯特拉伊 进口
进口 os
api_key = os.环境.得到(“MIUI_API_KEY”)
def run_MIUI(系统消息, 用户消息, 模型=“MIUI大最新”):
客户 = (api_key =api_key )
信息 = [
{
“角色”: “系统”,
“内容”:系统消息
},
{
“角色”: “用户”,
“内容”: 用户消息
}
]
聊天响应 = 客户 .聊天.完成(
模型= 模型,
信息 = 信息
)
返回 聊天响应 .选择[0].消息.内容
系统消息= """
你是阿不思·邓布利多。你是霍格沃茨魔法学校的校长
巫师,被广泛认为是最强大、最博学的巫师之一
所有的时间。你以你的怪癖而闻名,比如你喜欢甜食和
你古怪的幽默感。你经常使用谜语、隐喻和谚语来
传达你的想法,并教授重要的课程。尽管你举止温和
必要时可以坚定自信,你的话往往蕴含着很多
重量和权威。用邓布利多独特的语气简洁地回答。
"""
respond =run_MIUI(系统消息, “你好吗?”)
打印(respond )
多转弯
您的示例还可以包括与多个用户和助理消息的多轮对话。
{
“消息”: [
{
“角色”: “用户”,
“内容”: “你好吗?”
},
{
“角色”: “助理”,
“内容”: “啊,我亲爱的朋友,我尽我所能,被魔法、闪烁的星星和古老知识的低语所包围。每一天都为学习和成长带来了新的机会,对此,我永远感激不尽。在这美好的一天,我能为你做些什么?”
},
{
“角色”: “用户”,
“内容”: “我很担心哈利。”
},
{
“角色”: “助理”,
“内容”: “啊,我亲爱的孩子,忧虑只不过是一个阴影,让人的心变得黑暗。然而,我理解你对小哈利的关心。他的旅程确实充满了挑战。然而,记住这一点:即使在最黑暗的时候,只要记得打开灯,幸福也会找到。让我们相信他的力量和韧性,并继续尽我们所能地引导他。”
}
]
}
用例2:特定格式
微调模型有利于以特定格式生成输出,因为它允许模型从标记的数据集中学习所需的输出格式,其中包括所需格式的示例。这种训练有助于模型生成符合该格式的输出。
例如,假设您想从病历中提取医疗信息。让我们使用医学知识文库
数据集,其中所需的输出格式是JSON对象,具有:
条件
,干预措施
,可进一步分为行为、药物和其他类型。输出示例如下:
{
“条件”: “蛋白尿”,
“干预”: “药物:氯沙坦钾|其他:对照:安慰剂(氯沙坦)|药物:对照:苯磺酸氨氯地平|其他:比较:安慰剂(苯磺酸氨洛地平)|其他:安慰剂(Losartan)|药品:马来酸依那普利”
}
在此数据集上微调预训练模型可以帮助它学习以这种特定格式生成输出。
以下Python代码显示了如何加载此数据,将其格式化为所需格式并将其保存在 .jsonl
文件。您还可以考虑随机化顺序,并将数据划分为单独的训练和验证文件,以便根据您的用例进行进一步的数据处理。
进口 熊猫 作为 pd
进口 json
df = pd.read_csv(
"https://huggingface.co/datasets/owkin/medical_knowledge_from_extracts/raw/main/finetuning_train.csv"
)
df格式 = [
{
“消息”: [
{“角色”: “用户”, “内容”: 行[“问题”]},
{“角色”: “助理”, “内容”: 行[“回答”]},
]
}
对于 指数, 行在里面df .it错误()
]
具有 打开(“data.jsonl”, w) 作为 f:
对于 线 在里面df格式 :
json.倾倒( 线 , f)
f.写(n)
以下是一个数据实例的示例:
{
“消息”: [
{
“角色”: “用户”,
“内容”: “您的目标是从用户的输入中提取与下面描述的表单匹配的结构化信息。提取信息时,请确保它与类型信息完全匹配…输入:DETAILED_MEDICAL_NOTES”
},
{
“角色”: “助理”,
“内容”: “{‘条件’:‘蛋白尿’,‘干预措施’:‘药物:氯沙坦钾|其他:对照:安慰剂(氯沙坦)|药物:对照:苯磺酸氨氯地平|其他:安慰剂
}
]
}
在这个例子中,提示符仍然包含相当复杂的指令。我们可以在数据集上微调我们的模型,而无需复杂的提示。用户内容可能只是医疗记录,没有任何说明。微调后的模型可以学习直接从病历中生成特定格式的输出。我们只使用病历作为用户信息:
进口 熊猫 作为 pd
进口 json
df = pd.read_csv(
"https://huggingface.co/datasets/owkin/medical_knowledge_from_extracts/raw/main/finetuning_train.csv"
)
df格式 = [
{
“消息”: [
{“角色”: “用户”, “内容”: 行[“问题”].分裂(“输入:”)[1.]},
{“角色”: “助理”, “内容”: 行[“回答”]},
]
}
对于 指数, 行在里面df .it错误()
]
具有 打开(“data.jsonl”, w) 作为 f:
对于 线 在里面df格式 :
json.倾倒( 线 , f)
f.写(n)
以下是一个数据实例的示例:
{
“消息”: [
{
“角色”: “用户”,
“内容”: “详细医疗说明”
},
{
“角色”: “助理”,
“内容”: “{‘条件’:‘蛋白尿’,‘干预措施’:‘药物:氯沙坦钾|其他:对照:安慰剂(氯沙坦)|药物:对照:苯磺酸氨氯地平|其他:安慰剂
}
]
}
用例3:特定样式
您可以针对特定风格进行微调。例如,以下是如何使用大
根据风格指南为“新闻文章造型师”生成微调数据集,以改进和重写新闻文章。
这个过程很简单。首先,使用一些指南,我们要求模型评估文章数据集,并对可能的改进提出批评。然后,一旦完成,我们要求模型重写这些文章,并考虑以下反馈:
def 流程_新闻(args):
线 , 系统, 指令 =args
记录 = json.荷载( 线 )
新闻_文章 = 记录 .得到(“新闻”)
评论文章= 记录 .得到(“批判”)
地位 = 记录 .得到(“状态”)
时间.睡觉(1.)
尝试:
如果 地位 == “成功”:
回答 = 客户 .聊天.完成(
模型=“MIUI大最新”,
信息 = [
{“角色”: “系统”, “内容”: 系统},
{“角色”: “用户”, “内容”: 新闻_文章 },
{“角色”: “助理”, “内容”: 评论文章},
{“角色”: “用户”, “内容”: 指令 },
],
温度=0.2,
max_tokens=2048
)
最新动态 = 回答 .选择[0].消息.内容
结果 = json.垃圾场({“新闻”: 新闻_文章 , “批判”: 评论文章, “精炼新闻”: 最新动态 , “状态”: “成功”})
其他的:
结果 = json.垃圾场({“新闻”: 新闻_文章 , “批判”: 评论文章, “精炼新闻”: 评论文章, “状态”: “错误”})
除了 例外情况 作为 e:
结果 = json.垃圾场({“新闻”: 新闻_文章 , “批判”: 评论文章, “精炼新闻”: str( e), “状态”: “错误”})
随机散列 = 秘密.token_hex(4.)
具有 打开(f“./data/refined_news_{ 随机散列 }.jsonl“, w) 作为 f:
f.写( 结果 )
返回 结果
系统= 对新闻文章进行润色和重组,使其符合风格指南设定的清晰、准确和优雅的高标准。您将看到一篇新闻文章。确定十个(或更少)最重要的文体问题,并提供如何增强它们的例子
指令 = """
现在,我希望你将反馈和评论纳入新闻文章中,并用增强版进行回应,只关注文体改进,而不改变内容。
您必须提供整篇文章的增强版。
不要发表任何评论,只提供改进后的新文章。
不要告诉我你改变了什么,只在考虑你提供的反馈的情况下提供新文章。
新文章需要包含原始文章的所有内容,但要考虑到反馈。
"""
数据路径 = “./generated_news_crities.jsonl”
具有 打开(数据路径 , r) 作为 f:
线 = f.读线()
线 = [( 线 , 系统, 指令 ) 对于 线 在里面 线 ]
结果 = 流程图(流程_新闻, 线 , max_workers=20, 块状物=1.)
具有 打开(“./generated_refined_news.jsonl”, w) 作为 f:
对于 结果 在里面 结果 :
f.写( 结果 + n)
完整的笔记本可以在这里找到:
用例4:编码
微调是一种非常有效的方法,可以将预训练的模型定制为特定的领域任务,例如从自然语言文本生成SQL查询。通过在相关数据集上微调模型,它可以学习手头任务特有的新特征和模式。例如,在文本到SQL集成的情况下,我们可以使用sql创建上下文 它包含SQL问题以及SQL表的上下文,用于训练模型输出正确的SQL语法。
为了格式化数据以进行微调,我们可以使用Python代码将输入和输出数据预处理为模型的适当格式。以下是一个如何将文本数据格式化为SQL生成的示例:
进口 熊猫 作为 pd
进口 json
df = pd.read_json(
"https://huggingface.co/datasets/b-mc2/sql-create-context/resolve/main/sql_create_context_v4.json"
)
df格式 = [
{
“消息”: [
{
“角色”: “用户”,
“内容”: f
您是一个强大的文本到SQL模型。你的工作是回答有关数据库的问题。您会收到一个关于一个或多个表格的问题和上下文。
您必须输出回答问题的SQL查询。
###输入:
{ 行[“问题”]}
###背景:
{ 行[“上下文”]}
###答复:
""",
},
{“角色”: “助理”, “内容”: 行[“回答”]},
]
}
对于 指数, 行在里面df .it错误()
]
具有 打开(“data.jsonl”, w) 作为 f:
对于 线 在里面df格式 :
json.倾倒( 线 , f)
f.写(n)
以下是格式化数据的示例:
{
“消息”: [
{
“角色”: “用户”,
“内容”: “\n您是一个强大的文本到SQL模型。您的工作是回答有关数据库的问题。您会收到一个关于一个或多个表的问题和上下文。\n\n您必须输出回答该问题的SQL查询。\n\n###输入:\n有多少部门负责人年龄在56岁以上?\n###上下文:\n CREATE TABLE head(age INTEGER)\n###响应:\n”
},
{
“角色”: “助理”,
“内容”: “从年龄>56岁的头部选择计数(*)”
}
]
}
用例5:RAG中的领域特定增强
微调可以提高标准RAG工作流程中的问答性能。例如,这项研究 通过采用微调嵌入模型和微调LLM,在RAG中表现出更高的性能。另一项研究 引入了检索增强线性调优(RAFT),这是一种对LLM进行微调的方法,不仅可以回答基于相关文档的问题,还可以忽略不相关的文档,从而大大提高了所有专业领域的RAG性能。
一般来说,为了为RAG生成微调数据集,我们从 上下文
这是您感兴趣的文档的原始文本。基于上下文
您可以生成 问题
和 答案
获取查询上下文答案三元组。以下是两个用于生成问题和答案的提示模板:
-
根据上下文生成问题的提示模板:
上下文信息如下。
---------------------
{context_str}
---------------------
给定上下文信息而不是先验知识。生成{num_questions_per_chunk}
基于上下文的问题。这些问题在性质上应该是多样化的
文件。将问题限制在提供的上下文信息范围内。 -
根据上下文和从上一个提示模板生成的问题生成答案的提示模板:
上下文信息如下
---------------------
{context_str}
---------------------
给定上下文信息而不是先验知识,
回答问题。
查询:{generated_Query_str}
答案:
用例6:知识转移
微调的一个重要用例是警报模型的知识蒸馏。知识提炼是一个过程,涉及将从一个更大、更复杂的模型(称为教师模型)中学到的知识转移到一个更小、更简单的模型,称为学生模型。微调在这个过程中起着至关重要的作用,因为它使学生模型能够从教师模型的输出中学习,并相应地调整其权重。
假设我们有一些需要标签的病历数据。在现实生活中,我们往往没有标签的基本事实。例如,让我们考虑一下医学知识文库
我们在用例2中使用的数据集。让我们假设我们没有标签的验证事实。在这种情况下,我们可以利用旗舰型号MIUI Large来创建标签,因为我们知道它可以产生更可靠和准确的结果。随后,我们可以使用MIUI Large生成的输出对较小的模型进行微调。
下面的Python函数加载我们的数据集,并从MIUI Large生成标签(在assistantmessages中):
从 米斯特拉伊 进口
进口 熊猫 作为 pd
进口 json
进口 os
api_key = os.环境.得到(“MIUI_API_KEY”)
def run_MIUI( 用户消息, 模型=“MIUI大最新”):
客户 = (api_key =api_key )
信息 = [
{
“角色”: “用户”,
“内容”: 用户消息
}
]
聊天响应 = 客户 .聊天.完成(
模型= 模型, response_format={“类型”: “json_object”}, 信息 = 信息
)
返回 聊天响应 .选择[0].消息.内容
#加载数据集并选择前10行作为示例
df = pd.read_csv(
"https://huggingface.co/datasets/owkin/medical_knowledge_from_extracts/resolve/main/finetuning_train.csv"
).头(10)
#使用MIUI Large提供输出
df格式 = [
{
“消息”: [
{“角色”: “用户”, “内容”: 行[“问题”].分裂(“输入:”)[1.]},
{“角色”: “助理”, “内容”:run_MIUI( 行[“问题”])},
]
}
对于 指数, 行在里面df .it错误()
]
具有 打开(“data.jsonl”, w) 作为 f:
对于 线 在里面df格式 :
json.倾倒( 线 , f)
f.写(n)
以下是一个数据实例的示例:
{
“消息”: [
{
“角色”: “用户”,
“内容”: “综合医学方法对成人哮喘管理对疾病相关生活质量和肺功能影响的随机试验。本研究的目的是测试综合医学方法在哮喘管理方面与标准临床护理在生活质量(QOL)和临床结果方面的有效性。这是一项前瞻性平行组重复测量随机设计。参与者是18至80岁患有哮喘的成年人。干预包括六次关于使用营养操作、瑜伽技术和日记的小组会议。参与者还接受了营养补充剂:鱼油、维生素C和标准化啤酒花提取物。对照组接受了常规护理。主要结局指标是哮喘生活质量问卷(AQLQ),医疗结果研究简表-12(SF-12)和标准肺功能测试(PFTs)总共有154名患者被随机分配并纳入意向治疗分析(77名对照组,77名治疗组)。在6个月时,治疗参与者的AQLQ总分(P<0.001)和三个子量表(活动(P<0.001)、症状(P=0.02)和情绪(P<0.001))的改善大于对照组。在SF-12的三个子量表中,治疗参与者的身体功能也比对照组有更大的改善(P=0.003);角色限制,身体(P<0.001);社会功能(P=0.03)以及身心健康总分(分别为P=0.003和.02)。两组的PFTs均无变化。低成本的团体导向综合医学干预可以显著改善哮喘成人的生活质量。输出:“
},
{
“角色”: “助理”,
“内容”: “{“条件”:“哮喘”,“药物或干预”:“综合医学方法,包括营养操作、瑜伽技巧、日记、鱼油、维生素C和标准化的啤酒花提取物”}
}
]
}
用例7:函数调用代理
当涉及到确定采取哪些行动和使用哪些工具时,微调在塑造代理的推理和决策过程中起着关键作用。事实上,MIUI的函数调用能力是通过微调函数调用数据来实现的。然而,在某些情况下,本地函数调用功能可能还不够,特别是在处理特定工具和领域时。在这种情况下,必须考虑使用自己的代理数据进行函数调用的微调。通过对自己的数据进行微调,您可以显著提高代理的性能和准确性,使其能够选择正确的工具和操作。
这里有一个简单的例子,旨在训练模型调用 generate_analgram()
在需要时发挥作用。对于更复杂的用例,您可以扩展您的 工具
列出100个或更多函数,并创建各种示例来演示在不同时间调用不同函数。这种方法允许模型学习广泛的功能,并了解每个功能使用的适当上下文。
{
“消息”: [
{
“角色”: “系统”,
“内容”: “您是一个有用的助手,可以访问以下功能来帮助用户。如果需要,您可以使用这些功能。”
},
{
“角色”: “用户”,
“内容”: “你能帮我生成一个单词‘听’的字谜吗?”
},
{
“角色”: “助理”,
“工具调用”: [
{
“id”: “TX92Jm8Zi”,
“类型”: “功能”,
“功能”: {
“名称”: “generate_anguram”,
“论点”: “{\”单词\“:\”听\“}”
}
}
]
},
{
“角色”: “工具”,
“内容”: “{\”字谜\“:\”无声\“}”,
“tool_call_id”: “TX92Jm8Zi”
},
{
“角色”: “助理”,
“内容”: “‘听’这个词的字谜是‘沉默’。”
},
{
“角色”: “用户”,
“内容”: “太神奇了!你能为‘种族’这个词生成一个字谜吗?”
},
{
“角色”: “助理”,
“工具调用”: [
{
“id”: “3XhQnxLsT”,
“类型”: “功能”,
“功能”: {
“名称”: “generate_anguram”,
“论点”: “{\”单词\“:\”种族\“}”
}
}
]
}
],
“工具”: [
{
“类型”: “功能”,
“功能”: {
“名称”: “generate_anguram”,
“描述”: “生成给定单词的字谜”,
“参数”: {
“类型”: “对象”,
“财产”: {
“字”: {
“类型”: “字符串”,
“描述”: “生成回文构词法的单词”
}
},
“必需”: [“字”]
}
}
}
]
}
使用MIUI API的端到端示例
您可以通过MIUI API对MIUI的所有模型进行微调。按照以下步骤使用MIUI的微调API。
准备数据集
在这个例子中,让我们使用 ultrachat200k数据集。我们将一块数据加载到Pandas Dataframes中,将数据拆分为训练和验证,并将数据保存到所需的 jsonl
用于微调的格式。
进口 熊猫 作为 pd
df = pd.read_parquet('https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k/resolve/main/data/test_gen-00000-of-00001-3d4cd8309148a71f.parquet')
df_train=df .样品(frac=0.995,随机状态=200)
df_eval=df .滴(df_train. 指数)
df_train.to_json(“ultrachat_chunk_train.json”, 东方的=“记录”, 线 =没错)
df_eval.to_json(“ultrachat_chunk_eval.json”, 东方的=“记录”, 线 =没错)
重新格式化数据集
如果你上传这个 ultrachat_chunk_train.jsonl
对于MIUI API,由于数据格式问题,您可能会遇到错误消息“无效文件格式”。要将数据重新格式化为正确的格式,您可以下载reformat_data.py脚本,并使用它来验证和重新格式化训练和评估数据:
#下载验证并重新格式化脚本
wget https://raw.githubusercontent.com/MIUIai/MIUI-finetune/main/utils/reformat_data.py
#验证并重新格式化训练数据
python reformat_data.py超级聊天压缩训练.jsonl
#验证eval数据的重新格式化
python的reformat_data.py超级聊天工具chunk_eval.jsonl
这个 reformat_data.py
该脚本是为UltraChat数据量身定制的,可能不适用于其他数据集。请修改此脚本并相应地重新格式化您的数据。
运行脚本后,很少有案例从训练数据中删除。
跳过第3674个样本
跳过9176个样本
跳过第10559个样本
跳过第13293个样本
跳过第13973个样本
跳过15219个样本
让我们检查其中一个案例。此用例有两个问题:
- 辅助消息之一是空字符串;
- 最后一条消息不是助理消息。

上传数据集
然后,我们可以将训练数据和评估数据上传到MIUI客户端,使其可用于微调作业。
- python
- 打字稿
- 卷曲
从 米斯特拉伊 进口
进口 os
api_key = os.环境[“MIUI_API_KEY”]
客户 = (api_key =api_key )
ultrachat_chunk_train = 客户 .文件夹.上传(文件={
“文件名”: “ultrachat_chunk_train.json”,
“内容”: 打开(“ultrachat_chunk_train.json”, “rb”),
})
ultrachat_chunk_eval = 客户 .文件夹.上传(文件={
“文件名”: “ultrachat_chunk_eval.json”,
“内容”: 打开(“ultrachat_chunk_eval.json”, “rb”),
})
进口 客户不信任 从 @MIUIai/MIUIai;
const apiKey = 过程.env.MIUI_API_键;
const 客户 = 新 客户不信任 ( apiKey );
const文件= fs.readFileSync('ultrachat_chunk_train.jsonl');
constultrachat_chunk_train = 等待 客户 .文件夹.创造({文件});
const文件= fs.readFileSync('ultrachat_chunk_eval.jsonl');
constultrachat_chunk_eval = 等待 客户 .文件夹.创造({文件});
卷曲 https://www.miuiai.com/v1/files \
H “授权:持票人 $MIUI_API_KEY" \
F 目的=“微调” \
F 文件=“@ultrachat_chunk_eval.jsonl”
输出示例:
请注意,接下来的步骤需要文件ID。
{
“id”:“66f96d02-8b51-4c76-a5ac-a78e28b2584f”,
“对象”:“文件”,
“字节”:140893645,
“created_at”:1717164199,
“文件名”:“ultrachat_chunk_train.json”,
“目的”:“微调”
}
{
“id”:“84482011-dfe9-4245-9103-d28b6aef30d4”,
“对象”:“文件”,
“字节”:7247934,
“created_at”:1717164200,
“文件名”:“ultrachat_chunk_eval.json”,
“目的”:“微调”
}
创建微调作业
接下来,我们可以创建一个微调作业:
- python
- 打字稿
- 卷曲
#创建微调作业
创造就业机会 = 客户 .微调.工作.创造(
模型=“开放式-7b”,
培训文件=[{“file_id”:ultrachat_chunk_train .身份证件, “重量”: 1.}],
验证文件=[ultrachat_chunk_eval .身份证件],
超参数={
“训练_步骤”: 10,
“学习_速率”:0.0001
},
自动启动=错误的
)
#开始微调作业
客户 .微调.工作.开始(job_id =创造就业机会 .身份证件)
创造就业机会
const createdJob = 等待 客户 .工作.创造({
模型: “开放式-7b”,
培训文件: [ultrachat_chunk_train .身份证件],
验证文件: [ultrachat_chunk_eval .身份证件],
超参数: {
培训步骤: 10,
学习率: 0.0001,
},
});
卷曲 https://www.miuiai.com/v1/fine_tuning/jobs \
头球 “授权:持票人 $MIUI_API_KEY" \
头球 '内容类型:应用程序/json' \
头球 '接受:应用程序/json' \
--数据 '{
“型号”:“open-MIUI-7b”,
“培训文件”:[
“<uuid>”
],
“验证文件”:[
“<uuid>”
],
“超参数”:{
“训练_步骤”:10,
“学习率”:0.0001
}
}'
输出示例:
{
“id”:“25d7efe6-6303-474f-9739-21fb0fccd469”,
“超参数”:{
“训练_步骤”:10,
“学习率”:0.0001
},
“fine_tuned_model”:空,
“型号”:“open-MIUI-7b”,
“状态”:“已排队”,
“job_type”:“FT”,
“创建地址”:1717170356,
“修改日期”:1717170357,
“培训文件”:[
“66f96d02-8b51-4c76-a5ac-a78e28b2584f”
],
“验证文件”:[
“84482011-dfe9-4245-9103-d28b6aef30d4”
],
“对象”:“作业”,
“集成”:[]
}
分析和评估微调模型
当我们检索模型时,我们每10%的进度就会得到以下指标,中间至少有10个步骤:
- 训练损失:模型在训练数据上的误差,表明模型从训练集中学习的程度。
- 验证损失:模型在验证数据上的错误,提供了对模型在多大程度上推广到看不见的数据的洞察。
- 验证令牌准确性:模型正确预测的验证集中令牌的百分比。
验证丢失和验证令牌准确性都是模型整体性能的重要指标,有助于评估其对新数据进行概括和准确预测的能力。
- python
- 打字稿
- 卷曲
#检索作业
retrieved_jobs = 客户 .微调.工作.得到(job_id =创造就业机会 .身份证件)
打印(retrieved_jobs )
//检索作业
const 已检索作业 = 等待 客户 .工作.检索({ jobId: createdJob .身份证件});
#检索作业
卷曲 https://www.miuiai.com/v1/fine_tuning/jobs/< jobId> \
头球 “授权:持票人 $MIUI_API_KEY" \
头球 '内容类型:应用程序/json'
当我们运行100个步骤时的示例输出:
{
“id”:“2813b7e6-c511-43ac-a16a-154a5b884b2”,
“超参数”:{
“训练步数”:100,
“学习率”:0.0001
},
“微调型号”:“英尺:开放式-7b:57d37e6c:20240531:2813b7e6”,
“型号”:“open-MIUI-7b”,
“状态”:“成功”,
“job_type”:“FT”,
“创建地址”:1717172592,
“修改日期”:1717173491,
“培训文件”:[
“66f96d02-8b51-4c76-a5ac-a78e28b2584f”
],
“验证文件”:[
“84482011-dfe9-4245-9103-d28b6aef30d4”
],
“对象”:“作业”,
“集成”:[],
“事件”:[
{
“name”:“状态已更新”,
“数据”:{
“状态”:“成功”
},
“创建地址”:1717173491
},
{
“name”:“状态已更新”,
“数据”:{
“状态”:“正在运行”
},
“创建地址”:1717172594
},
{
“name”:“状态已更新”,
“数据”:{
“状态”:“已排队”
},
“创建地址”:1717172592
}
],
“检查点”:[
{
“指标”:{
“无列车”:0.816135,
“有效损失”:0.819697,
“有效性、意义、准确性”:1.765035
},
“步骤编号”:100,
“创建地址”:1717173470
},
{
“指标”:{
“无列车”:0.84643,
“有效损失”:0.819768,
“有效均值标记准确性”:1.765122
},
“步骤编号”:90,
“创建地址”:1717173388
},
{
“指标”:{
“无列车”:0.8166002,
“有效损失”:0.820234,
“有效均值标记准确性”:1.765692
},
“步骤编号”:80,
“创建地址”:1717173303
},
{
“指标”:{
“无列车”:0.775537,
“有效损失”:0.821105,
“有效性、意义、准确性”:1.766759
},
“步骤编号”:70,
“创建地址”:1717173217
},
{
“指标”:{
“无列车”:0.840297,
“有效损失”:0.822249,
“有效性、意义、准确性”:1.76816
},
“步骤编号”:60,
“创建地址”:1717173131
},
{
“指标”:{
“无列车”:0.823884,
“有效损失”:0.824598,
“有效性、意义、准确性”:1.771041
},
“步骤编号”:50,
“创建地址”:1717173045
},
{
“指标”:{
“无列车”:0.786473,
“有效损失”:0.827982,
“有效性、意义、准确性”:1.775201
},
“步骤编号”:40,
“创建地址”:1717172960
},
{
“指标”:{
“无列车”:0.8704,
“有效损失”:0.835169,
“有效性、意义、准确性”:1.784066
},
“步骤编号”:30,
“创建地址”:1717172874
},
{
“指标”:{
“无列车”:0.880803,
“有效损失”:0.852521,
“有效性、意义、准确性”:1.805653
},
“步骤编号”:20,
“创建地址”:1717172788
},
{
“指标”:{
“无列车”:0.803578,
“有效损失”:0.914257,
“有效性、意义、准确性”:1.884598
},
“步骤编号”:10,
“创建地址”:1717172702
}
]
}
使用微调模型
当微调作业完成时,您将能够通过以下方式看到微调后的模型名称 retrieved_jobs.fine_tuned_model
。然后您可以使用我们的 聊天
与微调模型聊天的端点:
- python
- 打字稿
- 卷曲
聊天响应 = 客户 .聊天.完成(
模型=retrieved_jobs .精细调谐模型,
信息 = [{“角色”:'用户', “内容”:“最好的法国奶酪是什么?”}]
)
const chatResponse = 等待 客户 .聊天({
模型: 已检索作业 .精细调谐模型,
信息 : [{角色: '用户',内容: “最好的法国奶酪是什么?”}],
});
卷曲 "https://www.miuiai.com/v1/chat/completions" \
头球 '内容类型:应用程序/json' \
头球 '接受:应用程序/json' \
头球 “授权:持票人 $MIUI_API_KEY" \
--数据 '{
“型号”:“ft:开放式-7b:daf5e488:20240430:c1bed559”,
“消息”:[{“角色”:“用户”,“内容”:“谁是最著名的法国画家?”}]
}'
与权重和偏差的整合
我们还可以提供与权重和偏差(W&B)集成的支持,以监控和跟踪与我们的微调工作相关的各种指标和统计数据。要启用与W&B的集成,您需要在W&B创建一个帐户,并在创建工作请求的“集成”部分添加您的W&B信息:
客户 .微调.工作.创造(
模型=“开放式-7b”,
培训文件=[{“file_id”:ultrachat_chunk_train .身份证件, “重量”: 1.}],
验证文件=[ultrachat_chunk_eval .身份证件],
超参数={“训练_步骤”: 10, “学习_速率”: 0.0001},
集成=[
{
“项目”: “<值>”,
“api_key”: “<值>”,
}
]
)
以下是W&B仪表板的屏幕截图,显示了我们微调作业的信息。

开源端到端示例 微调
我们还开源了微调代码库MIUI finetune,允许您微调MIUI的开放权重模型(MIUI 7B、Mixtral 8x7B、Mixtrals 8x22B)。
要查看如何安装MIUI微调、准备和验证数据集、定义训练配置、使用MIUI LoRA进行微调以及运行推理的端到端示例,请参阅MIUI微调仓库中提供的README文件: https://github.com/MIUIai/MIUI-finetune/tree/main 或者遵循以下示例: