如何使用 Node.js 微调 OpenAI ML 模型

494 阅读5分钟

什么是微调?

OpenAI 的模型已经根据网络上的大量文本进行了训练,但它们的训练数据仍然是有限的,而且没有达到应有的最新水平:它们仍然会遗漏特定主题的信息。

迁移学习是一种机器学习方法,您可以使用从解决一个问题中获得的知识并将其应用于新的但相关的问题。为一项任务开发的模型被重新用作第二项任务模型的起点——例如,可以编辑专门识别比萨饼的训练模型以识别馅饼。

微调类似于迁移学习,因为它允许您修改和自定义现有的 ML 模型。

为什么要微调?

微调可帮助您在大量任务中取得更好的结果。对模型进行微调后,您将不再需要通过提示提供样本,从而帮助您节省成本并实现低延迟请求。

假设训练模型的原始任务与新任务相似,微调已经设计和训练的模型可以让开发人员利用模型已经学到的东西,而不必从头开始开发。

先决条件

  1. OpenAI 帐户 -在此处创建一个 OpenAI 帐户
  2. 已安装 Node.js -在此处下载 Node.js

创建 OpenAI 帐户后,您将需要一个 API 密钥。您可以在此处通过单击 + 创建新密钥来获取 OpenAI API 密钥。

保存该 API 密钥以备后用。

创建一个新的 Node.js 项目

首先,在一个空目录中创建一个新的 Node.js 项目:

mkdir finetune-model
cd finetune-model
npm init --y

开始使用 OpenAI

在您的根目录中创建一个 .env文件并添加以下行:

OPENAI_API_KEY=YOUR-OPENAI-API-KEY

替换YOUR-OPENAI-API-KEY为您之前记下的 OpenAI API 密钥。现在您将能够在您的代码中使用 访问此 API 密钥process.env.OPENAI_API_KEY

接下来,安装openaifsnpm 包:

npm install openai fs

现在是时候准备您的数据了!

准备自定义数据

训练数据是 GPT-3 学习你想要它说什么的方式。

您的数据应该在JSONL 文档中,其中每一行都是与训练样本对应的提示完成对。

创建一个名为newdata.jsonl的 jsonl 文件,并包含如下所示的提示完成对:

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

我使用的数据包括关于我的有趣事实,可以在 GitHub 上找到。

OpenAI 建议至少有几百个示例,并发现数据集大小每增加一倍都会导致模型质量线性增加。保存至少 30 个提示完成对(越多越好)。这不足以为生产就绪产品制作微调模型,但足以满足本教程的目的。

保存你的 jsonl 文件,在命令行上,使用OpenAI 的 CLI 数据准备工具来帮助你轻松地将你的数据转换成 jsonl 文件格式。

openai tools fine_tunes.prepare_data -f newdata.jsonl

使用准备好的数据,是时候编写一些代码来微调现有的 OpenAI 机器学习模型了。

微调 OpenAI 模型

在本教程中,您将使用davinci,但 OpenAI 目前允许您微调其基础模型,其中还包括curiebabbageada。这些是他们的原始模型,他们在训练后缺乏任何指导(text-davinci-003例如)。

在名为 finetune.js 的文件中,将以下代码添加到将用于每个步骤的顶部:

const { Configuration, OpenAIApi } = require("openai");
const fs = require("fs");
const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);

在此之下,您的第一个函数会上传 jsonl 文件,以便您接下来可以使用它。

async function uploadFile() {
    try {
        const f = await openai.createFile(
            fs.createReadStream("newdata.jsonl"),
            "fine-tune"
        );
        console.log(`File ID ${f.data.id}`);
        return f.data.id;
    }
    catch (err) {
        console.log('err uploadfile: ', err);
    } 
}
uploadFile();

使用 运行文件后node finetune.js,记下为下一步打印的 ID 并注释掉uploadFile()函数调用。

在函数下方uploadFile(),添加以下函数:

async function makeFineTune() {
    try {
        const ft = await openai.createFineTune({
            training_file: 'YOUR-FILE-ID',
            model: 'davinci'
        });
        console.log(ft.data);
     }
    catch (err) {
        console.log('err makefinetune: ', err.response.data.error);
    }
}
makeFineTune();

替换YOUR-FILE-ID为上一步中的文件 ID,然后重新运行finetune.js以运行新函数。运行后,注释掉makeFineTune()函数调用。

等待几分钟让它处理。您可以通过调用 API 方法检查微调的状态,另外获取模型 ID,listFineTunes如下所示:

async function getFineTunedModelName() {
    try {
        const modelName = await openai.listFineTunes();
        console.table(modelName.data.data, ["id", "status", "fine_tuned_model"]);

    }
    catch (err) {
        console.log('err getmod: ', err)
    }
 }
getFineTunedModelName();

微调模型在statusisrunningfine_tuned_modelis时还没有准备好使用null,但是一旦你看到statusissucceededfine_tuned_modelis 之类的东西davinci:ft-personal-2023-05-01-22-05-28,然后注释掉getFineTunedModelName(),复制模型名称(以 开头davinci),你就可以开始使用模型了!

测试您的 Fine-Tuned OpenAI 模型

将以下代码添加到您的finetune.js文件中。

async function run() {
    try {
        const comp = await openai.createCompletion({
            model: 'YOUR-FINETUNED-MODEL-NAME',
            prompt: 'What is Lizzie Siegle's favorite food', //replace this prompt according to your data
            max_tokens: 200
        });
        if (comp.data) {
            console.log('choices: ', comp.data.choices)
        }
    } catch (err) {
        console.log('err: ', err)
    }
}
run();

替换YOUR-FINETUNED-MODEL-NAME为上一步中的模型名称。

然后,重新运行node finetune.js,您应该会看到您的新自定义模型已部署并根据您传入的提示进行新的完成!或者,您可以在OpenAI Playground 中测试经过微调的模型。
当我问我最喜欢的食物是什么时返回饺子的微调模型的用法示例

在 OpenAI Playground 中使用的微调模型列表

微调 OpenAI 模型的下一步是什么?

这就是如何自定义 OpenAI 的现有模型之一以适合您自己的特定用例和数据!

对于后续步骤,您可以

  1. 添加更多数据以提高完成度并使模型做好生产准备
  2. 尝试微调其他模型davinci
  3. 在您对微调模型的请求中使用所有其他完成参数,如temperature、 、 等frequency_penalty``presence_penalty
  4. 用另一种编程语言微调模型