使用一个大语言模型对另一个大语言模型进行“调教”
使用一个大语言模型对另一个大语言模型进行“调教”(通常称为微调或适配),是一种常见的技术手段,用于让目标模型更好地适应特定的任务、领域或风格。以下是基于搜索结果整理的详细步骤和方法:
1.准备工作
安装必要的库
• Transformers:用于加载和训练模型。
• Datasets:用于处理数据集。
• PEFT:用于微调,特别是LoRA(Low-Rank Adaptation)等技术。
• Accelerate:用于优化训练过程。
• ModelScope:用于下载和加载模型(国内用户)。
• SwanLab:用于可视化训练过程。
pip install transformers datasets peft accelerate modelscope swanlab
2.数据准备
下载数据集
使用datasets库下载或加载数据集。如果数据集较大或需要本地存储,可以手动下载并加载。
from datasets import load_dataset# 如果数据集在 Hugging Face 上
dataset = load_dataset("your_dataset_name", split="train")# 如果数据集在本地
dataset = load_dataset("json", data_files="path/to/your/dataset.json", split="train")
数据预处理
将数据集转换为适合模型输入的格式。通常需要对文本进行分词,并将标签转换为模型可理解的格式。
from transformers import AutoTokenizertokenizer = AutoTokenizer.from_pretrained("base_model_name")
MAX_LENGTH = 512 # 根据显存调整def preprocess_function(examples):inputs = tokenizer(examples["text"], truncation=True, max_length=MAX_LENGTH)labels = tokenizer(examples["label"], truncation=True, max_length=MAX_LENGTH)return {"input_ids": inputs["input_ids"],"attention_mask": inputs["attention_mask"],"labels": labels["input_ids"]}tokenized_dataset = dataset.map(preprocess_function, batched=True)
3.模型准备
下载并加载基础模型
使用transformers库加载基础模型。如果使用国内模型,可以通过ModelScope下载。
from transformers import AutoModelForCausalLM, AutoTokenizerbase_model = "base_model_name" # 替换为实际模型名称
tokenizer = AutoTokenizer.from_pretrained(base_model)
model = AutoModelForCausalLM.from_pretrained(base_model)
设置量化配置
如果需要在低显存设备上运行,可以对模型进行量化。
from transformers import BitsAndBytesConfigquant_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.float16,bnb_4bit_use_double_quant=False,
)
model = AutoModelForCausalLM.from_pretrained(base_model, quantization_config=quant_config)
应用LoRA配置
LoRA 是一种高效的微调方法,适用于大模型。
from peft import LoraConfig, TaskType, get_peft_modellora_config = LoraConfig(task_type=TaskType.CAUSAL_LM,target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],inference_mode=False,r=8, # LoRA 的秩lora_alpha=32,lora_dropout=0.1
)
model = get_peft_model(model, lora_config)
4.训练模型
设置训练参数
使用transformers的TrainingArguments设置训练参数。
from transformers import TrainingArgumentstraining_args = TrainingArguments(output_dir="./results",num_train_epochs=3,per_device_train_batch_size=4,gradient_accumulation_steps=4,learning_rate=2e-4,save_steps=500,logging_steps=500,evaluation_strategy="steps",eval_steps=500,save_total_limit=2,load_best_model_at_end=True,metric_for_best_model="accuracy",greater_is_better=True,save_on_each_node=True,bf16=True, # 如果使用 Ampere 架构以下的显卡,可以使用 fp16
)
创建训练器
使用transformers的Trainer或SFTTrainer进行训练。
from transformers import Trainertrainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset,tokenizer=tokenizer,
)
trainer.train()
5.保存和加载模型
保存模型
训练完成后,保存模型和分词器。
model.save_pretrained("path/to/save/model")
tokenizer.save_pretrained("path/to/save/tokenizer")
加载模型
加载保存的模型进行推理。
from transformers import AutoModelForCausalLM, AutoTokenizermodel = AutoModelForCausalLM.from_pretrained("path/to/save/model")
tokenizer = AutoTokenizer.from_pretrained("path/to/save/tokenizer")# 进行推理
prompt = "Who is Leonardo Da Vinci?"
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
output = model.generate(input_ids)
print(tokenizer.decode(output[0], skip_special_tokens=True))
6.使用 LangChain 进行 Prompt 工程
如果需要进一步优化模型的输出,可以使用 LangChain 框架进行 Prompt 工程。通过设计合适的提示词模板和输入输出接口,可以显著提升模型的性能。
from langchain.prompts import PromptTemplate
from langchain.llms import LLM# 创建提示词模板
template = """你是一个专业的{domain}专家,回答以下问题:
{question}
"""
prompt = PromptTemplate(input_variables=["domain", "question"], template=template)# 使用模型进行推理
llm = LLM(model=model, tokenizer=tokenizer)
response = llm(prompt.format(domain="历史", question="谁是达芬奇?"))
print(response)
7.可视化训练过程
使用 SwanLab 记录训练过程并可视化。
from swanlab.integration.huggingface import SwanLabCallbacktrainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset,tokenizer=tokenizer,callbacks=[SwanLabCallback()],
)
trainer.train()
总结
通过上述步骤,你可以使用一个大语言模型对另一个大语言模型进行微调,使其更好地适应特定的任务或领域。微调的关键在于数据准备、模型选择、量化配置、LoRA 应用以及训练参数的设置。此外,LangChain 框架可以进一步优化模型的输出,提升其在实际应用中的表现。
相关文章:
使用一个大语言模型对另一个大语言模型进行“调教”
使用一个大语言模型对另一个大语言模型进行“调教”(通常称为微调或适配),是一种常见的技术手段,用于让目标模型更好地适应特定的任务、领域或风格。以下是基于搜索结果整理的详细步骤和方法: 1.准备工作 安装必要的…...
golang使用sqlite3,开启wal模式,并发读写
因为sqlite是基于文件的,所以默认情况下,sqlite是不支持并发读写的,即写操作会阻塞其他操作,同时sqlite也很容易就产生死锁。 但是作为一个使用广泛的离线数据库,从sqlite3.7.0版本开始(SQLite Release 3.…...
如何利用maven更优雅的打包
最近在客户现场部署项目,有两套环境,无法连接互联网,两套环境之间也是完全隔离,于是问题就来了,每次都要远程到公司电脑改完代码,打包,通过网盘(如果没有会员,上传下载慢…...
音频进阶学习十二——Z变换一(Z变换、收敛域、性质与定理)
文章目录 前言一、Z变换1.Z变换的作用2.Z变换公式3.Z的状态表示1) r 1 r1 r12) 0 < r < 1 0<r<1 0<r<13) r > 1 r>1 r>1 4.关于Z的解释 二、收敛域1.收敛域的定义2.收敛域的表示方式3.ROC的分析1)当 …...
cursor指令工具
Cursor 工具使用指南与实例 工具概览 Cursor 提供了一系列强大的工具来帮助开发者提高工作效率。本指南将通过具体实例来展示这些工具的使用方法。 1. 目录文件操作 1.1 查看目录内容 (list_dir) 使用 list_dir 命令可以查看指定目录下的文件结构: 示例: list_dir log…...
MySQL 主从读写分离实现方案(一)—MariaDB MaxScale实现mysql8读写分离
一:MaxScale 是干什么的?? MaxScale是maridb开发的一个mysql数据中间件,其配置简单,能够实现读写分离,并且可以根据主从状态实现写库的自动切换,对多个从服务器能实现负载均衡。 二:MaxScale …...
阿里云 | DeepSeek人工智能大模型安装部署
ModelScope是阿里云人工智能大模型开源社区 ModelScope网络链接地址 https://www.modelscope.cn DeepSeek模型库网络链接地址 https://www.modelscope.cn/organization/deepseek-ai 如上所示,在阿里云人工智能大模型开源社区ModelScope中,使用阿里云…...
LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)
步骤一: 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…...
STM32 CUBE Can调试
STM32 CUBE Can调试 1、CAN配置2、时钟配置3、手动添加4、回调函数5、启动函数和发送函数6、使用方法(采用消息队列来做缓存)7、数据不多在发送函数中获取空邮箱发送,否则循环等待空邮箱 1、CAN配置 2、时钟配置 3、手动添加 需要注意的是STM32CUBE配置的代码需要再…...
MySQL数据存储- 索引组织表
索引组织表 前言数据存储堆表索引组织表 二级索引二级索引的性能评估🔹为什么 idx_name 的性能开销最大?🔹 为什么 idx_last_modify_date 更新频繁会影响性能?分析二级索引性能表格为什么主键应该“紧凑且顺序”?二级索…...
基于STM32设计的仓库环境监测与预警系统
目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块的技术详情介绍总结 1. 项目开发背景 随着工业化和现代化的进程,尤其是在制造业、食品业、医药业等行业,仓库环境的监控和管理成为了至关重要的一环。尤其是在存储易腐…...
VSCode便捷开发
一、常用插件 Vue 3 Snippets、Vetur、Vue - Official 二、常用开发者工具 三、Vue中使用Element-UI 安装步骤: 1、在VSCode的终端执行如下指令: npm i element-ui -S 2、在main.js中全局引入: import Vue from vue; import ElementUI from …...
理解 Maven 的 pom.xml 文件
pom.xml 是 Maven 项目的核心文件,它是项目构建、依赖管理、插件配置和项目元数据的主要地方。通过 pom.xml 文件,Maven 知道如何构建项目、下载依赖库、执行测试等任务。每个 Maven 项目都必须包含一个 pom.xml 文件。本文将详细讲解 pom.xml 文件的结构…...
docker数据持久化的意义
Docker 数据持久化是指在 Docker 容器中保存的数据不会因为容器的停止、删除或重启而丢失。Docker 容器本身是临时性的,默认情况下,容器内的文件系统是临时的,容器停止或删除后,其中的数据也会随之丢失。为了确保重要数据…...
opentelemetry-collector 配置elasticsearch
一、修改otelcol-config.yaml receivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailedotlp/jaeger: # Jaeger supports OTLP directlyendpoint: 192.168.31.161:4317tls:insecure: trueotlphttp/prometheus: …...
ASP.NET Core JWT Version
目录 JWT缺点 方案 实现 Program.cs IdentityHelper.cs Controller NotCheckJWTVersionAttribute.cs JWTVersionCheckkFilter.cs 优化 JWT缺点 到期前,令牌无法被提前撤回。什么情况下需要撤回?用户被删除了、禁用了;令牌被盗用了&…...
【ArcGIS】R语言空间分析、模拟预测与可视化技术
R语言在空间数据挖掘中具有广泛的应用,以下是一些关键内容和常用包的介绍: R语言空间数据挖掘的关键技术 空间数据类型 矢量数据:包括点(Point)、线(Line)、面(Polygon)等…...
日常知识点之面试后反思遗留问题汇总
梳理一下最近接触到的几个知识点: 1:突然问到端口复用 (SO_REUSEADDR) 端口复用一般用在服务端重启时,套接字处于time_wait状态时,无法绑定该端口,导致无法启动问题。 设置端口复用ÿ…...
链表(LinkedList) 1
上期内容我们讲述了顺序表,知道了顺序表的底层是一段连续的空间进行存储(数组),在插入元素或者删除元素需要将顺序表中的元素整体移动,时间复杂度是O(n),效率比较低。因此,在Java的集合结构中又引入了链表来解决这一问…...
Qt:Qt Creator项目创建
目录 认识Qt Creator Qt Creator概览 使用Qt Creator新建项目 选择项目模板 选择项目路径 选择构建系统 填写类信息设置界面 选择语言和翻译文件 选择Qt套件 选择版本控制系统 最终效果 认识Qt Creator Qt Creator概览 从开始菜单或者快捷方式打开Qt Creator集成开…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
