From b437f6be48a1dbb29df21c6438a2a6064873fabf Mon Sep 17 00:00:00 2001 From: Yuhao Yang <47235274+yhyang201@users.noreply.github.com> Date: Wed, 29 Apr 2026 11:08:23 +0800 Subject: [PATCH] model: Nemotron-omni-v3-alias (#23857) --- python/sglang/srt/configs/__init__.py | 6 +++++- python/sglang/srt/configs/model_config.py | 1 + python/sglang/srt/configs/nano_nemotron_vl.py | 9 +++++++++ python/sglang/srt/models/nano_nemotron_vl.py | 6 +++++- .../multimodal/processors/nano_nemotron_vl.py | 18 ++++++++++++++---- .../sglang/srt/utils/hf_transformers/common.py | 2 ++ 6 files changed, 36 insertions(+), 6 deletions(-) diff --git a/python/sglang/srt/configs/__init__.py b/python/sglang/srt/configs/__init__.py index dff1f81ff..bbc121eed 100644 --- a/python/sglang/srt/configs/__init__.py +++ b/python/sglang/srt/configs/__init__.py @@ -19,7 +19,10 @@ from sglang.srt.configs.lfm2 import Lfm2Config from sglang.srt.configs.lfm2_moe import Lfm2MoeConfig from sglang.srt.configs.lfm2_vl import Lfm2VlConfig from sglang.srt.configs.longcat_flash import LongcatFlashConfig -from sglang.srt.configs.nano_nemotron_vl import NemotronH_Nano_VL_V2_Config +from sglang.srt.configs.nano_nemotron_vl import ( + NemotronH_Nano_Omni_Reasoning_V3_Config, + NemotronH_Nano_VL_V2_Config, +) from sglang.srt.configs.nemotron_h import NemotronHConfig from sglang.srt.configs.olmo3 import Olmo3Config from sglang.srt.configs.qwen3_5 import Qwen3_5Config, Qwen3_5MoeConfig @@ -61,6 +64,7 @@ __all__ = [ "Lfm2VlConfig", "NemotronHConfig", "NemotronH_Nano_VL_V2_Config", + "NemotronH_Nano_Omni_Reasoning_V3_Config", "JetNemotronConfig", "JetVLMConfig", "Step3p5Config", diff --git a/python/sglang/srt/configs/model_config.py b/python/sglang/srt/configs/model_config.py index d9d0e36d6..4c850b44a 100644 --- a/python/sglang/srt/configs/model_config.py +++ b/python/sglang/srt/configs/model_config.py @@ -1387,6 +1387,7 @@ multimodal_model_archs = [ "MllamaForConditionalGeneration", "MossVLForConditionalGeneration", "NemotronH_Nano_VL_V2", + "NemotronH_Nano_Omni_Reasoning_V3", "PixtralForConditionalGeneration", "Qwen2AudioForConditionalGeneration", "Qwen2VLForConditionalGeneration", diff --git a/python/sglang/srt/configs/nano_nemotron_vl.py b/python/sglang/srt/configs/nano_nemotron_vl.py index 6d9355718..326a79c02 100644 --- a/python/sglang/srt/configs/nano_nemotron_vl.py +++ b/python/sglang/srt/configs/nano_nemotron_vl.py @@ -150,3 +150,12 @@ class NemotronH_Nano_VL_V2_Config(PretrainedConfig): video_maintain_aspect_ratio=self.video_maintain_aspect_ratio, ) return radio_config + + +class NemotronH_Nano_Omni_Reasoning_V3_Config(NemotronH_Nano_VL_V2_Config): + model_type = "NemotronH_Nano_Omni_Reasoning_V3" + + def __init__(self, *args, **kwargs): + # Explicit __init__ prevents PretrainedConfig.__init_subclass__ from + # replacing the parent's custom __init__ with a dataclass-generated one. + super().__init__(*args, **kwargs) diff --git a/python/sglang/srt/models/nano_nemotron_vl.py b/python/sglang/srt/models/nano_nemotron_vl.py index 637adf3a2..dc8dbe101 100644 --- a/python/sglang/srt/models/nano_nemotron_vl.py +++ b/python/sglang/srt/models/nano_nemotron_vl.py @@ -372,4 +372,8 @@ class NemotronH_Nano_VL_V2(EVS): self.sound_encoder.load_weights(sound_weights) -EntryClass = [NemotronH_Nano_VL_V2] +class NemotronH_Nano_Omni_Reasoning_V3(NemotronH_Nano_VL_V2): + pass + + +EntryClass = [NemotronH_Nano_VL_V2, NemotronH_Nano_Omni_Reasoning_V3] diff --git a/python/sglang/srt/multimodal/processors/nano_nemotron_vl.py b/python/sglang/srt/multimodal/processors/nano_nemotron_vl.py index 408e6c7ef..04f9b5f3f 100644 --- a/python/sglang/srt/multimodal/processors/nano_nemotron_vl.py +++ b/python/sglang/srt/multimodal/processors/nano_nemotron_vl.py @@ -19,13 +19,19 @@ import numpy as np import torch from PIL import Image -from sglang.srt.configs.nano_nemotron_vl import NemotronH_Nano_VL_V2_Config +from sglang.srt.configs.nano_nemotron_vl import ( + NemotronH_Nano_Omni_Reasoning_V3_Config, + NemotronH_Nano_VL_V2_Config, +) from sglang.srt.managers.schedule_batch import ( Modality, MultimodalDataItem, MultimodalProcessorOutput, ) -from sglang.srt.models.nano_nemotron_vl import NemotronH_Nano_VL_V2 +from sglang.srt.models.nano_nemotron_vl import ( + NemotronH_Nano_Omni_Reasoning_V3, + NemotronH_Nano_VL_V2, +) from sglang.srt.models.parakeet import ParakeetExtractor from sglang.srt.multimodal.audio_from_video import extract_audio_from_video_bytes from sglang.srt.multimodal.evs import EVSProcessor @@ -51,7 +57,7 @@ MAX_FRAMES = 128 class NanoNemotronVLImageProcessor(BaseMultimodalProcessor): - models = [NemotronH_Nano_VL_V2] + models = [NemotronH_Nano_VL_V2, NemotronH_Nano_Omni_Reasoning_V3] gpu_image_decode = ( False # NanoNemotronVL processes loaded image as PIL image explicitly ) @@ -59,7 +65,11 @@ class NanoNemotronVLImageProcessor(BaseMultimodalProcessor): def __init__(self, hf_config, server_args, _image_processor, *args, **kwargs): super().__init__(hf_config, server_args, _image_processor, *args, **kwargs) self.evs = EVSProcessor( - hf_config, {NemotronH_Nano_VL_V2_Config: NemotronH_Nano_VL_V2} + hf_config, + { + NemotronH_Nano_VL_V2_Config: NemotronH_Nano_VL_V2, + NemotronH_Nano_Omni_Reasoning_V3_Config: NemotronH_Nano_Omni_Reasoning_V3, + }, ) Image.MAX_IMAGE_PIXELS = None self.image_size = hf_config.image_size diff --git a/python/sglang/srt/utils/hf_transformers/common.py b/python/sglang/srt/utils/hf_transformers/common.py index f09ba3163..d05d53360 100644 --- a/python/sglang/srt/utils/hf_transformers/common.py +++ b/python/sglang/srt/utils/hf_transformers/common.py @@ -39,6 +39,7 @@ from sglang.srt.configs import ( KimiVLConfig, LongcatFlashConfig, MultiModalityConfig, + NemotronH_Nano_Omni_Reasoning_V3_Config, NemotronH_Nano_VL_V2_Config, NemotronHConfig, Olmo3Config, @@ -87,6 +88,7 @@ _CONFIG_REGISTRY: Dict[str, Type[PretrainedConfig]] = { DotsVLMConfig, DotsOCRConfig, NemotronH_Nano_VL_V2_Config, + NemotronH_Nano_Omni_Reasoning_V3_Config, NemotronHConfig, DeepseekVLV2Config, Qwen3_5Config,