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 认框架、建计划。目前认三种:
- HF fp8
- compressed-tensors
- NVIDIA ModelOpt
config.json 里 quant_method 是 fp8:weight_block_size 在就走 block 粒度,不在就 per-channel。activation_scheme 不是 "static" 就按动态激活量化。ignored_layers(或 modules_to_not_convert)列出的层跳过,保持 bf16。手写一个 QuantPlan
自动加载不够用时,可以自己拼一张规则表。QuantPlan 就是一串有序的 Rule,加一个兜底的 default。每条 Rule 是一个 Matcher 配一个 QuantScheme,scheme 传 None 表示跳过(保持 bf16)。
Matcher 有四种匹配方式:
resolve 自上而下走,第一条命中的 Rule 说了算,都不中就用 default。
给单个 Linear 指定 scheme
只想改一层、不想建整张表,直接把scheme 传给这个 Linear 就行。它会跳过 plan,直接 materialize:
scale 是怎么加载的
物理 spec 分配的 scale 参数(weight_scale、input_scale、weight_global_scale)由 LinearBase._attach_optional_scales 挂上 hf_keys 和 loader,并标成可选。于是预量化 checkpoint 里的这些 scale 会自动对上加载;普通 bf16 checkpoint 里没有它们,也不会因为 key 缺失而报错。
