微调

学习如何自定义模型以适应您的应用程序。

介绍

微调可以让您从API提供的模型中获得更多优势,包括:

  • 比提示更高质量的结果
  • 能够训练比提示中可以容纳的更多示例
  • 由于提示更短,而节省令牌
  • 更低的延迟请求

OpenAI的文本生成模型已经在大量的文本上进行了预训练。为了有效地使用这些模型,我们在提示中包括说明和有时几个示例。使用示例来展示如何执行任务通常被称为“少示例学习”。

微调通过在比提示中可以容纳的更多示例上进行训练来改善少示例学习,使您能够在各种任务上获得更好的结果。一旦模型被微调,您就不再需要在提示中提供那么多示例。 这将节省成本并启用更低的延迟请求。

在高级别上,微调涉及以下步骤:

  1. 准备和上传培训数据
  2. 训练新的微调模型
  3. 评估结果并(如果需要)返回到步骤1
  4. 使用您的微调模型

有关微调模型培训和使用情况的费用,请参见我们的定价页面

哪些模型可以进行微调?

目前,可以对以下模型进行微调:gpt-3.5-turbo-0125(推荐),gpt-3.5-turbo-1106gpt-3.5-turbo-0613babbage-002davinci-002gpt-4-0613(实验性)。

您还可以对微调模型进行微调,这在您获得了更多数据并且不希望重复以前的培训步骤时非常有用。

我们认为gpt-3.5-turbo对于大多数用户来说是最合适的模型,结果和易于使用方面都有优势。

何时使用微调

微调OpenAI的文本生成模型可以使其更适合于特定的应用程序,但这需要仔细投入时间和精力。我们建议首先尝试使用提示工程,提示链接(将复杂任务分解为多个提示)和函数调用来获得良好的结果,原因如下:

  • 有些任务我们的模型可能最初看起来不能很好地完成,但是通过使用正确的提示可以改善结果,因此可能不需要微调。
  • 与微调相比,迭代提示和其他技巧的反馈循环要更快。
  • 在需要微调的情况下,最初的提示工程工作并没有浪费,我们通常在使用微调数据中的好提示(或将提示链接/工具使用与微调结合)时获得最佳结果。

我们的提示工程指南介绍了一些获得更好性能而无需微调的最有效策略和技巧。您可能会发现在我们的游乐场中快速迭代提示是有帮助的。

常见用例

准备您的数据集

一旦您确定微调是适合的解决方案(例如,您已经优化了您的提示,但是模型仍然存在问题),您需要为培训模型准备数据。您应该创建一组与您将在生产中要求模型响应的会话类似的示例会话。

数据集中的每个示例都应该是与我们的Chat Completions API相同格式的会话,即一系列消息,每条消息都有一个角色,内容和一个可选名称。 至少有些培训示例应该直接针对模型在提示时不表现如愿的情况,并且数据中提供的助手消息应该是您希望模型提供的理想响应。

在接下来的部分中,我们将介绍如何为微调设置数据以及各种示例,微调可以提高基线模型的性能。

另一个微调有效的方案是在降低成本和/或延迟的同时保持质量,方法是用gpt-3.5-turbo模型替换GPT-4或者使用更短的提示。如果您能够使用GPT-4获得良好的结果,则通常可以通过对GPT-4完成的微调来实现与gpt-3.5-turbo模型的类似质量,可能还会使用缩短的说明提示。

示例格式

在此示例中,我们的目标是创建一个偶尔给出讽刺回复的聊天机器人,以下是我们为数据集创建的三个培训示例(会话):

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

对于babbage-002davinci-002,您可以按照以下所示的提示完成对格式进行微调:

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

多轮聊天示例

聊天格式的示例可以具有多条助手角色的消息。默认情况下,在微调期间,将在单个示例中训练所有助手消息。要跳过对特定助手消息的微调,可以添加weight键以禁用对该消息的微调,从而控制哪些助手消息被学习。weight的当前允许值为0或1。 以下是使用weight进行聊天格式的一些示例:

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

制作提示

一般来说,我们建议采取在模型微调之前发现适合模型的一组说明和提示,并将其包含在每个培训示例中。这样做应该可以让您获得最好和最一般的结果,尤其是如果您的培训示例相当少(例如,少于100个)。

如果您希望缩短在每个示例中重复的说明或提示以节省成本,请注意,模型可能会像这些说明已经包含在内一样行事,并且在推理时可能很难让模型忽略这些“烘焙”的说明。

可能需要更多的培训示例才能获得良好的结果,因为模型必须在没有指导性说明的情况下仅通过示例进行学习。

微调示例计数建议

要微调一个模型,您至少需要提供10个示例。我们通常在使用gpt-3.5-turbo进行微调时看到明确的改善,但正确的数量因具体用例而异。

我们建议从50个精心制作的演示开始,并查看模型是否有改善迹象。在某些情况下,这可能是足够的,但即使模型尚未达到生产质量,明显的改善也是一个好迹象,表明提供更多数据将继续提高模型。没有改善表明您可能需要重新考虑如何为模型设置任务或重新组织数据,而不是扩展超过有限示例集的范围。

训练和测试拆分

收集初始数据集后,我们建议将其拆分为训练和测试部分。在提交微调作业时同时提供训练和测试文件,我们将在训练过程中提供有关训练和测试的统计信息。这些统计信息将是您的初始信号,表明模型正在改善。此外,在训练之前构造测试集将在评估模型方面有所帮助,方法是生成测试集上的样本。

令牌限制

令牌限制取决于您选择的模型。对于gpt-3.5-turbo-0125,最大上下文长度为16,385,因此每个训练示例也限制为16,385个令牌。对于gpt-3.5-turbo-0613,每个训练示例限制为4,096个令牌。如果示例长于默认值,它们将被截断为最大上下文长度,从示例末尾移除令牌。为了确保您的整个训练示例适合上下文,请考虑检查消息内容中的总令牌计数是否在限制范围内。

您可以使用我们的计算令牌笔记本从OpenAI的配方簿中计算令牌。

估算成本

请参阅定价页面了解有关成本的详细信息每1,000个输入和输出令牌(我们不收取令牌的费用,这些令牌是验证数据的一部分)。要估算特定微调作业的成本,请使用以下公式:

基本成本每1,000个令牌输入文件中的令牌数训练的时期数

对于一个包含100,000个令牌的训练文件,在3个时期内训练的预期成本为~2.40美元。

检查数据格式

一旦您编译了数据集并且在创建微调作业之前,重要的是检查数据格式。为此,我们创建了一个简单的Python脚本,您可以使用它来查找潜在的错误,查看令牌计数并估算微调作业的成本。

Fine-tuning data format validation

上传训练文件

一旦您已经对数据进行了验证,文件需要使用Files API进行上传,以便与微调作业一起使用。

from openai import OpenAI

client = OpenAI()

client.files.create(
  file=open("mydata.jsonl", "rb"),
  purpose="fine-tune"
)

上传文件后,可能需要一些时间来处理。在文件处理期间,您可以创建微调作业,但是直到文件处理完毕,它才会启动。

最大文件上传大小为1 GB,但我们不建议使用该大小的数据进行微调,因为您可能不需要那么多数据就能看到改善。

创建微调模型

确保您的数据集具有正确的大小和结构,并且已经上传了文件,下一步是创建微调作业。我们支持通过微调UI或以编程方式创建微调作业。

要使用OpenAI SDK启动微调作业:

from openai import OpenAI

client = OpenAI()

client.fine_tuning.jobs.create(
  training_file="file-abc123",
  model="gpt-3.5-turbo"
)

在此示例中,model是要微调的模型的名称(gpt-3.5-turbobabbage-002davinci-002或现有的微调模型),training_file是在将训练文件上传到OpenAI API时返回的文件ID。您可以使用suffix parameter自定义微调模型的名称。

要设置其他微调参数,例如validation_filehyperparameters,请参考微调API的规范

启动微调作业后,可能需要一些时间才能完成。您的作业可能会排队在我们系统中的其他作业后面,并且根据模型和数据集大小,训练模型可能需要几分钟或几个小时。在模型训练完成后,创建微调作业的用户将收到一封确认电子邮件。

除了创建微调作业,您还可以列出现有的作业检索作业的状态取消作业

from openai import OpenAI

client = OpenAI()

# List 10 fine-tuning jobs
client.fine_tuning.jobs.list(limit=10)

# Retrieve the state of a fine-tune
client.fine_tuning.jobs.retrieve("ftjob-abc123")

# Cancel a job
client.fine_tuning.jobs.cancel("ftjob-abc123")

# List up to 10 events from a fine-tuning job
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-abc123", limit=10)

# Delete a fine-tuned model (must be an owner of the org the model was created in)
client.models.delete("ft:gpt-3.5-turbo:acemeco:suffix:abc123")

使用微调模型

当作业成功时,您将在检索作业详细信息时看到fine_tuned_model字段被填充了模型的名称。现在,您可以将其指定为Chat Completions(对于gpt-3.5-turbo)或遗留Completions API(对于babbage-002davinci-002)中的参数,并使用Playground对其进行请求。

作业完成后,模型应该立即可用于推理。在某些情况下,可能需要几分钟才能将您的模型加载到准备好处理请求的状态。如果您的模型超时或者无法找到模型名称,则可能是因为您的模型正在加载中。如果发生这种情况,请在几分钟后再试。

from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(
  model="ft:gpt-3.5-turbo:my-org:custom_suffix:id",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Hello!"}
  ]
)

print(completion.choices[0].message)

现在,您可以按照我们的文本生成指南中所述开始进行请求。

使用检查点模型

除了在每个微调作业的末尾创建最终微调模型,OpenAI还会在每个训练时期的末尾为您创建一个完整的模型检查点。这些检查点本身就是完整的模型,可以在我们的completions和chat-completions端点中使用。检查点对于提供在经历过拟合之前的微调模型的版本而言是有用的。

要访问这些检查点,请执行以下操作:

  1. 等待作业成功,您可以通过查询作业的状态来验证。
  2. 使用您的微调作业ID查询检查点端点,以访问微调作业的模型检查点列表。

对于每个检查点对象,您将看到fine_tuned_model_checkpoint字段被填充了检查点模型的名称。现在,您可以按照使用微调模型中所述使用此模型。

{
  "object": "fine_tuning.job.checkpoint",
  "id": "ftckpt_zc4Q7MP6XxulcVzj4MZdwsAB",
  "created_at": 1519129973,
  "fine_tuned_model_checkpoint": "ft:gpt-3.5-turbo-0125:my-org:custom-suffix:96olL566:ckpt-step-2000",
  "metrics": {
    "full_valid_loss": 0.134,
    "full_valid_mean_token_accuracy": 0.874
  },
  "fine_tuning_job_id": "ftjob-abc123",
  "step_number": 2000
}

每个检查点都将指定其:

  • step_number:创建检查点的步骤(其中每个时期的步骤数是训练集中的步骤数除以批量大小)
  • metrics:一个对象,包含在创建检查点的步骤时微调作业的指标。

目前,只保存并且可用于最后3个时期的检查点。我们计划在未来发布更复杂和灵活的检查点策略。

分析微调模型

我们提供了在训练过程中计算的以下训练指标:

  • 训练损失
  • 训练令牌准确率
  • 验证损失
  • 验证令牌准确率

验证损失和验证令牌准确率以两种方式计算:在每个步骤的小批量数据上和在每个时期末的全部验证拆分上。全验证损失和全验证令牌准确率是最准确的指标,用于跟踪您的模型的整体性能。这些统计信息旨在提供一个健全性检查,以确保训练顺利进行(损失应降低,令牌准确率应增加)。虽然在活动微调作业期间,您可以查看一个事件对象,其中包含一些有用的指标:

{
  "object": "fine_tuning.job.event",
  "id": "ftevent-abc-123",
  "created_at": 1693582679,
  "level": "info",
  "message": "Step 300/300: training loss=0.15, validation loss=0.27, full validation loss=0.40",
  "data": {
    "step": 300,
    "train_loss": 0.14991648495197296,
    "valid_loss": 0.26569826706596045,
    "total_steps": 300,
    "full_valid_loss": 0.4032616495084362,
    "train_mean_token_accuracy": 0.9444444179534912,
    "valid_mean_token_accuracy": 0.9565217391304348,
    "full_valid_mean_token_accuracy": 0.9089635854341737
  },
  "type": "metrics"
}

微调作业完成后,您还可以通过查询微调作业,提取文件ID,然后检索该文件的内容来查看有关训练过程的指标。每个结果CSV文件都有以下列:steptrain_losstrain_accuracyvalid_lossvalid_mean_token_accuracy

step,train_loss,train_accuracy,valid_loss,valid_mean_token_accuracy
1,1.52347,0.0,,,
2,0.57719,0.0,,,
3,3.63525,0.0,,,
4,1.72257,0.0,,,
5,1.52379,0.0,,,

虽然指标可能有所帮助,但生成微调模型的样本并进行评估可以提供最相关的模型质量感知。我们建议在测试集上生成基础模型和微调模型的样本,并在其旁边进行比较。测试集应该包括您可能在生产用例中向模型发送的输入的全部分布。如果手动评估耗时过长,请考虑使用我们的Evals库来自动化未来的评估。

迭代数据质量

如果微调作业的结果不及预期,请考虑以下方式调整训练数据集:

  • 收集示例以针对剩余问题:如果模型在某些方面表现不佳,请添加直接显示如何正确处理这些方面的训练示例。
  • 仔细检查现有示例中的问题:如果您的模型存在语法、逻辑或风格问题,请检查数据是否存在相同的问题。例如,如果模型现在说“我将为您安排会议”(而不应该这么说),请查看是否有现有示例教导模型说它可以做一些事情,而实际上它不能做。
  • 考虑数据的平衡和多样性:如果助手回复中的60%都是“我无法回答这个问题”,但在推理时只有5%的回复应该这么说,那么您可能会收到过多的拒绝。
  • 确保您的训练示例包含所需的所有信息:如果我们希望模型根据用户的个性特征进行赞美,并且训练示例中的助手赞美了未在前面对话中找到的特征,那么模型可能会学会幻觉信息。
  • 查看训练示例中的一致性:如果多个人创建了训练数据,则模型性能可能受到人们之间的一致性水平的限制。例如,在一个文本提取任务中,如果人们只同意70%的提取片段,那么模型可能无法做得更好。
  • 确保所有训练示例都采用了与推理预期相同的格式。

迭代数据量

一旦您对示例的质量和分布感到满意,您可以考虑扩展训练示例的数量。这通常有助于模型更好地学习任务,尤其是在可能的“边缘情况”方面。我们预计每次将训练示例的数量倍增时,都会获得类似的改善。您可以通过以下方式粗略估计预期的质量获益:

  • 使用当前数据集进行微调
  • 使用当前数据集的一半进行微调
  • 观察两者之间的质量差距

一般来说,如果您必须进行权衡,高质量的少量数据通常比低质量的大量数据更有效。

迭代超参数

我们允许您指定以下超参数:

  • epochs
  • learning rate multiplier
  • batch size

我们建议最初不指定这些参数,让我们为您根据数据集大小选择一个默认值,然后在观察到以下情况时进行调整:

  • 如果模型未能如预期那样遵循训练数据,请增加epochs的数量1或2。这对于有单个理想完成(或一小组类似的理想完成)的任务更常见。一些示例包括分类、实体提取或结构化解析。这些通常是您可以计算出与参考答案的最终准确度度量的任务。
  • 如果模型的多样性比预期的少,请减少epochs的数量1或2。这对于有一整个范围的可能良好完成的任务更常见。
  • 如果模型未能收敛,请增加learning rate multiplier。

您可以按照以下方式设置超参数:

client.fine_tuning.jobs.create(
  training_file="file-abc123",
  model="gpt-3.5-turbo",
  hyperparameters={
    "n_epochs": 3,
    "learning_rate_multiplier": 0.1,
    "batch_size": 64
  }
)

微调示例

现在我们已经探索了微调 API 的基础知识,让我们来看一下在几种不同的情况下进行微调生命周期。

风格和语调

在这个例子中,我们将探索如何构建一个微调模型,使其在提示的范围之外遵循特定的风格和语调指导。

首先,我们创建一组示例消息,显示模型应该做什么,在这种情况下是错误的单词。

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}

如果您想要遵循本示例并自行创建微调模型,您需要至少 10 个示例。

获取到可能改善模型的数据后,下一步是检查数据是否满足所有格式要求

现在我们已经格式化并验证了数据,最后一步是启动一个作业来创建微调模型。您可以通过 OpenAI CLI 或我们的其中一个 SDK 执行此操作,如下所示:

from openai import OpenAI

client = OpenAI()

file = client.files.create(
  file=open("marv.jsonl", "rb"),
  purpose="fine-tune"
)

client.fine_tuning.jobs.create(
  training_file=file.id,
  model="gpt-3.5-turbo"
)

完成微调作业后,您将能够使用微调模型

结构化输出

与微调配合使用的另一种情况是使模型提供结构化信息,在这种情况下是关于体育新闻的头条:

{"messages": [{"role": "system", "content": "Given a sports headline, provide the following fields in a JSON dict, where applicable: \"player\" (full name), \"team\", \"sport\", and \"gender\"."}, {"role": "user", "content": "Sources: Colts grant RB Taylor OK to seek trade"}, {"role": "assistant", "content": "{\"player\": \"Jonathan Taylor\", \"team\": \"Colts\", \"sport\": \"football\", \"gender\": \"male\" }"}]}
{"messages": [{"role": "system", "content": "Given a sports headline, provide the following fields in a JSON dict, where applicable: \"player\" (full name), \"team\", \"sport\", and \"gender\"."}, {"role": "user", "content": "OSU 'split down middle' on starting QB battle"}, {"role": "assistant", "content": "{\"player\": null, \"team\": \"OSU\", \"sport\": \"football\", \"gender\": null }"}]}

如果您想要遵循本示例并自行创建微调模型,您需要至少 10 个示例。

获取到可能改善模型的数据后,下一步是检查数据是否满足所有格式要求

现在我们已经格式化并验证了数据,最后一步是启动一个作业来创建微调模型。您可以通过 OpenAI CLI 或我们的其中一个 SDK 执行此操作,如下所示:

from openai import OpenAI

client = OpenAI()

file = client.files.create(
  file=open("sports-context.jsonl", "rb"),
  purpose="fine-tune"
)

client.fine_tuning.jobs.create(
  training_file=file.id,
  model="gpt-3.5-turbo"
)

完成微调作业后,您将能够使用微调模型并进行如下所示的请求:

completion = client.chat.completions.create(
  model="ft:gpt-3.5-turbo:my-org:custom_suffix:id",
  messages=[
    {"role": "system", "content": "Given a sports headline, provide the following fields in a JSON dict, where applicable: player (full name), team, sport, and gender"},
    {"role": "user", "content": "Richardson wins 100m at worlds to cap comeback"}
  ]
)

print(completion.choices[0].message)

根据格式化的训练数据,响应应该如下所示:

{
  "player": "Sha'Carri Richardson",
  "team": null,
  "sport": "track and field",
  "gender": "female"
}

函数调用

聊天完成 API 支持函数调用。在完成 API 中包含长的函数列表可能会消耗大量的提示令牌,有时模型会幻觉或者不提供有效的 JSON 输出。

使用带有函数调用示例的微调模型可以让您:

  • 即使在未提供完整函数定义的情况下,也可以获得类似格式的响应。
  • 获得更准确和一致的输出。

按照如下所示的格式进行示例,每行包含一个“messages”列表和一个可选的“functions”列表:

{
  "messages": [
    { "role": "user", "content": "What is the weather in San Francisco?" },
    {
      "role": "assistant",
      "function_call": {
        "name": "get_current_weather",
        "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celsius\"}"
      }
    }
  ],
  "functions": [
    {
      "name": "get_current_weather",
      "description": "Get the current weather",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city and country, eg. San Francisco, USA"
          },
          "format": { "type": "string", "enum": ["celsius", "fahrenheit"] }
        },
        "required": ["location", "format"]
      }
    }
  ]
}

如果您想要遵循本示例并自行创建微调模型,您需要至少 10 个示例。

如果您的目标是使用较少的令牌,则一些有用的技巧包括:

  • 省略函数和参数描述:从函数和参数中删除描述字段。
  • 省略参数:从参数对象中删除整个属性字段。
  • 省略函数:从函数数组中删除整个函数对象。

如果您的目标是最大限度地提高函数调用的输出准确性,我们建议在训练和查询微调模型时使用相同的函数定义。

对函数调用进行微调还可以用于自定义模型对函数输出的响应。为此,您可以包括一个函数响应消息和一个助手消息来解释该响应:

{
  "messages": [
    { "role": "user", "content": "What is the weather in San Francisco?" },
    {
      "role": "assistant",
      "function_call": {
        "name": "get_current_weather",
        "arguments": "{\"location\": \"San Francisco, USA\", \"format\": \"celsius\"}"
      }
    },
    { "role": "function", "name": "get_current_weather", "content": "21.0" },
    { "role": "assistant", "content": "It is 21 degrees celsius in San Francisco, CA" }
  ],
  "functions": [ ... ] // same as before
}

微调集成

OpenAI 提供了通过我们的集成框架将微调作业与第三方集成的功能。集成通常允许您在第三方系统中跟踪作业状态、状态、指标、超参数和其他与作业相关的信息。您还可以使用集成在基于作业状态更改的第三方系统中触发操作。目前,仅支持与 Weights and Biases 的集成,但更多集成正在开发中。

Weights and Biases 集成

Weights and Biases (W&B) 是一个用于跟踪机器学习实验的流行工具。您可以使用 OpenAI 与 W&B 的集成来在 W&B 中跟踪微调作业。此集成将自动将指标、超参数和其他与作业相关的信息记录到您指定的 W&B 项目中。

要将微调作业与 W&B 集成,您需要执行以下操作:

  1. 向 OpenAI 提供 Weights and Biases 帐户的身份验证凭据。
  2. 在创建新的微调作业时配置 W&B 集成。

使用 OpenAI 对 Weights and Biases 帐户进行身份验证

通过向 OpenAI 提交有效的 W&B API 密钥来进行身份验证。目前,这仅可以通过帐户仪表板完成,并且仅由帐户管理员执行。您的 W&B API 密钥将在 OpenAI 内部加密存储,并允许 OpenAI 代表您在 W&B 中发布指标和元数据,而无需在微调作业运行时进行身份验证。在未先使用 OpenAI 组织对 WandB 进行身份验证的情况下,尝试在微调作业上启用 W&B 集成将导致错误。

WandB auth image

常见问题解答

当我应该使用微调与嵌入式/检索增强的生成相比?

使用嵌入式与检索的方式最适合于您需要具有大量具有相关上下文和信息的文档的数据库的情况。

默认情况下,OpenAI 的模型被训练成为有用的通用助手。微调可用于创建一个狭窄专注的模型,并表现出特定的固有行为模式。检索策略可用于通过在生成响应之前提供相关上下文,使新信息对模型可用。检索策略不是微调的替代品,而且实际上可以与之互补。

您可以在我们的开发者日活动中进一步探索这些选项之间的区别:

我能否对 GPT-4o、GPT-4 Turbo 或 GPT-4 进行微调?

GPT-4 微调处于实验性访问状态,符合条件的开发者可以通过微调 UI 请求访问权限。对 GPT-4o 和 GPT-4 Turbo 进行微调目前尚不可用。

gpt-3.5-turbo-1106gpt-3.5-turbo-0125 最多支持 16K 个上下文示例。

我如何知道我的微调模型是否比基础模型更好?

我们建议在聊天对话的测试集上使用基础模型和微调模型生成样本,并在旁边进行比较。对于更全面的评估,请考虑使用 OpenAI evals 框架 创建一个特定于您使用案例的评估。

我能否继续对已经进行过微调的模型进行微调?

是的,您可以在创建微调作业时将微调模型的名称传递到 model 参数中。这将使用微调模型作为起始点启动一个新的微调作业。

如何估算微调模型的成本?

请参阅上面的估算成本部分。

新的微调端点是否仍然与 Weights & Biases 用于跟踪指标一起使用?

目前我们不支持此集成,但我们正在努力尽快实现它。

我能够同时运行多少个微调作业?

请参阅我们的速率限制指南,以了解有关限制的最新信息。

微调模型的速率限制是如何工作的?

微调模型会从与其基础模型相同的共享速率限制中进行拉取。例如,如果您在使用标准 gpt-3.5-turbo 模型时在给定时间段内使用了 TPM 速率限制的一半,则您从 gpt-3.5-turbo 微调的任何模型将仅拥有可访问性的剩余一半 TPM 速率限制,因为容量在所有相同类型的模型之间共享。

换句话说,拥有微调模型并不会从总吞吐量的角度为您提供更多使用我们的模型的能力。

我能够使用 /v1/fine-tunes 端点吗?

/v1/fine-tunes 端点已被弃用,改用 /v1/fine_tuning/jobs 端点。

对于从 /v1/fine-tunes 迁移到更新的 /v1/fine_tuning/jobs API 和更新模型的用户,您可以期望的主要区别是更新的 API。我们已经为更新的 babbage-002davinci-002 模型保留了遗留的提示完成对数据格式,以确保过渡顺畅。新的模型将支持具有 4k 令牌上下文的微调,并且将在 2021 年 9 月具有知识截止日期。

对于大多数任务,您应该能够从 gpt-3.5-turbo 中获得比 GPT 基础模型更好的性能。

Was this page helpful?