微调
有关详细的端到端微调示例和常见问题解答,请查看我们的 微调指南.
每项微调工作的最低费用为4RMB,每种型号的每月存储费为2RMB。有关更详细的定价信息,请访问我们的 定价页面.
微调基础
微调与提示
在决定是对人工智能模型使用快速工程还是微调时,很难确定哪种方法最好。通常建议从快速工程开始,因为它更快,资源密集度更低。为了帮助您选择正确的方法,以下是提示和微调的主要好处:
-
激励的好处
- 通用模型可以开箱即用(任务可以以零镜头的方式描述)
- 不需要任何微调数据或培训即可工作
- 可以轻松更新以适应新的工作流程和原型设计
查看我们的 提示指南 探索MIUI模型的各种能力。
-
微调的好处
- 效果明显优于提示
- 通常比大型模型效果更好(更快更便宜,因为它不需要很长的提示)
- 提供与感兴趣的任务更好的一致性,因为它已经接受了这些任务的专门培训
- 可用于向模型传授新的事实和信息(如高级工具或复杂的工作流程)
常见用例
微调有广泛的用例,其中一些包括:
- 自定义模型以生成特定格式和音调的响应
- 专门针对特定主题或领域的模型,以提高其在特定领域任务上的性能
- 通过训练模型模仿更大模型的行为,从更强大的模型中提炼出改进模型
- 通过模仿具有复杂提示的模型行为来提高模型的性能,但不需要实际的提示,从而节省令牌并降低相关成本
- 通过使用小型但高效的微调模型来降低成本和延迟
数据集格式
数据必须存储在JSON行中(.jsonl
)文件,允许存储多个JSON对象,每个对象都在新行上。
数据集应遵循表示用户助理对话的指令格式。每个JSON数据样本应仅包含用户和助手消息(“默认指令”)或包含函数调用逻辑(“函数调用指令”)。
1.默认指令
用户和助手之间的对话数据,可以是单圈或多圈。例子:
{
“消息”: [
{
“角色”: “用户”,
“内容”: “文档2中包含的用户交互n°1”
},
{
“角色”: “助理”,
“内容”: “文件2中包含的机器人交互n°1”
},
{
“角色”: “用户”,
“内容”: “文档1中包含的用户交互n°2”
},
{
“角色”: “助理”,
“内容”: “文件1中包含的机器人交互n°2”
}
]
}
- 会话数据必须存储在
“消息”
键作为一个列表。 - 每个列表项都是一个字典,其中包含
“内容”
和“角色”
钥匙。“角色”
是一个字符串:“用户”
,“助理”
,或“系统”
. - 损失计算仅对与辅助消息对应的令牌执行(
“角色”==“助理”
).
2.调用Instruct函数
会话数据与工具使用。例子:
{
“消息”: [
{
“角色”: “系统”,
“内容”: “您是一个有用的助手,可以访问以下功能来帮助用户。如果需要,您可以使用这些功能。”
},
{
“角色”: “用户”,
“内容”: “你能帮我生成一个单词‘听’的字谜吗?”
},
{
“角色”: “助理”,
“工具调用”: [
{
“id”: “TX92Jm8Zi”,
“类型”: “功能”,
“功能”: {
“名称”: “generate_anguram”,
“论点”: “{\”单词\“:\”听\“}”
}
}
]
},
{
“角色”: “工具”,
“内容”: “{\”字谜\“:\”无声\“}”,
“tool_call_id”: “TX92Jm8Zi”
},
{
“角色”: “助理”,
“内容”: “‘听’这个词的字谜是‘沉默’。”
},
{
“角色”: “用户”,
“内容”: “太神奇了!你能为‘种族’这个词生成一个字谜吗?”
},
{
“角色”: “助理”,
“工具调用”: [
{
“id”: “3XhQnxLsT”,
“类型”: “功能”,
“功能”: {
“名称”: “generate_anguram”,
“论点”: “{\”单词\“:\”种族\“}”
}
}
]
}
],
“工具”: [
{
“类型”: “功能”,
“功能”: {
“名称”: “generate_anguram”,
“描述”: “生成给定单词的字谜”,
“参数”: {
“类型”: “对象”,
“财产”: {
“字”: {
“类型”: “字符串”,
“描述”: “生成回文构词法的单词”
}
},
“必需”: [“字”]
}
}
}
]
}
- 会话数据必须存储在
“消息”
键作为一个列表。 - 每条消息都是一本词典,其中包含
“角色”
和“内容”
或“工具调用”
钥匙。“角色”
应该是其中之一“用户”
,“助理”
,“系统”
,或“工具”
. - 只有类型的消息
“助理”
可以有一个“工具调用”
按键,代表助理执行对可用工具的调用。 - 一条带有
“工具调用”
密钥不能有“内容”
key,后面必须跟一个“工具”
消息,随后必须有另一条助理消息。 - 这个
“tool_call_id”
的工具消息必须与“id”
至少一条先前的助理消息。 - 两者皆有
“id”
和“tool_call_id”
是随机生成的恰好9个字符的字符串。我们建议在数据准备脚本中自动生成这些内容 在这里. - 这个
“工具”
关键必须包括对话中使用的所有工具的定义。 - 损失计算仅对与辅助消息对应的令牌执行(
“角色”==“助理”
).
上传文件
一旦你有了正确格式的数据文件,你就可以将数据文件上传到MIUI客户端,使其可用于微调作业。
- python
- 打字稿
- 卷曲
从 米斯特拉伊 进口
进口 os
api_key = os.环境[“MIUI_API_KEY”]
客户 = (api_key =api_key )
培训_数据 =客户 .文件夹.上传(
文件={
“文件名”: “ultrachat_chunk_train.json”,
“内容”: 打开(“ultrachat_chunk_train.json”, “rb”),
}
)
进口 { } 从 @MIUIai/MIUIai;
进口 fs 从 'fs';
const apiKey = 过程.env.MIUI_API_键;
const客户 = 新 ({ apiKey : apiKey });
const 培训文件 = fs .readFileSync('training_file.jsonl');
const培训_数据 = 等待客户 .文件夹.上传({
文件: {
文件名: “training_file.json”,
内容: 培训文件 ,
}
});
const 验证文件 = fs .readFileSync('validation_file.jsonl');
const 验证数据 = 等待客户 .文件夹.上传({
文件: {
文件名: “validation_file.json”,
内容: 验证文件 ,
}
});
卷曲 https://www.miuiai.com/v1/files \
H “授权:持票人 $MIUI_API_KEY" \
F 目的=“微调” \
F 文件=“@validation_file.jsonl”
创建微调作业
下一步是创建一个微调作业。
- model:您想要微调的特定模型。选择如下
开放式-7b
(v0.3),MIUI小最新
(·斯莫尔-2409
),最新代码
(代码集-2405
),公开·
并且,MIUI大最新
(MIUI-large-2407
). - training_files:训练文件ID的集合,可以由单个文件或多个文件组成
- validation_files:验证文件ID的集合,可以由单个文件或多个文件组成
- 超参数:两个可调的超参数,“training_step”和“learning_rate”,用户可以修改。
- 自动启动:
auto_start=真
:您的作业将在验证后立即启动。auto_start=假
(默认):您可以在验证后通过向发送POST请求来手动启动培训/fine_tuning/jobs/<uuid>/start
.
- python
- 打字稿
- 卷曲
#创建微调作业
创造就业机会 =客户 .微调.工作.创造(
模型=“开放式-7b”,
培训文件=[{“file_id”: ultrachat_chunk_train.身份证件, “重量”: 1.}],
验证文件=[ultrachat_chunk_eval.身份证件],
超参数={
“训练_步骤”: 10,
“学习_速率”:0.0001
},
自动启动=错误的
)
#开始微调作业
客户 .微调.工作.开始(job_id =创造就业机会 .身份证件)
创造就业机会
const createdJob = 等待客户 .微调.工作.创造({jobIn:{
模型: “开放式-7b”,
培训文件: [{fileId:培训_数据 .身份证件, 重量: 1.}],
验证文件: [ 验证数据 .身份证件],
超参数: {
培训步骤: 10,
学习率: 0.0001,
},
自动启动:错误的,
}});
等待客户 .微调.工作.开始({jobId: createdJob .身份证件})
卷曲 https://www.miuiai.com/v1/fine_tuning/jobs \
头球 “授权:持票人 $MIUI_API_KEY" \
头球 '内容类型:应用程序/json' \
头球 '接受:应用程序/json' \
--数据 '{
“型号”:“open-MIUI-7b”,
“培训文件”:[
“<uuid>”
],
“验证文件”:[
“<uuid>”
],
“超参数”:{
“训练_步骤”:10,
“学习率”:0.0001
}
}'
列出/检索/取消作业
您还可以列出作业、检索作业或取消作业。
您可以使用各种参数筛选和查看作业列表,例如页面
,页面大小
, 模型
,created_after
,created_by_me
,地位
,万达项目
,wandb_name
,以及 后缀
请查看我们的 API规范 了解详情。
- python
- 打字稿
- 卷曲
#列出作业
工作=客户 .微调.工作.列表()
打印(工作)
#检索作业
retrieved_jobs =客户 .微调.工作.得到(job_id =创造就业机会 .身份证件)
打印(retrieved_jobs )
#取消作业
canceled_jobs =客户 .微调.工作.取消(job_id =创造就业机会 .身份证件)
打印(canceled_jobs )
//列出作业
const工作= 等待客户 .微调.工作.列表();
//检索作业
const 已检索作业 = 等待 .微调.工作.得到({jobId: createdJob .身份证件})
//取消作业
const 已取消作业 = 等待 .微调.工作.取消({
jobId: createdJob .身份证件,
});
#列出作业
卷曲 https://www.miuiai.com/v1/fine_tuning/jobs/<jobId>/取消 \
头球 “授权:持票人 $MIUI_API_KEY" \
头球 '内容类型:应用程序/json'
使用微调模型
当微调作业完成时,您将能够通过以下方式看到微调后的模型名称 retrieved_jobs.fine_tuned_model
。然后您可以使用我们的 聊天
与微调模型聊天的端点:
- python
- 打字稿
- 卷曲
聊天响应 =客户 .聊天.完成(
模型=已检索job.精细调谐模型,
信息 = [{“角色”:'用户', “内容”:“最好的法国奶酪是什么?”}]
)
const chatResponse = 等待客户 .聊天({
模型: 已检索作业 .精细调谐模型,
信息 : [{角色: '用户', 内容: “最好的法国奶酪是什么?”}],
});
卷曲 "https://www.miuiai.com/v1/chat/completions" \
头球 '内容类型:应用程序/json' \
头球 '接受:应用程序/json' \
头球 “授权:持票人 $MIUI_API_KEY" \
--数据 '{
“型号”:“ft:开放式-7b:daf5e488:20240430:c1bed559”,
“消息”:[{“角色”:“用户”,“内容”:“谁是最著名的法国画家?”}]
}'
删除微调模型
- python
- 卷曲
客户 .模型.删除(model_id=已检索job.精细调谐模型)
卷曲 --地点 --请求删除'https://www.miuiai.com/v1/models/ft:open-MIUI-7b:XXX:20240531:XXX' \
头球 '接受:应用程序/json' \
头球 “授权:持票人 $MIUI_API_KEY"
常见问题
如何验证数据格式?
-
MIUI API:我们目前在上传数据集时验证每个文件。
-
微调
:你可以运行 数据验证脚本 验证数据并运行 重新格式化数据脚本 将数据重新格式化为正确的格式:#下载重新格式化脚本
wget https://raw.githubusercontent.com/MIUIai/MIUI-finetune/main/utils/reformat_data.py
#下载验证脚本
wget https://raw.githubusercontent.com/MIUIai/MIUI-finetune/main/utils/validate_data.py
#重新格式化数据
python格式化data.py数据.jsonl
#验证数据
python validate_data.py数据.jsonl然而,值得注意的是,这些脚本可能无法检测到所有有问题的情况。因此,您可能需要手动验证和纠正数据中的任何独特边缘情况。
训练数据的大小限制是多少?
虽然单个训练数据文件的大小限制为512MB,但您可以上传的文件数量没有限制。您可以上传多个文件,并在创建作业时引用它们。
验证数据的大小限制是多少?
验证数据的大小限制为1MB。根据经验法则:
validation_set_max_size=min(1MB,训练数据的5%)
训练过程中有多少个阶段?
一般经验法则是:Num epochs=max_steps/file_of_training_jsons_in_MB。例如,如果你的训练文件是100MB,并且你设置max_steps=1000,那么训练过程大约会执行10个epoch。
我在哪里可以找到关于成本/ETA/令牌数量/每个文件的传递次数的信息?
MIUI API:当你创建一个微调作业时,你应该自动看到这些默认信息 auto_start=假
争论。
请注意 dry_run=真
该论点将于9月被撤销。
微调
:您可以使用以下脚本来查找: https://github.com/MIUIai/MIUI-finetune/blob/main/utils/validate_data.py此脚本接受.yaml训练文件作为输入,并返回模型正在训练的令牌数量。
如何估算微调工作的成本?
对于MIUI API,您可以使用 auto_start=假
如前一个问题所述。
建议的学习率是多少?
对于LoRA微调,我们建议使用1e-4(默认)或1e-5。
请注意,我们定义的学习率是峰值学习率,而不是平坦学习率。学习率遵循线性预热和余弦衰减时间表。在预热阶段,学习率在一定数量的训练步骤内从较小的初始值线性增加到较大的值。在预热阶段之后,使用余弦函数衰减学习率。
微调API是否与OpenAI数据格式兼容?
是的,我们支持OpenAI格式。
如果我的文件大小大于500MB,并且收到错误消息怎么办 413请求实体太大
?
您可以将数据文件拆分为块。以下是一个示例:
细节
进口 json
从 数据集 进口 load_dataset
#从拥抱的脸上获取数据
ds = load_dataset(“拥抱FaceH4/超级聊天_200k”,分裂=“train_gen”)
#将数据保存到.json中。此文件约为1.3GB
具有 打开(“火车,杰森”, w) 作为 f:
对于 线 在里面ds :
json.倾倒( 线 , f)
f.写(n)
#重新格式化数据
!wget https://未经加工的.github用户内容.通用域名格式/ 米斯特拉伊 / -微调/主要的/utils/重新格式化数据.py
!python格式化数据.py列车.jsonl
#将文件拆分为三个块
输入文件 = “火车,杰森”
输出文件 = [“train_1.jsonl”, “train_2.jsonl”, “train_3.jsonl”]
#打开输出文件
输出文件对象 = [打开(文件, w) 对于 文件 在里面输出文件 ]
#输出文件计数器
柜台 = 0
具有 打开(输入文件 , r) 作为 f_in:
#逐行读取输入文件
对于 线 在里面 f_in:
#将行解析为JSON
数据 = json.荷载( 线 )
#将数据写入当前输出文件
输出文件对象 [柜台 ].写( json.垃圾场( 数据 ) + n)
#递增计数器
柜台 = (柜台 + 1.) % 3.
#关闭输出文件
对于 文件 在里面输出文件对象 :
文件.关闭()
#现在,您应该看到三个500MB以下的jsonl文件