Trainer API训练属于自己行业的本地大语言模型 医疗本地问答大模型示例

embedded/2024/9/24 19:10:04/

Trainer API 是 Hugging Face transformers 库中强大而灵活的工具,简化了深度学习模型的训练和评估过程。通过提供高层次的接口和多种功能,Trainer API 使研究人员和开发者能够更快地构建和优化自然语言处理模型

文章目录

  • 前言
  • 一、Trainer API
    • 它能做什么?
    • 基本步骤
    • 简单示例
  • 二、详细步骤
    • 安装依赖
    • 准备数据集
    • 加载本地模型和分词器
    • 数据预处理
    • 设置训练参数
    • 创建 Trainer 实例
    • 开始训练
    • 评估模型
    • 保存模型
  • 三、 Trainer API 对大模型的限制
  • 四、用医疗数据微调 ChatGPT-3.5,让它成为智能的医疗问答助手
    • 使用 Ollama 安装大语言模型
    • 准备高质量的医疗数据
    • 数据准备与清洗
    • 数据分割
    • 创建训练数据格式
    • 使用 Trainer API 进行微调
    • 数据编码
    • 设置训练参数
    • 创建 Trainer 实例
    • 开始微调
    • 评估模型
    • 保存微调后的模型
    • 测试模型
    • 持续优化
  • 总结


前言

在如今这个数字化飞速发展的时代,越来越多的企业和个人意识到,通用的AI模型可能无法满足特定行业或业务的独特需求。

企业在日常运营中面对的语言、文化和行业术语,都是千差万别的。而本地化的语言模型,不仅可以更精准地理解这些内容,还能提供更贴近用户需求的服务。比如,医疗行业的AI助手需要懂得专业术语,而电商平台的客服AI则得知道怎样与顾客更好地互动。

更重要的是,随着数据隐私和安全问题日益突显,很多企业开始倾向于在本地进行模型训练,这样不仅可以保护敏感数据,还能在数据处理上保持灵活性。
总之,定制化训练本地大语言模型的需求,将会是未来的趋势,帮助我们更好地应对各行各业的挑战!


一、Trainer API

Trainer API 是 Hugging Face 的 transformers 库中一个帮助你训练和评估机器学习模型的工具。它提供了一个简单的接口,让你无需深入了解复杂的训练细节,就可以专注于模型的开发。

它能做什么?

  1. 训练模型:自动处理训练过程,只需要提供数据和模型。
  2. 评估性能:在每个训练周期结束时,自动评估模型的性能。
  3. 记录日志:可以记录训练进度,比如损失和准确率,便于分析。
  4. 保存模型:训练完毕后,方便地保存模型以供后续使用。
  5. 扩展性:允许你添加自定义逻辑,比如特殊的评估指标。

基本步骤

  1. 准备数据:将你的数据集准备好,并分成训练集和验证集。
  2. 选择模型:选择一个预训练模型,比如 BERT 或 GPT。
  3. 设置训练参数:定义训练的超参数,比如学习率、批次大小和训练轮数。
  4. 创建 Trainer 实例:将模型、参数和数据传给 Trainer。
  5. 开始训练:调用 train() 方法开始训练。
  6. 评估模型:使用 evaluate() 方法来评估模型性能。
  7. 保存模型:使用save_model() 方法保存训练好的模型。

简单示例

下面是一个非常简化的代码示例,展示如何使用 Trainer API:

from transformers import Trainer, TrainingArguments, BertForSequenceClassification# 1. 加载模型
model = BertForSequenceClassification.from_pretrained("bert-base-uncased")# 2. 设置训练参数
training_args = TrainingArguments(output_dir='./results',   # 输出结果存放位置num_train_epochs=3,       # 训练3个周期per_device_train_batch_size=8,  # 每个设备的批次大小
)# 3. 创建 Trainer 实例
trainer = Trainer(model=model,              # 要训练的模型args=training_args,       # 训练参数train_dataset=train_dataset,  # 训练数据集eval_dataset=valid_dataset   # 验证数据集
)# 4. 开始训练
trainer.train()# 5. 评估模型
results = trainer.evaluate()
print(results)# 6. 保存模型
trainer.save_model('./final_model')

二、详细步骤

安装依赖

确保你已经安装了 transformers 和 datasets 库。如果尚未安装,可以使用以下命令:

pip install transformers datasets

准备数据集

首先,你需要准备一个数据集。假设你有一个 CSV 文件,包含问答对(问题和答案)。你需要将数据加载为适合 Trainer 的格式。

import pandas as pd
from datasets import Dataset# 加载数据
data = pd.read_csv('your_dataset.csv')  # 替换为你的数据文件
dataset = Dataset.from_pandas(data)# 分割数据集
train_test_split = dataset.train_test_split(test_size=0.2)
train_dataset = train_test_split['train']
valid_dataset = train_test_split['test']

加载本地模型和分词器

加载你本地的大模型和相应的分词器。假设你的模型存放在 path/to/your/model 目录下。

from transformers import AutoTokenizer, AutoModelForSequenceClassificationmodel_path = "path/to/your/model"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForSequenceClassification.from_pretrained(model_path)

数据预处理

使用分词器对数据进行编码,将文本转为模型可以接受的格式。

def preprocess_function(examples):return tokenizer(examples['question'], padding="max_length", truncation=True)train_dataset = train_dataset.map(preprocess_function, batched=True)
valid_dataset = valid_dataset.map(preprocess_function, batched=True)

设置训练参数

定义训练超参数。这些参数会影响训练过程和模型性能。

from transformers import TrainingArgumentstraining_args = TrainingArguments(output_dir='./results',              # 输出目录evaluation_strategy="epoch",          # 每个周期评估一次learning_rate=2e-5,                   # 学习率per_device_train_batch_size=8,        # 训练批次大小per_device_eval_batch_size=8,         # 评估批次大小num_train_epochs=3,                   # 训练轮数weight_decay=0.01                     # 权重衰减
)

创建 Trainer 实例

将模型、训练参数和数据集传给 Trainer 实例。

from transformers import Trainertrainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=valid_dataset,
)

开始训练

调用 train() 方法开始训练模型。

trainer.train()

评估模型

训练完成后,可以使用验证集对模型进行评估。

results = trainer.evaluate()
print(results)

保存模型

最后,将训练好的模型和分词器保存到指定目录。

trainer.save_model('./final_model')  # 保存模型
tokenizer.save_pretrained('./final_model')  # 保存分词器

三、 Trainer API 对大模型的限制

  1. 内存限制
    GPU 内存:大模型可能会超出可用 GPU 内存,导致训练失败。需要确保你的硬件能够支持模型的大小,或者使用梯度累积等方法减小内存压力。
    CPU 内存:如果使用 CPU 训练,模型和数据也可能占用大量内存。
  2. 训练时间
    大模型通常需要更长的训练时间,尤其是在较大的数据集上。这可能导致实验周期变长。
  3. 超参数调整
    对于大模型,超参数的选择(如学习率、批次大小等)可能会影响训练的稳定性和收敛速度。调试过程可能更加复杂。
  4. 分布式训练
    如果需要在多个 GPU 上进行分布式训练,配置和管理会更加复杂,涉及到同步和通信问题。
  5. 推理速度
    大模型的推理速度相对较慢,这在实时应用中可能成为瓶颈。
  6. 兼容性
    某些大模型可能不支持 Trainer API 的所有功能,例如特定的损失函数或自定义回调。

应对策略

  • 使用混合精度训练:可以减少内存使用并加速训练。
  • 模型压缩:尝试量化或剪枝等技术,以减少模型的大小和计算需求。
  • 分布式训练:使用accelerate 库或其他框架进行分布式训练。
  • 动态批次大小:根据可用资源动态调整批次大小。

四、用医疗数据微调 ChatGPT-3.5,让它成为智能的医疗问答助手

使用 Ollama 安装大语言模型

首先,我们需要在本地安装 Ollama。这是一个非常便捷的工具,能够让你轻松下载和运行大型语言模型。打开终端,输入以下命令:

curl -sSfL https://ollama.com/download.sh | sh

安装完成后,使用以下命令下载 GPT-3.5 模型:

ollama pull gpt-3.5

接下来,我们需要启动 Ollama 服务器,以便通过 API 调用模型:

ollama serve gpt-3.5

这会在 http://localhost:11434 启动一个服务器,你可以通过这个地址访问模型。

准备高质量的医疗数据

用高质量的医疗数据来微调 ChatGPT-3.5,让它成为一个更智能的医疗问答助手,首先,我们需要收集一些高质量的医疗问答数据。这里有几个建议:

  • 数据来源:可以从权威的医疗网站、学术论文以及知名的医疗问答平台上收集数据。确保这些信息是最新且可靠的。
  • 数据格式:你的数据最好是以问答对的形式保存,比如 CSV 文件,这样方便后续处理。

例如,你的数据文件可能长这样:

Question,Answer
"什么是糖尿病?","糖尿病是一种慢性疾病,血糖水平过高。"
"流感的症状有哪些?","流感的常见症状包括发热、咳嗽和全身疼痛。"

确保问题和答案都是准确且具有代表性的。

数据准备与清洗

使用 Pandas 读取和清洗数据,确保数据质量,避免空值和重复项:

import pandas as pd# 读取数据
data = pd.read_csv('medical_qa_chinese.csv')# 数据清洗
data.dropna(inplace=True)  # 删除空值
data = data[data['Question'].str.strip() != '']  # 删除空问题
data = data.drop_duplicates(subset='Question')  # 删除重复问题

清洗后的数据可以更好地支持模型训练。

数据分割

将数据集分为训练集和验证集,以便于后续评估模型:

from sklearn.model_selection import train_test_splittrain_data, valid_data = train_test_split(data, test_size=0.2, random_state=42)

创建训练数据格式

将问题和答案整理为模型可接受的 JSON 格式,方便后续处理:

train_pairs = [{"prompt": q, "completion": a} for q, a in zip(train_data['Question'], train_data['Answer'])]
valid_pairs = [{"prompt": q, "completion": a} for q, a in zip(valid_data['Question'], valid_data['Answer'])]import json# 保存训练数据
with open('train_data.json', 'w', encoding='utf-8') as f:json.dump(train_pairs, f, ensure_ascii=False)# 保存验证数据
with open('valid_data.json', 'w', encoding='utf-8') as f:json.dump(valid_pairs, f, ensure_ascii=False)

使用 Trainer API 进行微调

确保你安装了 Hugging Face 的 Transformers 和 Torch 库:

pip install transformers torch

接下来,加载 GPT-3.5 模型并进行微调:

from transformers import Trainer, TrainingArguments, AutoModelForCausalLM, AutoTokenizer# 加载 Ollama 模型
model_name = "ollama/gpt-3.5"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

数据编码

将训练和验证数据编码为模型所需的格式:

train_encodings = tokenizer(train_pairs, truncation=True, padding=True, return_tensors='pt')
valid_encodings = tokenizer(valid_pairs, truncation=True, padding=True, return_tensors='pt')import torchclass MedicalDataset(torch.utils.data.Dataset):def __init__(self, encodings):self.encodings = encodingsdef __getitem__(self, idx):return {key: val[idx] for key, val in self.encodings.items()}def __len__(self):return len(self.encodings['input_ids'])train_dataset = MedicalDataset(train_encodings)
valid_dataset = MedicalDataset(valid_encodings)

设置训练参数

配置训练参数,以确保模型在训练过程中达到最佳效果。以下是一些关键参数:

  • 学习率:控制模型学习的速度,太高可能导致训练不稳定,太低则训练过慢。
  • 训练轮数:通常可以从 3 到 5 轮开始,具体根据模型的学习情况进行调整。
  • 批量大小:根据你的硬件配置选择合适的批量大小,通常 4-16 之间。
training_args = TrainingArguments(output_dir='./results',              # 输出目录evaluation_strategy="epoch",          # 每个训练周期后进行评估learning_rate=5e-5,                   # 学习率per_device_train_batch_size=4,        # 每个设备的训练批次大小num_train_epochs=5,                   # 增加训练轮数以提高效果weight_decay=0.01                     # 权重衰减
)

创建 Trainer 实例

创建 Trainer 实例并传入模型、训练参数和数据集:

trainer = Trainer(model=model,args=training_args,train_dataset=train_dataset,eval_dataset=valid_dataset,
)

开始微调

调用 train() 方法开始微调过程:

trainer.train()

微调过程:

  • 在训练期间,模型会逐步学习如何从输入问题中生成合适的答案。
  • 每个 epoch 后,模型会在验证集上评估性能,输出损失和准确率等指标。
  • 如果发现模型在某个 epoch 的性能停滞,可以考虑调整学习率或增加训练轮数。

评估模型

训练完成后,使用验证集评估模型的性能:

results = trainer.evaluate()
print(results)

评估结果将提供模型在验证集上的损失、准确率等信息。这些指标可以帮助你判断模型是否过拟合或欠拟合。

保存微调后的模型

将微调后的模型和分词器保存,以便后续使用:

trainer.save_model('./fine_tuned_model')
tokenizer.save_pretrained('./fine_tuned_model')

测试模型

使用新的问题来测试微调后的模型,确保其能够正确回答医疗相关问题:

test_question = "糖尿病的饮食注意事项有哪些?"
input_ids = tokenizer.encode(test_question, return_tensors='pt')
outputs = model.generate(input_ids)
predicted_answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"预测答案: {predicted_answer}")

持续优化

如果模型的表现不尽如人意,可以通过以下方式进一步优化:

  • 数据扩充:增加更多高质量的数据,尤其是针对模型表现不好的问题。
  • 超参数调整:根据验证集的评估结果调整学习率、训练轮数等超参数。
  • 增量训练:在新的数据上进行增量训练,而不是完全从头开始训练。

简易版的结构说明
简易版的结构说明


总结

调优大语言模型的过程是一个系统化的流程,从数据准备到模型训练、评估和保存,都需要精心设计和执行。确保数据的质量和模型的适用性是关键。在整个过程中,监控模型的性能和调整超参数也是非常重要的。如果你有具体的问题或想了解某个步骤的更多细节,请随时询问!


http://www.ppmy.cn/embedded/116223.html

相关文章

vue3中使用nexttick

1、引入 import { nextTick } from vue 2、具体使用,配合异步 setup() {const message ref(Hello!)const changeMessage async newMessage > {message.value newMessageawait nextTick()console.log(Now DOM is updated)}} 3、具体使用,普通 方…

使用四叉树碰撞的游戏 显微镜RPG

实现四叉树碰撞检测 //author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽,绘制,放大缩小中 // 2024-7-20 // 直线改每帧打印一个点,生长的直线,直线炮弹 /…

docker存储

docker分层结构 如图所示,容器是由最上面可读可写的容器层,以及若干个只读镜像层组成,创建容器时,容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制: 1、容器中新生成的数据会直接存放在容器层&#xf…

sklearn特征选取之SelectFromModel

sklearn.feature_selection.SelectFromModel 是一种基于模型的重要性权重进行特征选择的工具,允许我们根据学习器的权重或特征重要性自动选择特征。它通过从模型中提取特征的重要性来选择特征,常用于与那些具有 coef_ 或 feature_importances_ 属性的模型…

计算机毕业设计 美发管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Docker网络原理

Docker 网络是 Docker 容器之间以及容器与外部世界之间通信的机制。Docker 提供了多种网络驱动,允许容器以不同的方式进行通信: Docker 网络工作原理: 网络命名空间:Docker 使用 Linux 的网络命名空间来隔离容器的网络堆栈。每个…

react组件入门

react应用程序就是由一个个组件搭建而成。组件有类组件和函数组件两种。 我们之前使用create-react-app创建了app,src下放的就是我们应用的源代码,我们基于这些已生成的文件,来学习和验证组件。 类组件 这里我们创建PostList.js更改这个ap…

oracle dblink的使用并举例

Oracle Database Link(DB Link)是Oracle提供的一种功能,允许你在一个数据库中直接访问另一个远程或本地数据库的对象(如表、视图、序列等)。DB Link的设置简化了跨数据库操作,使得数据的集成和同步变得更加…