Skip to content

Commit e766c7c

Browse files
feat(windows): Native AMD ROCm GPU Acceleration (Resolves #531) (#538)
* feat(windows): add native ROCm support for AMD GPUs Implements native ROCm architecture for Windows. - Adds backend build pipeline for voicebox-server-rocm.exe - Detects AMD GPUs dynamically and routes PyTorch allocations - Adds automatic download and update logic for ROCm dependencies - Refactors UI in GpuPage.tsx and GpuAcceleration.tsx to add AMD flows - Fixes 'Switch to CPU' lock on Windows via Tauri backend_override state - Resolves PyInstaller/rocm_sdk UnboundLocalError silent crashes - Resolves Numba/NumPy 2.x incompatibilities during Qwen3-TTS load - Resolves HF_HUB_OFFLINE Catch-22 for CustomVoice processor caching * fix(rocm): host libs archive under the app release tag, drop offline-load regression Align the ROCm libs download with the CUDA pattern: both the server core and the libs archive are published under the app-version release tag, with the libs content version encoded in the filename only. The previous code fetched libs from a separate rocm7.2-v1 tag, which disagreed with the download test. Also revert the unrelated Qwen CustomVoice changes that wrapped model loading in force_offline_if_cached (not imported — a NameError on load for every platform) and re-added a Base-model cache gate. The inference-path offline guard was deliberately removed previously. * feat(rocm): gate download on AMD detection and persist the backend variant The ROCm download section now only shows when the backend reports an AMD GPU on Windows (new supports_rocm health field, backed by the memoized is_amd_gpu_windows detection that was previously unused), or when ROCm is already downloaded/active. Make the backend override honor a pinned variant: set_backend_override persists the choice to disk so it survives an app restart, start_server reads it back, and a cuda/rocm pin now actually selects that variant instead of always preferring ROCm. A stale pin to a deleted backend self-heals to the default order rather than forcing CPU. Add the web no-op stub for the new method. * chore(rocm): drop incomplete vitest harness for the unused GpuAcceleration component GpuAcceleration.tsx is not routed anywhere (GpuPage is the live settings view), and the added vitest setup referenced testing-library/vitest deps that were not in the lockfile, breaking the web typecheck. Remove the dead component's test and its scaffolding to keep this PR scoped to the ROCm feature. * ci(rocm): add ROCm release-artifact pipeline Mirror the CUDA packaging path for ROCm so the runtime download has artifacts to fetch. scripts/package_rocm.py splits the PyInstaller --rocm onedir into voicebox-server-rocm.tar.gz (core) + rocm-libs-rocm7.2-v1.tar.gz (AMD runtime: HIP DLLs, rocBLAS Tensile data, MIOpen kernel DBs) + rocm-libs.json, matching the names services/rocm.py expects, both under the app-version release tag. The new build-rocm-windows job in release.yml builds on windows-latest/cp312 and lets build_binary.py --rocm pull the official AMD Radeon wheels. The file classifier can't be validated against a real AMD build on CI, so it has unit coverage (test_package_rocm.py) against a synthetic onedir layout. The prefixes/dir markers may need a tweak after the first real build on AMD hardware — the packager hard-fails loudly if it classifies zero ROCm files. --------- Co-authored-by: Jamie Pine <ijamespine@me.com>
1 parent c2282b2 commit e766c7c

32 files changed

Lines changed: 2952 additions & 294 deletions

.github/workflows/release.yml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,3 +340,64 @@ jobs:
340340
name: voicebox-server-cuda-windows
341341
path: backend/dist/voicebox-server-cuda/
342342
retention-days: 7
343+
344+
build-rocm-windows:
345+
runs-on: windows-latest
346+
permissions:
347+
contents: write
348+
349+
steps:
350+
- uses: actions/checkout@v4
351+
352+
- name: Setup Python
353+
uses: actions/setup-python@v5
354+
with:
355+
# ROCm wheels are cp312-cp312-specific — build_binary.py --rocm enforces this.
356+
python-version: "3.12"
357+
cache: "pip"
358+
359+
- name: Install Python dependencies
360+
run: |
361+
python -m pip install --upgrade pip
362+
pip install pyinstaller
363+
pip install -r backend/requirements.txt
364+
pip install --no-deps chatterbox-tts
365+
pip install --no-deps hume-tada
366+
367+
- name: Build ROCm server binary (onedir)
368+
shell: bash
369+
working-directory: backend
370+
# build_binary.py --rocm pulls the official AMD Radeon torch + rocm_sdk
371+
# wheels (rocm-rel-7.2.1) itself when ROCm torch is not already present,
372+
# then restores the dev torch afterwards.
373+
run: python build_binary.py --rocm
374+
375+
- name: Package into server core + ROCm libs archives
376+
shell: bash
377+
run: |
378+
python scripts/package_rocm.py \
379+
backend/dist/voicebox-server-rocm/ \
380+
--output release-assets/ \
381+
--rocm-libs-version rocm7.2-v1 \
382+
--torch-compat ">=2.9.0,<2.10.0"
383+
384+
- name: Upload archives to GitHub Release
385+
if: startsWith(github.ref, 'refs/tags/')
386+
uses: softprops/action-gh-release@v2
387+
with:
388+
files: |
389+
release-assets/voicebox-server-rocm.tar.gz
390+
release-assets/voicebox-server-rocm.tar.gz.sha256
391+
release-assets/rocm-libs-rocm7.2-v1.tar.gz
392+
release-assets/rocm-libs-rocm7.2-v1.tar.gz.sha256
393+
release-assets/rocm-libs.json
394+
draft: true
395+
env:
396+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
397+
398+
- name: Upload onedir as workflow artifact
399+
uses: actions/upload-artifact@v4
400+
with:
401+
name: voicebox-server-rocm-windows
402+
path: backend/dist/voicebox-server-rocm/
403+
retention-days: 7

.gitignore

210 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)