权重
这一部分是推理主线的第一步:读 config 和权重。transformers 的 from_pretrained(目录) 一个调用做完很多事:读 config.json,挑文件(单个 safetensors、分片索引、老的 .bin),定 dtype,绑定输出层和词嵌入,缺了权重就随机初始化再打一份报告。candle 把这些拆开交给你:config.json 自己用 serde_json 读,文件列表自己给,dtype 必须写明,名字对不上自己改,缺了就是一个 Err 或 panic。VarBuilder 怎么拼名字、怎么复制数据,源码卷的 VarBuilder 和 safetensors 与 mmap 讲过,这里只讲从 PyTorch 过来要改的写法。
- safetensors:
from_pretrained对from_mmaped_safetensors;transformers 5.22.0 默认按 bf16 加载、candle 要写明 dtype;bf16 时 transformers 直接用映射的文件页、candle 复制一份;载成 F16 和 torch 逐位相同;分片要自己读model.safetensors.index.json。 - PyTorch 的 .bin / .pt:
torch.save(state_dict)的默认 ZIP 格式能读,旧格式、整个模型、TorchScript 读不出来,后两种不报错只是 0 个张量;嵌套的检查点要给键;bool 和 int32 被跳过;candle 解析 pickle 时不执行任何代码。 - 键名对不上:
rename_f处理torch.compile的_orig_mod.前缀和save_model删掉的词嵌入;tie_word_embeddings在 candle 里共享同一份张量;缺键、多余的键、形状不对时 PyTorch 一次列全,candle 只报第一个。
flowchart TB
dir["模型目录"] --> cfg["config.json"]
dir --> kind{"权重文件"}
kind -->|"model.safetensors"| mm["from_mmaped_safetensors"]
kind -->|"index.json 分片"| list["读 weight_map"]
list --> mm
kind -->|".bin 或 .pt"| pth["from_pth"]
mm --> vb["VarBuilder"]
pth --> vb
vb -->|"名字不同"| rn["rename_f"]
rn --> load["Llama load"]
vb --> load
cfg --> load
💬 关联讨论
发起讨论加载中...