赞
踩
因为上篇文章点赞数超过1,所以今天继续更新llama3微调方法。先介绍一下如何与本地llama3模型交互,再介绍如何使用torchtune和LoRA方式微调llama3,最后介绍一下如何用torchtune与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亿参数的预训练和指令微调模型。那么,预训练模型和指令微调模型有什么区别呢?我们来跟她们对话一下就明白了。
git clone https://github.com/meta-llama/llama3.git
最好先用anaconda创建一个专门为微调模型准备的python虚拟环境,然后运行命令:
cd llama3
pip install -e .
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"。
很明显,预训练模型Meta-Llama3-8B是对用户输入的一个续写。
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模型面对用户的提问,会给出合适的回答。
Meta-Llama-3-8B是针对用户输入的一个续写,跟Transformer架构的模型在预训练过程中的下一词汇预测很相似;Meta-Llama-3-8B-Instruct是可以回答用户提问的模型。因此,在选择LoRA微调的基底模型时,大部分情况应当选择指令词微调模型。
在切换到anaconda或venv的python环境后:
pip install torchtune
如果下载了torchtune仓库的源码,可以从中拷贝出对应的recipe文件,文件夹的相对路径为:
torchtune\recipes\configs\llama3
# Model Arguments model: _component_: torchtune.models.llama3.lora_llama3_8b lora_attn_modules: ['q_proj', 'v_proj'] apply_lora_to_mlp: False apply_lora_to_output: False lora_rank: 8 lora_alpha: 16 # Tokenizer tokenizer: _component_: torchtune.models.llama3.llama3_tokenizer path: /data/jack/Meta-Llama-3-8B-Instruct/original/tokenizer.model checkpointer: _component_: torchtune.utils.FullModelMetaCheckpointer checkpoint_dir: /data/jack/Meta-Llama-3-8B-Instruct/original/ checkpoint_files: [ consolidated.00.pth ] recipe_checkpoint: null output_dir: /data/jack/Meta-Llama-3-8B-Instruct/ model_type: LLAMA3 resume_from_checkpoint: False # Dataset and Sampler dataset: _component_: torchtune.datasets.alpaca_cleaned_dataset train_on_input: True seed: null shuffle: True batch_size: 2 # Optimizer and Scheduler optimizer: _component_: torch.optim.AdamW weight_decay: 0.01 lr: 3e-4 lr_scheduler: _component_: torchtune.modules.get_cosine_schedule_with_warmup num_warmup_steps: 100 loss: _component_: torch.nn.CrossEntropyLoss # Training epochs: 1 max_steps_per_epoch: null gradient_accumulation_steps: 64 compile: False # Logging output_dir: /data/jack/torchtune_test/lora_finetune_output metric_logger: _component_: torchtune.utils.metric_logging.DiskLogger log_dir: ${output_dir} log_every_n_steps: 1 log_peak_memory_stats: False # Environment device: cuda dtype: bf16 enable_activation_checkpointing: True # Profiler (disabled) profiler: _component_: torchtune.utils.profiler enabled: False
这里解释一下各个参数:
tokenizer下的path 这个一定要填写你下载的基底模型的分词器路径
checkpointer下的checkpoint_dir 填写你要微调的基底模型的存放文件夹路径
checkpointer下的checkpoint_files 基底模型文件名(一个或多个)
dataset下的_component_ 填写现有的或自定义的数据集类名
loss下的_component_ 填写训练过程中的损失函数,默认是交叉熵损失
epochs(发音:一剖克斯) 训练轮次,可以先设置为1试一下
下命令进行微调:
tune run lora_finetune_single_device --config ./8B_lora_single_device_custom.yaml
结束训练后,在输出文件夹中会产出一个合并了lora和基底模型权重的新模型meta_model_0.pt,也会产出一个独立的lora权重文件adapter_0.pt。
# Model arguments model: _component_: torchtune.models.llama3.llama3_8b checkpointer: _component_: torchtune.utils.FullModelMetaCheckpointer checkpoint_dir: /data/feipan3/Meta-Llama-3-8B-Instruct/ checkpoint_files: [meta_model_0.pt] output_dir: /data/feipan3/Meta-Llama-3-8B-Instruct/ model_type: LLAMA3 device: cuda dtype: bf16 seed: 5678 # Tokenizer arguments tokenizer: _component_: torchtune.models.llama3.llama3_tokenizer path: /data/feipan3/Meta-Llama-3-8B-Instruct/original/tokenizer.model # Generation arguments; defaults taken from gpt-fast prompt: "Give three tips for staying healthy." max_new_tokens: 512 temperature: 0.6 # 0.8 and 0.6 are popular values to try top_k: 300 quantizer: null
tune run generate --config generation_custom.yaml
我的问题是“给出保持健康的三条建议”,得到输出结果:
本文主要介绍了如何用torchtune工具微调Llama3,详细介绍了如何设置配方文件,如何运行以及最后如何进行效果验证。本文点赞超过2个,下一期继续更新如何准备微调数据集。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。