昇思+昇腾开发板+DeepSeek模型LoRA微调
LoRA微调原理
-
核心思想:冻结预训练模型权重,仅训练橙色的低秩适配矩阵(A/B矩阵)
-
-
优势:
- 训练参数量减少至全量微调的0.5%
- 显存占用降低50%以上
- 适配器权重仅需保存3MB(原模型5.6GB)
关键配置
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=[“q_proj”, “k_proj”, “v_proj”, “gate_proj”, “up_proj”, “down_proj”],
inference_mode=False,
r=8, # 低秩维度
lora_alpha=32, # 缩放系数
lora_dropout=0.1
)
开启同步
通过mindspore.set_context(pynative_synchronize=True)开启同步,方便在出现问题时进行快速定位。
流程:
环境准备与检查 -> 代码下载 -> 权重下载 -> 其他环境准备 -> 启动运行
代码实现知识点1:
MindSpore在将数据预处理操作应用到数据集时,代码实现会和Hugging Face Transformers有所区别。
MindSpore配合数据处理Pipeline来实现数据预处理,所有的数据变换通过.map(…)方法传入,需要指定作用的数据列。
.map(…) 操作可以针对数据集指定列 (column) 添加数据变换 (Transforms),将数据变换应用于该列数据的每个元素,并返回包含变换后元素的新数据集。
.map(…) 操作可以执行Dataset模块提供的内置数据变换操作,也可以执行用户自定义的变换操作。
代码实现知识点2:
脚本中自定义了SavePeftModelCallback,即每次在save_steps个步数后,将模型当前的LoRA adapter权重保存下来,做到保存微调过程中的权重。
保存后的权重可在指定的保存路径(案例中为“./output/DeepSeek-R1-Distill-Qwen-1.5B/adapter_model”)找到。
经验分享
香橙派AIpro的host侧和device侧共享,所以在host侧的内存占用(如python的多进程,模型加载等)也会影响到显存。
优化方案1
在加载模型时,直接加载fp16的权重,而非加载fp32权重再转成fp16。
加载fp32权重,然后转成fp16会占用大量内存。
直接加载fp16权重可以显著减少内存占用。
DeepSeek-R1-Distill-Qwen-1.5B 模型LoRA微调
优化方案2
如何限制拉起的python进程数,从而控制额外的内存占用,减少对显存的影响。 比较好的解决方案是通过设置如下环境变量,可以把python进程控制在4-6个:
export MAX_COMPILE_CORE_NUMBER=1
export TE_PARALLEL_COMPILER=1
MAX_COMPILE_CORE_NUMBER: 此环境变量用于指定图编译时可用的CPU核数。
TE_PARALLEL_COMPILER: 算子最大并行编译进程数,当大于1时开启并行编译。