基于魔乐社区openMind实现大模型微调指南(二)大模型微调实操

前言

一、大模型微调上手指南

大模型(LLM)的预训练和微调是打造AI应用的两个关键阶段。对于人工智能初学者和对大模型感兴趣的大学生来说,理解如何使用Qwen2.5-7B-Instruct模型进行任务微调非常有价值。本文将通过一个通俗易懂的实战教程,手把手介绍从概念到代码的完整流程,涵盖文本分类、问答、摘要生成和对话生成等任务。文章包括预训练与微调的区别、微调前需要掌握的基础知识、微调的步骤详解、代码示例以及相关资源推荐。

1.1 预训练 vs 微调:有什么区别?

Alpaca 和 Vicuna 是 LLaMA 模型的微调版本,能够进行对话并遵循指示。根据他们的网站,Vicuna 的输出质量(根据 GPT-4 判断...)约为 ChatGPT 的 90%,使其成为您可以在本地运行的最佳语言模型。这意味着通过微调模型,您可以获得针对特定任务的更好基础模型版本。

在开始实战之前,我们先明确预训练微调这两个概念:

为什么需要微调? 通用大模型很强大,但不可能直接解决所有垂直领域的问题。例如,一个在海量通用文本上预训练的模型可能没有掌握医学领域的专业术语或格式。如果我们希望模型帮忙生成医学报告,就需要用医疗领域的数据来微调它,让模型习得该领域的专业知识和表达方式。通过微调,我们可以让模型的任务特定性能提升,更好地适应目标领域的术语和语义。同时微调还能缓解数据稀缺性问题,在有限的标注数据下显著提升模型在特定任务上的表现。

预训练造就了模型的“大脑”和基本能力,微调则相当于请模型的“私人导师”进行强化训练,使其在特定任务上达到专家水平。接下来,我们将进入微调实战前的准备工作。

1.2 微调准备:模型、参数与数据

在动手微调Qwen2.5-7B-Instruct之前,需要了解和准备以下基础知识和要素:

1.2.1 模型参数规模与硬件要求

Qwen2.5-7B-Instruct是一个具有约7B参数的因果语言模型(Causal LM),结构包含28层Transformer、RMSNorm等机制,支持最长128K的上下文长度。7B参数模型属于较大的模型,其显存占用需要重点考虑。一般经验是16位精度加载模型需要约2倍于参数量的显存空间,7B模型大约需要14GB显存才能完整加载。。因此,在GPU上微调7B模型通常至少需要一张高端显卡(如24GB显存的RTX 3090/4090等),或者采用更高效的加载方式(例如bfloat16、8bit/4bit量化)来降低显存占用。如果有多块GPU,可以考虑使用数据并行或模型并行来分担内存压力。

操作系统与依赖: 推荐使用Linux或类似的64位操作系统环境。安装最新版的 Python 3.8+PyTorch**深度学习框架**(建议PyTorch 2.x,已支持GPU)。然后,通过pipconda安装Hugging Face的Transformers库和相关工具:

确保Transformers版本兼容: Qwen2.5模型已经整合进Transformers库(需版本≥4.37.0)。使用足够新的Transformers可以直接加载Qwen模型而不需要trust_remote_code=True(旧版可能需要这个参数)。如果遇到Tokenizer class QWenTokenizer does not exist之类的错误,可尝试升级或降低相关库版本。

下载模型权重: 可以通过Hugging Face Hub获取Qwen2.5模型。例如,我们以7B的指令微调版模型为基准:

第一次运行时,上述代码将自动从互联网下载模型权重并缓存(需确保网络畅通)。device_map="auto" 会将模型自动加载到GPU(若有多个GPU可平摊内存)。这里我们让torch_dtype="auto"自动选择精度(一般会是FP16/BF16),以减少显存占用。下载7B模型需要占用约十几GB磁盘空间,请提前确保空间充足。

以上是通过Hugging Face Hub获取,实操我们将通过openMind Library获取更为简单快速。

注:

因果语言模型(Causal Language Model): 预测给定文本序列中的下一个字符,一般用于文本生成、补全句子等,模型学习给定文本序列的概率分布,并预测下一个最可能的词或字符。

条件生成模型(Conditional Generation): 基于给定的条件或输入生成新的文本,模型不仅学习文本序列的概率分布,还学习如何根据给定的条件生成文本。常见的模型包括T5(Text-to-Text Transfer Transformer)和BART(Bidirectional and Auto-Regressive Transformer)。一般用于翻译、问答。

序列分类模型(Sequence Classification): 将输入的文本序列分类到预定义的类别中。常见的模型包括BERT(Bidirectional Encoder Representations from Transformers)和RoBERTa(Robustly Optimized BERT Pretraining Approach)。一般任务为情感分析、文本分类、垃圾邮件检测。

1.2.2 微调方式与高效训练技巧

大模型的微调有多种方法,除了传统的全参数微调(SFT,全模型的有监督微调)外,还有一些参数高效微调(PEFT)技术可以大幅降低显存和算力需求。常见的方法包括 LoRAQLoRA、Adapter、Prefix-Tuning 等。

LoRA(Low-Rank Adaptation)微调: LoRA方法会冻结预训练模型的绝大部分参数,仅在模型中引入少量可训练的低秩矩阵(通常插入到权重矩阵的旁路),使得需要更新的参数大幅减少。这样不仅避免了灾难性遗忘(不破坏原有知识),还降低了显存开销,即使在单张GPU上也能微调大模型。实践证明,LoRA微调后的效果通常接近全参数微调,但资源消耗要小得多。

QLoRA(量化 LoRA)微调: QLoRA是在LoRA基础上的进一步优化,即先将模型权重低比特量化(如4比特), 然后再应用LoRA。例如将Qwen2.5-7B模型权重量化为4-bit,可以将显存占用进一步降低约4倍。QLoRA能让我们在消费级显卡上微调几十亿参数模型成为可能。当然,极端的量化可能略有精度损失,需要在效率和效果之间权衡。

DeepSpeed 等分布式训练: DeepSpeed是微软开源的深度学习优化库,通过ZeRO并行等技术将模型参数拆分到多块GPU,有效减少单卡显存占用并提升训练效率。如果有多GPU环境或需要微调更大的模型(如几十亿参数以上),可以借助DeepSpeed的Zero Stage 2/3优化、CPU Offloading等特性来高效并行训练。同时,DeepSpeed还提供了诸如梯度检查点、显存优化等功能,使百亿级模型的微调成为可能。

综上,在微调前需要决定采用何种方式:直接全参微调(简单但耗资大),还是采用LoRA/QLoRA等高效微调(推荐给资源有限的开发者)。本教程选择使用LoRA进行微调演示,因为它对新手来说实现简单、所需资源少,但又能达到不错的效果。

1.2.3 重要超参数设置

如果把调用大模型比作烹饪,那么参数调优就是掌控火候的关键——火候太小,菜肴寡淡无味;火候太大,食材可能烧焦。同样地,在使用OpenAI API时,参数的细微调整会直接影响生成内容的精准性、创造性和实用性。无论是让AI生成一段严谨的法律条文,还是创作一首天马行空的诗歌,参数的设定都决定了输出结果的“风味”。

为了更直观地理解参数调优的重要性,我们来看几个实际案例:

案例一:智能客服中的参数调优 在智能客服场景中,用户通常希望获得准确、简洁的回答。此时,可以设置较低的 temperature(如 0.2)和 top_p(如 0.5),以减少生成内容的随机性和多样性,确保回答的准确性和一致性。 此外,可以设置适当的 max_tokens(如 100),限制回答的长度,避免冗长的回复。

案例二:内容创作中的参数调优 在内容创作场景中,如生成广告文案或社交媒体内容,通常需要富有创意和多样性的输出。此时,可以设置较高的 temperature(如 0.8)和 top_p(如 0.9),以增加生成内容的随机性和多样性,激发模型的创造力。 同时,可以适当调整 frequency_penaltypresence_penalty,鼓励模型使用更多新颖的表达方式,避免重复使用相同的词汇和句式。

案例三:数据分析中的参数调优在数据分析场景中,如从大量文本中提取关键信息并生成报告,通常需要结构化和准确的输出。此时,可以设置较低的 temperature(如 0.3)和 top_p(如 0.6),以减少生成内容的随机性,确保输出的准确性和一致性。 此外,可以设置适当的 max_tokens(如 200),限制输出的长度,确保报告的简洁性和可读性。

通过调整参数,如 temperaturetop_pfrequency_penalty 等,可以控制生成内容的随机性、创造性和重复性,从而满足不同场景的需求。如果参数不当,则会极大影响模型输出质量:

以下是一个使用 openai.ChatCompletion.create() 方法进行对话生成的示例:

在上述代码中:

通过上述配置,开发者可以快速集成大模型能力,为应用程序添加智能对话功能。此节个人认为是重要章节,因此在本节中,我们将深入解析 OpenAI 官方提供的 Python SDK 的五大核心接口——ChatCompletion(多轮对话)、Completion(单轮文本补全)、Embedding(文本向量化)、Audio(语音识别与翻译)和 Image(图像生成与编辑)。我们将介绍每个接口的用途、主要参数(默认值及建议范围)、参数如何影响模型输出效果与使用成本,并提供对应的 Python 示例代码。此外,每节还结合实际业务场景举例,帮助理解参数设置的效果,并在最后给出实战建议。

主要参数: 调用 openai.ChatCompletion.create() 时,常用的主要参数包括:

参数对内容和成本的影响: ChatCompletion 接口的输出很大程度上由 prompt消息内容模型 决定,但上述参数提供了重要的调优手段:

下面我们以 qwen-long 模型为例,演示 ChatCompletion 接口的基本用法。

在上述代码中,response_default 使用默认参数,会得到模型较为中规中矩的解释。而 response_creative 则提高了温度并让模型输出两个版本,可能一个解释更风趣类比,另一个更严谨数学。需要强调的是,n=2 虽然让我们一次获得两个答案,但其消耗的 Token 也是双倍的(输入部分共享但输出两份)。实际应用时,可以根据需求权衡这种一次多回复的策略。

应用场景与参数调优:聊天机器人或对话系统中,合适地调整这些参数能够显著改善用户体验。例如,当构建一个代码助理时,为了保证代码输出的确定性和正确性,常将 temperature 设为 0,使模型每次都产生几乎相同的结果,减少随机 bug。同时可能设置较高的 max_tokens 以便生成较长的代码段,并利用 stop 参数让模型在输出完函数定义后停止,避免啰嗦解释。

又如,在创意写作场景(故事生成、诗歌创作),可以将 temperature 提高到 1.0 以上甚至 1.5,并将 presence_penalty 适当提高以鼓励引入新主题、新意象,从而获得更有想象力的输出。然而要注意此时可能需要对结果进行人工筛选,因为高随机性下质量波动也会增大,必要时可以请求多次或增加 n 来获取多个候选文本。

1.2.4 微调数据格式

数据集是微调的燃料。不同任务的数据需要整理成模型可理解的输入-输出对格式。由于Qwen2.5-7B-Instruct是指令微调模型,我们采用“指令 + 输入 -> 模型输出”的格式来组织训练数据。例如:

文本分类任务: 可以将每条数据表示为一个指令和待分类文本,让模型输出分类标签。例如情感分类的数据格式可以这样组织:

上例中,instruction提供了模型需要执行的任务说明,input是需要分类的文本,output是期望模型给出的标签。微调时模型会学习在类似指令下输出正确的情感极性。

问答(QA)任务: 如果是知识问答或阅读理解,可以让instruction说明要求,input中提供问题和相关上下文,output给出回答。例如:

模型将学习根据提供的背景信息,提取并输出正确答案。

摘要生成任务: 格式类似,将待摘要的文本放入input,指令要求模型生成摘要,output为参考摘要。例如:

这样模型学习如何压缩文本并提取关键信息进行总结。

对话生成任务: 对话数据通常是多轮的,格式略有不同。一种方式是将多轮对话扁平化为一段特殊格式的文本。例如可以用角色标签来组织:

上例中,input包含多轮交互,以\n换行区分说话者。模型需根据对话上下文,在instruction要求下生成助手的新回复。实际训练对话模型时,也可以采用更复杂的格式(如OpenAI的role: user/assistant JSON格式)。

Qwen2.5-7B-Instruct支持多轮对话,在推理时通常需要提供类似ChatGPT的messages结构。

我们需要收集或构建针对目标任务的高质量训练数据。数据量不用像预训练那样动辄上亿条,但应覆盖多样的情况并确保正确性。准备好的数据划分为训练集、验证集(和测试集),例如按8:1:1拆分,这样可以在训练过程中用验证集评估模型性能并调参。确保数据格式和指令与模型预期格式一致,才能充分发挥指令微调模型的优势。

主流大模型微调数据集一览

数据集名称领域/特点适用任务下载地址
IEPile中英双语信息抽取,覆盖医学、金融等领域,含高质量标注指令数据。信息抽取、跨领域微调https://huggingface.co/datasets/zjunlp/iepile
ShareGPT 90k中英文双语人机问答数据,覆盖复杂真实场景。对话模型训练、跨语言生成https://huggingface.co/datasets/FreedomIntelligence/ShareGPT-CN
PAWS-X跨语言释义识别对抗数据集,支持6种语言(含中文)。多语言文本匹配、语义相似度https://huggingface.co/datasets/google-research-datasets/paws-x
Wikipedia-QA56种语言的维基百科文章,经清理后适用于预训练与知识增强。预训练、知识库构建https://huggingface.co/datasets/fibonacciai/Persian-Wikipedia-QA
Chinese-Poetry包含5.5万首唐诗、26万首宋词等古典文集,适合古文生成任务。古典文本生成、文化领域微调https://huggingface.co/datasets/Iess/chinese_modern_poetry
MCFEND多源中文假新闻检测数据集,支持虚假信息识别。假新闻检测、内容安全https://my5353.com/30429
Ape210K21万道小学数学题,含答案与解题步骤,适配数学推理任务。数学问题生成、逻辑推理微调https://huggingface.co/datasets/MU-NLPC/Calc-ape210k
Alpaca由斯坦福大学创建,通过微调模型生成,包含约 5.2 万个指令跟随数据样本。如常识问答、文本生成等https://huggingface.co/datasets/shibing624/alpaca-zh
fortune-telling占卜数据集风水占卜相关的数据集https://huggingface.co/datasets/Conard/fortune-telling
rm-static强化学习典型开源数据集人类偏好排序数据集,用于强化学习微调、训练奖励模型。https://huggingface.co/datasets/Dahoas/rm-static
NuminaMath-CoT思维链数据集约 86 万道中国高中数学练习题、以及美国和国际数学奥林匹克竞赛的题目,每个问题的解答都采用了思维链(CoT)的格式。https://huggingface.co/datasets/AI-MO/NuminaMath-CoT
Chinese-DeepSeek-R1-Distill-data-110k中文基于满血 DeepSeek-R1 蒸馏数据集。数据集中不仅包含 math 数据,还包括大量的通用类型数据,总数量为 110Khttps://huggingface.co/datasets/Congliu/Chinese-DeepSeek-R1-Distill-data-110k
the_cauldron多模态微调典型开源数据集包含 50 个大规模视觉语言训练数据集(仅训练集),用于多任务视觉语言模型的微调。数据集结构包含 images(图片列表)和texts(对话文本),其中对话以用户提问、模型回答的形式呈现,覆盖问答、选择等任务(如TQA数据集示例)。https://huggingface.co/datasets/Conard/fortune-telling
PubMedQA医学领域典型开源数据集。基于 PubMed 文献的医学问答数据集,包含医学研究相关问题,适合医疗信息抽取与领域适配任务。https://huggingface.co/datasets/qiaojin/PubMedQA
imdb文本分类、情感分析典型开源数据集大型电影评论数据集,包含用户评论到电影评分的映射关系,适用于对评论进行积极、负面分类的微调任务。https://huggingface.co/datasets/Conard/fortune-telling
CAMEL多轮对话数据集包含约 22.9 万条结构化的多轮对话数据。https://huggingface.co/datasets/camel-ai/ai_society

1.3 openMind Library基础

在上一次直播中我们已经在体验空间中通过建立Application应用,已经可以使用Jupyternotebook了,因此openMind Library将在体验空间中,通过代码运行实时获取效果来进一步帮助我们理解和学习。正所谓“工欲善其事,必先利其器”,我们需要对openMind Library先有初步了解,再来实操会更有效率。

1.3.1openMind Library概述

openMind Library是一个深度学习开发套件,通过简单易用的API支持模型预训练、微调、推理等流程。该开发套件通过一套接口兼容PyTorch和MindSpore等主流框架,并且仅支持昇腾NPU处理器。因此我们创建体验空间的算力资源一定要选择NPU算力资源:

为了应对大模型分布式训练的挑战,openMind Library提供了预训练接口,支持MindSpeed、Accelerate等加速库,帮助开发者顺畅快速地训练大模型。由于训练大模型算力需求庞大而且毕竟复杂,我们主题是微调大模型,因此关于模型训练的openMind Library我们不作过多了解。

openMind Library基于transformers库,集成了PyTorch框架下主流第三方工具的功能,提供了一键式的封装的微调命令行接口解决方案,涵盖了从数据处理、权重加载,到低参数微调、量化适配,以及微调和训练跟踪的全流程功能。因此关于openMind Library的微调问题我们是可以参考PyTorch如何对大模型做微调的。同时,openMind Library还提供了昇腾NPU亲和算子优化等加速手段,显著提升模型训练效率。

而且微调之前我们需要下载加载大模型,微调过后还需要推理测试微调效果,这方面openMind Library对Transformers和MindFormers的AutoClass、Pipeline、Trainer等接口进行封装,并增强了其功能,提供了对应的SDK。还提供了从魔乐社区自动下载和加载模型的能力,同时扩展新增了昇腾NPU亲和的特性,有效提升在昇腾NPU上进行模型训练推理的性能

openMind Library还可以和PEFTDeepSpeedbitsandbytes等三方库配合使用,也就是我之前给大家展示的微调算法代码,在创建的体验空间中,里面有使用openMind Library进行模型开发的实践文档,包含openMind和LLaMA Factory配合进行模型微调等案例。

二、openMind Library上手

由于仅支持昇腾NPU处理器,若本地没有部署NPU环境,可以在社区新建体验空间及部署Application体验空间,在Application体验空间的“Notebook APP”上使用NPU环境。Notebook已支持单卡的NPU算力资源基础环境,用户可直接进行以下操作。

如果想在自己的电脑上面部署openMind Library,需要确保你是NPU,以Python 3.8版本为例:

基于PyTorch快速安装openMind Library

基于MindSpore快速安装openMind Library

openMind Library原生兼容PyTorch和MindSpore等主流框架,方便用户使用。openMind Library在同一时刻仅支持在一种框架上运行。如果同时安装多种框架,openMind Library将抛出错误。

2.1数据加载

目前openMind Library集成适配了datasets,可用于加载魔乐社区上的数据集。openmind.omdatasets.OmDataset类基于datasets抽取了下载相关代码,依托于patch的方式适配了openmind_hub,支持从魔乐社区下载数据集。采用OmDataset.load_dataset('repo_name/dataset_name')的方式可以下载数据集,返回特定的datasets.dataset_dict.DatasetDict类。

目前该类仅支持在PyTorch框架下使用,暂不支持MindSpore框架。

数据集下载

OmDataset.load_dataset()方法目前支持下载的数据集格式如下:

具体示例如下。

openmind已暴露Omdataset接口,可直接从openmind中导入。

如果有其他开发需求,也可基于相对路径导入。

OmDataset支持下载parquet格式数据集,以下为用例:

下载json或jsonl格式数据集

OmDataset下载数据集支持json或jsonl格式,以下为用例:

下载targ.gz格式数据集

OmDataset下载数据集支持tar.gz格式,以下为用例:

下载csv格式数据集

OmDataset下载数据集支持csv格式,以下为用例:

下载python脚本加载魔乐社区数据集

支持从魔乐社区数据集仓库下载python脚本,并根据python脚本进一步下载数据集文件,适用于对数据集进行更细化的处理操作。

python脚本需要带有魔乐社区对应文件的下载链接,以test_py_image的test.py脚本为例:

从相关代码中可见,涉及下载对应文件时,URL指定了魔乐社区文件下载接口路径,代码里https://modelers.cn/api/v1/file/modeltesting/test_py_image/main/media/XXX 指定了文件下载的接口路径,然后使用该接口路径可以自定义下载。该接口路径可以通过om_hub_url拼接获取。

可尝试下载以下用例,请注意使用python脚本下载数据集文件时需要添加参数trust_remote_code=True

下载python脚本加载三方站点数据集

支持从魔乐社区数据集仓库下载python脚本,并根据python脚本从第三方站点进一步下载数据集相关文件:

从相关代码中可见,涉及下载对应文件时,URL指定了第三方站点。可尝试以下用例进行下载,请注意使用python脚本下载数据集文件时需要添加参数trust_remote_code=True

2.2加载模型权重

我们可以通过openMind Library来下载模型权重,openMind Library pipeline方法支持PyTorch和MindSpore两种框架。此外,pipeline方法支持多个领域的任务,例如文本生成、文本分类、图像识别等。

pipeline基本用法

当前的pipeline支持两种框架:PyTorch和MindSpore,在定义pipeline时,通过参数framework来指定,Pytorch框架为pt,MindSpore框架为ms。此外,Pytorch框架支持两种backendtransformersdiffusers,MindSpore支持三种backendmindformersmindonemindnlp,通过参数backend传入。

在openMind Library中,每种框架下的各类推理任务,都有相应的pipeline方法。例如,在PyTorch框架下,文本转音频任务可以通过TextToAudioPipeline方法来实现。为了简化操作,我们提供了一个通用的pipeline方法,支持加载对应任务的方法。

我们检索到目标模型:

点击Use in openMind可以看到调用下载代码:

可以直接在我们的Application空间上面运行:

通过pipe提交prompt可获取大模型回答。

通过配置task,model,frameworkbackend,可以加载对应框架和任务的模型。

微调训练中需要指定模型进行下载和加载,配置参数为model_idmodel_name_or_path。需要注意的是,在同一yaml脚本中,二者仅支持任选其一,不允许同时配置。

方法一:通过model_id参数可选取内置的模型,根据model_id匹配魔乐社区中的模型仓库名,便于模型的快速下载。配置方式如下:

当前内置模型可查看下表,将会持续更新:

模型系列model_id
Qwen2Qwen2-7B
Qwen2.5Qwen2.5-7B

方法二:用户可通过model_name_or_path参数,指定魔乐社区模型仓库名或者本地模型路径。

可指定魔乐社区模型仓库名,如AI-Research/Qwen2-7B模型:

使用model_idmodel_name_or_path时,可通过cache_dir参数设置权重缓存位置:

权重会被保存到/home/cache_dir路径,如果不设置则保存在默认路径。需要注意的是,当设置cache_dir路径时,用户需要同步设置HUB_WHITE_LIST_PATHS环境变量:

pipeline重要参数

需要注意pipeline的重要参数:

framework

pipeline支持PyTorch(pt)和MindSpore(ms)两种框架,并通过framework参数来进行指定。以下为运行在MindSpore框架上的pipeline实例:

backend

PyTorch框架支持以下两种backendtransformersdiffusers。MindSpore框架支持三种backendmindformersmindonemindnlp。通过backend参数来进行指定。

以下为运行在MindSpore框架,后端指定为mindnlppipeline实例:

device

用户可以通过device参数来指定推理任务所在的处理器,当前支持CPUNPU类型的处理器。如果不指定device参数,pipeline将会自动选取处理器。无论选择哪种处理器,在PyTorch框架和MindSpore框架上都可以正常运行。以下为运行在各处理器上的示例:

model和tokenizer

model参数除了支持传入模型地址,也支持传入实例化的模型对象来进行推理,model传入实例化的模型对象时,tokenizer也必须传入特定的实例化对象:

use_silicondiff

对于diffusers侧的任务,可以使用use_silicondiff参数来加速,提升推理的性能。

特定参数

pipeline提供了特定参数进行模型推理,可允许单独配置,以帮助用户完成工作。例如,对于文本生成任务,可以通过指定max_new_tokensnum_beams参数来控制生成的文本长度和生成的beam大小,以影响生成的结果:

2.3模型微调

PyTorch模型微调

transformers库是PyTorch模型开发的主流套件。以此为基础结合PyTorch侧主流生态库,openMind Library为用户提供了一键式训练启动命令,帮助用户快速实现从数据处理、多站点权重加载,到低参数微调、量化适配,以及微调和训练跟踪的全流程功能。

当前支持特性如下:

openMind Library提供命令行接口(command-line interface, CLI),支持用户在shell环境下交互式实现训练流程。用户只需要通过openmind-cli train demo.yaml命令,就可以动态解析yaml文件里的配置参数,并自动完成训练全流程。

openMind Library命令行接口内置于openMind Library中,安装openMind Library即可使用。

模型微调示例

openMind Library通过解析yaml文件的方式拉起微调训练。用户需要配置一个微调相关的yaml文件,然后通过openmind-cli train命令行方式运行,openMind Library会自动完成参数解析和微调流程配置运行。以下为一个简单可运行的示例demo.yaml

运行命令为:

yaml文件内的配置包括微调算法参数,模型参数,数据集参数和训练参数。

微调算法及参数配置

用户可设置stage参数选择模型训练过程。目前仅支持sft微调。

全参微调

openmind-cli train支持用户选择全参训练或者低参微调训练,目前可通过finetuning_type进行配置。全参训练可按以下配置:

LoRA微调

如果用户需要进行LoRA微调,可以参考以下内容进行配置。

在脚本中配置finetuning_type来启动LoRA微调:

如果需要调整LoRA微调配置,可以新增以下参数:

其中lora_alphalora_dropoutlora_rank参数解析已提供默认值,如无必要用户可不配置。lora_dropout默认为0,lora_rank默认为8,lora_alpha默认为lora_rank * 2

lora_target_modules参数配置存在如下选择:

QLoRA微调

QLoRA微调通过量化和LoRA微调的结合,降低了计算资源需求和显存使用。openmind-cli train支持基于bitsandbytes的QLoRA微调,目前已支持NF4下的4bit量化。用户可通过load_in_4bit参数进行开启,具体使用方式如下。

步骤1 Ascend NPU下安装bitsandbytes,可参考文档bitsandbytes,也可以参考以下流程:

前置条件:安装bitsandbytes前请确保环境中已安装好cann包和torch_npu,并source /xxx/your_folder/cann/ascend-toolkit/set_env.sh,若未安装,请参照参考openMind Library安装指南安装;cmake版本不低于3.22.1,g++版本不低于12.x,若未安装,可通过如下命令安装编译环境:

在安装bitsandbytes之前,可通过如下示例判断安装环境是否配置完成:

准备好安装环境后,可通过以下步骤编译安装bitsandbytes

如果在编译过程中出现异常,请在bitsandbytes目录下运行git clean -dfx清除所有编译产生的中间文件,然后检查编译环境,确认无误后重新运行上述3~5命令。

步骤2 启动QLoRA微调,在微调配置文件中,加入如下内容:

需要注意的是,开启load_in_4bit: True时需要同时开启finetuning_type: lorabf16: True

微调参数说明

参数名描述类型默认值是否可选
stage训练阶段,目前仅支持sft。strsft可选
finetuning_type微调方式。可选: full, lora。strfull可选
lora_target_modules采取LoRA方法的目标模块。strNone可选
lora_alphaLora微调的缩放因子。intNone可选
lora_dropoutLoRA微调的丢弃率,取值范围为[0, 1)。float0.0可选
lora_rankLora微调的秩。int8可选
load_in_4bit支持QLoRA微调时使用4bit精度。boolFalse可选

MindSpore模型微调

mindformers库是MindSpore模型开发的主流套件,为了方便用户进行模型微调,openMind Library对Auto Classes、Trainer和TrainingArguments接口统一进行了封装。

由于本次实操我们不使用MindSpore框架,因此我们不对MindSpore作深入了解。

三、微调流程分步详解

万事俱备,下面按照顺序详细讲解如何使用Qwen2.5-7B-Instruct进行微调。我们将结合OpenMIND Library框架生态工具,实现一个LoRA微调的示例。

3.1 选择并加载预训练模型

选择模型: 首先当然是选择合适的预训练模型作为微调基底。这里我们选用 Qwen2.5-7B-Instruct。这是阿里云通义千问团队开源的指令对齐大模型,拥有7B+参数并经过指令微调,擅长多语言对话、问答等任务。相较于未指令调优的基础模型,使用Qwen2.5-7B-Instruct可以大大缩短我们微调所需的收敛时间,并获得更好的指令执行效果。

基于此我们来构建yaml微调文件,加载模型:

3.2 准备任务数据集

数据获取: 根据所选任务,获取相应的数据集。初学者可以选择公开的标注数据集:例如文本分类可使用中文情感分类数据集ChnSentiCorp或新闻主题分类(TNews),问答可以使用CMRC2018机器阅读理解数据,摘要任务可尝试LCSTS中文短文本摘要数据集,对话则有Belle开放对话数据或ShareGPT整理的对话数据等。许多数据集可以在Hugging Face Datasets或者国内的千言平台(LUGE)下载、魔乐社区下载。我们选择Alpaca数据集进行微调,Alpaca是是一个基于斯坦福大学发布的 Alpaca 数据集(52K 条英文指令跟随数据)翻译而来的中文指令微调数据集,旨在支持中文大语言模型(LLM)的训练与研究。

中文化处理:通过人工翻译和润色,确保指令和响应的语义准确性和自然流畅性。

数据格式:每条数据包含三个字段:

数据量:约 77,500 条中文指令数据。

 

 

如果非已经处理好的数据,则我们需要数据清洗与格式转换 ,拿到数据后,需要进行清洗和格式标准化。去除明显的错误或噪声数据,以保证微调质量。接着,将数据转换为上一节定义的JSON格式或者其他适合的结构。对于Hugging Face的Datasets库,可以将数据处理成一个包含instruction, input, output字段的列表/表格,然后通过datasets.Dataset.from_pandasload_dataset接口载入。在转换时,要特别注意确保指令提示和标签正确对应。例如分类任务中,不要把文本内容漏到instruction里,QA任务中问题和背景要清晰区分。下面给出将一个示例转换为我们所需格式的伪代码:

准备好的JSONL文件可以直接被OpenMIND或Transformers的Trainer使用。在实际项目中,可能需要针对不同任务编写定制的处理脚本,但核心思想都是将数据整理为指令->输出的映射。

划分训练/验证集: 将清洗好的数据划分出一部分作为验证集(例如10%)。验证集不参与训练,用于在训练过程中评估模型性能,帮助我们判断何时停止训练以及是否过拟合等。如果有独立的测试集(用于最终评估),在微调过程中不要混用测试集,以免评估结果失真。

3.3 微调模型

终于进入微调的核心步骤!我们将演示如何使用OpenMIND Library结合Transformers和LoRA来训练模型。

stage: sft表示当前微调的阶段是 SFT(Supervised Fine-Tuning,有监督微调),也是最常见的微调第一阶段。

do_train: true启用训练流程。如果设为 false,系统只会进行模型加载或测试。

finetuning_type: lora表示使用 LoRA(低秩适配) 方法进行微调。相比全参数微调,LoRA 只训练部分参数,资源需求更低,非常适合在消费级显卡或小型服务器上训练。

lora_alpha: 16-LoRA 中的缩放因子,控制 LoRA 权重的影响程度。常见设置为 16、32 或 64。越大模型越容易拟合训练数据,过小可能学习不充分。

lora_dropout: 0-表示在注入的 LoRA 模块中是否使用 dropout 进行正则化,0 表示不启用,训练会更“稳定但可能过拟合”。如果数据量小,可以考虑加一点如 0.05~0.1

lora_rank: 8-LoRA 的秩 r 值,决定引入的可训练参数规模,值越大模型拟合能力越强,但也更耗资源。常用值为 4、8、16,设为 8 是一个中等强度配置。

lora_target_modules: q_proj-指定要插入 LoRA 的模块名称。这里指定了 q_proj,表示只对 Attention 的 Query 投影层做插入。

3.4 模型输出与缓存配置

logging_steps: 10

save_steps: 20000

overwrite_output_dir: true

cache_dir: /home/openmind/cache_model

3.5训练输出路径设置

微调后的模型(包括 LoRA adapter 权重、配置文件、训练日志等)将保存在这个目录中。

后续你可以使用:

总yaml文件:

在我们已经创建的jupyter notebook中输入指令:

模型开始微调:

微调完毕之后我们可以在生成的输出目录下面看到微调过程生成的文件:

文件名说明
checkpoint-19194/(或类似名)训练中保存的中间检查点,包含该步数时的模型权重、优化器状态等。用于中断恢复训练或模型回溯。
trainer_state.json记录整个训练过程的状态信息,例如当前epoch、step、loss曲线、最佳模型信息等。用于Trainer恢复训练或分析日志。
all_results.json汇总了训练过程中评估指标(如loss、accuracy等)的统计结果。适合用于实验对比分析。
train_results.json训练集上的性能指标。与all_results.json一起,用于衡量模型表现。
training_args.bin保存了训练参数对象(TrainingArguments)的二进制序列化结果,供后续载入模型时保持一致性。
added_tokens.json若你在分词器中添加了新的特殊Token(如<SYS>, <BOT>等),此处会记录新增的token信息。
merges.txtBPE分词算法的merge规则文件,用于tokenizer解码。
tokenizer.json保存完整的Tokenizer结构,包括分词规则、vocab映射等。加载tokenizer时主要读取这个文件。
tokenizer_config.jsonTokenizer的配置信息,例如是否小写、添加哪些特殊Token、是否使用FastTokenizer等。
special_tokens_map.json标明特殊Token(如 [PAD], [CLS], [EOS] 等)在词表中的映射关系。
vocab.json词表文件(字典结构),用于将文本映射为token ID。
README.md微调后模型的说明文件,记录了训练信息、模型结构、使用方法等。部分由OpenMIND或Hugging Face生成。
adapter_config.jsonLoRA 微调参数的配置信息(如rank、alpha、target_modules等),供加载LoRA权重时使用。
adapter_model.safetensors核心LoRA微调权重文件,保存了训练后的LoRA adapter 参数。可用于部署或加载微调结果。使用safetensors格式比.bin更安全高效。

那么我们怎么使用这些文件,用这些文件做什么呢?

3.5.1继续训练

可以通过 checkpoint-19194 目录恢复训练:

3.5.2. 加载 LoRA 微调模型进行推理

3.6模型评估与效果解读

微调后的模型需要通过评估来验证它在目标任务上的表现是否达标。评估可以在验证集或独立的测试集上进行。常见的评价指标因任务类型不同而有所差异:

结果解读: 一旦得到指标,需要结合任务性质进行解读。分类任务的Accuracy直观易懂,但对于类别不平衡的数据,更关注F1是否足够高。问答任务,如果F1仍较低,可能是模型答案不完整或语言表达不同(哪怕意思相同)。摘要任务的ROUGE分数一般不可能100%,能到达30-50已经是较不错的效果——因为摘要允许多种表达,模型未必字字匹配参考摘要。对话任务如果用BLEU等指标,分数通常更低,因为开放式对话的合理回应千差万别,自动指标无法全面评价。

因此,我们在看指标时,应纵向比较模型自身在相同数据集上的提升,而不宜简单横向和其他任务比较。例如,分类可以期望90%以上准确率,而开放问答的BLEU可能只有20但已经表示模型学会了一些回答技巧。最后,别忘了人工测试模型:直接与模型对话、让模型生成摘要,看主观上是否符合预期。这有助于发现自动指标未能反映的问题。

微调流程小结: 按照以上步骤,我们完成了从选模型、备数据、配参数,到启动训练、监控收敛,再到模型评估的全过程。对于初学者来说,每一步都需要细心和反复试验。遇到问题时,多查看日志和错误信息,必要时减少任务难度(比如先在小数据集上跑一个epoch看看输出是否正常)。通过这次实战,读者应当对大语言模型微调有了初步认识:大模型微调并不神秘,它是有章可循的工程流程

最后,鼓励大家多多尝试不同的任务和数据,用Qwen2.5-7B-Instruct这样的开源大模型进行创造性的实验。在实践中积累经验,熟悉各类坑和解决方案,你也可以驾驭大语言模型去完成各种有趣的应用!祝你在大模型微调之旅上收获满满。