Skip to content

[TRTLLM-12342][feat] Ring Attention, Unified Context Parallel for VisualGen#13821

Merged
NVShreyas merged 13 commits into
NVIDIA:mainfrom
NVShreyas:user/shreyasm/vg-ring-attention
May 21, 2026
Merged

[TRTLLM-12342][feat] Ring Attention, Unified Context Parallel for VisualGen#13821
NVShreyas merged 13 commits into
NVIDIA:mainfrom
NVShreyas:user/shreyasm/vg-ring-attention

Conversation

@NVShreyas

@NVShreyas NVShreyas commented May 7, 2026

Copy link
Copy Markdown
Collaborator

WAN 2.2 14B perf on N GB200s -

GPUs Config 40-step (s) Speedup vs 1-GPU Efficiency
1 cfg1 348.40 1.00x 100%
2 cfg2 174.00 2.00x 100%
4 cfg2·ul2 95.89 3.63x 91%
8 cfg2·ul4 48.06 7.25x 91%
16 cfg2·ul4·r2 25.60 13.61x 85%
24 cfg2·ul4·r3 18.46 18.87x 79%
32 cfg2·ul8·r2 14.12 24.67x 77%
64 cfg2·ul8·r4 8.48 41.08x 64%

Summary by CodeRabbit

  • New Features

    • Ring-based sequence parallelism for distributed inference and generation
    • New --ring_size CLI argument to configure ring parallelism
  • Refactor

    • Unified sequence sharding abstraction for simplified parallel model configuration and execution
  • Tests

    • Added comprehensive multi-GPU tests for ring parallelism and combined ring-Ulysses configurations

Description

Test Coverage

PR Checklist

Please review the following before submitting your PR:

  • PR description clearly explains what and why. If using CodeRabbit's summary, please make sure it makes sense.

  • PR Follows TRT-LLM CODING GUIDELINES to the best of your knowledge.

  • Test cases are provided for new code paths (see test instructions)

  • Any new dependencies have been scanned for license and vulnerabilities

  • CODEOWNERS updated if ownership changes

  • Documentation updated as needed

  • Update tava architecture diagram if there is a significant design change in PR.

  • The reviewers assigned automatically/manually are appropriate for the PR.

  • Please check this after reviewing the above items as appropriate for this PR.

GitHub Bot Help

To see a list of available CI bot commands, please comment /bot help.

@NVShreyas
NVShreyas requested review from a team as code owners May 7, 2026 00:05
@NVShreyas
NVShreyas requested review from chang-l and venkywonka May 7, 2026 00:05
@coderabbitai

coderabbitai Bot commented May 7, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

This PR introduces ring-based sequence parallelism via a new RingAttention class and refactors visual generation models to use a centralized SequenceSharder abstraction. It modernizes VisualGenMapping with fixed internal dimension ordering, updates configuration to support dit_ring_size, and adds comprehensive multi-GPU tests for ring and ring+Ulysses configurations.

Changes

Ring Attention & Sequence Parallelism Infrastructure

Layer / File(s) Summary
Configuration
tensorrt_llm/_torch/visual_gen/config.py
ParallelConfig marks dit_ring_size as supported and removes dit_dim_order field.
Mapping Foundation
tensorrt_llm/_torch/visual_gen/mapping.py
VisualGenMapping adopts fixed internal dimension order (_DEVICE_MESH_DIM_ORDER), removes user-facing order parameter, adds seq_mesh caching for combined cp×ulysses parallelism, and introduces seq_size, seq_rank, ring_rank, ring_group, seq_group properties.
Attention Backend Interfaces
tensorrt_llm/_torch/visual_gen/attention_backend/interface.py, flash_attn4.py
support_lse() method is documented in base AttentionBackend; FlashAttn4Attention renames method to supports_lse().
Ring Attention Implementation
tensorrt_llm/_torch/visual_gen/attention_backend/parallel.py
RingAttention class added for ring-based sequence parallelism with neighbor P2P exchanges and online softmax/LSE merging; UlyssesAttention now requires non-optional process group and validates head divisibility; Attention2DAttention declares support_lse() → False.
Sequence Sharding Utility
tensorrt_llm/_torch/visual_gen/utils.py
New SequenceSharder class centralizes distributed sequence sharding/gathering with optional right-padding, runtime enable/disable, and RoPE-aware sharding via from_vgm() factory.
Attention Backend Exports
tensorrt_llm/_torch/visual_gen/attention_backend/__init__.py
RingAttention added to module exports.

Model Integration & Refactoring

Layer / File(s) Summary
Attention Module Wiring
tensorrt_llm/_torch/visual_gen/modules/attention.py
Reads ring_size from config mapping; conditionally wraps backend with RingAttention (when ring_size > 1) and UlyssesAttention (when ulysses_size > 1).
Flux Transformer
tensorrt_llm/_torch/visual_gen/models/flux/transformer_flux.py
Replaces manual sequence-parallel slicing/all-gather with SequenceSharder; shards img/txt IDs and hidden states before RoPE, gathers final output.
Flux2 Transformer
tensorrt_llm/_torch/visual_gen/models/flux/transformer_flux2.py
Initializes SequenceSharder from mapping; replaces conditional use_seq_parallel sharding/gathering with unconditional sharder operations.
LTX2 Transformer
tensorrt_llm/_torch/visual_gen/models/ltx2/transformer_ltx2.py
Replaces root-level sequence-parallel flags with per-block and model-level SequenceSharder; validates audio head divisibility; refactors _shard_transformer_args() and _gather_sequence() to use sharder; adds set_ulysses_enabled() to dynamically enable/disable via sharder.
WAN Transformer
tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py
Replaces manual chunking/all-gather with SequenceSharder; shards patch tokens and RoPE tensors; updates forward docstring to reflect sharder abstraction.
Pipeline Loader
tensorrt_llm/_torch/visual_gen/pipeline_loader.py
Removes order parameter from VisualGenMapping construction (reflects config removal).

CLI & User-Facing Interface

Layer / File(s) Summary
Visual Generation CLI
examples/visual_gen/visual_gen_wan_t2v.py
Adds --ring_size argument (default 1); includes ring size in parallelism string reporting; wires ring_size into VisualGenArgs via dit_ring_size.

Tests

Layer / File(s) Summary
Ring Attention Tests
tests/unittest/_torch/visual_gen/multi_gpu/test_ring_attention.py
Comprehensive multi-GPU tests for RingAttention alone and composed with UlyssesAttention; validates shape, finiteness, equivalence to PyTorch SDPA shard, causal-mask rejection, LSE-support enforcement, and optional FlashAttention4 inner-backend compatibility.
WAN Ring Tests
tests/unittest/_torch/visual_gen/multi_gpu/test_wan_ring.py
Validates WAN ring (ring size 4) and WAN ring+Ulysses (2×2) output equivalence to single-GPU reference across 4 distributed ranks with deterministic weight initialization.
VisualGenMapping Tests
tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py
Removes custom dimension-order test cases; adds assertion for fixed default internal dimension order.

Sequence Diagram

sequenceDiagram
    participant User as User / CLI
    participant Config as Config & Mapping
    participant Attn as Attention Module
    participant Ring as RingAttention
    participant Backend as Inner Backend
    participant Sharder as SequenceSharder
    participant Model as Visual Gen Model

    User->>Config: Provide ring_size, ulysses_size
    Config->>Config: VisualGenMapping: fixed dim order, seq properties
    Config->>Attn: Pass config with ring_size, ulysses_size
    Attn->>Ring: Wrap backend if ring_size > 1
    Attn->>Attn: Wrap with UlyssesAttention if ulysses_size > 1
    
    Model->>Sharder: Create SequenceSharder from mapping
    Model->>Sharder: shard(hidden_states, img_ids, txt_ids)
    Sharder->>Sharder: Distribute sequence chunks to ranks
    Model->>Backend: Process local sequence chunk
    
    Ring->>Ring: P2P exchanges with neighbors (if ring_size > 1)
    Ring->>Backend: forward_with_lse per chunk
    Ring->>Ring: Online softmax/LSE merge
    
    Model->>Sharder: gather(hidden_states)
    Sharder->>Sharder: All-gather sequence dimension
    Sharder->>Model: Reconstruct full sequence
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

The PR introduces substantial new infrastructure (RingAttention, SequenceSharder) with dense logic for distributed P2P communication, online softmax merging, and sequence sharding. It refactors four major transformer models in a coordinated way, requiring careful verification of equivalence between manual and abstracted sequence-parallel patterns. Multiple files have interdependent changes (config, mapping, attention backends, models), and the test coverage spans multi-GPU distributed scenarios with tolerance-sensitive numerical comparisons.

Suggested labels

VisualGen, sequence-parallelism, ring-attention, distributed-training

Suggested reviewers

  • zhenhuaw-me
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.91% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The PR description is incomplete. It contains only a performance table and the template structure without meaningful content in key sections like Description and Test Coverage. Add a clear description explaining what Ring Attention and unified context parallelism are, why they were implemented, and which tests validate the changes (e.g., test_ring_attention.py, test_wan_ring.py).
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The PR title clearly and specifically describes the main feature: introducing Ring Attention and unified context parallelism for VisualGen components.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (7)
tensorrt_llm/_torch/visual_gen/config.py (1)

61-104: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Documentation inconsistency: class docstring says dit_ring_size is not supported, but field comment says "Supported".

The class docstring at lines 70-71 lists dit_ring_size under "Not Yet Supported", but the field comment at line 104 now says "# Supported". Please update the class docstring to reflect the current support status.

Proposed fix for class docstring
     Currently Supported:
         - dit_cfg_size: CFG (Classifier-Free Guidance) parallelism
         - dit_ulysses_size: Ulysses head-sharding parallelism
         - dit_attn2d_row_size, dit_attn2d_col_size: Attention2D context parallelism
+        - dit_ring_size: Ring attention context parallelism

     Not Yet Supported:
         - dit_tp_size: Tensor parallelism (not implemented)
-        - dit_ring_size: Ring attention context parallelism (not implemented)
         - dit_dp_size, dit_fsdp_size: Other parallelism types
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/visual_gen/config.py` around lines 61 - 104, The class
docstring for ParallelConfig is inconsistent about dit_ring_size: update the
docstring to mark dit_ring_size as supported (moving it out of the "Not Yet
Supported" list or changing its line to "Supported") so it matches the field
comment and current behavior; locate the ParallelConfig class docstring and
change the bullet mentioning dit_ring_size (previously under "Not Yet
Supported") to reflect that dit_ring_size is supported alongside
dit_ulysses_size, or adjust wording to indicate supported vs not supported
features consistently with the dit_ring_size field.
tensorrt_llm/_torch/visual_gen/attention_backend/interface.py (1)

1-1: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Update copyright year to include 2026.

Per coding guidelines, the copyright header should be updated to reflect the year of latest modification.

Proposed fix
-# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/visual_gen/attention_backend/interface.py` at line 1,
Update the copyright header in the file by changing the year portion from "2025"
to include 2026 (e.g., "2025-2026" or "2026" per project convention) so the SPDX
header reflects the latest modification year; edit the top-line text that
currently reads "Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES" to the
updated year string.
tensorrt_llm/_torch/visual_gen/modules/attention.py (1)

1-6: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Missing NVIDIA copyright header.

Per coding guidelines, all Python source files should contain an NVIDIA copyright header with the year of latest modification and Apache 2.0 license notice.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/visual_gen/modules/attention.py` around lines 1 - 6, Add
the required NVIDIA copyright header and Apache-2.0 license notice at the top of
the tensorrt_llm/_torch/visual_gen/modules/attention.py file (above the existing
imports); include the latest modification year, the NVIDIA copyright holder
line, and the full Apache License, Version 2.0 boilerplate or SPDX identifier so
the file complies with the project's licensing header convention.
tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py (1)

1-9: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Missing NVIDIA copyright header.

Per coding guidelines, all Python source files should contain an NVIDIA copyright header with the year of latest modification and Apache 2.0 license notice.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py` around lines 1
- 9, This file missing the required NVIDIA copyright header; add the standard
NVIDIA copyright and Apache-2.0 license header comment block at the very top of
tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py (above the existing
imports), with the correct year of latest modification and header text that
matches our repo template so it appears before the first symbol (imports like
math, torch, etc.) and ensures license metadata is present.
tensorrt_llm/_torch/visual_gen/attention_backend/flash_attn4.py (1)

171-186: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Incorrect method name: supports_lse should be support_lse.

The base class AttentionBackend defines support_lse(), which is called throughout the codebase (e.g., parallel.py:303, parallel.py:463). The newly added method at line 185 is named supports_lse() (with an extra 's'), which does not match the interface and will not be called by code expecting support_lse().

Rename the method to support_lse() to match the base class and maintain consistency with the rest of the codebase.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/visual_gen/attention_backend/flash_attn4.py` around lines
171 - 186, The class defines support_lse(self) at the top but later adds a
misnamed supports_lse(cls) duplicate; remove or rename the incorrect
supports_lse method to support_lse (and avoid duplicate definitions) so the
class only implements the expected classmethod support_lse() used by the
codebase (refer to the methods support_lse and supports_lse in flash_attn4.py
and ensure the class uses support_lse matching AttentionBackend's interface).
tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py (1)

1-4: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add the standard SPDX header to this modified test file.

This file is touched by the PR, but it still lacks the repository-mandated NVIDIA copyright / Apache-2.0 header.

As per coding guidelines, **/*.{cpp,h,cu,cuh,py}: All source files (.cpp, .h, .cu, .py) should contain an NVIDIA copyright header with the year of latest modification and Apache 2.0 license notice.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py` around
lines 1 - 4, Add the standard NVIDIA SPDX header and Apache-2.0 notice to the
top of the modified test file
tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py: prepend
the repository-mandated copyright/license block (including the year of latest
modification and SPDX-License-Identifier: Apache-2.0) as used across other
source files, ensuring it appears before the module docstring and imports so the
file now contains the required header for VisualGenMapping tests.
tensorrt_llm/_torch/visual_gen/mapping.py (1)

1-9: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add the standard SPDX header to this modified source file.

This file now has new production code but still starts without the repository-required NVIDIA copyright / Apache-2.0 header.

As per coding guidelines, **/*.{cpp,h,cu,cuh,py}: All source files (.cpp, .h, .cu, .py) should contain an NVIDIA copyright header with the year of latest modification and Apache 2.0 license notice.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tensorrt_llm/_torch/visual_gen/mapping.py` around lines 1 - 9, This file is
missing the repository-required NVIDIA SPDX/Apache-2.0 header; add the standard
SPDX header and copyright/license block at the top of
tensorrt_llm/_torch/visual_gen/mapping.py so all new production sources comply
with the policy, keeping the rest of the module (including VisualGenMapping,
DeviceMeshTopologyImpl, build_mesh and the shared
DeviceMeshTopologyImpl.device_mesh) unchanged.
🧹 Nitpick comments (1)
tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py (1)

105-107: ⚡ Quick win

Please exercise the new flattened sequence mesh directly.

SequenceSharder now consumes seq_rank, seq_group, and ring_group, but this suite only asserts the private _dim_names tuple and the older per-dim groups. A small 4-GPU check that seq_rank follows the cp-major / ulysses-minor linearization and that a collective over seq_group spans cp_size * ulysses_size would cover the API this PR actually introduced.

As per coding guidelines, Coverage expectations: Assess whether new/changed tests cover happy path, important edge cases, and failure modes relevant to the feature or fix.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py` around
lines 105 - 107, Add a test that exercises the new flattened sequence mesh
instead of only asserting _dim_names: instantiate
VisualGenMapping/SequenceSharder for a 4-GPU configuration (use world_size=4)
and verify that seq_rank is assigned following cp-major / ulysses-minor
linearization (i.e., seq_rank changes fastest across ulysses then cp), that
seq_group and ring_group are populated per the new API (seq_rank, seq_group,
ring_group fields on SequenceSharder), and assert that a collective over
seq_group spans cp_size * ulysses_size (use the SequenceSharder.cp_size and
.ulysses_size to compute expected group size). Ensure the test checks the happy
path mapping for all ranks (iterate ranks 0..world_size-1) rather than only
checking private _dim_names.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@examples/visual_gen/visual_gen_wan_t2v.py`:
- Around line 309-320: The CI failures are caused by trailing whitespace and
formatting in the block that checks args.ulysses_size and sets
num_heads/logger.info/parallel_str; remove any trailing spaces (especially after
the closing parenthesis on the logger.info line) and reflow the f-strings to
satisfy ruff formatting (keep the f-strings split sensibly or join into one
line) so that the code around args.ulysses_size, num_heads, logger.info, and
parallel_str has no trailing whitespace and conforms to the project's
line-length/format rules.

In `@tensorrt_llm/_torch/visual_gen/attention_backend/parallel.py`:
- Around line 559-584: The current gate uses k.shape[1] != q.shape[1] and only
rejects PredefinedAttentionMask.CAUSAL, which lets equal-length cross-attention
and non-FULL masks erroneously enter the ring; change the logic to require an
explicit self-vs-cross signal (e.g., expect a boolean like is_cross_attention or
is_self_attention passed via kwargs) and use that to immediately call
self.inner.forward(...) for cross-attention (instead of the shape check
k.shape[1] != q.shape[1]), and before entering the ring loop validate
attention_mask is either None or PredefinedAttentionMask.FULL and raise
NotImplementedError for any other mask (not just CAUSAL); update the code paths
around the symbols k.shape[1] != q.shape[1], PredefinedAttentionMask.CAUSAL,
self.inner.forward, and self.inner.forward_with_lse/_ring_send_recv so only true
self-attention with FULL/None mask runs the ring logic.

In `@tensorrt_llm/_torch/visual_gen/mapping.py`:
- Around line 38-40: Replace the non-ASCII multiplication character (×) used in
comments with an ASCII multiplication marker (either 'x' or '*') throughout
mapping.py; specifically update the comment lines that define "sp (sequence
parallelism) = cp × ulysses" and the following CP/attn examples (references:
symbols/sp, cp, ulysses, ring, attn2d, Attention2D) and the other occurrences
mentioned (around the blocks at 155-158, 243-247, 318) so ruff no longer flags
ambiguous Unicode—search for '×' and replace with 'x' or '*' in those comment
blocks.

In `@tensorrt_llm/_torch/visual_gen/utils.py`:
- Line 1: Add the standard NVIDIA SPDX header at the very top of the file (above
the existing module docstring """Utility functions for visual generation
pipelines."""), including the copyright line with the year of latest
modification (e.g., "Copyright (c) <YEAR>, NVIDIA CORPORATION & AFFILIATES") and
the SPDX license identifier "SPDX-License-Identifier: Apache-2.0"; ensure the
header is a multi-line comment block placed before the docstring so the file now
begins with the required NVIDIA/Apache-2.0 header.
- Around line 97-111: from_vgm() can return size>1 while group is None which
lets gather() call dist.all_gather(..., group=None) and accidentally use the
default world group; add a fail-fast invariant in the factory function
from_vgm() to raise a ValueError when size>1 and group is None (check vgm or the
derived group after computing size/rank/group) so sequence-parallel sharding
always requires a non-None group; reference the symbols from_vgm, vgm.seq_size /
size, group, gather, and dist.all_gather when locating and implementing the
check.

In `@tests/unittest/_torch/visual_gen/multi_gpu/test_ring_attention.py`:
- Around line 497-498: The docstring for class TestRingUlyssesAttention uses the
Unicode multiplication sign "×" which Ruff flags; update the docstring string
for TestRingUlyssesAttention to replace each "×" with ASCII "x" (e.g., change
"2×2 cp × ulysses" to "2x2 cp x ulysses") so linting passes while preserving the
original phrasing.
- Around line 44-59: The current try/except lumps optional FlashAttn4 imports
with required imports so an ImportError for FlashAttn4Attention sets
MODULES_AVAILABLE = False and skips non-FA4 tests; refactor by separating
required imports (PredefinedAttentionMask, RingAttention, UlyssesAttention,
AttentionTensorLayout, get_free_port) into their own try/except that controls
MODULES_AVAILABLE, then do a second optional try/except for FlashAttn4Attention
and _flash_attn_fwd that sets _fa4_fwd = None and FlashAttn4Attention = None on
failure and sets _flash_attn4_available = _fa4_fwd is not None, ensuring
RingAttention/UlyssesAttention tests run even if FA4 is absent.

In `@tests/unittest/_torch/visual_gen/multi_gpu/test_wan_ring.py`:
- Line 202: The test file has unused locals from unpacking _VIDEO_SHAPE and uses
a non-ASCII multiplication sign in docstrings; change the unpack to only keep
needed values (e.g., B, *_ = _VIDEO_SHAPE or B, *_rest = _VIDEO_SHAPE) or prefix
unused names with underscores (B, _C, _T, _H, _W = _VIDEO_SHAPE) to silence
Ruff, and replace any "2×2" docstring occurrences with the ASCII "2x2"; apply
the same fixes for the other occurrences referenced (the other unpack at the
same pattern and the docstring instances).

---

Outside diff comments:
In `@tensorrt_llm/_torch/visual_gen/attention_backend/flash_attn4.py`:
- Around line 171-186: The class defines support_lse(self) at the top but later
adds a misnamed supports_lse(cls) duplicate; remove or rename the incorrect
supports_lse method to support_lse (and avoid duplicate definitions) so the
class only implements the expected classmethod support_lse() used by the
codebase (refer to the methods support_lse and supports_lse in flash_attn4.py
and ensure the class uses support_lse matching AttentionBackend's interface).

In `@tensorrt_llm/_torch/visual_gen/attention_backend/interface.py`:
- Line 1: Update the copyright header in the file by changing the year portion
from "2025" to include 2026 (e.g., "2025-2026" or "2026" per project convention)
so the SPDX header reflects the latest modification year; edit the top-line text
that currently reads "Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES" to the
updated year string.

In `@tensorrt_llm/_torch/visual_gen/config.py`:
- Around line 61-104: The class docstring for ParallelConfig is inconsistent
about dit_ring_size: update the docstring to mark dit_ring_size as supported
(moving it out of the "Not Yet Supported" list or changing its line to
"Supported") so it matches the field comment and current behavior; locate the
ParallelConfig class docstring and change the bullet mentioning dit_ring_size
(previously under "Not Yet Supported") to reflect that dit_ring_size is
supported alongside dit_ulysses_size, or adjust wording to indicate supported vs
not supported features consistently with the dit_ring_size field.

In `@tensorrt_llm/_torch/visual_gen/mapping.py`:
- Around line 1-9: This file is missing the repository-required NVIDIA
SPDX/Apache-2.0 header; add the standard SPDX header and copyright/license block
at the top of tensorrt_llm/_torch/visual_gen/mapping.py so all new production
sources comply with the policy, keeping the rest of the module (including
VisualGenMapping, DeviceMeshTopologyImpl, build_mesh and the shared
DeviceMeshTopologyImpl.device_mesh) unchanged.

In `@tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py`:
- Around line 1-9: This file missing the required NVIDIA copyright header; add
the standard NVIDIA copyright and Apache-2.0 license header comment block at the
very top of tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py (above
the existing imports), with the correct year of latest modification and header
text that matches our repo template so it appears before the first symbol
(imports like math, torch, etc.) and ensures license metadata is present.

In `@tensorrt_llm/_torch/visual_gen/modules/attention.py`:
- Around line 1-6: Add the required NVIDIA copyright header and Apache-2.0
license notice at the top of the
tensorrt_llm/_torch/visual_gen/modules/attention.py file (above the existing
imports); include the latest modification year, the NVIDIA copyright holder
line, and the full Apache License, Version 2.0 boilerplate or SPDX identifier so
the file complies with the project's licensing header convention.

In `@tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py`:
- Around line 1-4: Add the standard NVIDIA SPDX header and Apache-2.0 notice to
the top of the modified test file
tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py: prepend
the repository-mandated copyright/license block (including the year of latest
modification and SPDX-License-Identifier: Apache-2.0) as used across other
source files, ensuring it appears before the module docstring and imports so the
file now contains the required header for VisualGenMapping tests.

---

Nitpick comments:
In `@tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py`:
- Around line 105-107: Add a test that exercises the new flattened sequence mesh
instead of only asserting _dim_names: instantiate
VisualGenMapping/SequenceSharder for a 4-GPU configuration (use world_size=4)
and verify that seq_rank is assigned following cp-major / ulysses-minor
linearization (i.e., seq_rank changes fastest across ulysses then cp), that
seq_group and ring_group are populated per the new API (seq_rank, seq_group,
ring_group fields on SequenceSharder), and assert that a collective over
seq_group spans cp_size * ulysses_size (use the SequenceSharder.cp_size and
.ulysses_size to compute expected group size). Ensure the test checks the happy
path mapping for all ranks (iterate ranks 0..world_size-1) rather than only
checking private _dim_names.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: f86d5723-3675-48ac-b486-78dc808dd449

📥 Commits

Reviewing files that changed from the base of the PR and between 634f86c and 62d80ae.

📒 Files selected for processing (17)
  • examples/visual_gen/visual_gen_wan_t2v.py
  • tensorrt_llm/_torch/visual_gen/attention_backend/__init__.py
  • tensorrt_llm/_torch/visual_gen/attention_backend/flash_attn4.py
  • tensorrt_llm/_torch/visual_gen/attention_backend/interface.py
  • tensorrt_llm/_torch/visual_gen/attention_backend/parallel.py
  • tensorrt_llm/_torch/visual_gen/config.py
  • tensorrt_llm/_torch/visual_gen/mapping.py
  • tensorrt_llm/_torch/visual_gen/models/flux/transformer_flux.py
  • tensorrt_llm/_torch/visual_gen/models/flux/transformer_flux2.py
  • tensorrt_llm/_torch/visual_gen/models/ltx2/transformer_ltx2.py
  • tensorrt_llm/_torch/visual_gen/models/wan/transformer_wan.py
  • tensorrt_llm/_torch/visual_gen/modules/attention.py
  • tensorrt_llm/_torch/visual_gen/pipeline_loader.py
  • tensorrt_llm/_torch/visual_gen/utils.py
  • tests/unittest/_torch/visual_gen/multi_gpu/test_ring_attention.py
  • tests/unittest/_torch/visual_gen/multi_gpu/test_visual_gen_mapping.py
  • tests/unittest/_torch/visual_gen/multi_gpu/test_wan_ring.py
💤 Files with no reviewable changes (1)
  • tensorrt_llm/_torch/visual_gen/pipeline_loader.py

Comment thread examples/visual_gen/visual_gen_wan_t2v.py Outdated
Comment thread tensorrt_llm/_torch/visual_gen/attention_backend/parallel.py
Comment thread tensorrt_llm/_torch/visual_gen/mapping.py
Comment thread tensorrt_llm/_torch/visual_gen/utils.py
Comment thread tensorrt_llm/_torch/visual_gen/utils.py
Comment thread tests/unittest/_torch/visual_gen/multi_gpu/test_ring_attention.py
Comment thread tests/unittest/_torch/visual_gen/multi_gpu/test_ring_attention.py
Comment thread tests/unittest/_torch/visual_gen/multi_gpu/test_wan_ring.py
@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --add-multi-gpu-test

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47054 [ run ] triggered by Bot. Commit: 6cd3bcf Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47054 [ run ] completed with state SUCCESS. Commit: 6cd3bcf
/LLM/main/L0_MergeRequest_PR pipeline #37027 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --add-multi-gpu-test

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47275 [ run ] triggered by Bot. Commit: 6cd3bcf Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47275 [ run ] completed with state SUCCESS. Commit: 6cd3bcf
/LLM/main/L0_MergeRequest_PR pipeline #37216 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas
NVShreyas force-pushed the user/shreyasm/vg-ring-attention branch from 6cd3bcf to 95dad89 Compare May 8, 2026 19:48
@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47440 [ run ] triggered by Bot. Commit: 95dad89 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47440 [ run ] completed with state FAILURE. Commit: 95dad89
/LLM/main/L0_MergeRequest_PR pipeline #37363 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47773 [ run ] triggered by Bot. Commit: 95dad89 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47773 [ run ] completed with state SUCCESS. Commit: 95dad89
/LLM/main/L0_MergeRequest_PR pipeline #37665 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47799 [ run ] triggered by Bot. Commit: 95dad89 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #47799 [ run ] completed with state SUCCESS. Commit: 95dad89
/LLM/main/L0_MergeRequest_PR pipeline #37690 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas
NVShreyas force-pushed the user/shreyasm/vg-ring-attention branch from 95dad89 to 785a43f Compare May 14, 2026 17:52
@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #48415 [ run ] triggered by Bot. Commit: 2d8b728 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #48415 [ run ] completed with state FAILURE. Commit: 2d8b728
/LLM/main/L0_MergeRequest_PR pipeline #38216 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@chang-l chang-l 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.

[sorry if i missed it] Did you add test coverage for Ring+Ulysses (Ring+Ulysses+CFG) combined?

Comment thread tensorrt_llm/_torch/visual_gen/config.py
Comment thread tensorrt_llm/_torch/visual_gen/utils.py Outdated
Comment thread tensorrt_llm/_torch/visual_gen/models/ltx2/transformer_ltx2.py Outdated
Comment thread tensorrt_llm/_torch/visual_gen/utils.py Outdated
Comment thread tensorrt_llm/_torch/visual_gen/attention_backend/parallel.py Outdated
Comment thread docs/source/models/visual-generation.md
Comment thread docs/source/models/visual-generation.md Outdated
Comment thread tensorrt_llm/_torch/visual_gen/mapping.py
@NVShreyas

Copy link
Copy Markdown
Collaborator Author

Ring+Ulysses (Ring+Ulysses+CFG) combined?

Yes Ring+ulysses tests exist. I have added new tests for CFG+Ulysses+Ring

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #48642 [ run ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@chang-l chang-l 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.

Thanks for the effort!

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #48642 [ run ] completed with state SUCCESS. Commit: e5d0bc2
/LLM/main/L0_MergeRequest_PR pipeline #38423 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #48928 [ run ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot kill

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49205 [ kill ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #48928 [ run ] completed with state ABORTED. Commit: e5d0bc2

Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49205 [ kill ] completed with state SUCCESS. Commit: e5d0bc2
Successfully killed previous jobs for commit e5d0bc2

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49213 [ run ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49213 [ run ] completed with state SUCCESS. Commit: e5d0bc2
/LLM/main/L0_MergeRequest_PR pipeline #38887 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49243 [ run ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49243 [ run ] completed with state SUCCESS. Commit: e5d0bc2
/LLM/main/L0_MergeRequest_PR pipeline #38914 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49286 [ run ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49286 [ run ] completed with state SUCCESS. Commit: e5d0bc2
/LLM/main/L0_MergeRequest_PR pipeline #38948 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot run --disable-fail-fast

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49442 [ run ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49442 [ run ] completed with state SUCCESS. Commit: e5d0bc2
/LLM/main/L0_MergeRequest_PR pipeline #39087 completed with status: 'FAILURE'

CI Report

⚠️ Action Required:

  • Please check the failed tests and fix your PR
  • If you cannot view the failures, ask the CI triggerer to share details
  • Once fixed, request an NVIDIA team member to trigger CI again

CI Agent Failure Analysis

Link to invocation

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot help

@github-actions

Copy link
Copy Markdown

GitHub Bot Help

/bot [-h] ['run', 'kill', 'skip', 'reuse-pipeline'] ...

Provide a user friendly way for developers to interact with a Jenkins server.

Run /bot [-h|--help] to print this help message.

See details below for each supported subcommand.

Details

run [--reuse-test (optional)pipeline-id --disable-fail-fast --skip-test --stage-list "A10-PyTorch-1, xxx" --gpu-type "A30, H100_PCIe" --test-backend "pytorch, cpp" --add-multi-gpu-test --only-multi-gpu-test --disable-multi-gpu-test --post-merge --extra-stage "H100_PCIe-TensorRT-Post-Merge-1, xxx" --detailed-log --debug(experimental) --high-priority]

Launch build/test pipelines. All previously running jobs will be killed.

--reuse-test (optional)pipeline-id (OPTIONAL) : Allow the new pipeline to reuse build artifacts and skip successful test stages from a specified pipeline or the last pipeline if no pipeline-id is indicated. If the Git commit ID has changed, this option will be always ignored. The DEFAULT behavior of the bot is to reuse build artifacts and successful test results from the last pipeline.

--disable-reuse-test (OPTIONAL) : Explicitly prevent the pipeline from reusing build artifacts and skipping successful test stages from a previous pipeline. Ensure that all builds and tests are run regardless of previous successes.

--disable-fail-fast (OPTIONAL) : Disable fail fast on build/tests/infra failures.

--skip-test (OPTIONAL) : Skip all test stages, but still run build stages, package stages and sanity check stages. Note: Does NOT update GitHub check status.

--stage-list "A10-PyTorch-1, xxx" (OPTIONAL) : Only run the specified test stages. Supports wildcard * for pattern matching (e.g., "*PerfSanity*" matches all stages containing PerfSanity). Examples: "A10-PyTorch-1, xxx", "PerfSanity". Note: Does NOT update GitHub check status.

--gpu-type "A30, H100_PCIe" (OPTIONAL) : Only run the test stages on the specified GPU types. Examples: "A30, H100_PCIe". Note: Does NOT update GitHub check status.

--test-backend "pytorch, cpp" (OPTIONAL) : Skip test stages which don't match the specified backends. Only support [pytorch, cpp, tensorrt, triton]. Examples: "pytorch, cpp" (does not run test stages with tensorrt or triton backend). Note: Does NOT update GitHub pipeline status.

--only-multi-gpu-test (OPTIONAL) : Only run the multi-GPU tests. Note: Does NOT update GitHub check status.

--disable-multi-gpu-test (OPTIONAL) : Disable the multi-GPU tests. Note: Does NOT update GitHub check status.

--add-multi-gpu-test (OPTIONAL) : Force run the multi-GPU tests in addition to running L0 pre-merge pipeline.

--post-merge (OPTIONAL) : Run the L0 post-merge pipeline instead of the ordinary L0 pre-merge pipeline.

--extra-stage "H100_PCIe-TensorRT-Post-Merge-1, xxx" (OPTIONAL) : Run the ordinary L0 pre-merge pipeline and specified test stages. Supports wildcard * for pattern matching. Examples: --extra-stage "H100_PCIe-TensorRT-Post-Merge-1, xxx", --extra-stage "Post-Merge".

--detailed-log (OPTIONAL) : Enable flushing out all logs to the Jenkins console. This will significantly increase the log volume and may slow down the job.

--debug (OPTIONAL) : Experimental feature. Enable access to the CI container for debugging purpose. Note: Specify exactly one stage in the stage-list parameter to access the appropriate container environment. Note: Does NOT update GitHub check status.

--high-priority (OPTIONAL) : Run the pipeline with high priority. This option is restricted to authorized users only and will route the job to a high-priority queue.

kill

kill

Kill all running builds associated with pull request.

skip

skip --comment COMMENT

Skip testing for latest commit on pull request. --comment "Reason for skipping build/test" is required. IMPORTANT NOTE: This is dangerous since lack of user care and validation can cause top of tree to break.

reuse-pipeline

reuse-pipeline

Reuse a previous pipeline to validate current commit. This action will also kill all currently running builds associated with the pull request. IMPORTANT NOTE: This is dangerous since lack of user care and validation can cause top of tree to break.

@NVShreyas

Copy link
Copy Markdown
Collaborator Author

/bot skip --comment "perf regressions are localized to LLMs and unrelated to visual_gen and current changes"

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49492 [ skip ] triggered by Bot. Commit: e5d0bc2 Link to invocation

@tensorrt-cicd

Copy link
Copy Markdown
Collaborator

PR_Github #49492 [ skip ] completed with state SUCCESS. Commit: e5d0bc2
Skipping testing for commit e5d0bc2

Link to invocation

@NVShreyas
NVShreyas merged commit 3b8387c into NVIDIA:main May 21, 2026
7 checks passed
xxi-nv pushed a commit to xxi-nv/TensorRT-LLM that referenced this pull request May 22, 2026
…ualGen (NVIDIA#13821)

Signed-off-by: Venmugil Elango <498703+venmugil@users.noreply.github.com>
Signed-off-by: Shreyas Misra <shreyasm@nvidia.com>
Co-authored-by: Venmugil Elango <498703+venmugil@users.noreply.github.com>
bmarimuthu-nv pushed a commit to nv-auto-deploy/TensorRT-LLM that referenced this pull request May 28, 2026
…ualGen (NVIDIA#13821)

Signed-off-by: Venmugil Elango <498703+venmugil@users.noreply.github.com>
Signed-off-by: Shreyas Misra <shreyasm@nvidia.com>
Co-authored-by: Venmugil Elango <498703+venmugil@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants