1.背景
上一篇文章写到,【个人开发】macbook m1 Lora微调qwen大模型
该微调方式,同样适用于GPU,只不过在train.py脚本中,针对device,调整为cuda即可。
如果数据量过大的话,单卡微调会存在瓶颈,因此考虑多GPU进行微调。
网上搜罗了一圈,多卡微调的常用方案:deepspeed+Llama-factory。
本文主要记录该方式的微调情况,仅为个人学习记录
2.微调方式
2.1 关键环境版本信息
| 模块 | 版本 |
|---|---|
| python | 3.10 |
| CUDA | 12.6 |
| torch | 2.5.1 |
| peft | 0.12.0 |
| transformers | 4.46.2 |
| accelerate | 1.1.1 |
| trl | 0.9.6 |
| deepspeed | 0.15.4 |
2.2 步骤
2.2.1 下载llama-factory
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
2.2.2 准备数据集
数据集采用网上流传的《甄嬛传》。
数据源地址:huanhuan.json
数据集结构如下。
// 文件命名:huanhuan.json
[
{
"instruction": "小姐,别的秀女都在求中选,唯有咱们小姐想被撂牌子,菩萨一定记得真真儿的——",
"input": "",
"output": "嘘——都说许愿说破是不灵的。"
},
...
]
其次,还得准备数据集信息【dataset_info.json】,因为是本地微调,所以微调时现访问dataset_info,再指定到具体的数据集中。
{
"identity": {
"file_name": "test_data.json"
}
}
注意文本的数据集的格式必须为,json,不然会报错。
2.2.3 微调模式
2.2.3.1 zero-1微调
配置参考zero-3的配置,修改了一下zero_optimization.stage的参数。
// 文件命名:ds_config_zero1.json
{
"fp16": {
"enabled": "auto",
"loss_scale": 0,
"loss_scale_window": 1000,
"initial_scale_power": 16,
"hysteresis": 2,
"min_loss_scale": 1
},
"bf16": {
"enabled": "auto"
},
"optimizer": {
"type": "AdamW",
"params": {
"lr": "auto",
"betas": "auto",
"eps": "auto",
"weight_decay": "auto"
}
},
"scheduler": {
"type": "WarmupLR",
"params": {
"warmup_min_lr": "auto",
"warmup_max_lr": "auto",
"warmup_num_steps": "auto"
}
},
"zero_optimization": {
"stage": 1,
"offload_optimizer": {
"device": "none",
"pin_memory": true
},
"offload_param": {
"device": "none",
"pin_memory": true
},
"overlap_comm": true,
"contiguous_gradients": true,
"sub_group_size": 1e9,
"reduce_bucket_size": "auto",
"stage3_prefetch_bucket_size": "auto",
"stage3_param_persistence_threshold": "auto",
"stage3_max_live_parameters": 1e9,
"stage3_max_reuse_distance": 1e9,
"stage3_gather_16bit_weights_on_model_save": true
},
"gradient_accumulation_steps": 4,
"gradient_clipping": "auto",
"steps_per_print": 100,
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"wall_clock_breakdown": false
}
微调脚本
# run_train_bash_zero_1.sh
#!/bin/bash
# 记录开始时间
START=$(date +%s.%N)
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 accelerate launch src/train.py
--deepspeed ds_config_zero1.json
--stage sft
--do_train True
--model_name_or_path /root/ai_project/fine-tuning-by-lora/models/model/qwen/Qwen2___5-7B-Instruct
--finetuning_type lora
--template qwen
--dataset_dir /root/ai_project/fine-tuning-by-lora/dataset/
--dataset identity
--cutoff_len 1024
--num_train_epochs 30
--max_samples 100000
--learning_rate 5e-05
--lr_scheduler_type cosine
--warmup_steps 10
--per_device_train_batch_size 4
--gradient_accumulation_steps 4
--max_grad_norm 1.0
--logging_steps 10
--save_steps 100
--neftune_noise_alpha 0
--lora_rank 8
--lora_dropout 0.1
--lora_alpha 32
--lora_target q_proj,v_proj,k_proj,gate_proj,up_proj,o_proj,down_proj
--output_dir ./output/qwen_7b_ft/zero1/
--bf16 True
--plot_loss True
# 记录结束时间
END=$(date +%s.%N)
# 计算运行时间
DUR=$(echo
文章来源于互联网:【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】
相关推荐: NO.22十六届蓝桥杯备战|一维数组|七道练习|冒泡排序(C++)
B2093 查找特定的值 – 洛谷 题⽬要求下标是从0开始的,和数组的下标是吻合的,存放数据应该从下标0开始 n的取值范围是1~10000 数组中存放的值的绝对值不超10000,说明int类型就⾜够了 找到了输出下标,找不到要输出-1,这⼀点要注意,很容易忽略…
5bei.cn大模型教程网










