42a5417c13
Upstream courtesy fix, found while auditing the conversion recipe for this branch -- pre-existing in dev, not introduced by int3-g64, but directly relevant to anyone converting for real (a #383-class gap: same failure family as the resume/manifest work already done for --indir, and the silent-mixing mechanism issue #355 fixed for a narrower case). The --indir path already refuses to resume with different conversion parameters on the same --outdir (a manifest records ebits/xbits/io_bits/ group_size/n_layers/bits_map and compares on every resume). The --repo streaming download loops (main model, --mtp, --indexer) never got the same guard: each shard's resume check is just `if os.path.exists(outp): continue` -- true whether or not THIS run's flags match the flags that produced that shard. A --repo conversion resumed with changed bits (--xbits 3 -> 4 mid-run, say, after an interruption) would silently mix bit-widths across shards in the same container, with no error and no log line distinguishing it from a normal resume. Fix: check_or_record_params(), a small shared helper mirroring the --indir manifest's refuse-on-mismatch logic but without needing its per-shard bookkeeping (the --repo loops already track shard completion correctly via out-NNNNN.safetensors existence, since shard index maps directly to output filename there -- only whether the params used SO FAR still match needed adding). Applied to all three --repo loops with per-mode sidecar files (.out-mtp-params.json / .out-idx-params.json / .out-params.json) so a --mtp and a main-model conversion into the same --outdir don't cross-check each other's parameters. Also includes PROJ_BITS (the per-projection expert bit overrides) in the tracked params dict on BOTH paths -- it was missing from --indir's existing manifest too, so a resume with a changed --up-bits/--gate-bits/ --down-bits would have passed the existing guard silently. Verified directly (no real HF downloads; --repo network paths can't be exercised under this task's constraints): unit-tested check_or_record_params() standalone -- fresh outdir accepts and records, a same-params resume accepts, a changed --xbits is refused, and a proj_bits-only change (nothing else different) is refused. Re-ran the existing --indir dry-run end to end (convert, resume, resume-with-changed- xbits) to confirm the manifest-based path still works correctly with proj_bits added to its params dict. Gates: make test-c (20/20) and make test-python (85/85) both pass.
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