大模型微调Fine-tuning

一、什么是大模型?

对大模型做一个直观的抽象, 本质上,现在的大模型要解决的问题,就是一个序列数据转换的问题:
输入序列 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)。

四、微调的常见方法

全参数微调FFTFull Fine Tuning):调整模型所有参数,适合数据量较大的场景。
轻量级微调PEFTParameter-Efficient Fine Tuning):如LoRA(低秩适应)、Adapter模块,仅训练少量参数,节省计算资源。
提示微调(Prompt-tuning):通过调整输入提示(Prompt)引导模型输出。
全参数微调FFT会带来一些问题:
  • 一个是 训练成本比较高,因为微调的参数量跟预训练的是一样的多的;
  • 一个是叫 灾难性遗忘( Catastrophic Forgetting),用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差
PEFT主要想解决的问题,就是FFT存在的上述两个问题, PEFT也是目前比较主流的微调方案。
从训练数据的来源、以及训练的方法的角度, 大模型的微调有以下几条技术路线:
  1. 一个是 监督式微调SFT(Supervised Fine Tuning),这个方案主要是用人工标注的数据,用传统机器学习中监督学习的方法,对大模型进行微调;
  2. 一个是 基于人类反馈的强化学习微调RLHF(Reinforcement Learning with Human Feedback),这个方案的主要特点是把人类的反馈,通过强化学习的方式,引入到对大模型的微调中去,让大模型生成的结果,更加符合人类的一些期望;
  3. 还有一个是 基于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、下载模型

使用的是Git下载,下载速度会比较快: git clone 通义千问2.5-7B-Instruct
model文件较大,会等十分钟左右才能完全下载,一共有4个主model

5.2.3、大模型微调框架LLaMA Factory

想深入了解llama_factory 的可以在这里查看: https:// github.com/hiyouga/LLaM
输入如下代码拉取 LLaMA-Factory,过程大约需要几分钟:
安装依赖的软件:执行 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 :指定了使用的数据集 identity
template: 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值