微信扫码
与创始人交个朋友
我要投稿
本文简要介绍下基于LLaMA-Factory的llama3 8B模型的微调过程
# 1. 安装py3.10虚拟环境
conda create -n py3.10-torch2.2 python=3.10
source activate
conda activate py3.10-torch2.2
# 2. 安装cuda12.2 gpu版torch2.2
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1 -c pytorch -c nvidia
https://modelscope.cn/models/LLM-Research/Meta-Llama-3-8B/files
# git
git clone https://www.modelscope.cn/LLM-Research/Meta-Llama-3-8B.git
https://huggingface.co/meta-llama/Meta-Llama-3-8B
# git
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B
# 官方demo
torchrun --nproc_per_node 1 example_text_completion.py --ckpt_dir Meta-Llama-3-8B/original/ --tokenizer_path Meta-Llama-3-8B/original/tokenizer.model --max_seq_len 512 --max_batch_size 6
torchrun --nproc_per_node 1 example_chat_completion.py --ckpt_dir Meta-Llama-3-8B-Instruct/original/ --tokenizer_path Meta-Llama-3-8B-Instruct/original/tokenizer.model --max_seq_len 512 --max_batch_size 6
# run_llama3_demo.py
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
model_dir = "/home/your_name/llama3/llama3/Meta-Llama-3-8B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
model_dir,
torch_dtype="auto",
device_map="auto"
)
# 加载与模型相匹配的分词器。分词器用于将文本转换成模型能够理解和处理的格式。
tokenizer = AutoTokenizer.from_pretrained(model_dir)
# 加载与模型相匹配的分词器。分词器用于将文本转换成模型能够理解和处理的格式
prompt = "你好,请介绍下你自己。"
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt}
]
# 使用分词器的 apply_chat_template 方法将上面定义的消息列表转换为一个格式化的字符串,适合输入到模型中。
# tokenize=False 表示此时不进行令牌化,add_generation_prompt=True 添加生成提示。
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 将处理后的文本令牌化并转换为模型输入张量,然后将这些张量移至之前定义的设备(GPU)上。
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
https://github.com/hiyouga/LLaMA-Factory
详细过程可以参考
升级到24.0版本
export PIP_REQUIRE_VIRTUALENV=false
python -m pip install --upgrade pip
cd LLaMA-Factory
pip install -e .[metrics]
# or
pip install -r requirements.txt --index-url https://mirrors.huaweicloud.com/repository/pypi/simple
这里以微调中文为例:
cd /home/your_name/LLaMA-Factory/data
cat dataset_info.json
head alpaca_data_zh_51k.json
创建微调脚本
# single_lora_llama3.sh
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
export NCCL_P2P_DISABLE="1"
export NCCL_IB_DISABLE="1"
# 添加 --quantization_bit 4 就是4bit量化的QLoRA微调,不添加此参数就是LoRA微调 \
CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \ ## 单卡运行
--stage sft \ ## --stage pt (预训练模式) --stage sft(指令监督模式) --stage rm(奖励模型)
--do_train True \ ## 执行训练模型
--model_name_or_path /your model path/Meta-Llama-3-8B-Instruct \ ## 模型的存储路径
--dataset alpaca_zh \ ## 训练数据的存储路径,存放在 LLaMA-Factory/data路径下
--template llama3 \ ## 选择llama factory支持的模版
--lora_target q_proj,v_proj \ ## 默认模块应作为
--output_dir /save output model/single_lora_llama3_checkpoint \ ## 微调后的模型保存路径
--overwrite_cache \ ## 是否忽略并覆盖已存在的缓存数据
--per_device_train_batch_size 2 \ ## 用于训练的批处理大小。可根据 GPU 显存大小自行设置。
--gradient_accumulation_steps 64 \ ## 梯度累加次数
--lr_scheduler_type cosine \ ## 指定学习率调度器的类型
--logging_steps 5 \ ## 指定了每隔多少训练步骤记录一次日志。这包括损失、学习率以及其他重要的训练指标,有助于监控训练过程。
--save_steps 100 \ ## 每隔多少训练步骤保存一次模型。这是模型保存和检查点创建的频率,允许你在训练过程中定期保存模型的状态
--learning_rate 5e-5 \ ## 学习率
--num_train_epochs 1.0 \ ## 指定了训练过程将遍历整个数据集的次数。一个epoch表示模型已经看过一次所有的训练数据。
--finetuning_type lora \ ## 参数指定了微调的类型,lora代表使用LoRA(Low-Rank Adaptation)技术进行微调。
--fp16 \ ## 开启半精度浮点数训练
--lora_rank 4 \ ## 在使用LoRA微调时设置LoRA适应层的秩。
# 对齐格式
sed -i 's/\r$//' ./single_lora_llama3.sh
# 修改文件权限
chmod +x ./single_lora_llama3.sh
# 运行微调脚本
./single_lora_llama3.sh
# llama3_merge_model.sh
#!/bin/bash
python src/export_model.py \ ## 用于执行合并功能的Python代码文件
--model_name_or_path /your_src_model/Meta-Llama-3-8B-Instruct \ ## 原始模型文件
--adapter_name_or_path /your_lora_model/single_lora_llama3_checkpoint \ ## 微调模型权重文件
--template llama3 \ ## 模型模板名称
--finetuning_type lora \ ## 微调框架名称
--export_dir /output_model/llama3_lora \ ## 合并后新模型文件位置
--export_size 2 \
--export_legacy_format false
sed -i 's/\r$//' ./llama3_merge_model.sh
chmod +x ./llama3_merge_model.sh
./llama3_merge_model.sh
Step 6. 测试微调效果
# test_llama3_lora.py
llama3_lora = '/home/your_name/llama3/llama3_lora'
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda" # the device to load the model onto
model = AutoModelForCausalLM.from_pretrained(
llama3_lora,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(llama3_lora)
prompt = "请介绍下你自己"
messages = [
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19