一、什么是大模型?
对大模型做一个直观的抽象,
本质上,现在的大模型要解决的问题,就是一个序列数据转换的问题:
输入序列 X = [x1, x2, ..., xm], 输出序列Y = [y1, y2, …, yn],X和Y之间的关系是:Y = WX。
“大模型”这个词:“大”是指用于训练模型的参数非常多,多达千亿、万亿;而“模型”指的就是上述公式中的矩阵W。
在这里,矩阵W就是通过机器学习,得出的用来将X序列,转换成Y序列的权重参数组成的矩阵。
二、什么是微调?
对大模型进行微调(Fine-tuning)是为了
让通用的预训练模型更好地适应特定任务或领域的需求,从而在具体应用中提升性能。
微调是预训练模型落地到实际应用的关键步骤,通过“
通用基础+专业适配”的平衡,以较低成本释放大模型的潜力。
微调的最终目的,是能够在可控成本的前提下,尽可能地提升大模型在特定领域的能力。
三、为什么要对大模型进行微调?
1、适应特定任务
-
预训练模型的局限性:大模型(如GPT、BERT等)通过海量通用数据训练,具备广泛的语义理解能力,但未必直接适配专业任务(如医疗诊断、法律文书生成等)。
-
任务针对性优化:微调通过少量领域数据调整模型参数,使其更专注于目标任务的模式(例如分类、生成、问答等)。
2、提升性能
-
数据分布差异:如果目标数据与预训练数据分布不同(如专业术语、表达习惯),微调能缩小差距,显著提高准确率。
-
任务指标优化:微调可以针对具体评估指标(如F1分数、ROUGE)优化,而预训练模型可能未直接优化这些指标。
3、数据效率高
-
少量标注数据即可改进:相比从头训练,微调仅需少量领域数据(甚至几百条样本)即可显著提升效果,节省时间和成本。
4、保留通用知识
-
迁移学习的优势:微调在保留预训练模型通用能力(如语言理解、常识推理)的基础上,叠加领域知识,避免“灾难性遗忘”。
5、适应领域术语和风格
-
专业场景需求:例如医疗、金融等领域有特殊术语和表达,微调能让模型学会正确使用这些词汇。
-
风格控制:如让生成内容更正式、更简洁,或符合品牌调性。
6、解决低资源语言或任务
-
小语种或小众领域:当某些语言或领域数据不足时,微调预训练模型比从头训练更可行。
7、个性化需求
-
定制化输出:根据用户偏好调整生成内容(如客服机器人语气、推荐系统偏好)。
何时不需要微调?
任务足够通用(如普通文本分类),且预训练模型表现已达标。
缺乏标注数据或计算资源,此时可用零样本(Zero-shot)或小样本学习(Few-shot)。
四、微调的常见方法
全参数微调FFT(
Full Fine Tuning):调整模型所有参数,适合数据量较大的场景。
轻量级微调PEFT(
Parameter-Efficient Fine Tuning):如LoRA(低秩适应)、Adapter模块,仅训练少量参数,节省计算资源。
提示微调(Prompt-tuning):通过调整输入提示(Prompt)引导模型输出。
全参数微调FFT会带来一些问题:
-
一个是 训练成本比较高,因为微调的参数量跟预训练的是一样的多的;
-
一个是叫 灾难性遗忘( Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差 。
PEFT主要想解决的问题,就是FFT存在的上述两个问题,
PEFT也是目前比较主流的微调方案。
从训练数据的来源、以及训练的方法的角度,
大模型的微调有以下几条技术路线:
-
一个是 监督式微调SFT(Supervised Fine Tuning),这个方案主要是用人工标注的数据,用传统机器学习中监督学习的方法,对大模型进行微调;
-
一个是 基于人类反馈的强化学习微调RLHF(Reinforcement Learning with Human Feedback),这个方案的主要特点是把人类的反馈,通过强化学习的方式,引入到对大模型的微调中去,让大模型生成的结果,更加符合人类的一些期望;
-
还有一个是 基于AI反馈的强化学习微调RLAIF (Reinforcement Learning with AI Feedback),这个原理大致跟RLHF类似,但是反馈的来源是AI。这里是想解决反馈系统的效率问题,因为收集人类反馈,相对来说成本会比较高、效率比较低。
从
成本和
效果的角度综合考虑,PEFT是目前业界比较流行的微调方案。接下来介绍几种比较流行的PEFT微调方案。
4.1、流行的PEFT方案1:Prompt Tuning
Prompt Tuning的出发点,是基座模型(Foundation Model)的参数不变,为每个特定任务,训练一个少量参数的小模型,在具体执行特定任务的时候按需调用。
Prompt Tuning的基本原理是在输入序列X之前,增加一些特定长度的特殊Token,以增大生成期望序列的概率。
具体来说,就是将X = [x1, x2, ..., xm]变成,X` = [x`1, x`2, ..., x`k; x1, x2, ..., xm], Y = WX`。
Prompt Tuning是发生在Embedding这个环节的。
如果将大模型比做一个函数:Y=f(X),那么Prompt Tuning就是在保证函数本身不变的前提下,在X前面加上了一些特定的内容,而这些内容可以影响X生成期望中Y的概率。
Prompt Tuning的具体细节,可以参见:The Power of Scale for Parameter-Efficient Prompt Tuning[1]。
4.2、流行的PEFT方案2:Prefix Tuning
Prefix Tuning的灵感来源是,基于Prompt Engineering的实践表明,在不改变大模型的前提下,在Prompt上下文中添加适当的条件,可以引导大模型有更加出色的表现。
Prefix Tuning的出发点,跟Prompt Tuning的是类似的,只不过它们的具体实现上有一些差异。
Prompt Tuning是在Embedding环节,往输入序列X前面加特定的Token。
而Prefix Tuning是在Transformer的Encoder和Decoder的网络中都加了一些特定的前缀。
具体来说,就是将Y=WX中的W,变成W` = [Wp; W],Y=W`X。
Prefix Tuning也保证了基座模型本身是没有变的,只是在推理的过程中,按需要在W前面拼接一些参数。
Prefix Tuning的具体细节,可以参见:Prefix-Tuning: Optimizing Continuous Prompts for Generation[2]。
4.3、流行的PEFT方案3:LoRA
LoRA是跟Prompt Tuning和Prefix Tuning完全不相同的另一条技术路线。
LoRA背后有一个假设:我们现在看到的这些大语言模型,它们都是被过度参数化的。而过度参数化的大模型背后,都有一个低维的本质模型。
通俗讲人话:大模型参数很多,但并不是所有的参数都是发挥同样作用的;大模型中有其中一部分参数,是非常重要的,是影响大模型生成结果的关键参数,这部分关键参数就是上面提到的低维的本质模型。
LoRA的基本思路
,包括以下几步:
-
首先, 要适配特定的下游任务,要训练一个特定的模型, 将Y=WX变成Y=(W+∆W)X,这里面∆W主是我们要微调得到的结果;
-
其次,将∆W进行低维分解∆W=AB (∆W为m * n维,A为m * r维,B为r * n维,r就是上述假设中的低维);
-
接下来,用特定的训练数据,训练出A和B即可得到∆W,在推理的过程中直接将∆W加到W上去,再没有额外的成本。
另外,如果要用LoRA适配不同的场景,切换也非常方便,做简单的矩阵加法即可:(W + ∆W) - ∆W + ∆W`。
关于LoRA的具体细节,可以参见LoRA: Low-Rank Adaptation of Large Language Models[3]。
4.4、流行的PEFT方案4:QLoRA
LoRA 效果已经非常好了,可以媲美全量微调的效果了,那为什么还要有个QLoRA呢?
这里先简单介绍一下,量化(Quantization)。
量化,是一种在保证模型效果基本不降低的前提下,通过降低参数的精度,来减少模型对于计算资源的需求的方法
。
量化的核心目标是降成本,降训练成本,特别是降后期的推理成本。
QLoRA就是量化版的LoRA,它是在LoRA的基础上,进行了进一步的量化,将原本用16bit表示的参数,降为用4bit来表示,可以在保证模型效果的同时,极大地降低成本。
论文中举的例子,65B的LLaMA 的微调要780GB的GPU内存;而用了QLoRA之后,只需要48GB。效果相当惊人!
关于QLoRA的具体细节,可以参见:QLoRA: Efficient Finetuning of Quantized LLMs[4]。
五、Fine-tuning的原理
5.1、大模型微调的步骤
在选定相关数据集和预训练模型的基础上,通过设置合适的超参数并对模型进行必要的调整,使用特定任务的数据对模型进行训练以优化其性能。
大模型微调包含以下四个核心步骤:
①
数据准备:
-
选择与任务相关的数据集。
-
对数据进行预处理,包括清洗、分词、编码等。
②
选择基础模型:
-
选择一个预训练好的大语言模型,如BERT、GPT-3等。
③
设置微调参数:
-
设定学习率、训练轮次(epochs)、批处理大小(batch size)等超参数。
-
根据需要设定其他超参数,如权重衰减、梯度剪切等。
④
微调流程:
-
加载预训练的模型和权重。
-
根据任务需求对模型进行必要的修改,如更改输出层。
-
选择合适的损失函数和优化器。
-
使用选定的数据集进行微调训练,包括前向传播、损失计算、反向传播和权重更新。

5.2、实操微调qwen2.5
大模型微调工具有:llama factory、阿里的魔塔社区。为了让小白也能明白大模型微调过程, 本文选了阿里的魔塔社区来作为实践对象。
选择魔塔的原因:魔塔的操作最简单、只需要按照步骤操作即可,而且不吃电脑配置,直接使用魔塔提供的集成环境来进行。
还有魔塔给新用户提供100小时的免费GPU资源进行使用。
5.2.1、环境准备
模型库中找到qwen2.5大模型, 为了减少下载等待时间,用的是7B模型:

在模型介绍页, 选择Notebook快速开发,然后选择方式二:


选择完
方式二:GPU环境后,点击“启动”。
启动大概需要2分钟,等GPU环境启动好以后点击"查看NoteBook"进入。

5.2.2、下载模型

model文件较大,会等十分钟左右才能完全下载,一共有4个主model

5.2.3、大模型微调框架LLaMA Factory
输入如下代码拉取 LLaMA-Factory,过程大约需要几分钟:
git clone --depth 1
https://github.com/hiyouga/LLaMA-Factory.git
安装依赖的软件:执行
pip install --upgrade pip &&
cd LLaMA-Factory && pip3 install -e ".[torch,metrics]"
5.2.4、微调模型
a. 创建微调训练相关的配置文件
在左侧的文件列表,Llama-Factory的文件夹里,打开examples\train_qlora下提供的llama3_lora_sft_awq.yaml,复制一份并重命名为qwen_lora_sft_bitsandbytes.yaml。
这个文件里面写着和微调相关的关键参数。
打开这个qwen_lora_sft_bitsandbytes.yaml文件,修改
内容:
### model
model_name_or_path: /mnt/workspace/Qwen2.5-7B-Instruct
quantization_bit: 4
# trust_remote_code: true
### method
stage: sft
do_train: true
finetuning_type: lora
lora_target: all
### dataset
dataset: identity
template: qwen
cutoff_len: 1024
max_samples: 1000
overwrite_cache: true
preprocessing_num_workers: 16
### output
output_dir: saves/qwen-7b/lora/sft
logging_steps: 10
save_steps: 500
plot_loss: true
overwrite_output_dir: true
# save_only_model: false
# report_to: none # choices: [none, wandb, tensorboard, swanlab, mlflow]
### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 8
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
#ddp_timeout: 180000000
### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 500
详细的参数解释如下
模型基础信息 :model_name_or_path: Qwen2.5-7B-Instruct :指定了要微调的基础模型的路径或名称。这里表明基础模型是存放在Qwen2.5-7B-Instruct路径下的 qwen 模型。quantization_bit: 4 :表示将模型的权重进行量化的位数为 4 位。 量化是一种压缩技术,可以减少模型的存储和计算需求,但可能会对模型的精度产生一定影响 。通过将权重量化到 4 位,可以在一定程度上提高模型的运行效率。微调方法 :stage: sft :这里的 sft 代表“Supervised Fine-Tuning”(有监督微调),即使用有标注的数据对模型进行微调训练。do_train: true :表示要进行训练操作。finetuning_type: lora :使用“LoRA”(Low-Rank Adaptation)方法进行微调。 LoRA 是一种高效的微调技术,它通过在原始模型的基础上添加一些低秩矩阵来实现对模型的微调,从而减少了训练的参数数量和计算成本 。lora_rank: 8 lora微调秩的大小,影响显存占用以及训练效果lora_target: all :表示对模型的所有部分都应用 LoRA 微调。数据集相关 :dataset: identity :指定了使用的数据集 identitytemplate: qwen :指定了数据的模板或格式与 qwen 模型相匹配。这有助于将数据集转换为适合模型输入的格式。cutoff_len: 1024 :设置输入文本的截断长度为 1024。如果输入文本超过这个长度,会被截断以适应模型的处理能力。max_samples: 1000 :限制数据集中使用的最大样本数量为 1000。这可能是出于训练时间或资源限制的考虑。overwrite_cache: true :表示如果缓存存在,将覆盖缓存。这意味着每次运行时都会重新处理数据集,而不是使用之前缓存的数据。preprocessing_num_workers: 16 :指定了用于数据预处理的工作进程数为 16。增加工作进程数可以加快数据预处理的速度,但也会消耗更多的系统资源。输出设置 :output_dir: saves/qwen-7b/lora/sft :指定了微调后的模型输出路径。训练后的模型将保存在 saves/qwen-7b/lora/sft 文件夹中。logging_steps: 10 :表示每 10 步记录一次训练日志,以便跟踪训练过程中的指标和进度。save_steps: 500 :每 500 步保存一次模型的中间状态,以便在训练过程中可以随时恢复或检查模型的进展。plot_loss: true :表示绘制训练过程中的损失曲线,以便直观地观察模型的训练效果。overwrite_output_dir: true :如果输出目录已经存在,将覆盖该目录。这确保了每次训练的结果都会保存在指定的输出目录中。训练参数 :per_device_train_batch_size: 1 :每个设备上的训练批次大小为 1。这意味着每次只处理一个样本进行训练,通常在资源有限或模型较大时使用较小的批次大小。gradient_accumulation_steps: 8 :梯度累积的步数为 8。梯度累积是一种技术,通过多次前向传播和反向传播累积梯度,然后再进行一次参数更新,以等效于使用较大的批次大小进行训练。learning_rate: 1.0e-4 :学习率为 0.0001。学习率决定了模型在训练过程中参数更新的步长,较小的学习率可能导致训练速度较慢,但可以提高模型的稳定性和准确性。num_train_epochs: 3.0 :训练的轮数为 3 轮。一轮是指对整个数据集进行一次完整的遍历。lr_scheduler_type: cosine :使用余弦退火(cosine annealing)的学习率调度策略。这种策略可以在训练过程中逐渐降低学习率,有助于提高模型的收敛速度和性能。warmup_ratio: 0.1 :热身比例为 0.1。在训练开始时,使用较小的学习率进行热身,然后逐渐增加到指定的学习率,以帮助模型更好地适应训练。bf16: true :表示使用 BF16(Brain Floating Point 16)数据类型进行训练。BF16 是一种半精度浮点数格式,可以减少内存占用和计算时间,但可能会对精度产生一定影响。ddp_timeout: 180000000 :分布式数据并行(DDP)的超时时间为 180000000 毫秒(约 50 小时)。这是在分布式训练中等待其他进程的最长时间,如果超过这个时间,训练将被终止。评估设置 :val_size: 0.1 :将数据集的 10%作为验证集。在训练过程中,会使用验证集来评估模型的性能,以便及时调整训练策略。per_device_eval_batch_size: 1 :每个设备上的评估批次大小为 1。与训练批次大小类似,评估时每次只处理一个样本。eval_strategy: steps :按照指定的步数进行评估。这意味着在训练过程中,每隔一定的步数就会对模型进行一次评估。eval_steps: 500 :每 500 步进行一次评估。这与 eval_strategy 配合使用,确定了评估的频率。
从上面的配置文件中可以看到,
本次微调的数据集是 identity。
修改原有的json数据,就可以微调一个属于你自己的大模型。
比如你可以
将 identity.json 中的 {{name}} 字段替换为你的名字,来微调一个属于自己的大模型。

b、
在 LLaMA-Factory 目录下,输入以下命令启动微调脚本(大概需要10分钟)
llamafactory-cli train examples/train_qlora/qwen_lora_sft_bitsandbytes.yaml
运行报错:
labels:
Hello! I am {{name}}, an AI assistant developed by {{author}}. How can I assist you today?<|im_end|>
Traceback (most recent call last):
File "/usr/local/bin/llamafactory-cli", line 8, in <module>
sys.exit(main())
^^^^^^
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/cli.py", line 151, in main
COMMAND_MAP[command]()
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp
_training_function(config={"args": args, "callbacks": callbacks})
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function
run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 52, in run_sft
model = load_model(tokenizer, model_args, finetuning_args, training_args.do_train)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/model/loader.py", line 178, in load_model
model = load_class.from_pretrained(**init_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/models/auto/auto_factory.py", line 571, in from_pretrained
return model_class.from_pretrained(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/modeling_utils.py", line 309, in _wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/modeling_utils.py", line 4508, in from_pretrained
model = cls(config, *model_args, **model_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/models/qwen2/modeling_qwen2.py", line 633, in __init__
self.model = Qwen2Model(config)
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/models/qwen2/modeling_qwen2.py", line 362, in __init__
self.post_init()
File "/usr/local/lib/python3.11/site-packages/transformers/modeling_utils.py", line 1969, in post_init
if v not in ALL_PARALLEL_STYLES:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: argument of type 'NoneType' is not iterable
root@dsw-1152258-b75c9889d-cfspl:/mnt/workspace/LLaMA-Factory#
root@dsw-1152258-b75c9889d-cfspl:/mnt/workspace/LLaMA-Factory#
root@dsw-1152258-b75c9889d-cfspl:/mnt/workspace/LLaMA-Factory# llamafactory-cli train examples/train_qlora/qwen_lora_sft_bitsandbytes.yaml
2025-06-17 14:41:56.530649: I tensorflow/core/util/port.cc:113] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2025-06-17 14:41:56.578288: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 AVX512F AVX512_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2025-06-17 14:41:57.593884: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
[2025-06-17 14:41:59,879] [INFO] [real_accelerator.py:254:get_accelerator] Setting ds_accelerator to cuda (auto detect)
[2025-06-17 14:42:02,160] [INFO] [logging.py:107:log_dist] [Rank -1] [TorchCheckpointEngine] Initialized with serialization = False
Generating train split: 91 examples [00:00, 7592.18 examples/s]
Converting format of dataset (num_proc=16): 100%|█████████████████████████████████████████████████████████████████████████████████| 91/91 [00:00<00:00, 401.68 examples/s]
Running tokenizer on dataset (num_proc=16): 100%|██████████████████████████████████████████████████████████████████████████████████| 91/91 [00:02<00:00, 36.30 examples/s]
training example:
input_ids:
[151644, 8948, 198, 2610, 525, 1207, 16948, 11, 3465, 553, 54364, 14817, 13, 1446, 525, 264, 10950, 17847, 13, 151645, 198, 151644, 872, 198, 6023, 151645, 198, 151644, 77091, 198, 9707, 0, 358, 1079, 6567, 247, 118, 26232, 15469, 11, 458, 15235, 17847, 7881, 553, 10236, 254, 242, 99362, 28946, 79478, 13, 2585, 646, 358, 7789, 498, 3351, 30, 151645, 198]
inputs:
<|im_start|>system
You are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>
<|im_start|>user
hi<|im_end|>
<|im_start|>assistant
Hello! I am 智能AI, an AI assistant developed by 研究者们. How can I assist you today?<|im_end|>
label_ids:
[-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, 9707, 0, 358, 1079, 6567, 247, 118, 26232, 15469, 11, 458, 15235, 17847, 7881, 553, 10236, 254, 242, 99362, 28946, 79478, 13, 2585, 646, 358, 7789, 498, 3351, 30, 151645, 198]
labels:
Hello! I am 智能AI, an AI assistant developed by 研究者们. How can I assist you today?<|im_end|>
Traceback (most recent call last):
File "/usr/local/bin/llamafactory-cli", line 8, in <module>
sys.exit(main())
^^^^^^
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/cli.py", line 151, in main
COMMAND_MAP[command]()
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/train/tuner.py", line 110, in run_exp
_training_function(config={"args": args, "callbacks": callbacks})
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/train/tuner.py", line 72, in _training_function
run_sft(model_args, data_args, training_args, finetuning_args, generating_args, callbacks)
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/train/sft/workflow.py", line 52, in run_sft
model = load_model(tokenizer, model_args, finetuning_args, training_args.do_train)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/mnt/workspace/LLaMA-Factory/src/llamafactory/model/loader.py", line 178, in load_model
model = load_class.from_pretrained(**init_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/models/auto/auto_factory.py", line 571, in from_pretrained
return model_class.from_pretrained(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/modeling_utils.py", line 309, in _wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/modeling_utils.py", line 4508, in from_pretrained
model = cls(config, *model_args, **model_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/models/qwen2/modeling_qwen2.py", line 633, in __init__
self.model = Qwen2Model(config)
^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/site-packages/transformers/models/qwen2/modeling_qwen2.py", line 362, in __init__
self.post_init()
File "/usr/local/lib/python3.11/site-packages/transformers/modeling_utils.py", line 1969, in post_init
if v not in ALL_PARALLEL_STYLES:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if
self
.
_tp_plan
is
not
None
and
is_torch_greater_or_equal
(
"2.5"
)
and
torch
.
distributed
.
is_available
():
修改后再运行:

在LLaMA-Factory目录下生成模型输出路径saves/qwen-7b/lora/sft:


5.2.5、推理测试
参考Llama-Factory文件夹中,examples\inference下提供的llama3_lora_sft.yaml,复制一份,并重命名为 qwen_lora_sft.yaml
model_name_or_path: /mnt/workspace/Qwen2.5-7B-Instruct
adapter_name_or_path: saves/qwen-7b/lora/sft
template: qwen
finetuning_type: lora
在Llama-Factory目录下,运行下面的推理命令:
llamafactory-cli chat examples/inference/qwen_lora_sft.yaml
稍微等待一下模型加载,然后就可以聊天了。

5.2.5、模型合并
参考Llama-Factory文件夹中,examples\merge_lora下提供的llama3_lora_sft.yaml,复制一份,并重命名为 qwen_lora_sft.yaml
### Note: DO NOT use quantized model or quantization_bit when merging lora adapters
### model
model_name_or_path: /mnt/workspace/Qwen2.5-7B-Instruct # 模型路径
adapter_name_or_path: saves/qwen-7b/lora/sft # 微调得到的权重路径
template: qwen
trust_remote_code: true
### export
export_dir: output/qwen-7b_lora_sft # 输出路径
export_size: 5
export_device: cpu # choices: [cpu, auto]
export_legacy_format: false
修改完配置文件后,使用下列指令导出合并后的模型:
llamafactory-cli export examples/merge_lora/
qwen_lora_sft.yaml
运行报错:
ImportError: cannot import name 'DTensor' from 'torch.distributed.tensor'

根据
查询CUDA 驱动版本:
nvidia-smi cuda版本为12.1

查看pytorch与transformers的版本:

匹配官方正确版本
根据官方文档和社区反馈,以下是一些兼容的 PyTorch 和 Transformers 版本组合:
-
PyTorch 2.5.0 + Transformers 4.52.1:适用于需要使用 DTensor 的最新功能。
-
PyTorch 2.3.0 + Transformers 4.36.2:适用于不需要 DTensor 的功能。
pip install torch==2.6.0 transformers==4.52.4 numpy==1.26.4
pip show torch transformers | grep Version
或者直接更换环境:

再次执行:
llamafactory-cli export examples/merge_lora/
qwen_lora_sft.yaml


生成的文件:

5.1.6、模型评估
llama-factory提供了对
cmmlu
,
mmlu
,
ceval
的评测脚本,使用以下命令可以对微调前后的模型进行简单的评测
原始模型:
llamafactory-cli eval \
--model_name_or_path /mnt/workspace/Qwen2.5-7B-Instruct \ # 模型路径
--template qwen \ # 使用 Qwen 模型的对话模板(Prompt 格式),确保输入符合模型预期。
--task cmmlu_test \ # 评测数据集(中文多任务语言理解基准),涵盖 67 个中文主题的推理和知识题。
--lang zh \
--n_shot 5 \ # 使用 5-shot learning(每个问题提供 5 个示例作为上下文)
--batch_size 1 \ # 批处理大小为 1(逐条推理),适合低显存或调试场景。若显存充足,可增大以提高速度。
--trust_remote_code True # 允许加载远程代码(如 Hugging Face 自定义模块),解决潜在的安全警告。

微调后的模型:
llamafactory-cli eval \
--model_name_or_path output/qwen-7b_lora_sft \
--template qwen \
--task cmmlu_test \
--lang zh \
--n_shot 5 \
--batch_size 1 \
--trust_remote_code True