finetune一个GPT3模型

过程其实挺简单的,首先得注册一个账号获取token(我是叫在美国的朋友注册了一个)。注册好账号后,有18美金的试用额度,基本可以完成好几次模型训练了。除了模型训练需要收费之外,大概1000个token的费用是0.02美金。

设置好OPENAI_API_KEY这个环境变量。

    export OPENAI_API_KEY="<OPENAI_API_KEY>"

接下来就进入正题了,

1. 准备数据,格式如下,每一行都是一个json,换行用\n表示,我finetune的task只需要1000条左右的数据,模型结果还不错,根据训练时的提示,至少需要100条,越多越好

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

openai提供了现成的命令可以转csv成json: openai tools fine_tunes.prepare_data -f ./train_data.csv

2. 训练,我finetune的是davinci模型,还有三四个选择,输错命令行会提示。我的task只finetune了一个周期,整个过程大概花费1美金,持续约5~10分钟

openai api fine_tunes.create -t ./train_data_prepared.jsonl -m davinci --n_epochs 1

不需要的模型还可以删除

openai api models.delete -i "davinci:ft-personal-2022-11-20-03-40-02"

用如下命令可以列出曾经训练的模型列表

openai api fine_tunes.list

3. api调用,有好几种方法,比如直接

openai api completions.create -m davinci:ft-personal-2022-11-20-04-05-47 -p "Beautiful sunset beach landscape with a boat"

我的task还需要设置更多的两个参数temperature和frequency_penalty,所以我写了个简单的脚本完成这个任务,并且openai限制1秒调用超过60次,我加了个简单的sleep。其中有个坑是,推理的时候seperator里的\n,无需过采用"\\"多转义。

import os
import sys
import openai
import json
import time

if not os.path.exists(sys.argv[2]):
    res = openai.Completion.create(
        max_tokens=32,
        model=sys.argv[1],
        prompt=sys.argv[2]+"\n##\n",
        temperature=0.7,
        frequency_penalty=0.1)
    text = res["choices"][0]["text"]
    items = text.split('\n')
    print(sys.argv[2]+"|"+items[0]+"|"+items[2])
else:
    f = open(sys.argv[2])
    lines = [line.strip()[:-2] for line in f.readlines()]
    f.close()

    f = open("./result.txt", "a+")

    for i,line in enumerate(lines):
        print(i, line)

        try:
            res = openai.Completion.create(
                max_tokens=32,
                model=sys.argv[1],
                prompt=line+"\n##\n",
                temperature=0.7,
                frequency_penalty=0.1)
            text = res["choices"][0]["text"]
            items = text.split('\n')
            print(line+"|"+items[0]+"|"+items[2], file=f)
            if i%30 == 0:
                f.flush()
            time.sleep(1.5)
        except Exception as e:
            print(e)
            time.sleep(15)
    f.close()

参考OpenAI API

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值