Chapter 13
源码走读路线图与生态
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建议的阅读顺序
| 优先级 | 文件 | 读什么 |
|---|---|---|
| 1 | src/peft/__init__.py | 看公共 API 边界 |
| 2 | src/peft/config.py | PeftConfig 基类 |
| 3 | src/peft/mapping_func.py | get_peft_model 主入口 |
| 4 | src/peft/peft_model.py | PeftModel / from_pretrained / save_pretrained |
| 5 | src/peft/tuners/tuners_utils.py | BaseTuner / BaseTunerLayer(每个 tuner 都继承) |
| 6 | src/peft/tuners/lora/config.py | 最经典的 config |
| 7 | src/peft/tuners/lora/layer.py | LoRA 实现核心 |
| 8 | src/peft/tuners/lora/model.py | LoraModel(注入 adapter) |
| 9 | src/peft/tuners/lora/bnb.py | 量化兼容 layer 写法范本 |
| 10 | src/peft/utils/save_and_load.py | adapter 怎么落盘 |
| 11 | src/peft/tuners/ia3/ | 对比另一种 tuner 的实现差异 |
| 12 | src/peft/tuners/prompt_tuning/ | 对比 prompt 系怎么不替换权重 |
| 13 | src/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-04 | QLoRA 集成(bnb 4bit + LoRA) |
| 2023-07 | 多 adapter 一等公民(add_adapter / set_adapter) |
| 2023-09 | LoftQ 初始化 |
| 2023-12 | AdaLoRA 重构 + IA³ / LoHa / LoKr 集成 |
| 2024-02 | DoRA 加入 |
| 2024-03 | VeRA 加入 |
| 2024-04 | PiSSA / OLoRA 初始化 |
| 2024-06 | OFT / BOFT / HRA 集成 |
| 2024-09 | add_weighted_adapter 支持 TIES / DARE |
| 2024-12 | FourierFT / rsLoRA / Trainable Tokens |
| 2025-Q1 | TorchAO 量化兼容 / EVA 初始化 |
| 2025-Q2 | 40+ 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 PEFT | Adapter-Transformers | OpenDelta | |
|---|---|---|---|
| 维护方 | HuggingFace | UKP(已 archived,并入 HF) | 清华 OpenBMB |
| 覆盖算法 | 40+ | 20+ | 10+ |
| 多 adapter 支持 | ★★★★★ | ★★★★ | ★★ |
| 量化集成 | 5+ 后端 | 无 | 无 |
| 社区活跃度 | 极高 | 低 | 中 |
结论:现在事实上的 PEFT 标准就是 HF PEFT。
13.8社区入口
- GitHub:
https://github.com/huggingface/peft(21k+ ⭐) - 官方文档:
https://huggingface.co/docs/peft - 论坛: HuggingFace Discuss / GitHub Issues
- 每周 PEFT digest: HF 博客
- 新方法征集: 关注
method_comparison/目录
13.9提 issue / PR 礼仪
- 提 bug:附 最小复现代码 + transformers/peft/torch 版本;
- 提 feature:先在 issue 里讨论范围;新方法要带论文链接;
- PR:跑
make quality(ruff + mypy);写测试到tests/; - 新 tuner 的 PR 通常需要 review 2-4 周;
- 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 份:
lora_finetuning/— 最简 SFT;loftq_finetuning/— QLoRA + 不掉精度初始化;dora_finetuning/— DoRA 一键替换 LoRA;multi_adapter_examples/— 多 adapter add / set / weighted 全套;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给读者的下一步
- 从
examples/lora_finetuning/跑通一个最小例子; - 读
tuners/lora/layer.py(不到 1000 行)把 LoRA 实现彻底搞懂; - 读
tuners/lora/bnb.py理解量化兼容怎么做; - 读
peft_model.py::PeftModelForCausalLM.forward(看 prompt 系怎么注入); - 挑一个你感兴趣的新方法(DoRA / PiSSA / VeRA)读它的 layer.py;
- 按第 12 章实现一个属于自己的 PoC tuner。
13.11结语
PEFT 是当前 LLM 微调生态的中枢——你看 LLaMA-Factory、Axolotl、TRL、ms-swift、vLLM、Diffusers, 底层都在调它。理解 PEFT 的三层抽象、能读懂 LoRA 的 layer.py,就掌握了 90% 的 PEFT 实战需求。
剩下的 10% 是新方法、量化集成、多 adapter 服务化——本书已经把每条线的入口都给你指了。 剩下的功夫在源码里。