三尺非寒 发表于 2026-2-26 03:41:17

保姆级零根本微调大模子(LLaMa-Factory,多卡版)

此处非常感谢https://github.com/hiyouga/LLaMA-Factory这个项目。
看到网上的教程许多都是教怎样用webui来微调的,这里出一期下令行多卡微调教程~
1. 模子预备

模子下载比力方便的方法:
1. modelscope社区(首选,速率很高,而且许多须要申请的模子都有)注意要选择代码下载,直接用下令行下载模子文件下不下来。注意默认的话是下到体系盘里,加上cache_dir这个参数
2. huggingface镜像网站(不消梯子,但是该申请的照旧须要申请,具体可参考主页的别的一篇文章哦~)
3.自行下载网上云盘资源等(上传比力慢,若接纳此方法,保举使用XShell等工具)
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvN2E3NTlkMWI2ZTU3NDNiOWQ3ZDhmODgyOTA5MTU3MTEucG5n


2. 数据集预备

数据集告急有两种格式,这里直接参考堆栈内里给出的示例数据即可(非常简朴)
有以下几点注意:
1. 对于本身的数据集,起首去测试一下instruction+input的长度,方便反面设定cutoff_len(这个参数的寄义是,长度到达cutoff_len会被截断)
2. 记得去data_info.json内里加上本身的数据集信息,参考以下添加方法。此处有个坑,原来是须要有哈希码来对应文件的,但是这个哈希码很神奇,乱写的哈希码会报哈希不对应,对应的哈希码照旧会报错。以是,末了干脆没写,就能跑了,而且本身新加了2个数据集都没写,都没有题目。
"MQA": {
      "file_name": "train_llama.json",
      "columns": {
            "prompt": "instruction",
            "query": "input",
            "response": "output",
            "history": "history"
      }
    }, https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvYjhmMDY1NjZkMmJjMzE1YTgxYmQ3MmY5OGNmMTI2OTEucG5n

3. 模子预备

设置环境具体步调:(这里非常多坑,按照这个步调是没题目标!)
# 使用cuda 12.1
# 使用conda创建环境
conda create -n llama_factory python=3.11
cd LLaMA-Factory
# 安装torch==2.4.0
conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.1 -c pytorch -c nvidia
pip install -e "."
pip install wandb
# 安装deepspeed
DS_BUILD_CPU_ADAM=1 pip install deepspeed==0.14.0
4. 修改下令

下面告急是先容在单台服务器(single node),多个GPU(multi gpu)的参数设置
要注意的告急是以下几点:
1. eval看是否须要,eval时间对于参数目比力大+数据量比力大而言有点长,可以直接把per_device_eval_batch_size、eval_steps、evaluation_strategy、load_best_model_at_end、val_size删掉,注意是删掉。 
2. 多卡并行时,记得去记得去LLaMA-Factory/examples/accelerate/fsdp_config.yaml文件`line 19`设置GPU个数!(发起卡数为2的次方,和利用体系有关)
num_processes: 4 # the number of GPUs in all nodes 忘记改的话就会像我下面如许报错
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvNjlmNWQxYmE5YTcwYmQ0ZTAyZGFkZWNiZDg2N2I0YWEucG5n
3. template记得改成你的模子名称,不能直接default,lora_target也是去找README举行修改
4. batch设置本身的显存可以大概跑起来的,我的是40G显存,只能设最大为4,末了的batch_size实际上是卡数 * 每张卡的batch * 累计步数,以是想要大一点的batch_size,可以对应地把gradient_accumulation_steps调高一点。理论上来说,batchsize大一些练习得会稳固一些,但是相应的学习率也应该轻微调大一些,具体可以参考这篇blog,写得很清楚。
放一个example.yaml供各人参考:
### model
model_name_or_path: xxx/huggingface/hub/mistralai/Mixtral-8x22B-Instruct-v0.1

### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
deepspeed: examples/deepspeed/ds_z3_offload_config.json

### dataset
dataset: mbpp
template: mistral
cutoff_len: 2048
max_samples: 316
overwrite_cache: true
preprocessing_num_workers: 16

### output
output_dir: saves/mistral8x22b/lora/sft
logging_steps: 1
save_steps: 500
plot_loss: true
overwrite_output_dir: true

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 2
learning_rate: 1.0e-4
num_train_epochs: 1 # test
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000

### eval
# val_size: 0.1
# per_device_eval_batch_size: 1
# eval_strategy: steps
# eval_steps: 500

### wandb
report_to: wandb
run_name: Mistral_8x22b_test
5. 开训

按照官方给出的README举行练习即可:
llamafactory-cli train examples/train_lora/xxx.yaml
llamafactory-cli chat examples/inference/xxx.yaml
llamafactory-cli export examples/merge_lora/xxx.yaml https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvZWYwMTE4YzkxNWVmNWUxZDc0ZjIzY2UzN2Y0ZTFkYTAucG5n
练习的时间注意以下几点: 
1. 可先用小数据集训一版,直接在sh文件中修改max_samples参数,跑一轮确定一下batch_size巨细为多少比力符合
2. 还要注意体系盘是否够大,否则数据加载不完就满了也无法举行练习
练习乐成后:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvM2IyNWIxMDYxMWU4YjZmYTAzN2EyZGYyODc5YzdjZjYucG5n
loss图像:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvMWRlMzY4M2RjNWM0NDc5YTA0YjIyYmQyYjIwYjFkMDIucG5n
6. 结果评测

先要举行merge 根本模子以及LoRA,再举行推理。推理发起使用vllm,速率会快许多。
merge_model在example内里有根本下令,须要注意的如下:
1. template记得改成对应的模子,其他参数根本不须要修改

7. 总结反思

第一次实行多卡微调大模子中途遇到了挺多坑,而且感觉有一些头脑上的误区,要实时记载下来:
1. 使用unsloth练习只能用单卡
2. 设置文件肯定要好悦目,每个都看懂,比如说yaml文件,有一些设置默认的要改成符合的,在微调的时间就要多点去相识每个参数的寄义
3. 报错第一时间去看issue,而不是在网上乱搜
4. 要只管使用2的次方的卡数,比方说2,4,8,用其他的不符合利用体系的规律,大概会有一些题目,比如说算力分配不均衡,2**n的张量无法拆分举行运算
5. 体系盘如果不敷的话可以直接清空.cache文件(都是缓存文件),一样平常在根目次下 cd ~
6. 练习的时间肯定要明了练习集和测试集的分布。比方说如果测试集原来的分布就和练习集一样,那就不要乱搞练习集增强,不要说训得不好的那些数据集再让他学习更多次,如许分布会变,让模子倾向于天生这些hard样本模式的。有一种环境可以调解数据分布不均衡的环境,练习集显着有偏,比如说99%正样本,1%负样本这些。
7. 在跑代码之前都要记得用小数据集举行试试,说不定跑完才报错呢!
8. 验证集,按本身需求,想快点就不要常常valid,大概调小一点比例
9. 推理的时间,大概偶然候贪心就是最好的,直接设temperature=0,topk=1
10. 注意maxlen,肯定要看清楚练习的数据集的长度,实现统计一下,告急的信息不要放反面,实行证明大模子照旧会更加关注前面的信息,以是rerank是个很好的提分trick! 至于怎样rerank也是很有本领的,肯定要注意分布要类似,最好就是选Top-K确定的,不要一个是2个一个是10个,如许分布很欠悦目!
11. 比LoRA稳固好的尚有LoRA+,PLoRA,稳固涨1-2%左右,微调之前先调研清楚呀!!
12. 迭代LoRA的结果不好!!不要理想着训完一个LoRA之后再来一个LoRA,真的没有重训好
页: [1]
查看完整版本: 保姆级零根本微调大模子(LLaMa-Factory,多卡版)