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

news2024/11/13 12:47:48

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, 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}")

持续优化

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

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

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


总结

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

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

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

相关文章

Machine Learning Specialization 学习笔记(3)

文章目录 前言一、神经网络基本概念基本组成工作流程训练过程类型应用举例不同层次特征的学习 为什么从基础特征到复杂特征逐渐推进什么是感受野更简单的解释具体示例总结 二、TensorFlow实现简单神经网络安装及环境配置数据预处理标准化 Dense层Convolutional Layer训练DEBUG …

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难,但做到60分基本上照着SOP做到位都没问题,如果我们能把每件事都做到60分,那绝对比至少60%的人都强,除非你的对手不讲武德——那就是他很可能看了我这篇文章,不但每方面都超过及格线&#…

MySQL高阶1853-转换日期格式

目录 题目 准备数据 分析数据 总结 题目 给定一个Days表,请你编写SQL查询语句,将Days表中的每一个日期转化为"day_name, month_name day, year"格式的字符串。 返回的结果表 不计顺序 。 准备数据 Create table If Not Exists Days (d…

Arthas 全攻略:让调试变得简单

文章目录 一、简介二、命令列表 一、简介 Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常&#xff…

排序---冒泡排序、堆排序

一、冒泡排序 相邻两个位置交换,假设排升序,就不断把最大的往后拿,所以这段序列从后往前变得有序。 //flag为0,即这个数组已经是有序的了,节省循环次数 二、堆排序(数组实现) 具体原理介绍看这…

jetcache-阿里多级缓存框架神器一定要掌握

文章目录 1. 简介2. springboot集成jetcache2.1 引入依赖2.2 配置文件2.3 高级API模式:通过CacheManager使用缓存,2.7 版本才可使用2.4 (推荐)AOP模式:通过Cached,CacheUpdate,CacheInvalidate注解 1. 简介 JetCache是…

局部整体(六)利用python绘制树状图

局部整体(六)利用python绘制树状图 树状图( Dendrogram)简介 由一个根节点组成,根节点产生多个通过分支连接的子节点。常用于表示层次结构或显示聚类算法的结果。树状图既可以看明白数据的层次结构,也能明…

兴业小知识|法拍房你不知道的省钱小技巧~划走可就亏大了

如果说二手房市场是买卖双方之间的博弈,那法拍房市场则是纯买方的心理游戏。 在法拍房竞拍过程中,有人稳如泰山,有人坐立不安,每一次的出价都是对相互底线的一番试探。 有激进竞拍,拍出天价的,有一举夺魁…

2024.9.20营养小题【2】(动态分配二维数组)

这道题里边涉及到了动态分配二维数组的知识点,不刷这道题我也不知道这个知识点,算是一个比较进阶一点的知识点了。 参考:C语言程序设计_动态分配二维数组_哔哩哔哩_bilibili【C/C 数据结构 】二维数组结构解析 - 知乎 (zhihu.com)

网络爬虫Request静态页面数据获取

在现代 Web 开发中,HTTP 请求(Request)是与服务器进行通信的核心操作。无论是在前端还是后端开发中,数据的获取、传递以及处理都离不开请求的应用。特别是在静态页面的数据获取中,使用请求可以将页面变得更加动态和互动,从而大大提升用户体验,使得页面内容更加丰富和灵活…

电风扇制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

电风扇正悄然成为制造业数字化转型浪潮中的一颗璀璨新星。通过构建5G智能工厂物联数字孪生平台,电风扇制造业正以前所未有的速度和精度,推进着整个行业的智能化、网络化与个性化发展。5G技术的飞速发展,为制造业带来了前所未有的通信速度和低…

vue 入门一

参考&#xff1a;丁丁的哔哩哔哩 1.使用vue 1.1 使用CDN的方式使用Vue mount和<div id"counter">关联起来 1.2 vue中的createApp import { createApp } from "vue"; import App from "./App.vue"; createApp(App).mount("#app&qu…

【软件测试】如何设计测试用例? 设计测试用例常用的方法.

目录 一.什么是测试用例?二.总体设计测试用例的万能公式.2.1 功能性能界面兼容易用安全2.2 弱网测试2.3 安装卸载测试. 三. 常用设计具体测试用例的方法3.1 等价类3.2 边界值3.3 正交法3.3.1 正交表3.3.2 如何设计正交表,并根据正交表编写测试用例 3.4 判定表法3.4.1 根据判定…

红日药业携手实在智能,构建RPA数字员工平台满足业务一体化需求 | 实在RPA案例

近日&#xff0c;天津红日药业股份有限公司&#xff08;简称“红日药业”&#xff09;与实在智能达成合作&#xff0c;依托实在智能业内领先的AIRPA技术&#xff0c;红日药业着手构建企业数字员工平台&#xff0c;满足业务一体化需求&#xff0c;培育新质生产力&#xff0c;为企…

基于PHP的电脑线上销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的电脑线上销售系…

小程序服务零工市场

零工市场小程序有着信息发布、岗位匹配、线上接单、零工人员保障险参保、技能培训、费用结算、完工确认、服务评价、纠纷调解等功能&#xff0c;为求职者和雇主搭建一座高效、便捷、精准的对接桥梁。 用工单位通过小程序的“雇主找人”&#xff0c;发布招聘信息&#xff0c;找到…

react-native连接android原生模块

目录 搭建react-native项目 搭建node和jdk的环境 搭建Android的环境 创建React-native项目 运行react-native项目 下载夜神模拟器 使用adb连接夜神浏览器。 运行react-native项目 编写原生安卓的apk android studio中编写原生代码 在React-native编写代码。 搭建rea…

【干货分享】2024软件测试面试题汇总

前言 本篇分享的软件测试面试题内容主要包括&#xff1a;测试总体、需求分析、测试计划、测试策略、测试用例、缺陷报告、测试总结报告、白盒测试、单元测试、集成测试、系统测试、验收测试等等26个模块。 1. 什么是软件测试&#xff1f; 答&#xff1a;为了发现程序中的错误…

滚动条指定距离滚动

/*** scroller 滚动条元素* to 滚动到位置* duration 滚动时间*/ function scrollLeftTo (scroller, to, duration) {let rafIdlet count 0const from scroller.scrollLeftconst frames duration 0 ? 1 : Math.round((duration * 1000) / 16)function cancel () {cancelAn…

学习CubeIDE——定时器开发

在b站上学习洋桃电子关于HAL库开发&#xff0c;发现使用CubeIDE是真的简单又方便。 实验现象&#xff1a;使用定时器来产生中断&#xff0c;中断程序是LED灯翻转 在我看来&#xff0c;定时器&#xff0c;是一个从0开始增1&#xff08;常规&#xff09;&#xff0c;增加到一定…