八、大模型之Fine-Tuning(1)

2024-04-01 22:28
文章标签 模型 tuning fine

本文主要是介绍八、大模型之Fine-Tuning(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 什么时候需要Fine-Tuning

  1. 有私有部署的需求
  2. 开源模型原生的能力不满足业务需求

2 训练模型利器Hugging Face

  1. 官网(https://huggingface.co/)
  2. 相当于面向NLP模型的Github
  3. 基于transformer的开源模型非常全
  4. 封装了模型、数据集、训练器等,资源下载方面
  5. 安装依赖
# pip 安装
pip install transformers # 安装最新版本
pip install transformers == 4.30 # 安装指定版本
# conda安装
conda install -c huggingface transformers  # 只4.0以后的版本

3 案例

3.1 操作流程

加载数据集—>数据预处理—>数据规整器—>训练器
在这里插入图片描述

3.2 实现

  1. 导包
import datasets
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModel
from transformers import AutoModelForCausalLM
from transformers import TrainingArguments, Seq2SeqTrainingArguments
from transformers import Trainer, Seq2SeqTrainer
import transformers
from transformers import DataCollatorWithPadding
from transformers import TextGenerationPipeline
import torch
import numpy as np
import os, re
from tqdm import tqdm
import torch.nn as nn
  1. 加载数据集
    通过HuggingFace,可以指定数据集名称,运行时自动下载
# 数据集名称
DATASET_NAME = "rotten_tomatoes" # 加载数据集
raw_datasets = load_dataset(DATASET_NAME)# 训练集
raw_train_dataset = raw_datasets["train"]# 验证集
raw_valid_dataset = raw_datasets["validation"]

在这里插入图片描述
3. 加载模型

# 模型名称
MODEL_NAME = "gpt2" # 加载模型 
model = AutoModelForCausalLM.from_pretrained(MODEL_NAME,trust_remote_code=True)

在这里插入图片描述
4. 加载Tokenizer
通过HuggingFace,可以指定模型名称,运行自动下载对应Tokenizer

# 加载tokenizer
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME,trust_remote_code=True)
tokenizer.add_special_tokens({'pad_token': '[PAD]'})
tokenizer.pad_token_id = 0# 设置随机种子:同个种子的随机序列可复现
transformers.set_seed(42)# 标签集
named_labels = ['neg','pos']# 标签转 token_id
label_ids = [tokenizer(named_labels[i],add_special_tokens=False)["input_ids"][0] for i in range(len(named_labels))
]

在这里插入图片描述
5. 处理数据集:转成模型接受的输入格式

  • 拼接输入输出:<INPUT TOKEN IDS><EOS_TOKEN_ID><OUTPUT TOKEN IDS>
  • PAD成相等长度:
    • <INPUT 1.1><INPUT 1.2>…<EOS_TOKEN_ID><OUTPUT TOKEN IDS><PAD>…<PAD>
    • <INPUT 2.1><INPUT 2.2>…<EOS_TOKEN_ID><OUTPUT TOKEN IDS><PAD>…<PAD>
  • 标识出参与 Loss 计算的 Tokens (只有输出 Token 参与 Loss 计算)
    • <-100><-100>…<OUTPUT TOKEN IDS><-100>…<-100>
MAX_LEN=32   #最大序列长度(输入+输出)
DATA_BODY_KEY = "text" # 数据集中的输入字段名
DATA_LABEL_KEY = "label" #数据集中输出字段名# 定义数据处理函数,把原始数据转成input_ids, attention_mask, labels
def process_fn(examples):model_inputs = {"input_ids": [],"attention_mask": [],"labels": [],}for i in range(len(examples[DATA_BODY_KEY])):inputs = tokenizer(examples[DATA_BODY_KEY][i],add_special_tokens=False)label = label_ids[examples[DATA_LABEL_KEY][i]]input_ids = inputs["input_ids"] + [tokenizer.eos_token_id, label]raw_len = len(input_ids)input_len = len(inputs["input_ids"]) + 1if raw_len >= MAX_LEN:input_ids = input_ids[-MAX_LEN:]attention_mask = [1] * MAX_LENlabels = [-100]*(MAX_LEN - 1) + [label]else:input_ids = input_ids + [tokenizer.pad_token_id] * (MAX_LEN - raw_len)attention_mask = [1] * raw_len + [0] * (MAX_LEN - raw_len)labels = [-100]*input_len + [label] + [-100] * (MAX_LEN - raw_len)model_inputs["input_ids"].append(input_ids)model_inputs["attention_mask"].append(attention_mask)model_inputs["labels"].append(labels)return model_inputs

6.定义数据规整器:训练时自动将数据拆分成Batch

# 定义数据校准器(自动生成batch)
collater = DataCollatorWithPadding(tokenizer=tokenizer, return_tensors="pt",
)

7.定义训练超参

LR=2e-5         # 学习率
BATCH_SIZE=8    # Batch大小
INTERVAL=100    # 每多少步打一次 log / 做一次 eval# 定义训练参数
training_args = TrainingArguments(output_dir="./output",              # checkpoint保存路径evaluation_strategy="steps",        # 按步数计算eval频率overwrite_output_dir=True,num_train_epochs=1,                 # 训练epoch数per_device_train_batch_size=BATCH_SIZE,     # 每张卡的batch大小gradient_accumulation_steps=1,              # 累加几个step做一次参数更新per_device_eval_batch_size=BATCH_SIZE,      # evaluation batch sizeeval_steps=INTERVAL,                # 每N步eval一次logging_steps=INTERVAL,             # 每N步log一次save_steps=INTERVAL,                # 每N步保存一个checkpointlearning_rate=LR,                   # 学习率
)

8.定义训练器

# 节省显存
model.gradient_checkpointing_enable()# 定义训练器
trainer = Trainer(model=model, # 待训练模型args=training_args, # 训练参数data_collator=collater, # 数据校准器train_dataset=tokenized_train_dataset,  # 训练集eval_dataset=tokenized_valid_dataset,   # 验证集# compute_metrics=compute_metric,         # 计算自定义评估指标
)

8.训练

trainer.train()

总结

  1. 加载数据集
  2. 数据预处理
    • 将输入输出按特定格式拼接
    • 文本转Token IDs
    • 通过labels标识出哪部分是输出(只有输出的token参与loss计算)
  3. 加载模型、Tokenizer
  4. 定义数据规则整器
  5. 定义训练超参:学习率、批次大小
  6. 定义训练器
  7. 开始训练

4 大模型训练相关技术

  1. 神经网络
    在这里插入图片描述

  2. 常用的激活函数
    在这里插入图片描述

  3. 梯度下降
    在这里插入图片描述

  4. 学习率
    在这里插入图片描述

  5. 求解器

为了让训练过程更好的收敛,人们设计了很多更复杂的求解器

  • 比如:SGD、L-BFGS、Rprop、RMSprop、Adam、AdamW、AdaGrad、AdaDelta 等等
  • 但是,好在对于Transformer最常用的就是 Adam 或者 AdamW
  1. 一些常用的损失函数
  • 两个数值的差距,Mean Squared Error: ℓ M S E = 1 N ∑ i = 1 N ( y i − y ^ i ) 2 \ell_{\mathrm{MSE}}=\frac{1}{N}\sum_{i=1}^N(y_i-\hat{y}_i)^2 MSE=N1i=1N(yiy^i)2 (等价于欧式距离,见下文)

  • 两个向量之间的(欧式)距离: ℓ ( y , y ^ ) = ∥ y − y ^ ∥ \ell(\mathbf{y},\mathbf{\hat{y}})=\|\mathbf{y}-\mathbf{\hat{y}}\| (y,y^)=yy^

  • 两个向量之间的夹角(余弦距离):
    在这里插入图片描述

  • 两个概率分布之间的差异,交叉熵: ℓ C E ( p , q ) = − ∑ i p i log ⁡ q i \ell_{\mathrm{CE}}(p,q)=-\sum_i p_i\log q_i CE(p,q)=ipilogqi ——假设是概率分布 p,q 是离散的

  • 这些损失函数也可以组合使用(在模型蒸馏的场景常见这种情况),例如 L = L 1 + λ L 2 L=L_1+\lambda L_2 L=L1+λL2,其中 λ \lambda λ是一个预先定义的权重,也叫一个「超参」

这篇关于八、大模型之Fine-Tuning(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868288

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

如何在本地部署 DeepSeek Janus Pro 文生图大模型

《如何在本地部署DeepSeekJanusPro文生图大模型》DeepSeekJanusPro模型在本地成功部署,支持图片理解和文生图功能,通过Gradio界面进行交互,展示了其强大的多模态处... 目录什么是 Janus Pro1. 安装 conda2. 创建 python 虚拟环境3. 克隆 janus

本地私有化部署DeepSeek模型的详细教程

《本地私有化部署DeepSeek模型的详细教程》DeepSeek模型是一种强大的语言模型,本地私有化部署可以让用户在自己的环境中安全、高效地使用该模型,避免数据传输到外部带来的安全风险,同时也能根据自... 目录一、引言二、环境准备(一)硬件要求(二)软件要求(三)创建虚拟环境三、安装依赖库四、获取 Dee

DeepSeek模型本地部署的详细教程

《DeepSeek模型本地部署的详细教程》DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私,在本地成功部署DeepSe... 目录一、环境准备(一)硬件需求(二)软件依赖二、安装Ollama三、下载并部署DeepSeek模型选