自学内容网 自学内容网

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

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


前言

在如今这个数字化飞速发展的时代,越来越多的企业和个人意识到,通用的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, AutoModelForSequenceClassification

model_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 TrainingArguments

training_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 Trainer

trainer = 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_split

train_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 torch

class MedicalDataset(torch.utils.data.Dataset):
    def __init__(self, encodings):
        self.encodings = encodings

    def __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}")

持续优化

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

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

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


总结

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


原文地址:https://blog.csdn.net/weixin_47763079/article/details/142387316

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!