Switch to ROCm 6.1 + torch 2.5.1 to fix MIOpen workspace=0 slowness
Some checks failed
Build ROCm Image / build (push) Failing after 11s
Some checks failed
Build ROCm Image / build (push) Failing after 11s
ROCm 7.2 + PyTorch 2.11.0 has a bug where PyTorch passes workspace=0 to MIOpen convolutions, forcing fallback to the slow GemmFwdRest solver. This caused s3gen.inference to take 15-22s instead of <5s, making synthesis 3-4x slower than real-time audio playback. ROCm 6.1 allocates workspace correctly so MIOpen picks fast GEMM solvers without needing torch.compile workarounds. Changes: - Base image: rocm/dev-ubuntu-22.04:7.2 → 6.1 - torch 2.11.0 → 2.5.1 (rocm6.1 wheel index) - Add pytorch_triton_rocm==3.1.0 - transformers 5.2.0 → 4.46.3, safetensors 0.5.3 → 0.4.0 - s3tokenizer unpinned → 0.3.0 - resemble-perth==1.0.1 directly (v1.0.1 is pip-installable; drop stub) - Drop Dockerfile perth_stub steps - Drop torch.compile and timing patches from engine.py (not needed) - Drop multi-pass warmup from main.py (torch JIT warmup not needed) - Drop ROCm 7.2-specific env vars from docker-compose.yml Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
35
main.py
35
main.py
@@ -18,33 +18,16 @@ logging.basicConfig(
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
_WARMUP_TEXTS = [
|
||||
# Short: covers brief HA notifications (lights on/off, etc.)
|
||||
"Okay.",
|
||||
# Medium: covers typical HA announcements
|
||||
"The front door is open. Please close it.",
|
||||
# Long: covers longer TTS requests and pre-compiles dynamic shape graph
|
||||
(
|
||||
"This is a warmup synthesis to pre-compile neural network kernels "
|
||||
"for longer text lengths used in Home Assistant announcements and notifications."
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def _warmup(voices: dict) -> None:
|
||||
"""Run one synthesis to populate MIOpen's in-memory kernel cache."""
|
||||
from wyoming_voices import resolve_voice
|
||||
audio_prompt = resolve_voice(None, voices) if voices else None
|
||||
logger.info(
|
||||
f"Running {len(_WARMUP_TEXTS)}-pass warmup to pre-compile torch kernels "
|
||||
"for short, medium, and long text lengths..."
|
||||
)
|
||||
for i, text in enumerate(_WARMUP_TEXTS, 1):
|
||||
try:
|
||||
engine.synthesize(text=text, audio_prompt_path=audio_prompt)
|
||||
logger.info(f"Warmup pass {i}/{len(_WARMUP_TEXTS)} complete")
|
||||
except Exception:
|
||||
logger.warning(f"Warmup pass {i} failed (non-fatal)", exc_info=True)
|
||||
logger.info("Warmup complete")
|
||||
logger.info("Running warmup synthesis...")
|
||||
try:
|
||||
engine.synthesize(text="Warmup.", audio_prompt_path=audio_prompt)
|
||||
logger.info("Warmup complete")
|
||||
except Exception:
|
||||
logger.warning("Warmup synthesis failed (non-fatal)", exc_info=True)
|
||||
|
||||
|
||||
async def main() -> None:
|
||||
@@ -58,10 +41,6 @@ async def main() -> None:
|
||||
voices = load_voices()
|
||||
wyoming_info = create_wyoming_info(engine.get_sample_rate(), voices)
|
||||
|
||||
# Run a warmup synthesis before accepting connections so MIOpen benchmarks
|
||||
# and caches the best convolution algorithms for all layer shapes. Without
|
||||
# this, the first real HA request triggers benchmarking (hundreds of runs)
|
||||
# and times out before any audio is returned.
|
||||
_warmup(voices)
|
||||
|
||||
host = get_wyoming_host()
|
||||
|
||||
Reference in New Issue
Block a user