模型LoRA微调
关于微调
大模型微调一般有可以分为两种:
- 全参数微调
- 高效参数微调
其中全参数微调困难有三:
- 显存不够
- 算力不足
- 数据量不多
因此,采用高效参数微调的方案更加切实可行,例如,LoRA
在保持大模型本身参数不变的情况下,通过训练小部分旁路参数来微调大模型。
注意:在使用LoRA微调时,需要保证大模型本身输入输出的shape不变
LoRA
基本过程
在Mindspore
框架下使用LoRA
微调的基本过程有三步:
Base model 实例化:
# 实例化base model
model_id = "MindSpore-Lab/DeepSeek-R1-Distill-Qwen-1.5B-FP16"
base_model = AutoModelForCausalLM.from_pretrained(model_id, mirror="modelers")
base_model.generation_config = GenerationConfig.from_pretrained(
model_id, mirror="modelers"
)
base_model.generation_config.pad_token_id \
= base_model.generation_config.eos_token_id
配置LoraConfig
# LoRA配置
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=[
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"
],
inference_mode=False, # 训练模式
r=8, # Lora 秩
lora_alpha=32, # Lora alaph,具体作用参见 Lora 原理
lora_dropout=0.1 # Dropout 比例
)
实例化LoRA
模型
# 实例化LoRA模型
model = get_peft_model(base_model, config)
还可以通过查看模型中参与微调的实际参数个数:
model.print_trainable_parameters()
一些经验
使用pf16
的模型减少内存占用
直接加载fp16
减少内存占用。当没有fp16
模型可用时,可以先加载fp32
的模型,然后:
model.half()
model.save_pretrian()
来保存一个fp16
的模型。
限制python
线程数
因OrangePi AIpro
昇腾开发板内存与显存共享,且在执行时会拉起多python
进程,导致额外的内存占用,从而影响到显存。故通过配置环境变量的方式,限制python
进程数,从而减少对显存的影响。
通过配置环境变量:
export MAX_COMPILE_CORE_NUMBER=1
export TE_PARALLEL_COMPILER=1
配置cgroup
,手动限制进程最大内存占用
sudo cgcreate -g memory:python_limit # 创建cgroup
sudo cgset -r memory.limit_in_bytes=4G /python_limit # 限制4GB内存
sudo cgclassify -g memory:python_limit $$
小经验
数据集
通过将input
的label
设成-100,来让模型不生成input
。
数据准备
数据的读取是通过Pipeline
形式进行的,可以使用.map
函数,注意shape
, 顺序。
删除base model减少存储空间占用
保存LoRA
模型时,可能会同时保存base model,检查是否存在,如果存在可以将其删除。