Support nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16 (and nvidia/C-RADIOv2-H) (#12277)

This commit is contained in:
Netanel Haber
2025-11-26 16:28:52 -07:00
committed by GitHub
parent a8ef4d1804
commit 082b54c689
17 changed files with 1334 additions and 17 deletions
@@ -0,0 +1,31 @@
import unittest
from types import SimpleNamespace
from sglang.test.gsm8k_mixin import GSM8KMixin
from sglang.test.mmmu_vlm_mixin import MMMUVLMMixin
from sglang.test.test_utils import CustomTestCase
MODEL = "nvidia/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16"
class TestNvidiaNemotronNanoV2VLTextOnly(GSM8KMixin, CustomTestCase):
accuracy = 0.87
model = MODEL
other_args = ["--max-mamba-cache-size", "256", "--trust-remote-code"]
class TestNvidiaNemotronNanoV2VLMMMU(MMMUVLMMixin, CustomTestCase):
accuracy = 0.454
model = MODEL
other_args = ["--max-mamba-cache-size", "128", "--trust-remote-code"]
mmmu_args = ["--limit=0.1"]
"""`--limit=0.1`: 10 percent of each task - this is fine for testing since the nominal result isn't interesting - this run is just to prevent relative regressions."""
def test_vlm_mmmu_benchmark(self):
self._run_vlm_mmmu_test(
SimpleNamespace(model=self.model, mmmu_accuracy=self.accuracy), "./logs"
)
if __name__ == "__main__":
unittest.main()
+2
View File
@@ -24,6 +24,7 @@ suites = {
TestFile("models/test_encoder_embedding_models.py", 460),
TestFile("models/test_generation_models.py", 103),
TestFile("models/test_nvidia_nemotron_nano_v2.py", 160),
TestFile("models/test_nvidia_nemotron_nano_v2_vl.py", 350), # GSM8k + MMMU
TestFile("models/test_qwen_models.py", 150),
TestFile("models/test_reward_models.py", 132),
TestFile("models/test_transformers_models.py", 320),
@@ -125,6 +126,7 @@ suites = {
TestFile("test_triton_moe_channel_fp8_kernel.py", 25),
TestFile("test_triton_sliding_window.py", 100),
TestFile("test_utils_update_weights.py", 48),
TestFile("test_video_utils.py", 5),
TestFile("test_vision_chunked_prefill.py", 170),
TestFile("test_vision_openai_server_a.py", 900),
TestFile("test_vlm_input_format.py", 300),
+59
View File
@@ -0,0 +1,59 @@
from dataclasses import dataclass
import pytest
from sglang.srt.utils import sample_video_frames
class DummyVideo:
def __init__(self, total_frames: int, avg_fps: float):
self._frames = total_frames
self._fps = avg_fps
def __len__(self):
return self._frames
def get_avg_fps(self):
return self._fps
@dataclass(kw_only=True)
class Case:
frames: int
avg_fps: float
desired_fps: int
max_frames: int
expected_frames: list[int]
description: str
# fmt: off
@pytest.mark.parametrize("case", [
Case(
frames=100, avg_fps=25.0, desired_fps=5, max_frames=200,
expected_frames=[0, 5, 10, 15, 20, 26, 31, 36, 41, 46, 52, 57, 62, 67, 72, 78, 83, 88, 93, 99],
description="capped by desired_fps"
),
Case(
frames=10, avg_fps=10.0, desired_fps=100, max_frames=5,
expected_frames=[0, 2, 4, 6, 9],
description="capped by max_frames"
),
Case(
frames=50, avg_fps=25.0, desired_fps=50, max_frames=200,
expected_frames=list(range(50)),
description="capped by total_frames"
),
Case(
frames=1, avg_fps=30.0, desired_fps=0, max_frames=0,
expected_frames=[0],
description="always sample at least 1 frame"
)
], ids=lambda c: c.description)
def test_sample_video_frames_lengths(case: Case):
video = DummyVideo(case.frames, case.avg_fps)
result = sample_video_frames(video, desired_fps=case.desired_fps, max_frames=case.max_frames)
assert result == case.expected_frames
if __name__ == "__main__":
pytest.main([__file__])