Chapter 13

源码走读路线图与生态

📌 commit a106ff4c7061 2.7 万行 / 找问题落点 / 跟生态

PEFT 仓库代码量约 2.7 万行(不算 tests / docs),整体结构清晰。 本章给一份"该按什么顺序读"的路线图,外加上下游生态、关键 commit、提 PR 指南。

13.1仓库目录全景

peft/                                 https://github.com/huggingface/peft
├── src/peft/                         ★ 核心库
│   ├── __init__.py                   公共 API 导出
│   ├── auto.py                       AutoPeftModel 自动选 task
│   ├── config.py                     PeftConfig 基类
│   ├── peft_model.py                 ★ PeftModel + 任务子类(CausalLM 等)
│   ├── mapping.py / mapping_func.py  ★ get_peft_model 入口
│   ├── mixed_model.py                同一 base 上挂多种 tuner
│   ├── functional.py                 一些纯函数 API
│   ├── helpers.py                    辅助工具
│   ├── tuners/                       ★ 40+ tuner 实现
│   │   ├── tuners_utils.py            BaseTuner / BaseTunerLayer
│   │   ├── lora/                     ★ LoRA + QLoRA + DoRA + 量化兼容
│   │   ├── adalora/                  AdaLoRA
│   │   ├── ia3/                       IA³
│   │   ├── loha/ / lokr/ / oft/ / boft/ / hra/  正交家族
│   │   ├── vera/ / fourierft/        实验性 LoRA 变种
│   │   ├── prompt_tuning/ / prefix_tuning/ / p_tuning/  Prompt 系
│   │   ├── multitask_prompt_tuning/
│   │   ├── poly/                     Polytropon
│   │   ├── adaption_prompt/          LLaMA-Adapter
│   │   ├── trainable_tokens/         扩词表用
│   │   ├── ...(还有 30+ 实验性 tuner)
│   ├── utils/                        loftq / pissa / hub / hf save_load
│   ├── optimizers/                   特定 PEFT 用的优化器(少)
│   └── import_utils.py               可选依赖判断
├── examples/                          ★ 80+ 跑得通的样例
│   ├── lora_finetuning/
│   ├── qlora_finetuning/
│   ├── int8_training/
│   ├── dora_finetuning/
│   ├── loftq_finetuning/
│   ├── pissa_finetuning/
│   ├── lora_dreambooth/
│   ├── multi_adapter_examples/
│   └── ...(很多)
├── tests/                             单元测试(也是好的"小例子")
├── docs/source/                      官方文档源
├── method_comparison/                 PEFT 方法 benchmark
└── scripts/

13.2建议的阅读顺序

优先级文件读什么
1src/peft/__init__.py 看公共 API 边界
2src/peft/config.py PeftConfig 基类
3src/peft/mapping_func.py get_peft_model 主入口
4src/peft/peft_model.py PeftModel / from_pretrained / save_pretrained
5src/peft/tuners/tuners_utils.pyBaseTuner / BaseTunerLayer(每个 tuner 都继承)
6src/peft/tuners/lora/config.py 最经典的 config
7src/peft/tuners/lora/layer.py LoRA 实现核心
8src/peft/tuners/lora/model.py LoraModel(注入 adapter)
9src/peft/tuners/lora/bnb.py 量化兼容 layer 写法范本
10src/peft/utils/save_and_load.pyadapter 怎么落盘
11src/peft/tuners/ia3/ 对比另一种 tuner 的实现差异
12src/peft/tuners/prompt_tuning/对比 prompt 系怎么不替换权重
13src/peft/mixed_model.py 看多 tuner 共存怎么实现

13.3核心调用栈一图速记

用户 import peft
   │
get_peft_model(base, LoraConfig(...))           ← mapping_func.py
   │
   ├── PEFT_TYPE_TO_TUNER_MAPPING[LORA] → LoraModel
   ├── PEFT_TYPE_TO_PEFT_MODEL_MAPPING[CAUSAL_LM][LORA] → PeftModelForCausalLM
   └── PeftModelForCausalLM(base, cfg, "default")
           │
           └── base_model = LoraModel(base, {default: cfg}, "default")
                   │
                   ├── BaseTuner.inject_adapter
                   │       └── for each module:
                   │             _check_target_module_exists?
                   │                → _create_and_replace
                   │                       → ScaleLoraLinear / Linear8bitLt / Linear4bit
                   ├── _mark_only_adapters_as_trainable
                   └── return

forward 路径:
   PeftModel.forward
       → base_model.forward
       → 原 transformer.forward 但 q_proj / v_proj 已替换为 LoraLinear
       → LoraLinear.forward = base_layer(x) + B(A(x)) * scaling

13.4关键 commit 时间线

时间变更
2022-12项目首次开源(v0.1)
2023-04QLoRA 集成(bnb 4bit + LoRA)
2023-07多 adapter 一等公民(add_adapter / set_adapter)
2023-09LoftQ 初始化
2023-12AdaLoRA 重构 + IA³ / LoHa / LoKr 集成
2024-02DoRA 加入
2024-03VeRA 加入
2024-04PiSSA / OLoRA 初始化
2024-06OFT / BOFT / HRA 集成
2024-09add_weighted_adapter 支持 TIES / DARE
2024-12FourierFT / rsLoRA / Trainable Tokens
2025-Q1TorchAO 量化兼容 / EVA 初始化
2025-Q240+ tuner / 长上下文兼容 / vLLM serving 适配

13.5关联论文

论文对应实现
Hu et al., LoRA, 2021 tuners/lora/
Zhang et al., AdaLoRA, 2023 tuners/adalora/
Liu et al., (IA)³, 2022 tuners/ia3/
Liu et al., DoRA, 2024 tuners/lora/dora.py
Kopiczko et al., VeRA, 2024 tuners/vera/
Dettmers et al., QLoRA, 2023 tuners/lora/bnb.py
Li et al., LoftQ, 2024 utils/loftq_utils.py
Meng et al., PiSSA, 2024 tuners/lora/layer.py(init)
Buyukakyuz et al., OLoRA, 2024 tuners/lora/layer.py(init)
Paischer et al., EVA, 2024 tuners/lora/eva.py
Liu et al., LoHa, 2022 tuners/loha/
Edalati et al., LoKr (KronA), 2022 tuners/lokr/
Qiu et al., OFT, 2023 tuners/oft/
Liu et al., BOFT, 2024 tuners/boft/
Lester et al., Prompt Tuning, 2021 tuners/prompt_tuning/
Li & Liang, Prefix Tuning, 2021 tuners/prefix_tuning/
Liu et al., P-Tuning v2, 2022 tuners/p_tuning/ (+ prefix)
Yadav et al., TIES-Merging, 2023 add_weighted_adapter 内
Yu et al., DARE, 2024 add_weighted_adapter 内

13.6下游生态

项目跟 PEFT 的关系
transformers 底座,PEFT 直接对接
TRL SFT / DPO / GRPO trainer 默认走 PEFT
LLaMA-Factory UI 包装,底层是 PEFT
Axolotl YAML 包装,底层是 PEFT
Unsloth 用自家 fused kernel 跑 LoRA,但仍兼容 PEFT 的 adapter 格式
ms-swift 魔搭微调框架,也走 PEFT
vLLM 支持多 LoRA 共享 base 推理
TGI / SGLang 同上
Diffusers SD/SDXL 微调用 PEFT 的 LoRA / LoHa

可以说"装了 transformers 就有 PEFT"已经是事实标准。

13.7对照其他 PEFT 工具

HuggingFace PEFTAdapter-TransformersOpenDelta
维护方 HuggingFace UKP(已 archived,并入 HF)清华 OpenBMB
覆盖算法 40+ 20+ 10+
多 adapter 支持 ★★★★★ ★★★★ ★★
量化集成 5+ 后端
社区活跃度 极高

结论:现在事实上的 PEFT 标准就是 HF PEFT

13.8社区入口

13.9提 issue / PR 礼仪

  1. 提 bug:附 最小复现代码 + transformers/peft/torch 版本
  2. 提 feature:先在 issue 里讨论范围;新方法要带论文链接;
  3. PR:跑 make quality(ruff + mypy);写测试到 tests/
  4. 新 tuner 的 PR 通常需要 review 2-4 周;
  5. commit 风格:FEAT: ... / FIX: ... / DOC: ... / TST: ...

13.10examples/ 55 子目录速查

仓库的 examples/ 已经有 55+ 个子目录,每个一份完整可跑脚本。按主题分类的查表:

主题子目录
LoRA 主流 lora_finetuning/ / causal_language_modeling/ / sft/
QLoRA / 量化 int8_training/ / fp4_finetuning/ / qalora_finetuning/ / loftq_finetuning/
LoRA 初始化变种 olora_finetuning/ / pissa_finetuning/ / eva_finetuning/ / corda_finetuning/ / monteclora_finetuning/
LoRA 增强 dora_finetuning/ / lora_ga_finetuning/ / lorafa_finetune/
新方法 vera/ / pvera/ / shira_finetuning/ / hira_finetuning/ / randlora_finetuning/ / delora_finetuning/ / gralora_finetuning/ / miss_finetuning/ / lily_finetuning/ / adamss_finetuning/
正交家族 boft_dreambooth/ / boft_controlnet/ / oft_dreambooth/ / hra_dreambooth/
多 adapter multi_adapter_examples/ / arrow_multitask/
多模态 / 视觉 stable_diffusion/ / lora_dreambooth/ / image_classification/ / semantic_segmentation/ / feature_extraction/
Prompt 系 conditional_generation/ / sequence_classification/(T5 任务)
特殊场景 dna_language_models/(DNA 序列) / kappaTune/(layer-wise target) / ephemeral_gpu_offloading/

新人最值得先打开的 5 份:

  1. lora_finetuning/ — 最简 SFT;
  2. loftq_finetuning/ — QLoRA + 不掉精度初始化;
  3. dora_finetuning/ — DoRA 一键替换 LoRA;
  4. multi_adapter_examples/ — 多 adapter add / set / weighted 全套;
  5. pissa_finetuning/ — 快收敛 init 实战。

13.11method_comparison/:PEFT 方法基准

repos/peft/method_comparison/ 是 PEFT 团队维护的方法级 benchmark。当下覆盖:

benchmark用途
MetaMathQA/ ~13B token 的数学题基准;评测各种 PEFT 方法在数学任务上的表现
text_generation_benchmark/LLM 生成质量指标对比
Gradio Space 在线 dashboard huggingface.co/spaces/peft-internal-testing/PEFT-method-comparison 实时查最新对比

每个方法的实验 config 是独立 JSON 文件,同 base + 同数据 + 不同方法跑出来公平对比。"我该选 LoRA 还是 DoRA?"——去这个 Space 看你的 base 模型 + 任务对应的 leaderboard。

13.12跟着测试读 API

PEFT 的 tests/ 不是单纯回归测试,是每个 tuner 用法的金标准最小例。下表是"想学 X,先 grep test_X.py"

测试文件覆盖什么
tests/test_initialization.py(7,600+ 行) 所有 init 模式:default / gaussian / pissa / loftq / eva / olora / orthogonal
tests/test_lora_variants.py LoRA / DoRA / LoRA-GA
tests/test_vera.py VeRA shared random matrix
tests/test_boft.py BOFT 蝶形分解
tests/test_cpt.py / test_cartridge.py新方法的入门示例
tests/test_common_gpu.py (92 KB) 所有方法的 GPU 训练 e2e
tests/test_custom_models.py (292 KB) 非 HF 标准架构上挂 PEFT
tests/test_lora_conversion.py merge / unmerge 等价
tests/test_auto.py AutoPeftModelForXxx 加载
tests/test_helpers.py target_modules / modules_to_save 选择逻辑
tests/test_gpu_examples.py (273 KB) 真实场景训练(LLaMA / Mistral / Qwen 等)

13.13给读者的下一步

  1. examples/lora_finetuning/ 跑通一个最小例子;
  2. tuners/lora/layer.py(不到 1000 行)把 LoRA 实现彻底搞懂;
  3. tuners/lora/bnb.py 理解量化兼容怎么做;
  4. peft_model.py::PeftModelForCausalLM.forward(看 prompt 系怎么注入);
  5. 挑一个你感兴趣的新方法(DoRA / PiSSA / VeRA)读它的 layer.py;
  6. 按第 12 章实现一个属于自己的 PoC tuner。

13.11结语

PEFT 是当前 LLM 微调生态的中枢——你看 LLaMA-Factory、Axolotl、TRL、ms-swift、vLLM、Diffusers, 底层都在调它。理解 PEFT 的三层抽象、能读懂 LoRA 的 layer.py,就掌握了 90% 的 PEFT 实战需求。

剩下的 10% 是新方法、量化集成、多 adapter 服务化——本书已经把每条线的入口都给你指了。 剩下的功夫在源码里。