@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 27864a851c
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 10, 20:15 UTC

feat: support LoRA for DeepSeek-OCR(Language Model part) (#31569)

Signed-off-by: zhima771 <15836938703@163.com> Co-authored-by: Cyrus Leung <tlleungac@connect.ust.hk> Co-authored-by: Jee Jee Li <pandaleefree@gmail.com>

zhima771 committed Jan 2, 2026 at 11:32 UTC 27864a851c7430d20af0020562759c77bd85f1a8
2 files changed +14 -2
docs/models/supported_models.md
+1 -1
@@ -677,7 +677,7 @@ These models primarily accept the [`LLM.generate`](./generative_models.md#llmgen
677 | `ChameleonForConditionalGeneration` | Chameleon | T + I | `facebook/chameleon-7b`, etc. | | ✅︎ |
678 | `Cohere2VisionForConditionalGeneration` | Command A Vision | T + I<sup>+</sup> | `CohereLabs/command-a-vision-07-2025`, etc. | | ✅︎ |
679 | `DeepseekVLV2ForCausalLM`<sup>^</sup> | DeepSeek-VL2 | T + I<sup>+</sup> | `deepseek-ai/deepseek-vl2-tiny`, `deepseek-ai/deepseek-vl2-small`, `deepseek-ai/deepseek-vl2`, etc. | | ✅︎ |
680 -| `DeepseekOCRForCausalLM` | DeepSeek-OCR | T + I<sup>+</sup> | `deepseek-ai/DeepSeek-OCR`, etc. | | ✅︎ |
680 +| `DeepseekOCRForCausalLM` | DeepSeek-OCR | T + I<sup>+</sup> | `deepseek-ai/DeepSeek-OCR`, etc. | ✅︎ | ✅︎ |
681 | `Ernie4_5_VLMoeForConditionalGeneration` | Ernie4.5-VL | T + I<sup>+</sup>/ V<sup>+</sup> | `baidu/ERNIE-4.5-VL-28B-A3B-PT`, `baidu/ERNIE-4.5-VL-424B-A47B-PT` | | ✅︎ |
682 | `FuyuForCausalLM` | Fuyu | T + I | `adept/fuyu-8b`, etc. | | ✅︎ |
683 | `Gemma3ForConditionalGeneration` | Gemma 3 | T + I<sup>E+</sup> | `google/gemma-3-4b-it`, `google/gemma-3-27b-it`, etc. | ✅︎ | ✅︎ |
vllm/model_executor/models/deepseek_ocr.py
+13 -1
@@ -14,9 +14,11 @@ from vllm.config import VllmConfig
14 from vllm.config.multimodal import BaseDummyOptions
15 from vllm.model_executor.models.interfaces import (
16 MultiModalEmbeddings,
17 + SupportsLoRA,
18 SupportsMultiModal,
19 SupportsPP,
20 )
21 +from vllm.model_executor.models.module_mapping import MultiModelKeys
22 from vllm.model_executor.models.utils import (
23 AutoWeightsLoader,
24 WeightsMapper,
@@ -343,7 +345,7 @@ class DeepseekOCRMultiModalProcessor(
345 info=DeepseekOCRProcessingInfo,
346 dummy_inputs=DeepseekOCRDummyInputsBuilder,
347 )
346 -class DeepseekOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
348 +class DeepseekOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, SupportsLoRA):
349 hf_to_vllm_mapper = WeightsMapper(
350 orig_to_new_prefix={
351 # map prefix for language backbone
@@ -589,3 +591,13 @@ class DeepseekOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
591 loader = AutoWeightsLoader(self)
592 autoloaded_weights = loader.load_weights(weights, mapper=self.hf_to_vllm_mapper)
593 return autoloaded_weights
594 +
595 + def get_mm_mapping(self) -> MultiModelKeys:
596 + """
597 + Get the module prefix in multimodal models
598 + """
599 + return MultiModelKeys.from_string_field(
600 + language_model="language_model",
601 + connector="projector",
602 + tower_model=["sam_model", "vision_model"],
603 + )