微调大语言模型
准备步骤
1 安装所需包
pip install transformers
pip install accelerate
pip install huggingface_hub
pip install ipywidgets
pip install datasets
pip install trl
pip install peft
pip install swanlab
下载模型与数据集
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
from huggingface_hub import snapshot_download
- 注意HF_ENDPOINT环境变量需在huggingface相关库之前
然后下载模型与数据集
snapshot_download(repo_id="b-mc2/sql-create-context",
repo_type="dataset",
local_dir="data",
max_workers=8,
resume_download=True
)
snapshot_download(
repo_id="codellama/CodeLlama-7b-hf",
local_dir="CodeLlama-7b-hf",
resume_download=True,
max_workers=8
)
以下是训练代码
from datasets import load_dataset
import swanlab
from swanlab.integration.huggingface import SwanLabCallback
import torch
from trl import SFTTrainer
from peft import LoraConfig
from transformers import TrainingArguments
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import setup_chat_format
import swanlab
swanlab.login(api_key='')
model_id = "internlm2_5-1_8b-chat" # or `mistralai/Mistral-7B-v0.1`
dataset = load_dataset("json",data_files="train_dataset.json",split="train",)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="auto",
# attn_implementation="flash_attention_2",
torch_dtype=torch.bfloat16,
trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained(model_id,trust_remote_code=True)
tokenizer.padding_side = 'right' # 以防止警告
model, tokenizer = setup_chat_format(model, tokenizer)
# 基于QLoRA论文和Sebastian Raschka实验的LoRA配置
peft_config = LoraConfig(
lora_alpha=128,
lora_dropout=0.05,
r=256,
bias="none",
target_modules="all-linear",
task_type="CAUSAL_LM",
)
args = TrainingArguments(
output_dir="code-llama-7b-text-to-sql", # 要保存的目录和存储库ID
num_train_epochs=3, # 训练周期数
per_device_train_batch_size=3, # 训练期间每个设备的批量大小
gradient_accumulation_steps=2, # 反向/更新前的步骤数
gradient_checkpointing=True, # 使用渐变检查点来节省内存
optim="adamw_torch", # 使用融合的adamw优化器
logging_steps=10, # 每10步记录一次
save_strategy="epoch", # 每个epoch保存检查点
learning_rate=2e-4, # 学习率,基于QLoRA论文
# bf16=True, # 使用bfloat16精度
max_grad_norm=0.3, # 基于QLoRA论文的最大梯度范数
warmup_ratio=0.03, # 根据QLoRA论文的预热比例
lr_scheduler_type="constant", # 使用恒定学习率调度器
report_to="tensorboard", # 将指标报告到Tensorboard
)
swanlab_callback = SwanLabCallback(experiment_name="TransformersTest", cloud=False)
max_seq_length = 3072 # 数据集模型和打包的最大序列长度
trainer = SFTTrainer(
model=model,
args=args,
train_dataset=dataset,
peft_config=peft_config,
max_seq_length=max_seq_length,
tokenizer=tokenizer,
callbacks=[swanlab_callback],
packing=True,
dataset_kwargs={
"add_special_tokens": False, # 我们使用特殊 tokens
"append_concat_token": False, # 不需要添加额外的分隔符 token
})
trainer.train()
trainer.save_model()
本文作者:Feihong1
本文链接:https://www.cnblogs.com/Feihong1/p/18383804
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步