Pull requests / #632

#632 expert profile: refuse a header version other than 1, naming both numbers and the file

closed · @Avicennasis · 0 评论 · 在 GitHub 查看

AMD / HIPNVIDIA / CUDALinux

描述

One fail-closed change on the expert-profile reader, with a test that runs without a model or a GPU. Reader side only: `tools/make_profile.py` and the cache policy are untouched (#589 / #587 are on the writer).

## `expert_cache.cpp`: a profile whose header version is not 1 is refused, naming both numbers and the file

`read_expert_profile` (`src/core/expert_cache.cpp:33`) reads the header's `version` field and then discards it (`(void) version;` at `:68`, "a future format bumps it; the layout check above is what protects this reader today"). The layout check compares `n_layers x n_expert`, but those fields are only known to sit where they do in a version 1 file: a later format that moves or widens anything after the version would be read as version 1 and either pass the geometry check with the wrong numbers or fail it with a message about the wrong thing ("is 0x2 but this model is 48x512"). Two writers now produce these files - `tools/make_profile.py` and `--expert-profile-save` (#477) - so a version bump is a real possibility rather than a note.

The reader now refuses any version other than 1 right after the magic, before the geometry check, naming the version it found, the version it reads, and the file:

```
read_expert_profile: <path> is a version 2 profile but this engine reads version 1 - it was written by a different release's tools/make_profile.py or --expert-profile-save
```

Same error shape as the file's other refusals (`read_expert_profile: ...` prefix, the path in the message, `false` with `err` set). A version 1 file is read exactly as before. 12 lines in the reader, 8 in `CMakeLists.txt`.

Test: `tests/core/expert_profile_version_test.cpp` (registered beside `expert_profile_save_test`, same `EXISTS` guard, links `strata_engine`, CPU only). It writes a version 1 profile with `write_expert_profile` and reads it back, then rewrites the 4-byte version field in place:

- version 1: loads, the ranking and the slot count come back;
- version 2: refused; the message names the file, "version 2" and "version 1";
- version 0 (a zeroed header): refused by its number;
- version 2 with the wrong geometry: refused as version 2, not as the wrong geometry (the version is checked first);
- back to version 1: loads again, so the version field was the only thing refused.

11 checks. On `main` the version 2 file loads as if it were version 1 (`read_expert_profile` returns true, `err` empty) and 5 of the 11 fail; with the change all 11 pass.

## What I ran, and where

Linux x86_64 (Ubuntu 24.04, AMD Ryzen 7 5800X - no AVX-512, no NVIDIA GPU, no CUDA or HIP toolkit), gcc 13.3.0, CMake 3.28.3. This is a claim about my machine, not yours.

- `strata_engine` (and so `expert_profile_save_test` and this test's ctest target) is only configured with `STRATA_ENABLE_CUDA` or `STRATA_ENABLE_HIP`, and `expert_cache.cpp` includes `cuda_runtime.h`, so I could not run the new target through ctest here. Instead I compiled the same two files directly - `g++ -std=c++20 -Wall -Wextra src/core/expert_cache.cpp tests/core/expert_profile_version_test.cpp` against a declarations-only `cuda_runtime.h` stub (its functions abort if called; the profile tests call none) - with no warnings: `expert_profile_version_test: OK` (exit 0). The same harness on `main`'s `expert_cache.cpp` prints the 5 `FAIL:` lines above and exits 1. `expert_profile_save_test` through the same harness: `OK` on both. The CMake registration is a copy of the save test's block, so it should configure wherever that one does; please run it through ctest on a GPU build, I have not.
- `cmake -B build-cpu -DSTRATA_ENABLE_CUDA=OFF -DSTRATA_BUILD_TESTS=ON -G Ninja` configures cleanly on this tree (the #93 items are fixed), `cmake --build build-cpu`: 72 of 72 targets. `ctest`: 13 tests, 12 passed; `expert_multi_test` fails with the kernel's own refusal (`missing AVX512F ... AVX512-VBMI`), which is this CPU, not the branch - nothing under `src/kernels` is touched.
- `git diff --check` clean.

Branch is on `99f3dbd` (0.1.38); happy to rebase if it has moved by the time you look.

站内延伸阅读

链到安装、模型与版本说明,便于 SEO/GEO,非官方 issue 正文。