Skip to content

[rocm, test] feat: add ROCm controller and test tooling#56

Merged
Wangmerlyn merged 5 commits intomainfrom
rocm-controller
Nov 26, 2025
Merged

[rocm, test] feat: add ROCm controller and test tooling#56
Wangmerlyn merged 5 commits intomainfrom
rocm-controller

Conversation

@Wangmerlyn
Copy link
Owner

@Wangmerlyn Wangmerlyn commented Nov 26, 2025

Summary by CodeRabbit

  • New Features

    • Added ROCm GPU support for non-NVIDIA AMD GPUs.
    • vram_to_keep parameter now accepts human-readable string values (e.g., "1000 MB") in addition to integers.
  • Documentation

    • Added developer setup guide with dev installation and testing instructions.
    • Added contributor guidance for development environment setup and ROCm test execution.
  • Tests

    • Added ROCm-specific test infrastructure with pytest markers and CLI support.

✏️ Tip: You can customize this high-level summary in your review settings.

@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @Wangmerlyn, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly expands the project's hardware compatibility by introducing comprehensive support for AMD ROCm GPUs. It provides a dedicated controller for managing ROCm devices, integrates this new capability into the overarching global GPU management system, and updates the testing infrastructure and documentation to facilitate development and testing on ROCm platforms. This change enables users with AMD GPUs to leverage the application's GPU-keeping functionalities.

Highlights

  • ROCm GPU Controller: Introduced a new RocmGPUController to manage and keep AMD ROCm GPUs busy, mirroring the functionality of the existing CUDA controller. This controller utilizes rocm_smi for utilization queries and performs lightweight element-wise operations to maintain GPU activity.
  • Global GPU Controller Integration: The GlobalGPUController has been updated to detect and initialize RocmGPUController instances when the computing platform is identified as ROCm, ensuring seamless integration with the existing multi-GPU management system.
  • Enhanced Testing Framework: A new pytest marker, rocm, has been added to specifically tag tests that require a ROCm stack. A conftest.py file was introduced to manage these markers, allowing ROCm-specific tests to be run conditionally using the --run-rocm option, and skipping them by default.
  • Developer Documentation Updates: The README.md and docs/getting-started.md files have been updated with new sections for developers and contributors, providing instructions on installing ROCm-specific dependencies and running ROCm-only tests.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request introduces support for ROCm GPUs by adding a RocmGPUController and integrating it into the GlobalGPUController. It also adds corresponding test infrastructure, including a pytest marker and command-line option to run ROCm-specific tests. The implementation is solid, but there are a few areas with code duplication that could be refactored for better maintainability. Specifically, the GlobalGPUController has duplicated logic for CUDA and ROCm platforms, and the new RocmGPUController duplicates some initialization logic from other controllers. I've also noted a performance improvement opportunity in how rocm-smi is used and a minor redundancy in the test configuration. Overall, this is a great addition. The changes are well-structured and the tests are thoughtful. Addressing the feedback will help improve the long-term health of the codebase.

Comment on lines 47 to 65
elif self.computing_platform == ComputingPlatform.ROCM:
from keep_gpu.single_gpu_controller.rocm_gpu_controller import (
RocmGPUController,
)

if gpu_ids is None:
self.gpu_ids = list(range(torch.cuda.device_count()))
else:
self.gpu_ids = gpu_ids

self.controllers = [
RocmGPUController(
rank=i,
interval=interval,
vram_to_keep=vram_to_keep,
busy_threshold=busy_threshold,
)
for i in self.gpu_ids
]
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

This elif block for ROCm is very similar to the existing if block for CUDA, leading to code duplication. To improve maintainability, you could refactor this. The logic for setting self.gpu_ids is identical and can be moved out of the conditional blocks. Then, you can use the conditional to select the appropriate controller class (CudaGPUController or RocmGPUController) and have a single list comprehension to create the self.controllers list. This would make the code DRY (Don't Repeat Yourself) and easier to extend.

Comment on lines 22 to 25
rocm_smi.rsmi_init()
# rsmi_dev_busy_percent_get returns percent (0-100)
util = rocm_smi.rsmi_dev_busy_percent_get(index)
rocm_smi.rsmi_shut_down()
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

Calling rocm_smi.rsmi_init() and rocm_smi.rsmi_shut_down() on every utilization query is inefficient. According to rocm-smi documentation, the library should be initialized once and shut down when no longer needed. Consider managing the rocm_smi lifecycle within the RocmGPUController itself, for example by calling rsmi_init() in __init__ or keep(), and rsmi_shut_down() in release(). The _query_rocm_utilization function could then be turned into a method of the class that doesn't handle initialization/shutdown.

Comment on lines 47 to 52
if isinstance(vram_to_keep, str):
vram_to_keep = self.parse_size(vram_to_keep)
elif not isinstance(vram_to_keep, int):
raise TypeError(
f"vram_to_keep must be str or int, got {type(vram_to_keep)}"
)
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

This logic for parsing vram_to_keep appears to be duplicated in other controller classes. To adhere to the DRY principle, consider moving this logic to the BaseGPUController.__init__. The base class could then be responsible for handling both str and int types for vram_to_keep, simplifying the initializers of child controllers like this one.

Comment on lines 63 to 65
@staticmethod
def parse_size(text: str) -> int:
return parse_size(text)
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

This parse_size static method is a simple wrapper and is likely duplicated across controller implementations. If the vram_to_keep parsing is centralized in BaseGPUController as suggested in another comment, this method would become redundant and could be removed from this class.

Comment on lines +14 to +17
def pytest_configure(config):
config.addinivalue_line("markers", "rocm: tests that require ROCm stack")
config.addinivalue_line("markers", "large_memory: tests that use large VRAM")

Copy link
Contributor

Choose a reason for hiding this comment

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

medium

The pytest markers rocm and large_memory are already registered in pyproject.toml under [tool.pytest.ini_options]. This pytest_configure function is therefore redundant and can be removed to avoid duplicated configuration.

Copy link

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines 22 to 24
rocm_smi.rsmi_init()
# rsmi_dev_busy_percent_get returns percent (0-100)
util = rocm_smi.rsmi_dev_busy_percent_get(index)

Choose a reason for hiding this comment

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

P1 Badge Initialize ROCm SMI with required flags

In _query_rocm_utilization the call to rocm_smi.rsmi_init() omits the required flags argument (ROCm SMI expects rsmi_init(0)); with a real rocm_smi present this raises TypeError, gets swallowed by the broad except, and the function always returns None. On ROCm systems this means busy-threshold gating never runs and the controller will keep firing workloads even when the GPU is already busy.

Useful? React with 👍 / 👎.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 26, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

The PR adds ROCm GPU controller support alongside refactored base initialization. Changes include a new RocmGPUController class with tensor allocation and batch operations, platform-aware controller selection, base GPU controller parameter extension to accept humanized string input, pytest markers for ROCm/large_memory tests, and developer documentation with installation and testing guidance.

Changes

Cohort / File(s) Change Summary
Documentation
README.md, docs/getting-started.md
Added "For developers" and "For contributors" sections detailing dev installation (pip install -e ".[dev]"), CUDA/ROCm test execution, pytest markers (rocm, large_memory), and editable dev workflow setup.
Test Configuration
pyproject.toml
Added [tool.pytest.ini_options] with rocm and large_memory test markers.
GPU Controller Base & Platform Selection
src/keep_gpu/global_gpu_controller/global_gpu_controller.py, src/keep_gpu/single_gpu_controller/base_gpu_controller.py
Refactored global controller initialization to determine controller class by platform, then uniformly instantiate via list comprehension. Updated base controller __init__ signature to accept Union[int, str] for vram_to_keep, with runtime parsing via parse_size() and type validation.
CUDA GPU Controller
src/keep_gpu/single_gpu_controller/cuda_gpu_controller.py
Removed type handling for vram_to_keep (now delegated to base class). Minor log message formatting (en dash to hyphen).
ROCm GPU Controller
src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py
New RocmGPUController class implementing keep/release lifecycle, daemon worker thread with tensor allocation, batch ReLU operations, GPU utilization queries via rocm_smi, and context manager support. Includes error handling and configurable parameters (rank, interval, vram_to_keep, busy_threshold, iterations).
Test Infrastructure
tests/conftest.py
Added --run-rocm CLI flag, pytest_* hooks to register markers, skip ROCm tests unless flag provided, and rocm_available fixture checking torch.cuda availability and HIP support.
ROCm Tests
tests/rocm_controller/test_rocm_utilization.py
New test file mocking rocm_smi interface to verify _query_rocm_utilization() return values and rsmi initialization/shutdown call counts.

Sequence Diagram(s)

sequenceDiagram
    participant GGC as GlobalGPUController
    participant BC as BaseGPUController<br/>(vram_to_keep parsing)
    participant CudaC as CudaGPUController
    participant RocmC as RocmGPUController

    GGC->>GGC: Detect platform (CUDA/ROCM)
    alt CUDA platform
        GGC->>GGC: controller_cls = CudaGPUController
    else ROCm platform
        GGC->>GGC: controller_cls = RocmGPUController
    end

    GGC->>BC: __init__(vram_to_keep: Union[int, str], ...)
    BC->>BC: if isinstance(vram_to_keep, str):<br/>   parse_size() → int
    BC->>BC: validate type → raise if invalid
    
    alt via CudaGPUController
        BC->>CudaC: super().__init__()
    else via RocmGPUController
        BC->>RocmC: super().__init__()
        RocmC->>RocmC: start daemon thread<br/>for keep_loop()
    end

    GGC->>GGC: Instantiate self.controllers<br/>using controller_cls
Loading
sequenceDiagram
    participant User
    participant RocmC as RocmGPUController
    participant RT as Worker Thread<br/>(_keep_loop)
    participant GPU as ROCm GPU
    participant RSMI as rocm_smi

    User->>RocmC: keep()
    RocmC->>RT: Start daemon thread
    
    RT->>GPU: Allocate tensor
    loop every interval seconds
        RT->>RSMI: _query_utilization()
        alt GPU busy > threshold
            RSMI-->>RT: utilization %
            RT->>RT: Sleep
        else GPU idle
            RSMI-->>RT: utilization %
            RT->>GPU: _run_batch() - ReLU ops
            GPU-->>RT: Complete
        end
    end

    User->>RocmC: release()
    RocmC->>RT: Stop thread + clear cache
    RT-->>RocmC: Shutdown complete
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

  • RocmGPUController implementation (rocm_gpu_controller.py): Substantial new class with multi-threaded logic, GPU interaction patterns, error handling, and lifecycle management. Requires careful review of thread safety, tensor lifecycle, and exception handling.
  • Base controller parameter type change (base_gpu_controller.py): New Union[int, str] parameter with runtime parsing requires validation of parsing logic and error propagation.
  • Global controller refactoring (global_gpu_controller.py): Platform-aware class selection and initialization consolidation—verify instantiation logic and consistency across branches.
  • Test infrastructure changes (conftest.py, test_rocm_utilization.py): Mock setup and state isolation patterns need verification for correctness.

Poem

🐰 With ROCm's spark and strings of size,
We parse the GPU, utilities rise,
A daemon thread keeps busy and bright,
While CUDA and Rome now share the same fight! 🚀✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main changes: adding ROCm controller support (new RocmGPUController class) and test tooling (pytest markers, conftest configuration, and new test file).
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch rocm-controller

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (2)
tests/conftest.py (1)

14-17: Remove redundant marker registration.

These markers are already defined in pyproject.toml (lines 144-147). Pytest automatically reads marker definitions from [tool.pytest.ini_options], making this dynamic registration redundant. Duplicate registration can lead to maintenance issues if the definitions diverge.

Apply this diff to remove the redundant registration:

-def pytest_configure(config):
-    config.addinivalue_line("markers", "rocm: tests that require ROCm stack")
-    config.addinivalue_line("markers", "large_memory: tests that use large VRAM")
-
-
src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py (1)

49-53: rsmi_init() likely requires a flags argument.

The ROCm SMI library typically expects rsmi_init(0) with an explicit flags parameter. Without it, this may raise a TypeError on systems with real rocm_smi installed, causing the exception to be silently caught and utilization monitoring to fail.

         if self._rocm_smi:
             try:
-                self._rocm_smi.rsmi_init()
+                self._rocm_smi.rsmi_init(0)
             except Exception as exc:  # pragma: no cover - env-specific
                 logger.debug("rsmi_init failed: %s", exc)
🧹 Nitpick comments (3)
tests/rocm_controller/test_rocm_utilization.py (1)

8-36: Consider testing through public API instead of private function.

The test directly invokes rgc._query_rocm_utilization(1), which is a private function (underscore prefix). While the test structure is sound and properly mocks the ROCm SMI interface, testing private implementation details can make the test suite brittle to refactoring.

Consider refactoring to test through the public API of RocmGPUController instead. For example, you could test the keep() method or a public monitoring method that internally calls _query_rocm_utilization. This would verify the behavior from a user's perspective while still validating the ROCm integration.

If direct testing of the private function is intentional for unit testing purposes, the current approach is acceptable but may require updates if the private API changes.

Note: Line 30's DummyRocmSMI.calls = 0 appears defensive but redundant since it's the first operation with the counter in this test.

src/keep_gpu/single_gpu_controller/base_gpu_controller.py (1)

7-24: Excellent refactor centralizing type handling!

The updated __init__ signature accepting Union[int, str] with runtime parsing successfully consolidates the vram_to_keep handling logic, eliminating duplication in subclasses like CudaGPUController. The type validation and error messaging are clear and appropriate.

Optional: The static analysis hint (TRY003) suggests extracting the exception message to a constant or using a custom exception class. However, the current inline message is clear and concise, making this an optional style improvement rather than a necessary change.

src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py (1)

107-112: Consider graceful exit when stopped during allocation retry.

If _stop_evt is set while retrying tensor allocation (e.g., during release()), the loop exits with tensor = None and raises RuntimeError. This exception propagates even though the controller is intentionally stopping.

         if tensor is None:
-            logger.error("rank %s: failed to allocate tensor, exiting loop", self.rank)
-            raise RuntimeError("Failed to allocate tensor for ROCm GPU keeping")
+            if self._stop_evt.is_set():
+                logger.debug("rank %s: stop requested during allocation, exiting", self.rank)
+                return
+            logger.error("rank %s: failed to allocate tensor, exiting loop", self.rank)
+            raise RuntimeError("Failed to allocate tensor for ROCm GPU keeping")
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a40eb74 and 16e05a3.

📒 Files selected for processing (9)
  • README.md (1 hunks)
  • docs/getting-started.md (1 hunks)
  • pyproject.toml (1 hunks)
  • src/keep_gpu/global_gpu_controller/global_gpu_controller.py (1 hunks)
  • src/keep_gpu/single_gpu_controller/base_gpu_controller.py (1 hunks)
  • src/keep_gpu/single_gpu_controller/cuda_gpu_controller.py (1 hunks)
  • src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py (1 hunks)
  • tests/conftest.py (1 hunks)
  • tests/rocm_controller/test_rocm_utilization.py (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
src/keep_gpu/global_gpu_controller/global_gpu_controller.py (2)
src/keep_gpu/single_gpu_controller/cuda_gpu_controller.py (1)
  • CudaGPUController (16-195)
src/keep_gpu/utilities/platform_manager.py (1)
  • ComputingPlatform (12-15)
tests/rocm_controller/test_rocm_utilization.py (1)
tests/conftest.py (1)
  • rocm_available (30-31)
src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py (5)
src/keep_gpu/single_gpu_controller/base_gpu_controller.py (2)
  • BaseGPUController (6-59)
  • keep (33-38)
src/keep_gpu/utilities/logger.py (1)
  • setup_logger (67-98)
src/keep_gpu/single_gpu_controller/cuda_gpu_controller.py (3)
  • keep (83-96)
  • _keep_loop (123-162)
  • release (98-110)
src/keep_gpu/global_gpu_controller/global_gpu_controller.py (2)
  • keep (60-62)
  • release (68-75)
tests/rocm_controller/test_rocm_utilization.py (3)
  • rsmi_init (17-18)
  • rsmi_shut_down (26-27)
  • rsmi_dev_busy_percent_get (21-23)
src/keep_gpu/single_gpu_controller/base_gpu_controller.py (2)
src/keep_gpu/single_gpu_controller/cuda_gpu_controller.py (1)
  • parse_size (76-77)
src/keep_gpu/global_gpu_controller/global_gpu_controller.py (1)
  • parse_size (65-66)
🪛 Ruff (0.14.5)
src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py

41-41: Do not catch blind exception: Exception

(BLE001)


52-52: Do not catch blind exception: Exception

(BLE001)


74-74: Do not catch blind exception: Exception

(BLE001)


91-91: Do not catch blind exception: Exception

(BLE001)


112-112: Avoid specifying long messages outside the exception class

(TRY003)

src/keep_gpu/single_gpu_controller/base_gpu_controller.py

20-22: Avoid specifying long messages outside the exception class

(TRY003)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Run pre-commit checks
  • GitHub Check: Build documentation
  • GitHub Check: build
🔇 Additional comments (13)
pyproject.toml (1)

143-147: LGTM! Pytest markers are properly configured.

The marker definitions follow pytest conventions and provide clear descriptions for ROCm and large memory tests.

src/keep_gpu/single_gpu_controller/cuda_gpu_controller.py (2)

64-64: Good refactor delegating parsing to the base class.

Passing vram_to_keep directly to the base class eliminates duplicate parsing logic and centralizes type handling in BaseGPUController.__init__.


180-180: LGTM! Log message formatting improved.

The change from en dash to hyphen improves consistency in log messages.

README.md (1)

85-91: Excellent developer documentation!

The new section provides clear guidance for contributors, including development setup, fast validation checks, and ROCm-specific test execution. This aligns well with the test infrastructure changes in the PR.

docs/getting-started.md (1)

42-53: LGTM! Contributor documentation is well-structured.

The contributor section provides clear setup instructions and aligns with the developer guidance in README.md. The editable install example is practical and helpful.

src/keep_gpu/global_gpu_controller/global_gpu_controller.py (1)

28-58: Excellent refactor addressing code duplication!

The refactored code consolidates controller instantiation logic using controller_cls, successfully eliminating the duplication flagged in the previous review. The unified approach with gpu_ids assignment and controller list comprehension makes the code more maintainable and easier to extend for additional platforms.

tests/conftest.py (3)

5-11: LGTM! ROCm CLI option follows pytest best practices.

The --run-rocm option enables selective execution of ROCm tests, which is appropriate for optional hardware-specific testing.


19-26: LGTM! Test skipping logic is well-implemented.

The collection modifier appropriately skips ROCm tests by default, requiring explicit opt-in via --run-rocm. This prevents accidental execution on systems without ROCm.


29-31: LGTM! ROCm detection logic is correct.

The fixture properly detects ROCm availability by checking both CUDA API availability and the presence of torch.version.hip, which is specific to ROCm builds.

src/keep_gpu/single_gpu_controller/rocm_gpu_controller.py (4)

19-43: LGTM! Clean initialization with proper delegation to base class.

The lazy import pattern for rocm_smi with graceful fallback is appropriate. The broad Exception catch (line 41) is acceptable here since import failures can manifest as various exception types depending on the environment.


64-76: LGTM!

Clean shutdown sequence with proper thread synchronization and resource cleanup. The structure correctly mirrors CudaGPUController.release().


85-93: Good refactoring - SMI lifecycle now managed at controller level.

This addresses the prior feedback about inefficient per-query rsmi_init()/rsmi_shut_down() calls. The SMI is now initialized once in keep() and shut down in release().


130-143: LGTM!

Good use of @torch.no_grad() to avoid gradient tracking overhead. The early exit check on _stop_evt ensures responsive shutdown, and torch.cuda.synchronize() guarantees accurate timing measurements.

@Wangmerlyn Wangmerlyn merged commit 6dbed69 into main Nov 26, 2025
5 checks passed
@Wangmerlyn Wangmerlyn linked an issue Nov 26, 2025 that may be closed by this pull request
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.

rocm support

1 participant