ChatGPT微调系列一:总述 微调 的基本流程

news2024/11/17 17:28:16

文章目录

  • 前言
  • 一、啥叫微调
  • 二、为啥要微调
  • 三、不是所有模型都可以微调的
  • 四、总述微调的基本流程,以及涉及的主要函数,参数
    • 1. 安装
    • 2. 准备训练数据
    • 3. openai.api_key = os.getenv() 进行一个说明
    • 4. 通过API 调用模型 常用函数
    • 5. 微调模型 常用函数
    • 6. OpenAI CLI 开始微调
      • --------------------------- 1. 创建微调模型---------------------------
      • --------------------------- 2. 微调中断 恢复---------------------------
      • --------------------------- 3. 微调中的其他操作---------------------------
      • --------------------------- 4. 使用微调模型---------------------------
      • --------------------------- 5. 删除微调模型---------------------------

前言

ChatGPT出来时间也不短了,最近听同事们说在面试时候,很多公司都会问,有没有微调GPT的经历,因此觉得,这东西需要掌握住,正好公司自己搭建的平台,api秘钥也是免费用,就趁着这个机会,好好琢磨下这个东西。

大致分为以下几步走:
第一:总述 微调 的基本流程

第二:微调用的数据

第三:微调的一些特殊用法

第四:实际例子分析

一、啥叫微调

微调是指在训练好的机器学习模型上进行进一步调整和优化,以提高其性能适应特定任务领域的能力。在微调过程中,我们通常会使用一个较小的数据集来重新训练模型,这个数据集包含与目标任务或领域相关的样本。通过微调,模型可以学习到更加具体和精确的特征,从而提升其在特定任务上的表现。微调是深度学习迁移学习中常用的技术之一,可以使得模型更好地适应实际应用场景。

二、为啥要微调

用过GPT网页版的,或者通过api直接调用的,都知道,它有不错的通用能力,但是一到特别领域就不行。

但是但是,微调后就有这写好处:

  1. 个性化适应:通过微调,可以根据特定的需求和场景来训练ChatGPT,使其具有更加个性化、定制化的回答能力。可以引入特定领域的语料库或样本集,以便ChatGPT对该领域的问题和主题有更深入的了解。

  2. 消除偏见:微调可以帮助消除模型中可能存在的偏见。通过重新训练模型并提供多样化的数据,可以减少模型在回答问题时对某些群体或观点的偏见,从而提高模型的公平性和中立性。

  3. 控制输出:微调可以让更好地控制ChatGPT的输出内容。可以通过微调来约束模型生成的答案,确保其符合特定的要求,比如遵守特定的规则、避免敏感信息泄露等。

  4. 提高准确性:微调可以显著提高ChatGPT的准确性和质量。通过使用与目标任务相关的数据进行微调,模型可以更好地理解和回答相关问题,提供更准确的答案

并且通过微调可让从 API 提供的模型中获得更多收益:

  1. 比即时设计更高质量的结果
  2. 能够训练比提示中更多的例子
  3. 由于更短的提示而节省了代币
  4. 更低的延迟请求
    GPT-3 已经在来自开放互联网的大量文本上进行了预训练。当给出仅包含几个示例的提示时,它通常可以凭直觉判断出您要执行的任务并生成合理的完成。这通常称为“小样本学习”。

微调通过训练比提示中更多的示例改进小样本学习,让咱们在大量任务中取得更好的结果。对模型进行微调后,将不再需要在提示中提供示例。这样可以节省成本并实现更低延迟的请求。

总述就是,微调涉及以下步骤:

  1. 准备和上传训练数据
  2. 训练微调模型
  3. 使用微调模型

三、不是所有模型都可以微调的

微调目前仅适用于以下基础模型:davincicuriebabbageada。这些是原始模型,在训练后没有任何说明(例如text-davinci-003)。还可以继续微调微调模型以添加其他数据,而无需从头开始。

我只关注ChatGPT3.5系列:如图
在这里插入图片描述

四、总述微调的基本流程,以及涉及的主要函数,参数

1. 安装

这个是openai给的安装方法:

建议使用的 OpenAI 命令行界面 (CLI)。要安装这个,运行

pip install --upgrade openai

(以下说明适用于0.9.4及更高版本。此外,OpenAI CLI 需要 python 3。)

OPENAI_API_KEY通过将以下行添加到您的 shell 初始化脚本(例如 .bashrc、zshrc 等)或在微调命令之前的命令行中运行它来设置您的环境变量:

export OPENAI_API_KEY="<OPENAI_API_KEY>"

2. 准备训练数据

后面咱们专门说这个

3. openai.api_key = os.getenv() 进行一个说明

openai.api_key = os.getenv() 函数

import os
import openai

# Load your API key from an environment variable or secret management service
openai.api_key = os.getenv("OPENAI_API_KEY")

这行代码的含义是将环境变量中存储的OpenAI API密钥赋值给openai.api_key变量。
这可以用于对OpenAI API进行身份验证,以便在使用API时向OpenAI发送请求。

os.getenv():是Python标准库os中的一个函数,它用于获取操作系统环境变量的值。
"OPENAI_API_KEY":是要获取的环境变量的名称,这里我们想要获取OpenAI的API密钥。
openai.api_key:是OpenAI提供的一个变量,用于存储API密钥。将os.getenv("OPENAI_API_KEY")的返回值赋值给它,
即可将API密钥保存在该变量中,方便后续使用。

4. 通过API 调用模型 常用函数

openai.Completion.create() 函数

response = openai.Completion.create(
model="text-davinci-003", 
prompt="Say this is a test", 
temperature=0, 
max_tokens=7)

openai.Completion.create():是OpenAI提供的一个函数,用于创建文本生成的请求。
model="text-davinci-003":指定了使用的模型。在这个例子中,模型被命名为"text-davinci-003"。模型名称通常表明了它所擅长的任务和能力。
prompt="Say this is a test":是输入给模型的提示文本。在这个例子中,模型的生成将基于这个提示进行。
temperature=0:是控制文本生成的随机性的参数。较低的温度值(如0)会使生成结果更加确定性,较高的温度值(如1)会使生成结果更加随机。
max_tokens=7:指定了生成文本的最大长度。在这个例子中,生成的文本将不超过7个标记(tokens)。
通过调用openai.Completion.create()函数并传入相应的参数,可以向OpenAI API发送请求,并获得生成的文本结果。

5. 微调模型 常用函数

fine_tunes.create() 函数

fine_tunes.create: 这个函数用于创建一个微调任务。
主要参数:

-t <TRAIN_FILE_ID_OR_PATH>: 指定训练文件的标识符或路径,它包含了用于微调的数据集。
该参数,允许根据训练文件是本地存储还是上传到OpenAI API来指定文件的标识符或路径。
如果这个文件位于C:\path\to\train.txt,命令会是这样的:

-t C:\path\to\train.txt

另外,如果你已经将训练文件上传到了OpenAI API,并获得了一个文件标识符,你可以将这个标识符作为-t参数的值。
例如,如果文件标识符是file-abc123,命令会是这样的:

-t file-abc123

-m <BASE_MODEL>: 指定基础模型的选择,即预训练模型的名称或标识符。
-n <NUM_ITERATIONS>: 指定微调的迭代次数,即完成微调的总步骤数。
-b <BATCH_SIZE>: 指定每个微调步骤(iteration)的批量大小,即每次更新模型时一次处理的样本数量。
-e <EVALUATION_INTERVAL>: 指定模型在微调过程中进行评估的间隔,即多少个微调步骤后进行一次模型评估。
-s : 指定随机种子,以确保微调过程的可重复性。
-o <OUTPUT_DIR>: 指定输出目录,用于存储微调过程中生成的模型权重和其他相关文件。
通过使用这些参数,您可以指定微调所使用的训练数据、基础模型以及微调任务的其他相关参数。
执行fine_tunes.create函数后,OpenAI API将开始进行模型微调,并在指定的迭代次数内更新模型权重和优化参数,
最终生成一个经过个性化训练的模型。

openai.常用函数
openai.Completion.create(): 用于创建文本生成的请求。
openai.Davinci(models='davinci'): 用于选择Davinci模型。
openai.Gpt3(models='gpt-3.5-turbo'): 用于选择GPT-3.5 Turbo模型。
openai.ChatCompletion.create(): 用于创建对话式生成的请求。
openai.File.create(): 用于上传文件到OpenAI API中,并返回一个文件标识符。
openai.File.retrieve(): 用于从OpenAI API中检索已上传的文件。

6. OpenAI CLI 开始微调

--------------------------- 1. 创建微调模型---------------------------

使用 OpenAI CLI 开始微调工作:

openai api fine_tunes.create -t <TRAIN_FILE_ID_OR_PATH> -m <BASE_MODEL>

'''
也可以给模型增加上名字最多 40 个字符的后缀

'''
openai api fine_tunes.create -t test.jsonl -m ada --suffix "custom model name"


结果名称将是:

ada:ft-your-org:custom-model-name-2022-02-15-04-21-04

执行这行代码后,开始执行下面的操作…

  1. 使用文件 API上传文件(或使用已经上传的文件)
  2. 创建微调作业
  3. 流式传输事件直到作业完成(这通常需要几分钟,但如果队列中有很多作业或您的数据集很大,则可能需要数小时)

注意
成功创建微调任务后,
API将返回一个响应包含有关微调的信息,其中包括相应的模型ID。您可以从API响应中提取该模型ID,这个后面会需要使用

--------------------------- 2. 微调中断 恢复---------------------------

使用这行代码就行恢复…

openai api fine_tunes.follow -i <YOUR_FINE_TUNE_JOB_ID>

fine_tunes.follow: 这个函数用于跟踪模型微调任务状态和进展
主要参数:

-i <YOUR_FINE_TUNE_JOB_ID>: 指定模型微调任务的标识符,即您的微调的唯一ID
通过使用fine_tunes.follow函数并提供相应的微调ID,您可以获取有关模型微调过程的实时状态更新。
这些状态更新可能包括每个迭代步骤的训练损失验证指标当前轮次等信息。通过跟踪微调任务的状态,
您可以了解模型微调的进展情况,并根据需要进行必要的监控和后续操作。

!!!请注意!!!,上述参数是一个示例,需要将<YOUR_FINE_TUNE_JOB_ID>替换为实际的模型微调作业ID。这个作业ID通常是在启动微调任务时由OpenAI API返回的

--------------------------- 3. 微调中的其他操作---------------------------

除了创建微调,恢复微调外,还可以 列出现有微调检索微调状态取消微调

  1. 列出现有微调(有点类似 pip list) # List all created fine-tunes
openai api fine_tunes.list
  1. 检索微调 # Retrieve the state of a fine-tune. The resulting object includes
# job status (which can be one of pending, running, succeeded, or failed)
# and other information
openai api fine_tunes.get -i <YOUR_FINE_TUNE_JOB_ID>
  1. 取消微调任务 # Cancel a job
openai api fine_tunes.cancel -i <YOUR_FINE_TUNE_JOB_ID>

看到了吧,这里的 工作ID 其实就是上面创建微调模型的时候 返回的 ID

--------------------------- 4. 使用微调模型---------------------------

方式一:OpenAI 命令行界面:

openai api completions.create -m <FINE_TUNED_MODEL> -p <YOUR_PROMPT>

方式二:Python:

import openai
openai.Completion.create(
    model=FINE_TUNED_MODEL,
    prompt=YOUR_PROMPT)

'''
这个函数上面有详细解释
'''

如果您使用了OpenAI API中的fine_tunes.create函数进行微调,则在成功创建微调任务后,
API将返回一个响应包含有关微调作业的信息,其中包括相应的模型ID。您可以从API响应中提取该模型ID,
并将其用作<FINE_TUNED_MODEL>参数的值。

--------------------------- 5. 删除微调模型---------------------------

方式一:OpenAI 命令行界面:

openai api models.delete -i <FINE_TUNED_MODEL>

方式二:Python:

import openai
openai.Model.delete(FINE_TUNED_MODEL)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Maven 使用详细教程

目录 Maven 介绍 Maven 安装 1、安装JDK 2、下载Maven安装文件 3、配置环境变量 4、检测安装成功 Maven 标准工程结构 Maven 版本要素 Maven仓库 1、本地仓库&#xff1a; 2、中央仓库 3、其他远程仓库 创建Maven工程 使用命令方式创建Maven工程 Eclipse中创建…

智能大棚自动控制系统 实现传统农业精细化管理

新型农业经营主体管理系统是指为了适应农村经济发展需求&#xff0c;提高农业生产组织化、规模化、现代化程度&#xff0c;促进农业产业结构调整和农村产业转型升级&#xff0c;推动农村经济社会持续健康发展而建立的一套管理体系。 该系统主要包括农产品生产、种植、养…

JavaWeb学习路线(8)——登录

一、基本登录功能 &#xff08;一&#xff09;需求&#xff1a; 根据账号与密码判别用户是否可以登录 &#xff08;二&#xff09;实现步骤 Controller接收传递的JSON格式数据&#xff0c;使用RequestBody实体类进行接收&#xff0c;调用Service具体处理。Service创建登录接…

循环购应运而生,让老百姓敢于消费、有钱消费、愿意消费

​小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 无论…

7 植物背景分离、RGB、HSV特征提取案例(matlab程序)

学习目标&#xff1a;背景分离和RGB等特征提取 1.简述 叶片RGB图像背景精确分离的方法,包括以下图像背景分离方法:S1:选取叶片,所得到的原始图像;S2:采用MATLAB 2016R软件将RGB图像转化为HSV图像,以饱和度0.190.21为界限,将小于界限的图像明度调整为0,并转化为灰度图;S3:用edg…

Redis高并发分布式锁

文章目录 高并发场景秒杀抢购超卖Bug高并发场景秒杀抢购Demo测试结果 JVM级别锁使用nginx对本地服务进行负载均衡 Redis实现分布式锁Redis分布式锁实现DemoRedis分布式锁有关问题 分布式锁性能的提升减少锁的粒度使用异步处理 高并发场景秒杀抢购超卖Bug 在今天的数字化世界中&…

供应商索赔(金税数据)导入并创建凭证(ALV长篇备忘三)

情境/背景:供应商三包索赔款项源起QMS质量系统&#xff0c;联动金税系统完成发票开具&#xff0c;最终在SAP系统中创建完成财务凭证。该流程为手工操作&#xff0c;费时费力且效率低下容易出错。 目标/任务:把QMS供应商三包索赔业务搬上线,同SAP FI顾问梳理功能说明书&#xf…

2023-06-29:redis中什么是热点Key?该如何解决?

2023-06-29&#xff1a;redis中什么是热点Key&#xff1f;该如何解决&#xff1f; 答案2023-06-29&#xff1a; 在Redis中&#xff0c;经常被访问的key被称为热点key。 产生原因和危害 原因 热点key问题产生的原因可以归纳为以下两种情况&#xff1a; 用户对于某些数据的…

安卓弹出popup之XPopup

弹窗自己写的话。虽然很简单。但不够丝滑。如果要优雅点的。又要添加动画。但是。。。如果用上了XPopup&#xff0c;动画别人帮你写。爽不爽&#xff1f;丝滑不丝滑。。&#xff1f; 丝滑第一步。先引入依赖 implementation com.github.li-xiaojun:XPopup:2.9.19如果没有这些…

git版本回退操作

本文 git 相关命令&#xff1a; git reset&#xff1a;回退版本&#xff0c;可指定某一次提交的版本。git reset [--soft | --mixed | --hard] commitId。git revert&#xff1a;撤销某个提交&#xff0c;做反向操作&#xff0c;生成新的commitId&#xff0c;原有提交记录保留…

基于java+swing+mysql图书管理系统V7.0

基于javaswingmysql图书管理系统V7.0 一、系统介绍二、功能展示1.项目骨架2.数据库表3.项目内容4.主界面5.登陆6、借阅管理7、修改读者信息8、图书验收9、新书订购 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java SE项目&#xff08;awtswing&…

(四)python实战——Sqlite3数据库表的增、删、查、改操作案例

前言 Sqlite3是一个轻量级的数据库&#xff0c;本节内容我们介绍一下如何在python环境中使用Sqlite数据库&#xff0c;完成数据库表的简单增、删、查、改操作。开始本节内容之前&#xff0c;我们需要先安装好python环境&#xff0c;我们使用的是python3的环境。 正文 ①创建…

【Docker】利用Dockerfile制作个人的镜像文件详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

如何避免死锁--方法三--scoped_lock

scoped_lock是c17新增的一种模板&#xff0c;也是RAII模式。其是可变参数&#xff0c;可以接受各种互斥类型作为参数模板&#xff0c;可以指定多个互斥量。 前文中我们说到&#xff0c;lock可以锁定多个互斥量&#xff0c;scoped_lock也可以做到。 void thread1() {cout <&…

【网络互联设备】网络杂谈(15)之网桥、路由器、网关、集线器、交换机、中继器的作用与概念

涉及知识点 网桥、路由器、网关、集线器、交换机、中继器的作用与概念&#xff0c;常见的网络互联设备&#xff0c;什么是网桥、路由器、网关、集线器、交换机、中继器。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不…

STM32F103基于HAL工程挂载FatFS驱动SD卡实现IAP功能

STM32F103基于HAL工程挂载FatFS驱动SD卡实现IAP功能 &#x1f3ac;基于SD卡IAP升级演示&#xff1a; &#x1f4cd;相关篇《STM32F103基于HAL工程挂载FatFS驱动SD卡》 &#x1f4cc;《使用STM32F103的串口实现IAP程序升级功能》 &#x1f449;&#x1f3fb;ST相关文档&…

并发-JMM-CPU缓存一致性协议MESI

回顾 指令重排 第一V读&#xff0c;都不能指令重排&#xff1b;第二个V写&#xff0c;都不能指令重排 普通读写&#xff0c;写读都会发生指令重排&#xff0c;V写普通读写会发生指令重排&#xff0c;普通读写V读会发生指令重排 CPU缓存一致性协议MESI java—》cpu的执行过程…

Three.js教程:高光网格材质Phong

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 其他系列工具&#xff1a; NSDT简石数字孪生 高光网格材质Phong 高光网格材质MeshPhongMaterial和基础网格材质MeshBasicMaterial、漫反射网格材质MeshLambertMaterial一样都是网格模型的Mesh的材质。 高光网格材质MeshPho…

Web测试的主要内容和测试方法有哪些?

Web测试的主要内容&#xff1a; 一、输入框 二、搜索功能 三、增加、修改功能 四、删除功能 五、注册、登录模块 六、上传图片测试 七、查询结果列表 八、返回键检查 九、回车键检查 十、刷新键检查 Web测试的测试方法&#xff1a; 1.在测试时&#xff0c;与网络有关的步骤或者…

npm报错(npm ERR! Unexpected token ‘.‘)

使用 nvm 将 node 切换到高版本后&#xff0c;运行 npm 相关的命令报的这个错 解决办法&#xff1a; 1、通过nvm list 命令查看当前都安装的node版本列表&#xff0c;依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2…