Skip to main content

Linear 怎么决定自己的精度

每个 Linear 在构造时都要挑一个物理 spec。挑的顺序在 LinearBase.__init__phyai/src/phyai/layers/linear/layers.py)里写死,四选一,从高到低:
大多数情况你只会碰到第 3 条:加载 checkpoint 时 plan 自动建好,你什么都不用传。

从 checkpoint 自动加载

load_quant_plan(checkpoint_dir)layers/quant/active.py)读两个地方:
  • config.json 里的 quantization_config,没有就退而找 compression_config
  • 独立的 hf_quant_config.json(ModelOpt 用这个)
两个都没有就返回 None,模型保持 bf16。读到了就交给 importer 认框架、建计划。目前认三种:
config.jsonquant_methodfp8
weight_block_size 在就走 block 粒度,不在就 per-channel。activation_scheme 不是 "static" 就按动态激活量化。ignored_layers(或 modules_to_not_convert)列出的层跳过,保持 bf16。
三个 importer 按固定顺序试(fp8 → compressed-tensors → modelopt)。加载成功后会打一行日志,告诉你 config 从哪个文件读来的。

手写一个 QuantPlan

自动加载不够用时,可以自己拼一张规则表。QuantPlan 就是一串有序的 Rule,加一个兜底的 default。每条 Rule 是一个 Matcher 配一个 QuantSchemeschemeNone 表示跳过(保持 bf16)。
Matcher 有四种匹配方式: resolve 自上而下走,第一条命中的 Rule 说了算,都不中就用 default

给单个 Linear 指定 scheme

只想改一层、不想建整张表,直接把 scheme 传给这个 Linear 就行。它会跳过 plan,直接 materialize

scale 是怎么加载的

物理 spec 分配的 scale 参数(weight_scaleinput_scaleweight_global_scale)由 LinearBase._attach_optional_scales 挂上 hf_keys 和 loader,并标成可选。于是预量化 checkpoint 里的这些 scale 会自动对上加载;普通 bf16 checkpoint 里没有它们,也不会因为 key 缺失而报错。