安装LLaMA Factory

git clone --depth 1 https://github.com/hiyouga/LlamaFactory.git
cd LlamaFactory
pip install -e .
pip install -r requirements/metrics.txt

安装监控显卡工具

pip install nvitop
pip install nvidia-ml-py -U
nvitop -m auto
nvitop -m compact
nvitop -m full

快速开始

下面三行命令分别对 Qwen3-4B-Instruct 模型进行 LoRA 微调推理合并

llamafactory-cli train examples/train_lora/qwen3_lora_sft.yaml
llamafactory-cli chat examples/inference/qwen3_lora_sft.yaml
llamafactory-cli export examples/merge_lora/qwen3_lora_sft.yaml

下载模型

https://modelscope.cn/models/Qwen/Qwen3-4B-Instruct-2507
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关键文件介绍

文件夹 作用说明
accelerate Hugging Face Accelerate 分布式训练配置示例,用于多卡 / 多机、FSDP 训练,存放 accelerate 的 config 文件
ascend 华为昇腾 NPU 芯片适配的训练 / 推理样例,国产昇腾硬件跑大模型用
deepspeed DeepSpeed ZeRO 优化器的配置样例,大模型多卡显存优化,做大模型全量微调必备
extras 高级进阶功能合集:FP8、Galore、各种特殊优化器、FSDP‑QLoRA、DPO/ORPO 等高级对齐算法的示例配置
inference 推理、对话、API 服务的配置样例。训练完模型后,用这里 yaml 做 chat、批量推理、启动 api 服务GitHub
ktransformers KTransformers 推理库集成,做极低显存 CPU/GPU 混合推理
megatron Megatron‑LM 大模型框架适配,英伟达原生大模型训练框架,超大模型张量并行训练
megatron_bridge 桥接转换工具:把 Megatron 格式模型和 HuggingFace 格式互相转换的配置
merge_lora LoRA 适配器合并脚本配置。
train_full 全参数微调示例。整个大模型全部参数参与训练,吃显存极高
train_lora 普通 LoRA 微调,只训练少量 LoRA 适配器权重,显存占用低,普通消费卡就能微调 7B‑13B 模型
train_qlora QLoRA 4‑bit 量化微调,4/8bit 量化基础模型,进一步降低显存,单张 24G 显卡就能微调 70B 大模型

以下是详细的介绍:

1. 训练阶段:examples/train_lora/qwen3_lora_sft.yaml
  • 对应命令llamafactory-cli train ...

  • 核心作用“教模型”
    这是整个流程的起点。这个文件定义了怎么学

  • 关键配置

    ### model
    model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
    trust_remote_code: true
    
    ### method
    stage: sft
    do_train: true
    finetuning_type: lora
    lora_rank: 8
    lora_target: all
    
    ### dataset
    dataset: identity,alpaca_en_demo
    template: qwen3_nothink
    cutoff_len: 2048
    max_samples: 1000
    preprocessing_num_workers: 16
    dataloader_num_workers: 4
    
    ### output
    output_dir: saves/qwen3-4b/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
    resume_from_checkpoint: null
    
    ### eval
    # eval_dataset: alpaca_en_demo
    # val_size: 0.1
    # per_device_eval_batch_size: 1
    # eval_strategy: steps
    # eval_steps: 500
    
    • 学什么:指定数据集(dataset: sft_data)和对话模板(template: qwen3)。
    • 怎么学:设定学习率(learning_rate)、训练轮数(num_train_epochs)、批次大小(per_device_train_batch_size)。
    • 学多少:配置 LoRA 的参数,比如秩(lora_rank: 8)和目标模块(lora_target: all)。
  • 产出:运行后,你会得到一个新的文件夹(通常在 saves/ 目录下),里面包含训练好的 LoRA 权重文件adapter_model.bin)。

一、model — 模型配置
参数 含义 可选值 / 说明
model_name_or_path 预训练模型的路径或名称 可以是本地路径(如 /mnt/workspace/...)或 HuggingFace 模型名(如 Qwen/Qwen3-4B
trust_remote_code 是否信任模型自带的远程代码 true / false。部分模型(如 Qwen)需要自定义代码,必须设为 true
二、method — 训练方法
参数 含义 可选值 / 说明
stage 训练阶段 sft(监督微调)、rm(奖励模型训练)、ppo(PPO强化学习)、dpo(DPO直接偏好优化)、ktoorpopretrain(预训练)等
do_train 是否执行训练 true / false
finetuning_type 微调方式 lora(低秩适配)、full(全参数微调)、freeze(冻结部分参数微调)、adalorallama_pro
lora_rank LoRA 的秩(rank),越大能力越强但参数越多 常见值:48163264128。当前为 8
lora_target LoRA 应用的目标模块 all(所有线性层)、或指定模块名如 q_proj,v_proj,k_proj,o_projqkv_proj
三、dataset — 数据集配置
参数 含义 可选值 / 说明
dataset 使用的数据集名称,多个用逗号分隔 内置数据集如 identity(身份认知数据)、alpaca_en_demo(Alpaca英文示例)、alpaca_zh 等,也可自定义注册
template 对话模板,决定如何将数据格式化为模型输入 qwen3_nothink(Qwen3 不带思考的模板)、qwen3qwenchatmlllama3vicuna 等,需与模型匹配
cutoff_len 最大序列长度(token数),超出截断 512102420484096 等。当前为 2048
max_samples 最多使用的训练样本数 整数,如 1000。设为 null 或不填则使用全部数据
preprocessing_num_workers 数据预处理时使用的进程数 整数,如 4816。越大预处理越快,但消耗更多内存
dataloader_num_workers 数据加载时使用的 worker 数 整数,如 0248。影响训练时数据加载速度
四、output — 输出配置
参数 含义 可选值 / 说明
output_dir 模型和日志的输出目录 任意路径字符串,如 saves/qwen3-4b/lora/sft
logging_steps 每隔多少步记录一次训练日志 整数,如 10。表示每10步打印一次 loss 等
save_steps 每隔多少步保存一次 checkpoint 整数,如 500。每500步保存一个模型检查点
plot_loss 是否绘制 loss 曲线图 true / false。训练结束后生成 loss 曲线图
overwrite_output_dir 是否覆盖已存在的输出目录 true / falsetrue 会覆盖之前的训练结果
save_only_model 是否只保存模型权重(不含 optimizer 等) true(只保存模型)/ false(同时保存 optimizer、scheduler 状态,方便断点续训)
report_to 训练指标上报平台 none(不上报)、wandb(Weights & Biases)、tensorboardswanlabmlflow
五、train — 训练超参数
参数 含义 可选值 / 说明
per_device_train_batch_size 每张 GPU 的训练批次大小 整数,如 1248。受显存限制
gradient_accumulation_steps 梯度累积步数 整数,如 8。实际 batch size = per_device_train_batch_size × gradient_accumulation_steps × GPU数。当前实际 batch size = 1×8 = 8
learning_rate 学习率 浮点数。LoRA 常用 1e-4~3e-4,全参数微调常用 1e-5~5e-5
num_train_epochs 训练轮数 浮点数,如 3.0。表示整个数据集训练3遍
lr_scheduler_type 学习率调度策略 cosine(余弦衰减)、linear(线性衰减)、constant(恒定)、constant_with_warmuppolynomial
warmup_ratio 预热阶段占总训练步数的比例 浮点数,如 0.1(10%的步数用于预热),0.03
bf16 是否使用 BF16 混合精度训练 true / false。需要 Ampere 及以上架构 GPU(如 A100、3090)
ddp_timeout 分布式训练超时时间(微秒) 整数,如 180000000。防止多卡训练时因数据加载慢导致超时
resume_from_checkpoint 从哪个 checkpoint 恢复训练 null(从头开始)或 checkpoint 路径(如 saves/qwen3-4b/lora/sft/checkpoint-1000
六、eval — 评估配置
参数 含义 可选值 / 说明
eval_dataset 评估使用的数据集 dataset,如 alpaca_en_demo
val_size 从训练集中划分出验证集的比例 浮点数,如 0.1(10% 作为验证集)
per_device_eval_batch_size 每张 GPU 的评估批次大小 整数,如 1
eval_strategy 评估策略 steps(按步数评估)、epoch(按轮次评估)、no(不评估)
eval_steps 每隔多少步评估一次 整数,如 500。仅在 eval_strategy=steps 时有效
2. 体验/验证阶段:examples/inference/qwen3_lora_sft.yaml
  • 对应命令llamafactory-cli chat ...

  • 核心作用“考模型”
    训练完后,你不需要把模型部署到服务器,而是想先在命令行里跟它聊聊天,看看效果好不好。这个文件定义了怎么聊

  • 关键配置

    model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
    adapter_name_or_path: saves/qwen3-4b/lora/sft
    template: qwen3_nothink
    infer_backend: huggingface  # choices: [huggingface, vllm, sglang, ktransformers]
    trust_remote_code: true
    
    • 加载谁:它需要同时指定基础模型model_name_or_path)和刚才训练出来的 LoRA 权重adapter_name_or_path)。
    • 用什么引擎:这里就是你刚才问到的 infer_backend: huggingfacevllm
    • 格式:必须保持和训练时一样的对话模板(template: qwen3),否则模型会听不懂人话。
  • 产出:一个交互式的命令行界面,你可以输入问题,模型实时回答。

3. 部署/导出阶段:examples/merge_lora/qwen3_lora_sft.yaml
  • 对应命令llamafactory-cli export ...

  • 核心作用“打包模型”
    LoRA 权重只是一个“补丁”,不能独立运行。如果你要把模型发给别人,或者部署到生产环境,通常希望它是一个独立的、完整的模型文件。这个文件定义了怎么合

  • 关键配置

    ### Note: DO NOT use quantized model or quantization_bit when merging lora adapters
    
    ### model
    model_name_or_path: Qwen/Qwen3-4B-Instruct-2507
    adapter_name_or_path: saves/qwen3-4b/lora/sft
    template: qwen3_nothink
    trust_remote_code: true
    
    ### export
    export_dir: saves/qwen3_sft_merged
    export_size: 5
    export_device: cpu  # choices: [cpu, auto]
    export_legacy_format: false
    
    • 源文件:指定基础模型路径和 LoRA 权重路径。
    • 去向:指定合并后的模型保存路径(export_dir)。
    • 注意:这里通常要求基础模型必须是 FP16/BF16 格式,不能是量化过的(如 INT4/INT8),否则合并会失败或精度受损。
  • 产出:一个全新的、独立的模型文件夹。这个文件夹里包含了所有权重,不再依赖 LoRA 插件,可以直接被任何支持该架构的工具加载。

文件名关键词 角色 动作 你的操作
train 老师 训练 修改它来调整学习策略,跑完得到“补丁包”。
inference 考官 测试 修改它来加载“补丁包”,跑完进行对话测试。
merge 打包员 合并 修改它来指定输出位置,跑完得到“完整版模型”。

参数介绍

LLaMA‑Factory 里的 template(模板)是干什么的

每个开源大模型(Llama3、Qwen、GLM、Mistral)都有自己专属对话格式,不能混用。

比如 Llama3 用 <|begin_of_text|><|start_header_id|>user<|end_header_id|>;Mistral 用 [INST]xxx[/INST],Qwen 用<|im_start|>。模板就是帮你自动拼接这套格式,不用自己手动写符号。

你的训练数据集是 json,格式类似:

[
  {"role":"user","content":"你好"},
  {"role":"assistant","content":"你好呀"}
]

模板会自动加上模型专属标记,拼接成模型训练时看到的完整文本:

<|begin_of_text|><|start_header_id|>user<|end_header_id|>
你好
<|eot_id|>
<|start_header_id|>assistant<|end_header_id|>
你好呀<|eot_id|>
safetesnsors 是什么?

Safetensors 是一种用于安全存储张量(如模型权重)的新型文件格式,由 Hugging Face 团队开发,旨在解决传统格式(如 .pth.bin)在安全性和加载效率上的不足。它不包含可执行代码,仅存储张量数据,因此在加载来自不可信来源的模型时更安全,且支持零拷贝加载,速度极快。

使用方法

!pip install safetensors

from safetensors import safe_open

with safe_open("adapter_model.safetensors", framework="pt", device=0) as f:
    for key in f.keys():
        tensor = f.get_tensor(key)
        # 处理 tensor查看
        print(tensor)
interence参数介绍

infer_backend: huggingface # choices: [huggingface, vllm, sglang, ktransformers]

指定模型在推理(运行/对话)时,底层使用哪个“引擎”来驱动。

选项 特点描述 适用场景
huggingface 默认选项。兼容性最强,几乎支持所有模型,无需额外安装复杂依赖。但推理速度相对较慢,显存利用率一般。 调试、开发、快速验证。
vllm 高性能。通过 PagedAttention 技术极大提升吞吐量,推理速度极快,显存占用更低。 生产环境、批量处理。
sglang 极速/新架构。比 vLLM 更新,针对复杂提示词(如多轮对话、Agent)有专门优化,速度往往更快。 追求极致速度、复杂 Agent 应用。适合对延迟极其敏感的场景。
ktransformers 特定优化。通常指针对特定硬件或架构优化的内核版本(较少见,视具体版本而定)。 特定硬件优化场景。

export_legacy_format: false

参数值 导出文件格式 适用场景
False (默认) .safetensors 现代 HF 生态、vLLM、TGI 等主流推理
True .bin (pytorch_model) 老旧工具链、特定量化脚本、兼容性需求

使用API进行批量推理

准备 API 配置文件api_config.yaml,用于告诉服务加载哪个模型、使用哪个推理后端以及端口是多少。

### model
# 这里填入你的本地绝对路径
model_name_or_path: /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507

# 如果有 LoRA 权重,也填入路径;如果是合并模型则留空或注释掉
# adapter_name_or_path: saves/qwen3-4b/lora/sft 

template: qwen3_nothink
trust_remote_code: true
infer_backend: vllm  # 推荐使用 vllm 以获得更快的推理速度

在根目录下使用命令行启动

若出现报错

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

# 指定端口为 8000,使用第 0 号 GPU
API_PORT=8000 CUDA_VISIBLE_DEVICES=0 DISABLE_VERSION_CHECK=1 llamafactory-cli api examples/api/api_config.yaml

使用脚本进行批量推理

from openai import OpenAI

# 初始化客户端
client = OpenAI(
    api_key="0", 
    base_url="http://localhost:8000/v1"
)

# 1. 定义批量问题列表
questions = [
    "你好,请介绍一下你自己",
    "量子力学是什么?",
    "如何用 Python 写一个冒泡排序?"
]

print(f"开始批量推理,共 {len(questions)} 个问题...\n" + "-"*30)

# 2. 循环发送请求
for i, question in enumerate(questions):
    try:
        response = client.chat.completions.create(
            model="Qwen3-4B", 
            messages=[
                {"role": "user", "content": question}
            ],
            temperature=0.7
        )
        
        # 获取回答内容
        answer = response.choices[0].message.content
        
        # 打印结果
        print(f"[问题 {i+1}]: {question}")
        print(f"[回答]: {answer}")
        print("-" * 30)
        
    except Exception as e:
        print(f"请求 {i+1} 失败: {e}")

print("所有推理完成!")

训练轮数怎么计算的

总轮数 (Total Steps) = [(数据集总样本数 ) / (单卡批次大小 × 梯度累积步数)]_向上取整× 训练轮次

对于这一份yaml文件

### model
model_name_or_path: /mnt/workspace/.cache/modelscope/models/Qwen/Qwen3-4B-Instruct-2507
trust_remote_code: true

### method
stage: sft
do_train: true
finetuning_type: lora
lora_rank: 8
lora_target: all

### dataset
dataset: identity,alpaca_en_demo
template: qwen3_nothink
cutoff_len: 2048
max_samples: 1000
preprocessing_num_workers: 16
dataloader_num_workers: 4

### output
output_dir: saves/qwen3-4b/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: 1.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000
resume_from_checkpoint: null

## eval
# eval_dataset: alpaca_en_demo
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 500
计算过程
  1. 确定关键参数
    • 数据集总样本数**😗* 您在配置中设置了 max_samples: 1000,因此每个用于训练的样本总数为 1000 个。
    • 训练轮次 (Epochs): num_train_epochs: 1.0,表示整个数据集会训练 1 遍。
    • 单卡批次大小 (Batch Size): per_device_train_batch_size: 1,表示每张卡每次处理 1 个样本。
    • 梯度累积步数 (Gradient Accumulation Steps): gradient_accumulation_steps: 8,表示每累积 8 个批次后才进行一次参数更新。
  2. 代入公式计算

三种微调方式

在大模型微调中,通常所说的“三种微调方式”主要指Full(全量)微调LoRA(Low-Rank-Adaptation)微调QLoRA微调。它们的核心区别在于更新参数量、资源消耗(尤其是显存)和适用场景

你可以把它们想象成对一辆汽车进行改装:

  • 全量微调:如同重装整个引擎和所有系统。效果最彻底,但成本极高。
  • LoRA微调:如同加装一个高性能外挂。不改动原车核心,成本低,效果显著,还能随时拆下。
  • QLoRA微调:如同mini版引擎上再装外挂。成本最低,让普通用户也能玩得起大模型。

下面是这三种方式的详细对比:

微调方式 更新参数量 显存需求 适用场景
全量微调 100% 所有参数 极高 (约4倍模型大小) 资源充足的巨头,追求极致性能
LoRA微调 极少 (0.1%-1%) 中等 (约1.2倍模型大小) 绝大多数应用场景,个人开发者
QLoRA微调 极少 (0.1%-1%) 很低 (约0.3倍模型大小) 资源有限的个人或小团队
1. 全量微调 (Full Fine-tuning)

这是最传统、最彻底的微调方式。

  • 原理:在训练过程中,更新模型的全部参数。模型的所有权重都会根据你的新数据进行调整。
  • 优点:理论上能达到最好的效果,因为模型可以完全适应新任务。
  • 缺点资源消耗巨大。训练一个70亿(7B)参数的模型,可能需要80GB甚至更多的显存,对硬件要求极高,训练速度也慢。
2. LoRA微调 (Low-Rank Adaptation)

这是一种“参数高效微调”(PEFT)技术,是目前最主流的微调方法。

  • 原理冻结原始模型的所有参数,只在模型的特定层旁边注入并训练一些非常小的“适配器”矩阵(即LoRA模块)。训练时只更新这些小模块的参数。
  • 优点:
    • 显存占用低:只需训练极少量参数(通常不到原模型的1%),大大降低了显存需求。
    • 训练速度快:因为要计算的参数少,训练效率非常高。
    • 灵活切换:可以为不同任务训练多个LoRA模块,使用时像“插件”一样按需加载,非常灵活。
  • 缺点:性能上限理论上略低于全量微调,但在绝大多数任务中,效果已经非常接近。
3. QLoRA微调 (Quantized LoRA)

这是在LoRA基础上的进一步创新,旨在将资源消耗降到最低。

  • 原理

    :QLoRA = 量化 + LoRA

    1. 量化:首先将原始模型的精度从16位(FP16)压缩到4位(NF4),这能让模型体积缩小约75%。
    2. LoRA:然后在这个被压缩的模型上,再进行LoRA微调。
  • 优点显存需求极低。它使得在单张消费级显卡(如24GB显存的RTX 4090)上微调一个巨大的70B模型成为可能。

  • 缺点:由于引入了量化,会带来微小的精度损失(通常小于1%),但换取的是巨大的资源节省。

所有示例训练方式

  1. qwen3_lora_dpo.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术进行 DPO 训练的配置。
    • 技术点:DPO(Direct Preference Optimization)是一种对齐技术,让模型学会人类的偏好(比如回答得更友好、更真实)。这个配置文件是用于让模型变得“更听话”。
  2. qwen3_lora_kto.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术进行 KTO 训练的配置。
    • 技术点:KTO(Knowledge Transfer Optimization)也是一种对齐算法,类似于 DPO,旨在通过偏好数据优化模型输出。
  3. qwen3_lora_pretrain.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术进行 预训练 的配置。
    • 技术点:这通常用于让模型学习新知识或新语言,而不是微调回答风格。
  4. qwen3_lora_reward.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术训练 奖励模型 的配置。
    • 技术点:奖励模型(Reward Model)不直接回答问题,而是给其他模型的回答打分(好评/差评),用于后续的强化学习(RLHF)。
  5. qwen3_lora_sft_ds3.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术进行 SFT 训练,且使用了 DeepSpeed Stage 3 的配置。
    • 技术点:SFT(Supervised Fine-Tuning,监督微调)是让模型学会具体任务(如写代码、写文案)。ds3 代表使用了 DeepSpeed 的第三级优化,这意味着该配置是为了在显存有限的情况下训练非常大的模型。
  6. qwen3_lora_sft_ray.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术进行 SFT 训练,且使用了 Ray 框架的配置。
    • 技术点:Ray 是一个用于分布式计算的框架。这个配置文件意味着训练任务被分布到了多台机器或多个节点上进行。
  7. qwen3_lora_sft_ray.sh
    • 含义:启动上述 qwen3_lora_sft_ray.yaml 配置的 Shell 脚本
    • 技术点:当你想运行分布式训练时,通常会执行这个 .sh 文件。
  8. qwen3_lora_sft.yaml
    • 含义:基于 Qwen3 模型,使用 LoRA 技术进行 SFT 训练的标准配置。
    • 技术点:这是最常规的微调配置,不涉及复杂的分布式框架(如 Ray)或显存优化(如 DeepSpeed)。
  9. qwen3_preprocess.yaml
    • 含义数据预处理 配置。
    • 技术点:在训练开始前,需要对原始数据进行清洗、分词、格式转换。这个文件定义了数据处理的规则。
  10. qwen3vl_lora_dpo.yaml
    • 含义:基于 Qwen3VL 模型,使用 LoRA 技术进行 DPO 训练的配置。
    • 技术点VL 代表 Vision-Language(视觉语言)。这说明该配置是用于多模态模型(能看懂图片的模型)的训练。
  11. qwen3vl_lora_sft.yaml
    • 含义:基于 Qwen3VL 模型,使用 LoRA 技术进行 SFT 训练的配置。
    • 技术点:这是多模态模型的标准微调配置。

量化

什么是模型量化

模型量化是一种模型压缩技术,其核心思想是将模型参数(如权重和激活值)从高精度数据类型(通常是 FP16 或 BF16,占用 16 位)转换为低精度数据类型(如 INT4 或 INT8,占用 4 位或 8 位)。

  • 原理:类似于将高清图片压缩成低分辨率图片,虽然会有微小的信息损失,但整体效果依然可用。
  • 目的:大幅减少模型所需的显存(VRAM)和内存(RAM),同时通常能提升推理速度。
  • 效果:一个典型的 7B(70亿参数)模型,原生 FP16 格式可能需要约 14GB 显存,而经过 INT4 量化后,显存占用可降至约 4-6GB,使得在消费级显卡(如 RTX 3060/4060)上运行大模型成为可能。
LlamaFactory 支持的量化方法

LlamaFactory 主要支持两大类量化方法:后训练量化(PTQ)和量化感知训练(QAT)。在实际应用中,PTQ 更为常见,因为它不需要重新训练模型。

后训练量化

PTQ 是在模型预训练完成后进行的量化。LlamaFactory 集成了目前主流的 PTQ 算法:

  1. GPTQ
    • 原理:一种基于逐块(per-channel)的权重量化方法。它通过最小化量化前后权重的差异来优化量化参数。
    • 特点:精度损失较小,兼容性较好,是目前应用最广泛的量化方法之一。
    • 适用场景:适用于大多数需要快速部署且对精度有一定要求的场景。
  2. AWQ
    • 原理:激活感知权重量化。它不仅考虑权重,还考虑激活值的分布,通过保护重要的权重通道来减少精度损失。
    • 特点:相比 GPTQ,AWQ 在低比特(如 2-bit 或 3-bit)量化时表现更优,推理速度通常更快,且对硬件的兼容性要求较低。
    • 适用场景:追求极致推理速度和极低显存占用的场景。
  3. AQLM
    • 原理:一种更先进的量化方法,结合了矢量量化和标量量化的优势。
    • 特点:在极低比特下(如 2-bit)能保持较好的性能,但计算开销可能略高。
量化感知训练

QAT 是在模型微调(SFT)过程中引入量化模拟。LlamaFactory 支持 QLoRA。

  • QLoRA:将 LoRA(低秩适应)微调与量化结合。它在微调时使用量化模型,但更新的是 LoRA 适配器的参数。
  • 优势:可以在极低显存占用下(例如仅需 6GB 显存)对大模型进行微调,训练完成后可以合并 LoRA 权重并导出为纯量化模型。
LlamaFactory 中的量化配置

在 LlamaFactory 中,用户可以通过命令行参数或配置文件轻松启用量化。常见的配置选项包括:

  • --quantization_bit:指定量化的比特数。常见值有 0(不量化)、4(INT4)、8(INT8)。
  • --quantization_method:指定量化算法。常见值有 gptqawqaqlm
  • --template:根据不同的量化模型,可能需要指定相应的对话模板(如 qwenllama2 等),以确保输入格式正确。
量化带来的收益与权衡
收益
  • 显存占用大幅降低:这是最直接的好处,使得在低端硬件上运行大模型成为可能。
  • 推理速度提升:低精度计算通常比高精度计算更快,尤其是在支持 INT4 指令的现代 GPU(如 NVIDIA 的 Tensor Core)上。
  • 部署成本降低:可以使用更便宜的硬件进行模型推理服务。
什么是模型量化

模型量化是一种模型压缩技术,其核心思想是将模型参数(如权重和激活值)从高精度数据类型(通常是 FP16 或 BF16,占用 16 位)转换为低精度数据类型(如 INT4 或 INT8,占用 4 位或 8 位)。

  • 原理:类似于将高清图片压缩成低分辨率图片,虽然会有微小的信息损失,但整体效果依然可用。
  • 目的:大幅减少模型所需的显存(VRAM)和内存(RAM),同时通常能提升推理速度。
  • 效果:一个典型的 7B(70亿参数)模型,原生 FP16 格式可能需要约 14GB 显存,而经过 INT4 量化后,显存占用可降至约 4-6GB,使得在消费级显卡(如 RTX 3060/4060)上运行大模型成为可能。
Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐