aboutsummaryrefslogtreecommitdiff
path: root/app/tests/test_backends_sglomni.py
diff options
context:
space:
mode:
authorhistoria <historiavg@proton.me>2026-09-03 01:36:45 -0400
committerhistoria <historiavg@proton.me>2026-09-03 01:36:45 -0400
commit976f12a72ebbd330e0328991afed3524c06a35ad (patch)
treeaf01b6349bda892a96957fb4418736bdcfd2ab6b /app/tests/test_backends_sglomni.py
parent7ec70e19b78cbe7438ec4d61e15951f6e8dd0fb8 (diff)
downloadtts-audiobook-generator-976f12a72ebbd330e0328991afed3524c06a35ad.tar.gz
fix: increase gpu memory for MOSS with gplang-omni to .87
Diffstat (limited to 'app/tests/test_backends_sglomni.py')
-rw-r--r--app/tests/test_backends_sglomni.py40
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):