gpt-3.5-turbo模型微调指南
原创 人工智能写作 2023-08-24 07:42:21
作为微调示例,我们将使用RecipeNLG数据集进行微调,该数据集提供了各种食谱以及每个食谱中提取的通用成分列表。
我们将按照以下步骤进行操作:
1、设置:加载我们的数据集和必要的安装包。
2、数据准备:准备数据进行微调,创建训练和验证示例,并将其上传到Files接口。
3、微调:创建您的微调模型。
4、推理:使用您的微调模型进行推理。
完成这些步骤,您将能够训练、评估和部署一个经过微调的gpt-3.5-turbo模型。
1、设置
确保使用最新版本的openai python包
pip install --upgrade openai
import json
import openai
import os
import pandas as pd
from pprint import pprint
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "")
gpt-3.5-turbo在特定专业领域进行微调会达到很好的效果。请确保您的数据集足够精准和覆盖面广。
recipe_df=pd.read_csv("data/cookbook_recipes_nlg_10k.csv")
recipe_df.head()
2、数据准备
当使用 ChatCompletion 格式进行微调时,每个训练示例都是一个简单的消息列表(对话)。数据格式示例如下:
在训练过程中,此对话将被拆分,最终条目(也就是这里的assistant)将是模型生成的completion,其余消息充当Prompt。所以在构建训练示例数据时请注意这一点 - 如果您的模型将在多轮对话中起作用,那么请提供代表性示例,否则在对话开始扩展时它可能会表现不佳。请注意,目前每个训练示例的token限制为4096。任何超过此长度的内容都将被截断为4096 个token。
training_data = []
system_message = "You are a helpful recipe assistant. You are to extract the generic ingredients from each of the recipes provided."
def prepare_example_conversation(row):
messages = []
messages.append({"role": "system", "content": system_message})
user_message = f"""Title: {row['title']}\n\nIngredients: {row['ingredients']}\n\nGeneric ingredients: """
messages.append({"role": "user", "content": user_message})
messages.append({"role": "assistant", "content": row["NER"]})
return {"messages": messages}
pprint(prepare_example_conversation(recipe_df.iloc[0]))
您可以从30-50个经过精心修剪的示例开始。随着训练集大小的增加,您应该会看到性能继续线性扩展,但您的工作也会花费更长的时间。
# use the first 100 rows of the dataset for training
training_df = recipe_df.loc[0:100]
# apply the prepare_example_conversation function to each row of the training_df
training_data = training_df.apply(prepare_example_conversation, axis=1).tolist()
for example in training_data[:5]:
print(example)
除了训练数据之外,我们还可以提供验证数据(可选),这些数据将用于确保模型不会过度拟合您的训练集。
validation_df = recipe_df.loc[101:200]
validation_data = validation_df.apply(prepare_example_conversation, axis=1).tolist()
然后,我们需要将数据保存为 .jsonl 文件,每一行都是一个训练示例对话。
def write_jsonl(data_list: list, filename: str) -> None:
with open(filename, "w") as out:
for ddict in data_list:
jout = json.dumps(ddict) + "\n"
out.write(jout)
training_file_name="tmp_recipe_finetune_training.jsonl"
write_jsonl(training_data, training_file_name)
validation_file_name = "tmp_recipe_finetune_validation.jsonl"
write_jsonl(validation_data, validation_file_name)
上传文件
将文件上传到Files端口以供微调模型使用。
training_response = openai.File.create(
file=open(training_file_name, "rb"), purpose="fine-tune"
)
training_file_id = training_response["id"]
validation_response = openai.File.create(
file=open(validation_file_name, "rb"), purpose="fine-tune"
)
validation_file_id = validation_response["id"]
print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)
3、微调
现在我们使用生成的文件和可选的后缀来创建微调作业。响应将包含一个 ID,您可以使用它来查询作业的更新状态。
注意:文件必须首先由openai系统进行处理,因此您可能会收到“File not ready”错误。出现这种情况,只需几分钟后重试即可。
response = openai.FineTuningJob.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-3.5-turbo",
suffix="recipe-ner",
)
job_id = response["id"]
print("Job ID:", response["id"])
print("Status:", response["status"])
检查工作状态
您可以向 https://api.openai.com/v1/alpha/fine-tunes 接口发出GET请求来列出您的 alpha 微调作业。在这种情况下,您需要检查上一步获得的Job ID是否最终状态为:succeeded。
完成后,您可以使用 result_files 对验证集的结果进行采样(如果您上传了验证集),并使用fine_tuned_model参数中的ID来调用经过训练的模型。
response = openai.FineTuningJob.retrieve(job_id)
print("Job ID:", response["id"])
print("Status:", response["status"])
print("Trained Tokens:", response["trained_tokens"])
我们可以使用events接口跟踪微调的进度。您可以重新运行下面的单元几次,直到微调准备就绪。
response = openai.FineTuningJob.list_events(id=job_id, limit=50)
events = response["data"]
events.reverse()
for event in events:
print(event["message"])
现在已经完成了,我们可以从job中获取fine-tuned model ID:
response = openai.FineTuningJob.retrieve(job_id)
fine_tuned_model_id = response["fine_tuned_model"]
print("Fine-tuned model ID:", fine_tuned_model_id)
4、进行推理
最后一步就是使用经过微调的模型进行推理。与经典的FineTuning类似,您只需修改model参数为微调模型名称就可以调用ChatCompletions。
test_row = test_df.iloc[0]
test_messages = []
test_messages.append({"role": "system", "content": system_message})
user_message = create_user_message(test_row)
test_messages.append({"role": "user", "content": create_user_message(test_row)})
pprint(test_messages)
response = openai.ChatCompletion.create(
model=fine_tuned_model_id, messages=test_messages, temperature=0, max_tokens=500
)
print(response["choices"][0]["message"]["content"])
恭喜,您现在已完成微调您自己的模型!
人工智能写作团队致力于打造行业性AI应用模型,定制专业版AI微调模型,把人工智能与您现有的知识库和业务系统进行深度对接,打造更加智能和高效的企业应用,有需求的企业或个人可以与我们取得联系。
0 回答
默认排序
时间排序
暂无评论,快来发表你的评论吧!