932f3678b0
Routed experts (gate/up/down) can now take different bit widths via PROJ_BITS. Motivating config: --xbits 4 --up-bits 3 puts up_proj at int3-g64 (fmt=5, this PR's format) while gate/down stay int4 — ~8% fewer expert bytes on disk and per token, at ~zero quality cost. Backed by the OLMoE per-projection ablation posted to #168: up@int3 matches int4-g64 (56.2 vs 55.8), up@int2 craters (-16pp). This also supplies the definition the #404 resume manifests already depend on: current dev records dict(PROJ_BITS) in check_or_record_params and the --indir progress file in four places, but the global was never defined — every one of those paths NameErrors at runtime today. The manifests were written for this interface; this commit is the other half. Validated: synthetic GLM fixture with --up-bits 3 yields int3-g64 up_proj (O*(I/64)*24B weight + group scales) and int4-per-row gate/down. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tools
These scripts support model preparation and offline engineering work. They are not runtime dependencies of the C engine.
convert_fp8_to_int4.py,download_glm52.py: model preparationmake_glm_oracle.py,make_glm_bench_model.py: deterministic fixturesbenchmark_cuda_fixture.py,eval_glm.py,fetch_benchmarks.py: benchmarksgen_unicode.py: tokenizer table generation
Run them from c/, for example:
python3 tools/convert_fp8_to_int4.py --selftest
python3 tools/make_glm_bench_model.py --output /tmp/colibri-bench