昇思+昇腾开发板:基于昇思MindSpore使用 LoRA 微调模型模仿甄嬛语气对话
昇思+昇腾开发板:基于昇思MindSpore使用 LoRA 微调模型模仿甄嬛语气对话
作者:qianduanjidi
来源:昇思论坛
# 01 微调背景与目标
当前,MindSpore NLP 仓库 0.4 分支已支持适配昇腾开发板的 Qwen 模型。本内容将介绍如何在昇思大模型平台的单卡环境下,采用 LoRA 方法对 DeepSeek-R1-Distill-Qwen-1.5B 模型进行微调,使模型能模仿《甄嬛传》中甄嬛的语气风格进行对话。微调示例代码可参考 deepseek-r1-distill-qwen-1.5b-lora.py,昇腾开发板上的实际操作以该示例代码为准。
# 02 LoRA 方法简介
LoRA(Low-Rank Adaptation)是一种高效的参数微调方法,属于参数高效微调(PEFT)范式。其核心思路是:冻结原始模型参数,在 Attention 层的 Query、Key、Value(QKV)等模块引入由两个可训练的低维矩阵 A 和 B 组成的低秩旁路结构。微调时仅更新这两个矩阵,大幅减少训练参数量,降低计算和内存开销,同时性能接近全参数微调。
# 03 环境准备
卸载现有 MindSpore 并安装 2.6.0 版本:
%%capture captured_output
# 实验环境已经预装了mindspore==2.6.0,如需更换mindspore版本,可更改下面 MINDSPORE_VERSION 变量
!pip uninstall mindspore -y
%env MINDSPORE_VERSION=2.6.0
!pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/${MINDSPORE_VERSION}/MindSpore/un
查看当前 MindSpore 版本:
# 查看当前 mindspore 版本
!pip show mindspore
运行结果:
Name: mindspore
Version: 2.6.0
Summary: MindSpore is a new open source deep learning training/inference framework that could be used for mobile, edge and cloud scenarios.
Home-page: https://www.mindspore.cn
Author: The MindSpore Authors
Author-email: contact@mindspore.cn
License: Apache 2.0
Location: /home/mindspore/miniconda/envs/jupyter/lib/python3.9/site-packages
Requires: asttokens, astunparse, dill, numpy, packaging, pillow, protobuf, psutil, safetensors, scipy
Required-by: mindnlp
安装 MindSpore NLP 0.4.1 版本及 openMind Hub Client:
%%capture captured_output
# 04 数据集下载与处理
1、下载数据集
通过 openmind_hub 接口从魔乐社区下载 huanhuan.json 数据集。
import os
from mindnlp.transformers import AutoModelForCausalLM, AutoTokenizer
from mindnlp.engine import TrainingArguments, Trainer
from mindnlp.dataset import load_dataset
from mindnlp.transformers import GenerationConfig
from mindnlp.peft import LoraConfig, TaskType, get_peft_model
from mindnlp.engine.utils import PREFIX_CHECKPOINT_DIR
from mindnlp.configs import SAFE_WEIGHTS_NAME
from mindnlp.engine.callbacks import TrainerCallback, TrainerState, TrainerControl
from mindspore._c_expression import disable_multi_thread
disable_multi_thread() # 禁用多线程,提升微调性能
# 开启同步,在出现报错,定位问题时开启
# mindspore.set_context(pynative_synchronize=True)
from openmind_hub import om_hub_download
# 从魔乐社区下载数据集
om_hub_download(
repo_id="MindSpore-Lab/huanhuan",
repo_type="dataset",
filename="huanhuan.json",
local_dir="./",
)
运行结果:
'./huanhuan.json'
加载数据集: 使用 mindnlp 的 load_dataset 函数加载下载好的数据集。
# 加载数据集
2、数据处理
实例化 tokenizer,设置 pad_token 为 eos_token,padding_side 为 right。
# 实例化tokenizer
定义 process_func 函数,将数据处理成模型所需格式,包括生成对话模板、处理输入_ids、attention_mask 和 labels,进行截断和填充等操作。
对数据集应用处理函数,生成格式化数据集,并为演示裁剪数据集。
# 定义数据处理逻辑
运行结果:
User: 小姐,别的秀女都在求中选,唯有咱们小姐想被撂牌子,菩萨一定记得真真儿的——
# 05 执行微调
**1、**实例化基础模型:
加载 MindSpore-Lab/DeepSeek-R1-Distill-Qwen-1.5B-FP16 模型,并配置生成参数。
# 实例化base model
配置 LoRA: 设置任务类型、目标模块、秩等参数,实例化 LoRA 模型。
# LoRA配置
获取模型参与训练的参数,发现仅占总参数量的0.5%。
# 获取模型参与训练的参数,发现仅占总参数量的0.5%
运行结果:
trainable params: 9,232,384 || all params: 1,786,320,384 || trainable%: 0.5168380813819342
**2、**定义回调函数:
用于保存 LoRA 适配器权重。
# Callback函数,随save_steps定义的步数保存LoRA adapter权重
配置训练参数:
设置输出路径、批次大小、日志步数、训练轮数等。
# 训练超参
3、实例化 Trainer 并启动微调
# 定义Trainer
代码仓仓库:https://xihe.mindspore.cn/models/qianduanjidi/MindSpore\_Demo/tree