Skip to content

Build libtorchaudio GPU extensions on ROCm via HIPIFY (torchvision-style)#17

Draft
ethanwee1 wants to merge 4 commits into
ROCm:release/2.11.0.1from
ethanwee1:ew/rocm-24803-hipify-gpu-ext
Draft

Build libtorchaudio GPU extensions on ROCm via HIPIFY (torchvision-style)#17
ethanwee1 wants to merge 4 commits into
ROCm:release/2.11.0.1from
ethanwee1:ew/rocm-24803-hipify-gpu-ext

Conversation

@ethanwee1

@ethanwee1 ethanwee1 commented Jul 1, 2026

Copy link
Copy Markdown

Port libtorchaudio's GPU extensions (rnnt loss, forced_align, CUDA CTC decoder) to build on ROCm/HIP, as torchaudio source updates in this fork — no manual hipify call in setup.py (per review). Relies on the built-in CUDAExtension hipify for the .cu source bodies.

Changes

  • cuda_compat.h — maps the CUDA runtime symbols used in headers (cudaStream_t, cudaError_t, cudaSuccess, cudaGetErrorString/Name, cudaGetLastError, cudaSetDevice, cudaMemcpy*, cudaMemset*, cudaStreamSynchronize) to HIP under USE_ROCM. (CUDAExtension hipify uses hipify_extra_files_only=True, so it does not rewrite project headers even with the right header_include_dirs.)
  • Widen the rnnt/forced_align GPU #ifdef USE_CUDA guards, macros.h, and Options::stream_ to also cover USE_ROCM.
  • Route cub through hipcub under USE_ROCM.

Paired with ROCm/pytorch#3382 (torchaudio pin + Windows B:/C: cross-drive HIPIFY fix in torch/utils/cpp_extension.py).

GPU testing

Validated on AMD Radeon PRO V710 (gfx110X) via TheRock workflow .github/workflows/test_torchaudio_wheels.yml (branch ethanwee/torchaudio-gpu-tests):

  • GPU smoke test: rnnt_loss (fwd+bwd), forced_align, cuda_ctc_decoder import all PASS.
  • torchaudio GPU unit tests: 784 passed, 1 xfailed (run https://github.com/ROCm/TheRock/actions/runs/29277679572); the only failures were multi-GPU-only tests that can't run on a single-GPU runner (now skipped).

(This source-only version is byte-identical to the previously build+test-validated tree.)

…yle)

Mirror torchvision's setup.py approach: run hipify_python.hipify() over
the libtorchaudio sources when building for ROCm and compile the
generated .hip outputs, instead of relying solely on the torch
CUDAExtension HIPIFY (which only processes listed source files and left
torchaudio headers/symbols like cuda_runtime_api.h, cudaSetDevice and
cub un-converted).

HIPIFY cannot rewrite preprocessor guards, so the #ifdef USE_CUDA gates
around the rnnt/forced_align GPU headers, macros.h, and Options::stream_
are widened to `#if defined(USE_CUDA) || defined(USE_ROCM)`.

Reference: https://github.com/ROCm/vision/blob/release/0.27/setup.py
ethanwee1 added a commit to ROCm/pytorch that referenced this pull request Jul 1, 2026
@ethanwee1

Copy link
Copy Markdown
Author

TheRock test build (Windows gfx110X-all) via ROCm/pytorch#3382:
https://github.com/ROCm/TheRock/actions/runs/28538325024

ethanwee1 added a commit to ROCm/pytorch that referenced this pull request Jul 6, 2026
…io#16)

Revert the temporary HIPIFY-based pin (ROCm/audio#17) back to the
compat-shim port commit that passed TheRock Windows validation
(28529085509). The HIPIFY setup.py approach still leaves CUDA headers
unconverted; the cuda_compat.h port in ROCm/audio#16 is the validated path.

The Windows cross-drive HIPIFY fix remains in torch/utils/cpp_extension.py
(this PR); it is unrelated to the audio-side port strategy.
@ethanwee1

Copy link
Copy Markdown
Author

Closing in favor of #16 (cuda_compat.h compat shim). The torchvision-style HIPIFY in extension.py still leaves headers like cuda_utils.h and macros.h with CUDA-only includes; TheRock run 28538325024 failed on those. Validated Windows build: 28529085509 with #16.

…yle)

Mirror torchvision's setup.py approach: run hipify_python.hipify() over
libtorchaudio CUDA sources and headers, then compile the generated .hip
outputs.

Fixes vs the first HIPIFY attempt (TheRock 28538325024):

1. Do not widen `#ifdef USE_CUDA` to `USE_ROCM` in headers — that pulled
   `cuda_fp16.h` into CPU `.cpp` compiles because PyTorch defines USE_ROCM
   globally on ROCm extension builds. Keep upstream USE_CUDA guards; pass
   `-DUSE_CUDA` on hipcc/nvcc only for GPU translation units.
2. Hipify with `os.path.realpath()` paths and depth-aware include globs so
   headers like `cuda_utils.h` are rewritten on the same inode Windows runners
   use when B: is a subst alias of the C: checkout (otherwise the compiler
   reads un-hipified headers from the underlying path).
3. Include `cuctc/` in the hipify scope.

Reference: https://github.com/ROCm/vision/blob/release/0.27/setup.py

Paired with ROCm/pytorch#3382 (torchaudio pin + Windows cross-drive HIPIFY fix
in torch/utils/cpp_extension.py — that fix is in PyTorch, not here).
ethanwee1 added a commit to ROCm/pytorch that referenced this pull request Jul 6, 2026
Update ethanwee1/audio ew/rocm-24803-hipify-gpu-ext to 0c7509ef with:
- realpath-based hipify (Windows B:/C: alias)
- reverted USE_ROCM header guard widening
- -DUSE_CUDA on hipcc for GPU units only
@ethanwee1 ethanwee1 reopened this Jul 6, 2026
@ethanwee1

Copy link
Copy Markdown
Author

HIPIFY v2 pushed (0c7509ef):

  • Reverted USE_CUDA || USE_ROCM header guard widening (was pulling cuda_fp16.h into CPU compiles).
  • Hipify via realpath() paths + nested globs + header_include_dirs (fixes cuda_utils.h still showing cuda_runtime_api.h on Windows B:/C: subst).
  • Pass -DUSE_CUDA on hipcc only (GPU TUs); upstream #ifndef USE_ROCM shuffle branches unchanged.

ROCm/pytorch#3382 pin updated to this commit.

…e rewritten

hipify resolves angle-bracket includes against header_include_dirs. The
sources include headers as <libtorchaudio/...> via the extension -I root
(src/), but v2 passed src/libtorchaudio, so hipify looked for
src/libtorchaudio/libtorchaudio/... , failed to resolve, and left
#include <libtorchaudio/cuda_utils.h> un-rewritten -> compiled the
original cuda_utils.h with cuda_runtime_api.h. Point header_include_dirs
at src/ (csrc.parent) so the includes resolve and get rewritten to the
hipified header paths.
@ethanwee1

Copy link
Copy Markdown
Author

HIPIFY v3 (133b6687): fixed header_include_dirs to point at the extension -I root (src/) instead of src/libtorchaudio, so hipify resolves and rewrites the <libtorchaudio/...> angle-bracket includes (root cause of compute.hip still including the original cuda_utils.h).

Test build (Windows gfx110X-all) via ROCm/pytorch#3382: https://github.com/ROCm/TheRock/actions/runs/28953516514

@ethanwee1

Copy link
Copy Markdown
Author

✅ SUCCESS — HIPIFY v3 build passed (Windows gfx110X-all):
https://github.com/ROCm/TheRock/actions/runs/28953516514

Produced torchaudio-2.11.0.1+devrocm...-cp312-cp312-win_amd64.whl (0 cuda_runtime* not-found errors). The header_include_dirs fix let hipify rewrite the <libtorchaudio/...> includes to the hipified headers, so the torchvision-style HIPIFY approach now builds cleanly — no manual per-symbol compat shim.

@jithunnair-amd jithunnair-amd left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CUDAExtension does hipify under the hood. I'd like to see if we can use that hipify invocation in a way that will address the issues raised by this PR (the right header_include_dir for eg.). If torchaudio source needs an update instead, that's a viable path too, esp. since it'd be updates in our own fork.

Also, if hipify needs an update to handle the Windows issue with B:/C: drive, that's a legitimate path forward too.

In essence, I would prefer not to invoke hipify manually in torchaudio setup file, as that's not the developer example we want to set.

…header + guards)

Addresses review feedback (jithunnair-amd) to not invoke hipify manually in
the torchaudio setup file. Instead this ports libtorchaudio to ROCm via
fork source updates only, relying on the built-in CUDAExtension hipify for
the .cu source bodies:

- cuda_compat.h maps the CUDA runtime symbols used in headers to their HIP
  equivalents under USE_ROCM.
- Widen the rnnt/forced_align GPU #ifdef USE_CUDA guards, macros.h, and
  Options::stream_ to also cover USE_ROCM.
- Route cub through hipcub under USE_ROCM.

The Windows B:/C: subst cross-drive HIPIFY fix lives in ROCm/pytorch#3382
(torch/utils/cpp_extension.py).
@ethanwee1

Copy link
Copy Markdown
Author

Thanks @jithunnair-amd — reworked to drop the manual hipify_python.hipify() call from setup.py/extension.py entirely. The port is now done purely as torchaudio source updates in our fork (your option 2), relying on the built-in CUDAExtension hipify for the .cu source bodies:

  • cuda_compat.h maps the CUDA runtime symbols that appear in headers (cudaStream_t, cudaError_t, cudaSuccess, cudaGetErrorString/Name, cudaGetLastError, cudaSetDevice, cudaMemcpy*, cudaMemset*, cudaStreamSynchronize) to their HIP equivalents under USE_ROCM.
  • Widened the rnnt/forced_align GPU #ifdef USE_CUDA guards, macros.h, and Options::stream_ to also cover USE_ROCM.
  • Routed cub through hipcub under USE_ROCM.

Context on why not just the built-in hipify: CUDAExtension calls hipify with hipify_extra_files_only=True, so all_files is limited to the listed source files and the include-rewrite skips project headers (cuda_utils.h, etc.) even though the extension already passes the correct header_include_dirs (src/). So the headers need to be HIP-safe in-source regardless — hence the small compat header + guard changes rather than a torch-side hipify change.

The Windows B:/C: subst cross-drive HIPIFY issue is handled separately in ROCm/pytorch#3382 (torch/utils/cpp_extension.py realpath normalization), which is a general CUDAExtension fix.

This source-only version is byte-identical to the tree that previously built + passed GPU tests on gfx110X (784 torchaudio unit tests passed; rnnt/forced_align/cuda_ctc smoke). Pin in ROCm/pytorch#3382 updated to 9808bfc9.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants