Skip to content

feat(speculative): add Qwen3-VL support for DFlash training - #1887

Open
skierat wants to merge 3 commits into
NVIDIA:mainfrom
skierat:skierat/qwen3-vl-dflash-training
Open

skierat wants to merge 3 commits into
NVIDIA:mainfrom
skierat:skierat/qwen3-vl-dflash-training

Conversation

@skierat

@skierat skierat commented Jul 2, 2026 •

Copy link
Copy Markdown
Contributor

What does this PR do?

Type of change: new feature

Adds online DFlash training support for Qwen3-VL–style vision-language models.

Changes include:

  • Load VLMs through the Transformers 5 AutoModelForImageTextToText API, while retaining compatibility with the legacy VLM auto-model API.
  • Run the base model through its top-level multimodal forward when image/video inputs are present, ensuring vision embeddings are injected before collecting DFlash target hidden states.
  • Extend VisionLanguageDataCollator to:
    • propagate answer_only_loss, chat-template, and DFlash label-alignment settings;
    • apply VLM_MIN_PIXELS / VLM_MAX_PIXELS processor limits;
    • derive assistant-only masks from ChatML/Llama chat boundaries when processor generation masks are unavailable;
    • enforce the fixed training_seq_len required by DFlash block training.
  • Preserve the existing text-only DFlash path.

Usage

python -m torch.distributed.run \                                      
--nproc_per_node 4 \                                                 
examples/speculative_decoding/main.py \                              
--config modelopt_recipes/general/speculative_decoding/dflash.yaml \
model.model_name_or_path=/path/to/qwen3-vl-model \
model.trust_remote_code=true \
data.data_path=/path/to/train.jsonl \
data.vlm_processor=/path/to/qwen3-vl-model \                        
data.vlm_img_dir=/path/to/image/root \
training.training_seq_len=4096 \
training.answer_only_loss=true \
dflash.dflash_block_size=8 \
dflash.dflash_mask_token_id=151669


### Testing
- git diff --check
- Parsed all modified Python modules successfully.
- Ran iterative multi-node Slurm smoke tests with a Qwen3-VL-family model and mixed multimodal data:
    - validated VLM model loading with Transformers 5;
    - validated distributed initialization, DFlash conversion, and VLM collation paths;
    - identified and addressed processor padding/truncation behavior required by fixed-size DFlash blocks.
This PR remains draft pending a completed end-to-end training smoke test and automated regression coverage.

### Before your PR is "Ready for review"
Make sure you read and follow Contributor guidelines (https://github.com/NVIDIA/Model-Optimizer/blob/main/CONTRIBUTING.md) and your commits are signed (git commit -s -S).
Make sure you read and follow the Security Best Practices (https://github.com/NVIDIA/Model-Optimizer/blob/main/SECURITY.md#security-coding-practices-for-contributors) (e.g. avoiding hardcoded trust_remote_code=True, torch.load(...,
weights_only=False), pickle, etc.).
- Is this change backward compatible?: ✅
- If you copied code from any other sources or added a new PIP dependency, did you follow guidance in CONTRIBUTING.md: N/A
- Did you write any new necessary tests?: ❌ — automated Qwen3-VL/DFlash regression coverage still needs to be added before review.
- Did you update Changelog (https://github.com/NVIDIA/Model-Optimizer/blob/main/CHANGELOG.rst)?: ❌ — evaluate and add an entry before marking ready for review if this is considered user-facing speculative-decoding support.
- Did you get Claude approval on this PR?: N/A
### Additional Information
The PR intentionally excludes local Slurm launch scripts, logs, model paths, datasets, and environment-specific configuration.


<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

* **New Features**
  * Enhanced vision-language training with tokenizer/chat-template alignment, improved answer-only loss handling, and more consistent label shifting.
  * Expanded multimodal support with configurable VLM pixel-count bounds (via environment settings) to control processor expansion.

* **Bug Fixes**
  * More resilient JSONL dataset loading with an automatic-to-manual fallback for local, non-streaming inputs.
  * Improved training-time multimodal forward handling, including validation of hidden-state outputs.
  * More reliable distributed training behavior when no valid blocks are found, keeping gradient synchronization stable.

* **Tests**
  * Added coverage for Transformers VLM auto-model selection and multimodal collation label/mask correctness.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

@skierat
skierat requested review from a team as code owners July 2, 2026 14:55
@skierat
skierat requested review from cjluo-nv and h-guo18 July 2, 2026 14:55
@copy-pr-bot

copy-pr-bot Bot commented Jul 2, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai

coderabbitai Bot commented Jul 2, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This PR extends speculative decoding support for vision-language models by adding JSONL fallback dataset loading, expanding multimodal collation and masking, wiring the new collator options through the example path, broadening VLM auto-model selection, and updating HFDFlashModel’s multimodal forward and zero-loss handling.

Changes

VLM training and data pipeline updates

Layer / File(s) Summary
Dataset loading and VLM collator core changes
modelopt/torch/utils/plugins/transformers_dataset.py, tests/unit/torch/utils/test_transformers_dataset.py
Adds JSONL fallback in ShardedDataset._load_dataset; updates VisionLanguageDataCollator with shift_labels, VLM_MIN_PIXELS/VLM_MAX_PIXELS processor config, chat-template syncing, marker-derived assistant masks, _build_assistant_masks, _pad_sequence_tensors, revised sample processing, and a unit test for masking and padding behavior.
Collator wiring in example script
examples/speculative_decoding/eagle_utils.py
Passes chat_template, answer_only_loss, and shift_labels to the online VLM collator.
VLM auto-model class resolution
modelopt/torch/speculative/utils.py, tests/unit/torch/speculative/plugins/test_fakebase.py
Updates load_vlm_or_llm to prefer AutoModelForVision2Seq, fall back to AutoModelForImageTextToText, then architecture lookup, and adds coverage for the Transformers 5 VLM auto-model path.
Multimodal forward and loss handling in HFDFlashModel
modelopt/torch/speculative/plugins/hf_dflash.py
Routes multimodal inputs through top-level forward with hidden_states validation and changes the zero-loss dummy tensor to include all trainable dflash_module parameters.

Estimated code review effort: 3 (Moderate) | ~35 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Trainer
  participant VisionLanguageDataCollator
  participant Processor
  participant HFDFlashModel

  Trainer->>VisionLanguageDataCollator: collate multimodal batch
  VisionLanguageDataCollator->>Processor: from_pretrained with pixel bounds
  VisionLanguageDataCollator->>VisionLanguageDataCollator: build assistant masks and labels
  VisionLanguageDataCollator-->>Trainer: batch tensors and labels
  Trainer->>HFDFlashModel: forward(batch)
  HFDFlashModel->>HFDFlashModel: detect multimodal kwargs
  HFDFlashModel->>HFDFlashModel: super().forward with hidden_states
  HFDFlashModel-->>Trainer: outputs or zero-loss return
Loading
🚥 Pre-merge checks | ✅ 6
✅ Passed checks (6 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding Qwen3-VL support for speculative DFlash training.
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.
Security Anti-Patterns ✅ Passed PASS: The diff adds no unsafe torch/numpy loads, no hardcoded trust_remote_code=True, no eval/exec, no new # nosec, and no dependency-manifest changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

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

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

Actionable comments posted: 2

🤖 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 `@modelopt/torch/speculative/utils.py`:
- Around line 613-620: The model class resolution in utils.py currently prefers
AutoModelForVision2Seq before AutoModelForImageTextToText, which keeps using the
deprecated alias when both are available. Update the fallback order in the model
class lookup so AutoModelForImageTextToText is tried first, then fall back to
AutoModelForVision2Seq, and keep the architecture-based fallback in the same
resolution chain.

In `@modelopt/torch/utils/plugins/transformers_dataset.py`:
- Around line 537-545: The padding logic in `pad_tokenized_messages` only
extends `input_ids` and `attention_mask`, but it also needs to pad
`assistant_masks` when `apply_chat_template()` returns that tensor. Update the
sequence-padding loop near the existing `tokenized_messages.get(key)` handling
to include `assistant_masks` with the same `pad_width`, preserving tensor shape
consistency for the downstream `answer_only_loss` path in
`transformers_dataset`.
🪄 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: 77e86707-9ddf-4546-8afc-48443831de63

📥 Commits

Reviewing files that changed from the base of the PR and between 9038b71 and 16bad92.

📒 Files selected for processing (4)
  • examples/speculative_decoding/eagle_utils.py
  • modelopt/torch/speculative/plugins/hf_dflash.py
  • modelopt/torch/speculative/utils.py
  • modelopt/torch/utils/plugins/transformers_dataset.py

Comment on lines +613 to +620
# ``AutoModelForVision2Seq`` was renamed in Transformers 5. Prefer the
# legacy alias when present, then use the current auto-model entry point.
model_cls = getattr(transformers, "AutoModelForVision2Seq", None)
if model_cls is None:
model_cls = getattr(transformers, "AutoModelForImageTextToText", None)
if model_cls is None:
architecture = (getattr(model_config, "architectures", None) or [None])[0]
model_cls = getattr(transformers, architecture, None) if architecture else None

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the relevant file and nearby logic
git ls-files modelopt/torch/speculative/utils.py
wc -l modelopt/torch/speculative/utils.py
sed -n '580,660p' modelopt/torch/speculative/utils.py

# Search for related auto-model selection logic
rg -n "AutoModelForVision2Seq|AutoModelForImageTextToText|architectures|FutureWarning" modelopt/torch/speculative -S

Repository: NVIDIA/Model-Optimizer

Length of output: 4378


🌐 Web query:

Hugging Face AutoModelForVision2Seq deprecated removed in v5 use AutoModelForImageTextToText FutureWarning

💡 Result:

The class AutoModelForVision2Seq was deprecated in earlier versions of the Hugging Face Transformers library and has been officially removed in version 5.0.0 [1][2][3]. To resolve the FutureWarning or import errors resulting from this change, you should update your code to use AutoModelForImageTextToText instead [4][1][5]. This change is part of the broader cleanup and architectural updates introduced in Transformers v5 [6][3]. If you are encountering this in your codebase, replacing all instances of AutoModelForVision2Seq with AutoModelForImageTextToText will restore compatibility with the v5.x ecosystem [1][7].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Find the Transformers version constraints used by this repo
rg -n "transformers|tf_latest|AutoModelForImageTextToText|AutoModelForVision2Seq" pyproject.toml requirements*.txt noxfile.py modelopt tests -S

Repository: NVIDIA/Model-Optimizer

Length of output: 50378


🌐 Web query:

Transformers 4.56 AutoModelForVision2Seq AutoModelForImageTextToText both available deprecation warning

💡 Result:

In the Hugging Face Transformers library, AutoModelForVision2Seq is deprecated and has been superseded by AutoModelForImageTextToText [1][2][3]. In version 4.56, using AutoModelForVision2Seq triggers a FutureWarning because it is slated for removal in version 5.0 [4][3][5]. The library has explicitly transitioned to AutoModelForImageTextToText as the standard class for handling vision-language (image-text-to-text) models [6][7]. To resolve this deprecation warning, you should update your code to replace any instances of AutoModelForVision2Seq with AutoModelForImageTextToText [1][8]. For example: Instead of: from transformers import AutoModelForVision2Seq model = AutoModelForVision2Seq.from_pretrained("model-name") Use: from transformers import AutoModelForImageTextToText model = AutoModelForImageTextToText.from_pretrained("model-name")

Citations:


Prefer AutoModelForImageTextToText first

AutoModelForVision2Seq is still present in the supported 4.56+ range and emits a FutureWarning, so this order keeps taking the deprecated path whenever both classes exist. Try the new class first, then fall back to the legacy alias for older installs.

🤖 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 `@modelopt/torch/speculative/utils.py` around lines 613 - 620, The model class
resolution in utils.py currently prefers AutoModelForVision2Seq before
AutoModelForImageTextToText, which keeps using the deprecated alias when both
are available. Update the fallback order in the model class lookup so
AutoModelForImageTextToText is tried first, then fall back to
AutoModelForVision2Seq, and keep the architecture-based fallback in the same
resolution chain.

Comment on lines +537 to +545
for key, pad_value in (
("input_ids", self.tokenizer.pad_token_id),
("attention_mask", 0),
):
value = tokenized_messages.get(key)
if not isinstance(value, torch.Tensor):
continue
pad = value.new_full((value.shape[0], pad_width), pad_value)
tokenized_messages[key] = torch.cat((value, pad), dim=1)

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.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Pad assistant_masks with the other sequence tensors.

When marker-derived masks are not used, apply_chat_template() can return assistant_masks; if the processor also ignored padding="max_length", this helper pads input_ids/attention_mask but leaves assistant_masks short. Line 595 can then fail with a shape mismatch under answer_only_loss=True.

Proposed fix
         for key, pad_value in (
             ("input_ids", self.tokenizer.pad_token_id),
             ("attention_mask", 0),
+            ("assistant_masks", 0),
         ):
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
for key, pad_value in (
("input_ids", self.tokenizer.pad_token_id),
("attention_mask", 0),
):
value = tokenized_messages.get(key)
if not isinstance(value, torch.Tensor):
continue
pad = value.new_full((value.shape[0], pad_width), pad_value)
tokenized_messages[key] = torch.cat((value, pad), dim=1)
for key, pad_value in (
("input_ids", self.tokenizer.pad_token_id),
("attention_mask", 0),
("assistant_masks", 0),
):
value = tokenized_messages.get(key)
if not isinstance(value, torch.Tensor):
continue
pad = value.new_full((value.shape[0], pad_width), pad_value)
tokenized_messages[key] = torch.cat((value, pad), dim=1)
🤖 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 `@modelopt/torch/utils/plugins/transformers_dataset.py` around lines 537 - 545,
The padding logic in `pad_tokenized_messages` only extends `input_ids` and
`attention_mask`, but it also needs to pad `assistant_masks` when
`apply_chat_template()` returns that tensor. Update the sequence-padding loop
near the existing `tokenized_messages.get(key)` handling to include
`assistant_masks` with the same `pad_width`, preserving tensor shape consistency
for the downstream `answer_only_loss` path in `transformers_dataset`.

@h-guo18

h-guo18 commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

/claude review

@claude claude 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.

Claude review — findings summary.

Totals: CRITICAL: 0, IMPORTANT: 1, SUGGESTION: 0

Scope reviewed: All 4 changed files in the PR (transformers_dataset.py, hf_dflash.py, speculative/utils.py, eagle_utils.py). The base-tip diff also surfaced unrelated main-branch drift in other files (e.g. examples/hf_ptq/README.md); those are not part of this PR and were not reviewed.

Most impactful finding (IMPORTANT — inline on transformers_dataset.py):
_pad_sequence_tensors pads input_ids/attention_mask to train_len but not assistant_masks. On the generation-tag VLM path (return_assistant_tokens_mask=True, i.e. no recognized ChatML/Llama markers) combined with a processor that ignores padding="max_length" — the exact case this method exists for — the mask returns at the pre-pad length while input_ids is padded, producing a shape mismatch in _process_multimodal_sample's masked label assignment. The primary Qwen3-VL marker path is unaffected because _build_assistant_masks builds the mask via torch.zeros_like(input_ids) after padding.

Other observations (no action needed):

  • The rebuilt DDP dummy-loss (summing param.reshape(-1)[0] * 0.0 over all trainable draft params) is a correct improvement over the prior single-fc.weight reference — it marks every draft parameter as graph-participating so DDP reduction completes on ranks with no valid answer-only labels.
  • The multimodal top-level-forward routing and the AutoModelForVision2Seq/AutoModelForImageTextToText/architecture fallback chain both look sound. (Note: CodeRabbit suggested preferring AutoModelForImageTextToText first as the non-deprecated alias — worth considering, but not a correctness issue.)
  • shift_labels plumbing is consistent end-to-end (main.py passes shift_labels=not is_dflash; DFlash uses unshifted labels as documented).

Risk assessment: Low-to-moderate. The core Qwen3-VL path is well-guarded; the one blocking issue is confined to the alternate generation-tag masking path. Note the PR is still marked draft (no automated regression coverage yet) and CodeRabbit's pre-merge gate flags two new # nosec comments that violate SECURITY.md — resolve those before merge.

Comment on lines +537 to +545
for key, pad_value in (
("input_ids", self.tokenizer.pad_token_id),
("attention_mask", 0),
):
value = tokenized_messages.get(key)
if not isinstance(value, torch.Tensor):
continue
pad = value.new_full((value.shape[0], pad_width), pad_value)
tokenized_messages[key] = torch.cat((value, pad), dim=1)

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.

[IMPORTANT Compatibility] _pad_sequence_tensors pads only input_ids and attention_mask, but not assistant_masks.

Trace the non-marker path: when a VLM chat template has {% generation %} tags but no recognized ChatML/Llama markers, _apply_chat_template sets derive_masks_from_markers=False and therefore requests return_assistant_tokens_mask=True from the processor. If that processor also ignores padding="max_length" (the exact scenario this method exists to compensate for), assistant_masks comes back at the pre-pad length L, while input_ids gets padded here to train_len. Then in _process_multimodal_sample:

labels[..., :-1][assistant_mask[..., 1:] == 0] = IGNORE_TOKEN_ID

indexes a [B, train_len-1] tensor with a [B, L-1] boolean mask → shape-mismatch crash (or silently wrong masking if it happens to broadcast).

The primary Qwen3-VL path is safe because markers are recognized and _build_assistant_masks builds the mask after padding via torch.zeros_like(input_ids). But any VLM relying on generation-tag masks hits this.

Why it matters: breaks answer_only_loss for the generation-tag VLM path the PR still advertises supporting.

Fix: include assistant_masks in the pad loop when present (pad with 0):

for key, pad_value in (
    ("input_ids", self.tokenizer.pad_token_id),
    ("attention_mask", 0),
    ("assistant_masks", 0),
):

(guarding, as the loop already does, on the value being a rank-2 tensor).

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.

@skierat Please take a look if this make sense. Thanks

"images",
"videos",
}
use_top_level_forward = any(

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.

LGTM for now. In the long term I think we want to abstract away the model-specific logics from the algorithm logic. Could you help add a TODO comment here?

@h-guo18 h-guo18 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.

Hi @skierat, thanks for the PR! The changes LGTM. Could you please:

  • Add some minimal unit tests for the changes in VisionLanguageDataCollator and load_vlm_or_llm
  • Run a end2end test with tools/launcher and add a yaml example under tools/launcher/examples, similar to the existing tools/launcher/examples/Qwen/Qwen3-8B/hf_online_dflash.yaml. (Also works if you prefer to put in a separate PR).

This is a new place we put per-model examples. It should be much easier to create, test and share with users than our previous shell scripts or notebooks.

@skierat
skierat requested a review from a team as a code owner July 8, 2026 14:59

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

🧹 Nitpick comments (1)
tests/unit/torch/utils/test_transformers_dataset.py (1)

33-82: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Good hermetic unit test; consider covering the default shift_labels=True path too.

This test only exercises shift_labels=False with marker-derived masks. The collator's default is shift_labels=True (per VisionLanguageDataCollator.__init__), and the alternate branch where _assistant_marker_specs() is empty (native return_assistant_tokens_mask=True path) is also untested. Both are common/default runtime paths for this new masking logic.

As per path instructions, checked-in tests should "document expected behavior, protect against regressions, or flag backward-incompatible behavior changes" — the shifted-label branch is the default and most-used configuration, so leaving it uncovered is a real regression-protection 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/unit/torch/utils/test_transformers_dataset.py` around lines 33 - 82,
The current test only covers the non-default masking flow in
VisionLanguageDataCollator._process_multimodal_sample with shift_labels set to
false and marker-derived assistant masks. Add coverage for the default
shift_labels=true behavior, and also exercise the native
return_assistant_tokens_mask path by making _assistant_marker_specs() return
empty so the processor path is used; verify the resulting input_ids,
assistant_masks, and labels match the shifted-label expectations.

Source: Path instructions

🤖 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.

Nitpick comments:
In `@tests/unit/torch/utils/test_transformers_dataset.py`:
- Around line 33-82: The current test only covers the non-default masking flow
in VisionLanguageDataCollator._process_multimodal_sample with shift_labels set
to false and marker-derived assistant masks. Add coverage for the default
shift_labels=true behavior, and also exercise the native
return_assistant_tokens_mask path by making _assistant_marker_specs() return
empty so the processor path is used; verify the resulting input_ids,
assistant_masks, and labels match the shifted-label expectations.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: ec4dace4-149f-43c0-b754-b1f337937f83

📥 Commits

Reviewing files that changed from the base of the PR and between 0f1a84e and ed07136.

📒 Files selected for processing (2)
  • tests/unit/torch/speculative/plugins/test_fakebase.py
  • tests/unit/torch/utils/test_transformers_dataset.py

@h-guo18 h-guo18 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.

lgtm. Approve to unblock; Please also take a look at AI review comments. Thanks!

This branch has not been deployed

No deployments
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