From ca542ee154e91c9a7757fb0b8f9d90ee578fb613 Mon Sep 17 00:00:00 2001 From: linitra24 Date: Wed, 16 Sep 2026 22:16:09 +0800 Subject: [PATCH] [Model][LoRA] Enable LoRA support for ModernBertModel (#57148) Signed-off-by: linitra24 --- docs/models/pooling_models/embed.md | 2 +- vllm/model_executor/models/modernbert.py | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/models/pooling_models/embed.md b/docs/models/pooling_models/embed.md index a60bd4307a..13a2e0d381 100644 --- a/docs/models/pooling_models/embed.md +++ b/docs/models/pooling_models/embed.md @@ -47,7 +47,7 @@ You can compute pairwise similarity scores to build a similarity matrix using th | `JinaEmbeddingsV5Model`C | Qwen3-decoder or EuroBERT-encoder backbone with task-specific LoRA adapters | `jinaai/jina-embeddings-v5-text-small`, `jinaai/jina-embeddings-v5-text-nano` (see note) | ✅︎ | ✅︎ | | `LlamaBidirectionalModel`C | Llama-based with bidirectional attention | `nvidia/llama-nemotron-embed-1b-v2`, etc. | ✅︎ | ✅︎ | | `LlamaModel`C, `LlamaForCausalLM`C, `MistralModel`C, etc. | Llama-based | `intfloat/e5-mistral-7b-instruct`, etc. | ✅︎ | ✅︎ | -| `ModernBertModel` | ModernBERT-based | `Alibaba-NLP/gte-modernbert-base`, etc. | | | +| `ModernBertModel` | ModernBERT-based | `Alibaba-NLP/gte-modernbert-base`, etc. | ✅︎ | | | `NomicBertModel` | Nomic BERT | `nomic-ai/nomic-embed-text-v1`, `nomic-ai/nomic-embed-text-v2-moe`, `Snowflake/snowflake-arctic-embed-m-long`, etc. | | | | `Qwen2Model`C, `Qwen2ForCausalLM`C | Qwen2-based | `ssmits/Qwen2-7B-Instruct-embed-base` (see note), `Alibaba-NLP/gte-Qwen2-7B-instruct` (see note), etc. | ✅︎ | ✅︎ | | `Qwen3Model`C, `Qwen3ForCausalLM`C | Qwen3-based | `Qwen/Qwen3-Embedding-0.6B`, etc. | ✅︎ | ✅︎ | diff --git a/vllm/model_executor/models/modernbert.py b/vllm/model_executor/models/modernbert.py index 8fe80bbe19..df901a6566 100644 --- a/vllm/model_executor/models/modernbert.py +++ b/vllm/model_executor/models/modernbert.py @@ -32,7 +32,7 @@ from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmb from vllm.model_executor.model_loader.weight_utils import default_weight_loader from vllm.sequence import IntermediateTensors -from .interfaces import SupportsCrossEncoding +from .interfaces import SupportsCrossEncoding, SupportsLoRA from .interfaces_base import attn_type, default_pooling_type from .utils import AutoWeightsLoader, WeightsMapper, maybe_prefix @@ -262,7 +262,7 @@ class ModernBertEncoderLayer(nn.Module): @support_torch_compile @default_pooling_type(seq_pooling_type="CLS") -class ModernBertModel(nn.Module): +class ModernBertModel(nn.Module, SupportsLoRA): hf_to_vllm_mapper = WeightsMapper( orig_to_new_prefix={ "model.layers.": "encoder_layer.layers.", @@ -271,6 +271,11 @@ class ModernBertModel(nn.Module): } ) + packed_modules_mapping = { + "Wqkv": ["Wqkv"], + "Wi": ["Wi"], + } + def __init__( self, vllm_config: VllmConfig,