Skip to content

[WS1][kernels] Batch-invariant logprob (CUDA)#204

Open
KJLdefeated wants to merge 6 commits into
mainfrom
feat/batch-invariant-logp-cuda
Open

[WS1][kernels] Batch-invariant logprob (CUDA)#204
KJLdefeated wants to merge 6 commits into
mainfrom
feat/batch-invariant-logp-cuda

Conversation

@KJLdefeated

@KJLdefeated KJLdefeated commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

[WS1][kernels] SM90 Batch-Invariant logprob CUDA Kernel

Summary

Adds a Hopper (SM90) TMA CUDA kernel for the batch-invariant selected-token log-probability operator introduced in #199 plus a Native/Triton/CUDA benchmark. The operator computes, from already materialized logits:

logp[t] = logits[t, target_ids[t]] - logsumexp(logits[t, :])

The kernel streams the vocab through shared memory with TMA bulk-tensor copies and folds it into a running online log-sum-exp, so it never materializes the [N, V] softmax and its extra forward memory is ~0. It is registered as the
top-priority CUDA backend on Hopper and falls back cleanly everywhere else.

Path Status
CUDA SM90 forward (csrc/cuda/batch_invariant_logp_kernel_sm90.cu) TMA online-softmax, bf16 + fp32, one CTA per row. New.
Python op (BatchInvariantLogpSM90Op) Autograd wrapper; TMA forward + tile-wise backward. New.
Backward Reuses #199's Triton tile-wise backward via the forward-saved lse (no [N, V] materialization).
Registry Hardware-gated: inserted at the front of the CUDA batch_invariant_logp list only when the SM90 symbol is compiled on cc_major == 9.
Fallback Non-bf16/fp32, unaligned vocab row stride, or non-Hopper → Triton, else native.
Benchmark benchmarks/benchmark_batch_invariant_logp.py compares Native/Triton/CUDA. New.

This builds on the open branch for #199 (Native + Triton). Reviewed after #199 merges.

Implementation

  • New kernel csrc/cuda/batch_invariant_logp_kernel_sm90.cu.
  • Binding in csrc/ops.cpp and build source in setup.py's sm90_srcs; stub in rl_engine/_C.pyi.
  • Python op rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py:
    • _BatchInvariantLogpSM90Function forward calls the compiled kernel;
    • backward reuses Triton _batch_invariant_logp_bwd_kernel.
  • Registry rl_engine/kernels/registry.py.
  • Docs/benchmark: updated docs/operators/batch-invariant-logp.md; added the benchmark script.

Validation environment

Item Value
GPU NVIDIA H200 (Hopper, SM90, compute capability 9.0)
Driver 550.127.08 (CUDA driver 12.4)
CUDA toolkit / nvcc 12.8, V12.8.93 (conda nvidia channel)
PyTorch 2.11.0+cu128
Python 3.11.15
Host compiler gcc 12.5.0
Extension KERNEL_ALIGN_FORCE_SM90=1, _C.batch_invariant_logp_sm90 available
Build vars TORCH_CUDA_ARCH_LIST=9.0a, KERNEL_ALIGN_DEV_RPATH=1

Correctness / Tests

Unit coverage

python -m pytest tests/test_batch_invariant_logp.py -q -rs

Result: 67 passed (14 new SM90-kernel tests: correctness fp32/bf16, large and unaligned vocab, single-token, 3-D, bitwise batch-invariance, backward, ignore-index, fp16 fallback; plus the registry-dispatch test now accepting the CUDA op).

python -m pytest tests/test_batch_invariant_logp.py -k CudaSM90 -q

Result: 14 passed. Registry selects BatchInvariantLogpSM90Op on the H200:

Detected TMA-capable architecture (SM90); ...
Successfully linked to precompiled _C.batch_invariant_logp_sm90 kernel.

Vocab sweep (bf16, vs log_softmax + gather)

Correct on both TMA-aligned and unaligned (tail-path) vocab sizes:

V 256 300 400 1024 50257 128256 151936
max abs err 0 0 4.8e-7 4.8e-7 9.5e-7 9.5e-7 9.5e-7

Benchmarks

python benchmarks/benchmark_batch_invariant_logp.py — bf16, H200, 20 iters + 5 warmup. Memory is peak extra above baseline (MB).

Forward

shape (N x V) native ms triton ms cuda ms cuda vs native cuda vs triton native MB triton MB cuda MB
4096x32768 1.341 0.148 0.090 14.8x 1.64x 1536 0 0
4096x128256 4.964 0.566 0.323 15.4x 1.75x 6012 0 0
4096x151936 5.908 0.669 0.384 15.4x 1.74x 7122 0 0
8192x128256 9.904 1.056 0.597 16.6x 1.77x 12024 0 0

Forward + backward

shape (N x V) native ms triton ms cuda ms cuda vs native cuda vs triton native MB triton MB cuda MB
4096x32768 3.549 0.463 0.407 8.7x 1.14x 1792 512 512
4096x128256 13.173 1.750 1.510 8.7x 1.16x 7014 2004 2004
4096x151936 15.632 2.072 1.788 8.7x 1.16x 8310 2376 2376
8192x128256 26.211 3.416 2.955 8.9x 1.16x 14028 4008 4008

Files

  • csrc/cuda/batch_invariant_logp_kernel_sm90.cu (new)
  • rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py (new)
  • benchmarks/benchmark_batch_invariant_logp.py (new)
  • csrc/ops.cpp, setup.py, rl_engine/_C.pyi, rl_engine/kernels/registry.py
  • tests/test_batch_invariant_logp.py, docs/operators/batch-invariant-logp.md

Summary by CodeRabbit

  • New Features
    • Added the batch-invariant selected log-probability operator with multiple backends, including a high-performance CUDA (Hopper/SM90) implementation on compatible devices.
    • Added a benchmark script to compare latency and memory across implementations.
  • Bug Fixes
    • Improved consistency for ignore_index handling, validation, and graceful fallback when an optimized backend isn’t available.
  • Documentation
    • Added operator docs (usage, semantics, supported backends) and navigation entries, including benchmark results.
  • Tests
    • Added a comprehensive test suite covering correctness, gradients, batch invariance, edge cases, and backend dispatch.

hihaluemen and others added 5 commits June 28, 2026 20:06
Implements batch_invariant_logp for selected-token log probabilities from materialized logits with row-local, batch-invariant semantics.

- PyTorch NativeBatchInvariantLogpOp: FP32 row-wise reference with ignore_index handling and target validation.

- Triton TritonBatchInvariantLogpOp: online-softmax forward with fixed vocab tiling and tile-wise backward using saved per-row lse.

- Registry dispatch, PyTorch/Triton tests, and operator docs.
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fb33fce7-d33d-4660-a53e-2febc1fd4b76

📥 Commits

Reviewing files that changed from the base of the PR and between 603a7e1 and f27da18.

📒 Files selected for processing (4)
  • benchmarks/benchmark_batch_invariant_logp.py
  • csrc/cuda/batch_invariant_logp_kernel_sm90.cu
  • docs/operators/batch-invariant-logp.md
  • rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py
✅ Files skipped from review due to trivial changes (1)
  • docs/operators/batch-invariant-logp.md
🚧 Files skipped from review as they are similar to previous changes (2)
  • rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py
  • csrc/cuda/batch_invariant_logp_kernel_sm90.cu

📝 Walkthrough

Walkthrough

Adds a new batch_invariant_logp operator with native PyTorch, Triton, and CUDA SM90 TMA backends. It wires the operator into the registry, build, benchmarks, tests, and documentation, and adds a local _dev_notes/ ignore rule.

Changes

Batch-invariant logp operator

Layer / File(s) Summary
Native PyTorch reference implementation
rl_engine/kernels/ops/pytorch/loss/batch_invariant_logp.py
NativeBatchInvariantLogpOp computes selected log-probabilities via explicit FP32 logsumexp with shape validation and ignore_index masking.
Triton forward/backward kernels
rl_engine/kernels/ops/triton/loss/batch_invariant_logp.py
Adds forward/backward Triton kernels with online log-sum-exp reduction and an autograd wrapper TritonBatchInvariantLogpOp with validation.
CUDA SM90 TMA kernel and bindings
csrc/cuda/batch_invariant_logp_kernel_sm90.cu, csrc/ops.cpp, rl_engine/_C.pyi, setup.py
Adds the TMA-based CUDA kernel, forward entrypoint, pybind and type-stub bindings, and adds the source to the SM90 build.
CUDA SM90 Python wrapper and fallback
rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py
Adds SM90 support detection, fallback to Triton/native, an autograd Function calling the compiled kernel, and BatchInvariantLogpSM90Op dispatch wrapper.
Kernel registry wiring
rl_engine/kernels/registry.py
Adds OpBackend entries and priority maps for cuda/rocm/cpu, plus hardware probing to prefer SM90 when available.
Test suite for all backends
tests/test_batch_invariant_logp.py
Adds correctness, batch-invariance, gradient, validation, fallback, and registry dispatch tests across all backends.
Benchmark script
benchmarks/benchmark_batch_invariant_logp.py
Adds a script comparing latency and peak VRAM across native, Triton, and optional SM90 backends with CLI configuration and backward mode.
Operator documentation
docs/operators/batch-invariant-logp.md, docs/operators/README.md, docs/.nav.yml
Adds documentation describing the operator contract, backends, benchmarks, and usage, linked in navigation and the operator index.
Local dev notes ignore rule
.gitignore
Adds a local-only ignore rule for _dev_notes/.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Caller
  participant KernelRegistry
  participant BatchInvariantLogpSM90Op
  participant _BatchInvariantLogpSM90Function
  participant TritonBatchInvariantLogpOp
  participant NativeBatchInvariantLogpOp

  Caller->>KernelRegistry: get_op("batch_invariant_logp")
  KernelRegistry-->>Caller: selected backend op
  Caller->>BatchInvariantLogpSM90Op: __call__(logits, target_ids, ignore_index)
  BatchInvariantLogpSM90Op->>BatchInvariantLogpSM90Op: check shape, dtype, alignment
  alt SM90 supported
    BatchInvariantLogpSM90Op->>_BatchInvariantLogpSM90Function: apply()
    _BatchInvariantLogpSM90Function->>_BatchInvariantLogpSM90Function: call compiled SM90 kernel forward
    _BatchInvariantLogpSM90Function-->>BatchInvariantLogpSM90Op: logp, lse
  else unsupported input
    BatchInvariantLogpSM90Op->>TritonBatchInvariantLogpOp: apply() (fallback)
    alt Triton unavailable
      TritonBatchInvariantLogpOp->>NativeBatchInvariantLogpOp: apply() (fallback)
      NativeBatchInvariantLogpOp-->>BatchInvariantLogpSM90Op: logp
    else Triton available
      TritonBatchInvariantLogpOp-->>BatchInvariantLogpSM90Op: logp
    end
  end
  BatchInvariantLogpSM90Op-->>Caller: selected log-probability
Loading

Suggested labels: needs-gpu-ci

Suggested reviewers: inaniloquentee, Flink-ddd, bitborne

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly reflects the main change: a CUDA batch-invariant logprob implementation.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/batch-invariant-logp-cuda
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch feat/batch-invariant-logp-cuda

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 9

🧹 Nitpick comments (3)
tests/test_batch_invariant_logp.py (2)

45-56: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Narrow the broad exception catch.

Catching bare Exception to detect kernel availability masks unrelated failures (e.g., a broken _C module import due to an ABI mismatch) as "SM90 not available," silently skipping tests instead of surfacing the real problem.

🔧 Suggested narrowing
     try:
         from rl_engine.kernels.ops.base import _C, _EXT_AVAILABLE
-    except Exception:
+    except ImportError:
         return False
🤖 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/test_batch_invariant_logp.py` around lines 45 - 56, The
_sm90_kernel_available helper is swallowing unrelated import failures by
catching a broad Exception when importing rl_engine.kernels.ops.base. Narrow
this to the specific import error(s) expected for missing kernel bindings, and
keep the availability check in _sm90_kernel_available focused on genuine “not
installed/not built” cases so ABI or module breakages still surface during
tests.

Source: Linters/SAST tools


831-1020: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Missing validation-error test coverage for the SM90 backend.

Every other backend has a dedicated validation test class (TestValidation for native at lines 294-324, TestTritonValidation/TestTritonCPUValidation at lines 788-824), but there is no equivalent for BatchInvariantLogpSM90Op (e.g., rejecting 1D logits, shape mismatches, or out-of-range targets). Given the PR objective explicitly calls out "expanded tests covering correctness, backward, ignore-index, alignment, and fallback behavior," validation parity across backends would close a gap.

🤖 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/test_batch_invariant_logp.py` around lines 831 - 1020, Add a SM90
validation test class for BatchInvariantLogpSM90Op to match the existing backend
coverage in TestValidation and TestTritonValidation/TestTritonCPUValidation. In
tests/test_batch_invariant_logp.py, create cases that assert invalid inputs are
rejected for the BatchInvariantLogpSM90Op path, such as 1D logits, mismatched
logits/target shapes, and targets outside the vocabulary range. Keep the tests
grouped near the other TestCudaSM90* classes and use _get_op() so the new
coverage clearly targets the SM90 backend.
rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py (1)

22-35: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Narrow the fallback exception handling.

Only the import path should fall back for missing Triton. Catching every Exception around the backward kernel can mask real kernel failures and silently take the full [N, V] PyTorch fallback.

Suggested shape
-        try:
+        try:
             import triton
 
             from rl_engine.kernels.ops.triton.loss.batch_invariant_logp import (
                 _BLOCK_V,
                 _batch_invariant_logp_bwd_kernel,
             )
+        except (ImportError, ModuleNotFoundError):  # pragma: no cover - Triton missing
+            ...
+        else:
 
             grid = (num_tokens, triton.cdiv(vocab_size, _BLOCK_V))
             _batch_invariant_logp_bwd_kernel[grid](
                 ...
             )
-        except Exception:  # pragma: no cover - Triton missing
+        # PyTorch fallback for the missing-Triton branch only.

Also applies to: 67-89

🤖 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 `@rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py` around lines 22 -
35, The _fallback_op helper currently catches every Exception, which can hide
real Triton/kernel failures and incorrectly route to the PyTorch fallback.
Narrow the exception handling in batch_invariant_logp so only Triton
import/module-missing cases fall back to NativeBatchInvariantLogpOp, and let
actual kernel errors propagate; update the same logic wherever the fallback is
duplicated in the backward path referenced by TritonBatchInvariantLogpOp and
NativeBatchInvariantLogpOp.

Source: Linters/SAST tools

🤖 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 `@benchmarks/benchmark_batch_invariant_logp.py`:
- Around line 77-88: The VRAM helper currently hardcodes its warmup and
iteration counts, so CLI overrides are ignored for memory measurement. Update
`_peak_vram_gb` to accept the same `warmup` and `iters` inputs used by
`_time_ms`, and change the call sites in `benchmark_batch_invariant_logp` to
pass `args.warmup` and `args.iters` so timing and VRAM runs stay consistent.
- Around line 63-92: The timing and memory helpers are hardcoded to torch.cuda
even though run_benchmark supports xpu, so the benchmark will break on Intel
GPUs. Update _time_ms and _peak_vram_gb to dispatch through the active backend
in device_ctx.device_type, using torch.xpu for xpu and torch.cuda for cuda/hip,
including synchronize, Event creation, empty_cache, memory_allocated,
reset_peak_memory_stats, and max_memory_allocated calls.

In `@csrc/cuda/batch_invariant_logp_kernel_sm90.cu`:
- Around line 179-200: The SM90 entrypoint in batch_invariant_logp_sm90_forward
currently assumes the current CUDA context matches logits, and it also only
validates target shape, not device. Add a CUDA device guard based on logits
before any allocation or launch, and add a TORCH_CHECK that target is on the
same CUDA device as logits (and CUDA at all) alongside the existing logits
checks. Keep the validation and setup near batch_invariant_logp_sm90_forward so
direct calls through the exported binding are safe even when the Python wrapper
is bypassed.

In `@docs/operators/batch-invariant-logp.md`:
- Around line 85-100: The “Forward + backward” measurements in the
batch-invariant logp docs are not reproducible from the current benchmark path.
Update the benchmark source used by run_benchmark so it actually exercises and
times a backward pass (including VRAM tracking), or else remove/qualify this
table as coming from a different benchmark variant. Use the existing benchmark
identifiers in benchmark_batch_invariant_logp.py and its run_benchmark flow to
keep the documentation aligned with the script.

In `@rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py`:
- Around line 114-130: The SM90 wrapper currently disables target validation by
default in BatchInvariantLogp.__call__ and apply, which can allow unsafe CUDA
gathers for bad non-ignored targets. Update the default in these methods so
validate matches the native operator’s behavior (true by default), and keep an
explicit opt-out path for callers that already validated targets. Preserve the
existing ignore_index handling and ensure the wrapper forwards the validate flag
consistently through BatchInvariantLogp.
- Around line 12-19: The `_sm90_supported` guard only checks tensor device type
and alignment, so tensors from non-Hopper CUDA devices can still route into the
SM90 TMA path. Update `_sm90_supported` to also verify the input logits’ CUDA
capability (cc_major == 9) on the tensor’s current device, alongside the
existing dtype and stride-multiple-of-16 checks, so cached registry entries
correctly fall back for non-SM90 GPUs.

In `@rl_engine/kernels/ops/pytorch/loss/batch_invariant_logp.py`:
- Around line 115-124: The shape validator in _validate_shapes currently allows
non-integral target_ids and empty vocabularies to slip through. Update
_validate_shapes in batch_invariant_logp.py to first reject target_ids unless
they are an integer/long type before any cast happens in apply(), and add an
explicit check that logits.size(-1) is greater than zero before proceeding. Keep
the existing logits/target_ids shape checks in place after these new
validations.

In `@rl_engine/kernels/ops/triton/loss/batch_invariant_logp.py`:
- Around line 202-212: The Triton batch-invariant logp path defaults validation
off, which makes it inconsistent with the native backend and can hide invalid
target IDs. Update the default in the BatchInvariantLogp call/apply flow so
validation is enabled by default, matching the native implementation; adjust the
default value on the validate parameter in the relevant method(s) and ensure
BatchInvariantLogp.apply preserves that default behavior.
- Around line 219-245: `_BatchInvariantLogpFunction.apply` currently validates
shapes and index ranges but not the dtype of `target_ids`, so non-integer inputs
can be silently converted later. Add an explicit integer-type check in the
validation path of the batch invariant logp function before
`target_ids.reshape(-1)` is used, and raise a clear `ValueError` for float,
bool, complex, or other non-integer dtypes. Keep the existing shape and range
checks in place and ensure the new check is near the `validate` block in
`batch_invariant_logp.py`.

---

Nitpick comments:
In `@rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py`:
- Around line 22-35: The _fallback_op helper currently catches every Exception,
which can hide real Triton/kernel failures and incorrectly route to the PyTorch
fallback. Narrow the exception handling in batch_invariant_logp so only Triton
import/module-missing cases fall back to NativeBatchInvariantLogpOp, and let
actual kernel errors propagate; update the same logic wherever the fallback is
duplicated in the backward path referenced by TritonBatchInvariantLogpOp and
NativeBatchInvariantLogpOp.

In `@tests/test_batch_invariant_logp.py`:
- Around line 45-56: The _sm90_kernel_available helper is swallowing unrelated
import failures by catching a broad Exception when importing
rl_engine.kernels.ops.base. Narrow this to the specific import error(s) expected
for missing kernel bindings, and keep the availability check in
_sm90_kernel_available focused on genuine “not installed/not built” cases so ABI
or module breakages still surface during tests.
- Around line 831-1020: Add a SM90 validation test class for
BatchInvariantLogpSM90Op to match the existing backend coverage in
TestValidation and TestTritonValidation/TestTritonCPUValidation. In
tests/test_batch_invariant_logp.py, create cases that assert invalid inputs are
rejected for the BatchInvariantLogpSM90Op path, such as 1D logits, mismatched
logits/target shapes, and targets outside the vocabulary range. Keep the tests
grouped near the other TestCudaSM90* classes and use _get_op() so the new
coverage clearly targets the SM90 backend.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: b1bd5092-d130-4cca-b342-e7dd0294cf08

📥 Commits

Reviewing files that changed from the base of the PR and between aee6d3b and 603a7e1.

📒 Files selected for processing (14)
  • .gitignore
  • benchmarks/benchmark_batch_invariant_logp.py
  • csrc/cuda/batch_invariant_logp_kernel_sm90.cu
  • csrc/ops.cpp
  • docs/.nav.yml
  • docs/operators/README.md
  • docs/operators/batch-invariant-logp.md
  • rl_engine/_C.pyi
  • rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py
  • rl_engine/kernels/ops/pytorch/loss/batch_invariant_logp.py
  • rl_engine/kernels/ops/triton/loss/batch_invariant_logp.py
  • rl_engine/kernels/registry.py
  • setup.py
  • tests/test_batch_invariant_logp.py

Comment thread benchmarks/benchmark_batch_invariant_logp.py Outdated
Comment thread benchmarks/benchmark_batch_invariant_logp.py Outdated
Comment thread csrc/cuda/batch_invariant_logp_kernel_sm90.cu
Comment thread docs/operators/batch-invariant-logp.md
Comment thread rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py
Comment thread rl_engine/kernels/ops/cuda/loss/batch_invariant_logp.py
Comment thread rl_engine/kernels/ops/pytorch/loss/batch_invariant_logp.py
Comment thread rl_engine/kernels/ops/triton/loss/batch_invariant_logp.py
Comment thread rl_engine/kernels/ops/triton/loss/batch_invariant_logp.py
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