diff options
| author | historia <historiavg@proton.me> | 2026-09-03 01:36:45 -0400 |
|---|---|---|
| committer | historia <historiavg@proton.me> | 2026-09-03 01:36:45 -0400 |
| commit | 976f12a72ebbd330e0328991afed3524c06a35ad (patch) | |
| tree | af01b6349bda892a96957fb4418736bdcfd2ab6b /app/tests | |
| parent | 7ec70e19b78cbe7438ec4d61e15951f6e8dd0fb8 (diff) | |
| download | tts-audiobook-generator-976f12a72ebbd330e0328991afed3524c06a35ad.tar.gz | |
fix: increase gpu memory for MOSS with gplang-omni to .87
Diffstat (limited to 'app/tests')
| -rw-r--r-- | app/tests/test_backends_sglomni.py | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/app/tests/test_backends_sglomni.py b/app/tests/test_backends_sglomni.py index e61d51e..54659d6 100644 --- a/app/tests/test_backends_sglomni.py +++ b/app/tests/test_backends_sglomni.py @@ -447,30 +447,36 @@ class EngineMemoryBudgetTests(unittest.TestCase): VRAM when mem_fraction_static is unset (qwen3_tts, moss_tts, voxtral): on a 24 GB card the first /v1/audio/speech request aborts with "CUDA out of memory. Tried to allocate ~100 MiB" and every retry fails - identically. These vendored configs pin the pool at 0.70, leaving ~7 GB - for the colocated vocoder, CUDA graphs, and other GPU processes. + identically. These vendored configs pin the pool below auto-size, + leaving several GB for the colocated vocoder, CUDA graphs, and other + GPU processes — 0.70 for the small models. moss_tts pins 0.87 instead: + its ~17.1 GB of v1.5 bf16 weights alone exceed the 0.70 budget on the + ~20.7 GB the engine profiler sees on a 24 GB card (its colocated + tokenizer stage is already resident), so a 0.70 pin would abort the + boot with "Loaded weights leave no GPU memory for the KV cache" + instead of fixing the request-time OOM. """ - # (catalog key, engine stage name). Voxtral's engine stage is - # tts_generation; every other engine-bearing pipeline names it - # tts_engine. moss_tts_local is intentionally absent — its upstream - # config class already budgets its colocated stages explicitly - # (0.15 preprocessing / 0.67 AR / 0.18 vocoder), and pinning would - # fight that logic (the codec reserve derives from the fractions). + # (catalog key, engine stage name, pinned mem_fraction_static). + # Voxtral's engine stage is tts_generation; every other engine-bearing + # pipeline names it tts_engine. moss_tts_local is intentionally absent — + # its upstream config class already budgets its colocated stages + # explicitly (0.15 preprocessing / 0.67 AR / 0.18 vocoder), and pinning + # would fight that logic (the codec reserve derives from the fractions). # s2-pro's OOM is model size, not budgeting (upstream issue #359). PINNED = ( - ("qwen3_tts_0_6b_base", "tts_engine"), - ("qwen3_tts_0_6b_customvoice", "tts_engine"), - ("qwen3_tts_1_7b_base", "tts_engine"), - ("qwen3_tts_1_7b_voicedesign", "tts_engine"), - ("moss_tts", "tts_engine"), - ("voxtral_tts", "tts_generation"), + ("qwen3_tts_0_6b_base", "tts_engine", 0.70), + ("qwen3_tts_0_6b_customvoice", "tts_engine", 0.70), + ("qwen3_tts_1_7b_base", "tts_engine", 0.70), + ("qwen3_tts_1_7b_voicedesign", "tts_engine", 0.70), + ("moss_tts", "tts_engine", 0.87), + ("voxtral_tts", "tts_generation", 0.70), ) UNPINNED = ("moss_tts_local", "fish_s2_pro") def test_engine_budget_is_pinned_under_the_engine_stage(self): - for key, stage in self.PINNED: - with self.subTest(key=key, stage=stage): + for key, stage, fraction in self.PINNED: + with self.subTest(key=key, stage=stage, fraction=fraction): path = config_path(entry_by_key(key)) self.assertIsNotNone(path) self.assertTrue(path.is_file(), f"missing {path}") @@ -479,7 +485,7 @@ class EngineMemoryBudgetTests(unittest.TestCase): "stages:\n" f" {stage}:\n" " engine:\n" - " mem_fraction_static: 0.70\n", + f" mem_fraction_static: {fraction:.2f}\n", text) def test_already_budgeted_and_oversized_models_stay_unpinned(self): |
