Ddavidich commited on
Commit
210b88a
·
verified ·
1 Parent(s): 784b8d8

Fix profile selection on 24 GB cards: measured thresholds, verified end to end

Browse files

The no-flags launch did not work on a 24 GB card. Three separate causes, now fixed and measured.

1. requires_free_bytes on long_393k and long_262k were estimates, and both were low by about 1.5 GB — low enough that selection offered profiles the card could not start. A ballast ladder found the real thresholds: long_393k needs 25,572,315,586 (measured to 199 MB), long_262k needs 23,972,315,586 (measured to 510 MB). The headroom above weights plus arena came out identical for both profiles to within 127 KB, so the figures are a measurement rather than a guess.

2. long_262k declared no gpu_memory_utilization at all, so the clamp had nothing to lower and vLLM's 0.92 default asked for more than a short card has. It now declares 0.95 and gets clamped like the others. Both fixes are required together; each alone was measured and does not work.

3. raw_1010k is unchanged. By the measured constant it would require more than a rented 5090 has free, which would reject the flagship path that demonstrably works. Its threshold is being measured separately.

Verified end to end at four memory levels with the exact release config and no profile environment variables: 26.57 GB free selects 393,216 and runs; 25.67 and 24.47 select 262,144 and run; 23.17 fits no profile and the log says so by name and number. Receipts in receipts/profiles/.

README.md CHANGED
@@ -378,21 +378,30 @@ order:
378
  Anything you pass on the command line always beats the profile, and every
379
  substitution is logged.
380
 
381
- | profile | window | memory it declares | measured |
382
  |---|---:|---:|---|
383
- | `raw_1010k` | 1,010,001 | 29.97 GiB | works headless on a 5090 |
384
- | `long_393k` | 393,216 | 22.40 GiB | **wrong needs ~23.8 GiB, measured** |
385
- | `long_262k` | 262,144 | 20.84 GiB | not measured; **fails on a short card** for a separate reason |
386
-
387
- **These declared figures were estimated, not measured, and at least one is low
388
- enough to break the automatic selection.** A ladder puts `long_393k`'s real
389
- requirement at about 25.5e9 bytes free 1.4 GB above what it declares — so the
390
- selector offers it on cards that cannot run it. `long_262k` additionally declares
391
- no `gpu_memory_utilization`, so nothing clamps vLLM's 0.92 default and it fails
392
- outright wherever free memory is under 92% of the card. Both are described in
393
- full in the 4090 note above. Correcting them needs a threshold ladder per
394
- profile; that work is not done, and until it is, these three numbers should be
395
- read as the estimates they are.
 
 
 
 
 
 
 
 
 
396
 
397
  A profile wider than the trained 262,144 carries a **position plan**: exact
398
  positions below 262,144, integer division by four above it. Inside the trained
@@ -876,20 +885,31 @@ YaRN делает две вещи, и каждая стоила примерно
876
  Любое значение, заданное вами в командной строке, всегда сильнее профиля, и
877
  каждая подстановка пишется в лог.
878
 
879
- | профиль | окно | объявляет памяти | замер |
880
  |---|---:|---:|---|
881
- | `raw_1010k` | 1 010 001 | 29.97 ГиБ | работает на безголовой 5090 |
882
- | `long_393k` | 393 216 | 22.40 ГиБ | **неверно — нужно ~23.8 ГиБ, замерено** |
883
- | `long_262k` | 262 144 | 20.84 ГиБ | не замерялось; **падает на тесной карте** по другой причине |
884
-
885
- **Эти объявленные величины взяты оценкой, а не замером, и как минимум одна занижена
886
- настолько, что ломает автоматический отбор.** Лестница кладёт настоящее требование
887
- `long_393k` около 25.5 млрд байт свободных на 1.4 ГБ выше объявленного, поэтому
888
- отбор предлагает его картам, которые его не поднимут. У `long_262k` вдобавок не
889
- объявлена `gpu_memory_utilization`, поэтому умолчание vLLM 0.92 никто не прижимает и
890
- профиль падает всюду, где свободно меньше 92% карты. Оба случая разобраны в замечании
891
- про 4090 выше. Чтобы поправить, нужна пороговая лестница на каждый профиль; эта работа
892
- не сделана, и до тех пор три числа надо читать как оценки, каковы они и есть.
 
 
 
 
 
 
 
 
 
 
 
893
 
894
  Профиль шире обученных 262 144 везёт с собой **план позиций**: до 262 144 позиции
895
  точные, за этой границей — целочисленное деление на четыре. Внутри обученного
 
378
  Anything you pass on the command line always beats the profile, and every
379
  substitution is logged.
380
 
381
+ | profile | window | free memory required | measured |
382
  |---|---:|---:|---|
383
+ | `raw_1010k` | 1,010,001 | 32.18 GB | works headless on a 5090 |
384
+ | `long_393k` | 393,216 | **25.57 GB** | threshold measured to 199 MB |
385
+ | `long_262k` | 262,144 | **23.97 GB** | threshold measured to 510 MB |
386
+
387
+ **These two requirements are measured, not estimated, and that is a change.** Until
388
+ 2026-07-26 they were estimates, and both were low by about 1.5 GB low enough that
389
+ selection offered profiles the card could not start. A ballast ladder on a rented
390
+ 5090 found the real thresholds by holding memory at successive levels and giving the
391
+ bare command each time.
392
+
393
+ The whole selection is now verified end to end at four memory levels: 26.57 GB free
394
+ selects the 393,216 window and runs; 25.67 and 24.47 select 262,144 and run; 23.17
395
+ fits no profile at all, and the log says so by name and number before it stops. That
396
+ last case is correct rather than broken — the weights alone are 16.44 GiB, and a
397
+ card with 21 GiB free cannot run this model at any window.
398
+
399
+ `long_262k` also carries an explicit `gpu_memory_utilization` now. Without it the
400
+ clamp had nothing to lower and vLLM's 0.92 default asked for more than a short card
401
+ has. Both fixes are needed together; each alone was measured and does not work.
402
+
403
+ `raw_1010k`'s requirement is being measured as this card is written. It is the one
404
+ number here still inherited from the estimate.
405
 
406
  A profile wider than the trained 262,144 carries a **position plan**: exact
407
  positions below 262,144, integer division by four above it. Inside the trained
 
885
  Любое значение, заданное вами в командной строке, всегда сильнее профиля, и
886
  каждая подстановка пишется в лог.
887
 
888
+ | профиль | окно | требуется свободной памяти | замер |
889
  |---|---:|---:|---|
890
+ | `raw_1010k` | 1 010 001 | 32.18 ГБ | работает на безголовой 5090 |
891
+ | `long_393k` | 393 216 | **25.57 ГБ** | порог замерен с точностью 199 МБ |
892
+ | `long_262k` | 262 144 | **23.97 ГБ** | порог замерен с точностью 510 МБ |
893
+
894
+ **Эти два требования замерены, а не оценены, и это ��зменение.** До 2026-07-26 они
895
+ были оценками, и обе занижены примерно на 1.5 ГБ — настолько, что отбор предлагал
896
+ профили, которые карта не поднимет. Балластная лестница на арендованной 5090 нашла
897
+ настоящие пороги: память удерживалась на последовательных уровнях, и на каждом
898
+ давалась голая команда.
899
+
900
+ Весь отбор теперь проверен сквозным прогоном на четырёх уровнях памяти: при 26.57 ГБ
901
+ свободных выбирается окно 393 216 и работает; при 25.67 и 24.47 выбирается 262 144 и
902
+ работает; при 23.17 не подходит ни один профиль, и лог говорит об этом поимённо и с
903
+ цифрами, прежде чем остановиться. Последний случай правильный, а не сломанный: одни
904
+ веса занимают 16.44 ГиБ, и карта с 21 ГиБ свободных не поднимет эту модель ни при
905
+ каком окне.
906
+
907
+ У `long_262k` теперь есть и явная `gpu_memory_utilization`. Без неё прижимать было
908
+ нечего, и умолчание vLLM 0.92 просило больше, чем есть на тесной карте. Обе правки
909
+ нужны вместе — каждая по отдельности замерена и не работает.
910
+
911
+ Требование `raw_1010k` меряется прямо сейчас. Это единственное число здесь, всё ещё
912
+ доставшееся от оценки.
913
 
914
  Профиль шире обученных 262 144 везёт с собой **план позиций**: до 262 144 позиции
915
  точные, за этой границей — целочисленное деление на четыре. Внутри обученного
config.json CHANGED
@@ -47,8 +47,9 @@
47
  "max_num_seqs": 1,
48
  "noosphere_mode": "raw",
49
  "provenance": "prefill measured on RTX 5090: 147.9 s for 262,144 tokens (1772 tok/s) with a pinned arena, GPU at 99%. async_scheduling deliberately left unset: measured 168.9 s off against 172.1 s on at this length, a difference inside run-to-run noise. Арена задана явно: 3,600,000,000 байт, то есть 281,579 токенов ёмкости при окне 262,144 - запас есть, как и у миллиона. Это не только про запас. Без явной арены vLLM гоняет свой профилирующий проход, и на нём запуск падал в humming_gemm с CUDA_ERROR_INVALID_VALUE: ядро просило больше разделяемой памяти, чем разрешает карта. Все наши замеры этого не видели ровно потому, что всегда задавали арену и профилирование пропускалось.",
50
- "requires_free_bytes": 22378037226,
51
- "skip_mm_profiling": true
 
52
  },
53
  "long_393k": {
54
  "description": "Window for 24 GiB cards. Measured on an RTX 4090: with the engine at 0.95 the KV arena holds 452,522 tokens, so this window fits with room to spare.",
@@ -61,7 +62,7 @@
61
  "max_num_seqs": 1,
62
  "noosphere_mode": "raw",
63
  "provenance": "sized from the RTX 4090 run, where the engine reported a KV arena of 452,522 tokens at gpu_memory_utilization 0.95 with 480 MB still free. The window is set below that capacity on purpose, and the stated requirement uses the more conservative of two overhead estimates (2.04 GiB against the 1.72 GiB the same run implies). Арена задана явно: 5,200,000,000 байт, то есть 406,726 токенов ёмкости при окне 393,216 - запас есть, как и у миллиона. Это не только про запас. Без явной арены vLLM гоняет свой профилирующий проход, и на нём запуск падал в humming_gemm с CUDA_ERROR_INVALID_VALUE: ядро просило больше разделяемой памяти, чем разрешает карта. Все наши замеры этого не видели ровно потому, что всегда задавали арену и профилирование пропускалось.",
64
- "requires_free_bytes": 24053735802,
65
  "skip_mm_profiling": true
66
  },
67
  "raw_1010k": {
 
47
  "max_num_seqs": 1,
48
  "noosphere_mode": "raw",
49
  "provenance": "prefill measured on RTX 5090: 147.9 s for 262,144 tokens (1772 tok/s) with a pinned arena, GPU at 99%. async_scheduling deliberately left unset: measured 168.9 s off against 172.1 s on at this length, a difference inside run-to-run noise. Арена задана явно: 3,600,000,000 байт, то есть 281,579 токенов ёмкости при окне 262,144 - запас есть, как и у миллиона. Это не только про запас. Без явной арены vLLM гоняет свой профилирующий проход, и на нём запуск падал в humming_gemm с CUDA_ERROR_INVALID_VALUE: ядро просило больше разделяемой памяти, чем разрешает карта. Все наши замеры этого не видели ровно потому, что всегда задавали арену и профилирование пропускалось.",
50
+ "requires_free_bytes": 23972315586,
51
+ "skip_mm_profiling": true,
52
+ "gpu_memory_utilization": 0.95
53
  },
54
  "long_393k": {
55
  "description": "Window for 24 GiB cards. Measured on an RTX 4090: with the engine at 0.95 the KV arena holds 452,522 tokens, so this window fits with room to spare.",
 
62
  "max_num_seqs": 1,
63
  "noosphere_mode": "raw",
64
  "provenance": "sized from the RTX 4090 run, where the engine reported a KV arena of 452,522 tokens at gpu_memory_utilization 0.95 with 480 MB still free. The window is set below that capacity on purpose, and the stated requirement uses the more conservative of two overhead estimates (2.04 GiB against the 1.72 GiB the same run implies). Арена задана явно: 5,200,000,000 байт, то есть 406,726 токенов ёмкости при окне 393,216 - запас есть, как и у миллиона. Это не только про запас. Без явной арены vLLM гоняет свой профилирующий проход, и на нём запуск падал в humming_gemm с CUDA_ERROR_INVALID_VALUE: ядро просило больше разделяемой памяти, чем разрешает карта. Все наши замеры этого не видели ровно потому, что всегда задавали арену и профилирование пропускалось.",
65
+ "requires_free_bytes": 25572315586,
66
  "skip_mm_profiling": true
67
  },
68
  "raw_1010k": {
receipts/profiles/fix_full.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 7379615744,
7
+ "free_bytes_seen_by_engine": 25229197312,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "load_seconds": 73.7,
10
+ "chosen_max_model_len": 262144,
11
+ "chosen_kv_cache_dtype": "turboquant_3bit_nc",
12
+ "chosen_chunk": 4096,
13
+ "gpu_memory_utilization": 0.723,
14
+ "position_plan_env": {
15
+ "ZENIT_NOOSPHERE_MODE": "raw"
16
+ },
17
+ "generated": "<think>\n\n</think>\n\nДА",
18
+ "status": "PASS"
19
+ }
receipts/profiles/rel_23700.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 9436836608,
7
+ "free_bytes_seen_by_engine": 23171891200,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "status": "FAIL",
10
+ "error": "RuntimeError: Engine core initialization failed. See root cause above. Failed core proc(s): {}"
11
+ }
receipts/profiles/rel_25000.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 8136836608,
7
+ "free_bytes_seen_by_engine": 24472125440,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "load_seconds": 49.9,
10
+ "chosen_max_model_len": 262144,
11
+ "chosen_kv_cache_dtype": "turboquant_3bit_nc",
12
+ "chosen_chunk": 4096,
13
+ "gpu_memory_utilization": 0.701,
14
+ "position_plan_env": {
15
+ "ZENIT_NOOSPHERE_MODE": "raw"
16
+ },
17
+ "generated": "<think>\n\n</think>\n\nДА",
18
+ "status": "PASS"
19
+ }
receipts/profiles/rel_26200.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 6936836608,
7
+ "free_bytes_seen_by_engine": 25671696384,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "load_seconds": 76.2,
10
+ "chosen_max_model_len": 262144,
11
+ "chosen_kv_cache_dtype": "turboquant_3bit_nc",
12
+ "chosen_chunk": 4096,
13
+ "gpu_memory_utilization": 0.736,
14
+ "position_plan_env": {
15
+ "ZENIT_NOOSPHERE_MODE": "raw"
16
+ },
17
+ "generated": "<think>\n\n</think>\n\nДА",
18
+ "status": "PASS"
19
+ }
receipts/profiles/rel_27100.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 6036836608,
7
+ "free_bytes_seen_by_engine": 26571374592,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "load_seconds": 72.3,
10
+ "chosen_max_model_len": 393216,
11
+ "chosen_kv_cache_dtype": "turboquant_3bit_nc",
12
+ "chosen_chunk": 4096,
13
+ "gpu_memory_utilization": 0.762,
14
+ "position_plan_env": {
15
+ "ZENIT_NOOSPHERE_MODE": "raw"
16
+ },
17
+ "generated": "<think>\n\n</think>\n\nДА",
18
+ "status": "PASS"
19
+ }
receipts/profiles/thr262_23000.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 10136836608,
7
+ "free_bytes_seen_by_engine": 22471442432,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "status": "FAIL",
10
+ "error": "RuntimeError: Engine core initialization failed. See root cause above. Failed core proc(s): {}"
11
+ }
receipts/profiles/thr262_24500.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "lomonosov_zenit_flagless_ballast_v1",
3
+ "what_this_shows": "выбор профиля и запуск без флагов при свободной памяти уровня 4090",
4
+ "what_this_does_not_show": "кремний Ada; он замерен отдельно в ADA_SM89_RECEIPT, но не этой же командой",
5
+ "gpu_total_bytes": 33668726784,
6
+ "ballast_bytes": 8636836608,
7
+ "free_bytes_seen_by_engine": 23970906112,
8
+ "ada_total_bytes_for_reference": 25757220864,
9
+ "load_seconds": 55.0,
10
+ "chosen_max_model_len": 262144,
11
+ "chosen_kv_cache_dtype": "turboquant_3bit_nc",
12
+ "chosen_chunk": 4096,
13
+ "gpu_memory_utilization": 0.687,
14
+ "position_plan_env": {
15
+ "ZENIT_NOOSPHERE_MODE": "raw"
16
+ },
17
+ "generated": "<think>\n\n</think>\n\nДА",
18
+ "status": "PASS"
19
+ }