昇思学习营第七期·昇腾开发板2

模型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 $$

小经验

数据集

通过将inputlabel设成-100,来让模型不生成input

数据准备

数据的读取是通过Pipeline形式进行的,可以使用.map函数,注意shape, 顺序。

删除base model减少存储空间占用

保存LoRA模型时,可能会同时保存base model,检查是否存在,如果存在可以将其删除。