Rust in Everything
基于 candle 0.11.0

权重

这一部分是推理主线的第一步:读 config 和权重。transformers 的 from_pretrained(目录) 一个调用做完很多事:读 config.json,挑文件(单个 safetensors、分片索引、老的 .bin),定 dtype,绑定输出层和词嵌入,缺了权重就随机初始化再打一份报告。candle 把这些拆开交给你:config.json 自己用 serde_json 读,文件列表自己给,dtype 必须写明,名字对不上自己改,缺了就是一个 Err 或 panic。VarBuilder 怎么拼名字、怎么复制数据,源码卷的 VarBuilder 和 safetensors 与 mmap 讲过,这里只讲从 PyTorch 过来要改的写法。

  1. safetensors:from_pretrained 对 from_mmaped_safetensors;transformers 5.22.0 默认按 bf16 加载、candle 要写明 dtype;bf16 时 transformers 直接用映射的文件页、candle 复制一份;载成 F16 和 torch 逐位相同;分片要自己读 model.safetensors.index.json。
  2. PyTorch 的 .bin / .pt:torch.save(state_dict) 的默认 ZIP 格式能读,旧格式、整个模型、TorchScript 读不出来,后两种不报错只是 0 个张量;嵌套的检查点要给键;bool 和 int32 被跳过;candle 解析 pickle 时不执行任何代码。
  3. 键名对不上: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

💬 关联讨论

发起讨论
加载中...