采用LoRA方法微调llama3大语言模型


前言

因为上篇文章点赞数超过1,所以今天继续更新llama3微调方法。先介绍一下如何与本地llama3模型交互,再介绍如何使用torchtune和LoRA方式微调llama3,最后介绍一下如何用torchtune与llama3模型交互。


一、Llama3模型简介

目前llama3开源的模型有Meta-Llama-3-8B、Meta-Llama-3-8B-Instruct、Meta-Llama-3-70B和Meta-Llama-3-70B-Instruct。这里Meta-Llama-3-8B是参数规模为80亿的预训练模型(pretrained model),Meta-Llama-3-8B-Instruct是80亿参数经过指令微调的模型(instruct fine-tuned model);对应的,后两个模型就是对应700亿参数的预训练和指令微调模型。那么,预训练模型和指令微调模型有什么区别呢?我们来跟她们对话一下就明白了。

1.下载llama3源码到linux服务器

git clone https://github.com/meta-llama/llama3.git

2.安装依赖

最好先用anaconda创建一个专门为微调模型准备的python虚拟环境,然后运行命令:

cd llama3
pip install -e .

3.测试预训练模型Meta-Llama-3-8B

torchrun --nproc_per_node 1 example_text_completion.py
–ckpt_dir Meta-Llama-3-8B/
–tokenizer_path Meta-Llama-3-8B/tokenizer.model
–max_seq_len 128 --max_batch_size 4

参数解释:
–ckpt_dir 模型权重所在文件夹路径,一般后缀为.pt、.pth或.safetensors
–tokenizer_path 分词器路径,必须带上分词器名称,例如tokenizer.model
–max_seq_len 输出的最大序列长度,这个在预训练模型的调用中是必带参数
–max_batch_size 每个批次包含的最大样本数

下图是模型的输出结果,当我输入英文"I believe the meaning of life is"时,模型会输出"to love. It is to love others, to love ourselves, and to love God. Love is the meaning of life blablabla"。
llama3预训练模型的输出
很明显,预训练模型Meta-Llama3-8B是对用户输入的一个续写。

4.测试指令微调模型Meta-Llama3-8B-Instruct

torchrun --nproc_per_node 1 example_chat_completion.py
–ckpt_dir /data/jack/Meta-Llama-3-8B-Instruct/original/
–tokenizer_path /data/jack/Meta-Llama-3-8B-Instruct/original/tokenizer.model
–max_seq_len 512 --max_batch_size 4
参数解释:
–max_seq_len 输出的最大序列长度,这个对指令微调模型是可选参数,不设置指令微调模型也会在问答中自动停止输出
指令词微调的模型问答
如上图所示,Meta-Llama-3-8B-Instruct模型面对用户的提问,会给出合适的回答。

5.小结

Meta-Llama-3-8B是针对用户输入的一个续写,跟Transformer架构的模型在预训练过程中的下一词汇预测很相似;Meta-Llama-3-8B-Instruct是可以回答用户提问的模型。因此,在选择LoRA微调的基底模型时,大部分情况应当选择指令词微调模型。

二、LoRA微调Llama3

1.引入库

在切换到anaconda或venv的python环境后:

pip install torchtune

2.编写配置文件

如果下载了torchtune仓库的源码,可以从中拷贝出对应的recipe文件,文件夹的相对路径为:
torchtune\recipes\configs\llama3

# Model Arguments
model
### 使用LoRA技术微调LLaMA大语言模型 #### 一、环境准备 为了成功应用LoRA技术对LLaMA进行微调,需确保安装必要的库并配置好运行环境。这通常涉及PyTorch及其扩展包`transformers`和`peft`(用于实现LoRA)。对于硬件资源有限的情况,调整参数如`micro_batch_size=1`可以有效降低内存占用,使得像A800这样的单张显卡也能处理大规模模型[^2]。 ```bash pip install torch transformers peft accelerate bitsandbytes ``` #### 二、加载预训练模型 通过Hugging Face的Transformers库轻松获取已有的LLaMA模型权重文件,并将其加载到指定设备上: ```python from transformers import AutoModelForCausalLM, AutoTokenizer model_name_or_path = "your_model_path" tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) model = AutoModelForCausalLM.from_pretrained( model_name_or_path, load_in_8bit=True, # 如果使用int8量化则开启此选项 device_map="auto", # 自动分配至可用GPU ) ``` #### 三、初始化LoRA适配器 利用PEFT库中的功能来创建一个基于现有模型架构的新层——即所谓的低秩适应(LoRA),它允许只修改少量新增加的参数而不是整个网络结构: ```python from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=16, # 秩大小,默认为16 lora_alpha=32, # LoRA缩放因子 target_modules=["q_proj", "v_proj"], # 需要添加LoRA模块的位置 lora_dropout=0.05, # 应用在新加入矩阵上的dropout概率 ) model = get_peft_model(model, lora_config) print(f"Trainable parameters after applying LoRA: {sum(p.numel() for p in model.parameters() if not p.requires_grad)}") ``` #### 四、数据集准备与迭代优化过程 定义适合目标任务的数据读取逻辑以及相应的损失函数计算方式;接着就可以按照常规流程执行训练循环,在每轮结束后保存最佳版本的checkpoint以便后续部署或进一步精炼. ```python import datasets from torch.utils.data.dataloader import DataLoader from transformers import Trainer, TrainingArguments dataset = datasets.load_dataset('path_to_your_data') train_dataloader = DataLoader(dataset['train'], batch_size=4) training_args = TrainingArguments(output_dir="./results", per_device_train_batch_size=4, num_train_epochs=3, logging_steps=10,) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataloader.dataset, ) trainer.train() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值