数据截至 (上游 commit 1fe27b1b53f3)
05 · 加载与导出:4bit 进来,GGUF/FP8 出去
这章走完权重的完整旅程:从
from_pretrained的加载路由,到训练态的省显存开关(梯度检 查点启发式),再到训完怎么导出成能部署的格式。
1. 加载:FastLanguageModel 是个路由器
FastLanguageModel.from_pretrained(unsloth/models/loader.py:425-426)的参数面几乎照抄
HF,但它做的第一件事是分派:
- 4bit QLoRA(默认) 走本仓库的老管线:
FastLlamaModel.from_pretrained(unsloth/models/llama.py:2349)——先pre_patch()换类(见 01 章),再用 bitsandbytes 4bit 把权重装上卡; - 8bit / 全参数微调 / QAT 委托给新的
FastModel(unsloth/models/loader.py:512-549, 该类在loader.py:1212)——另一条基于unsloth_zoo编译器补丁的管线; - 用户自带
BitsAndBytesConfig时会被读取并覆盖load_in_4bit/8bit标志 (loader.py:462-476),尊重外部配置而不是顶掉它。
两个模型名层面的小机关:
- 4bit 名 ↔ 16bit 名互查表:
unsloth/models/mapper.py的__INT_TO_FLOAT_MAPPER记录每个-bnb-4bit仓库对应的 16bit 原版;没装 bitsandbytes(SUPPORTS_FOURBIT为假)或用户要 16bit 时,加载器默默换成非量化仓库 (unsloth/models/loader_utils.py:463-474);导出合并时反查回来。 - 分布式安全:多卡 torchrun 下量化模型每 rank 各自加载到自己设备,避免 Accelerate
搬移量化权重出错(
loader.py:500-509)。