chore: import upstream snapshot with attribution
Lint test / lint (push) Has been cancelled

This commit is contained in:
wehub-resource-sync
2026-07-13 13:34:58 +08:00
commit a203934033
1368 changed files with 175001 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
from . import (baai, baichuan, baidu, bert, codefuse, deepseek, gemma, glm, internlm, llama, llava, llm, mamba,
microsoft, minicpm, minimax, mistral, mllm, moonshot, mplug, openbuddy, qwen, seed, skywork, stepfun,
telechat, tencent, valley, yi)
+113
View File
@@ -0,0 +1,113 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import os
import sys
from transformers import AutoModel, AutoModelForSequenceClassification, PretrainedConfig, PreTrainedModel
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, get_device, git_clone_github, safe_snapshot_download
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
class Emu3GenLoader(ModelLoader):
def get_processor(self, model_dir, config) -> Processor:
self.model_info.max_model_len = self.model_info.max_model_len + 40960
config.image_area = int(os.environ.get('image_area', config.image_area))
config.max_position_embeddings = int(os.environ.get('max_position_embeddings', config.max_position_embeddings))
tokenizer = super().get_processor(model_dir, config)
import sys
sys.path.append(model_dir)
from processing_emu3 import Emu3Processor
vq_hub = safe_snapshot_download('BAAI/Emu3-VisionTokenizer', check_local=True)
from transformers import AutoImageProcessor, AutoModel
image_processor = AutoImageProcessor.from_pretrained(vq_hub, trust_remote_code=True)
image_tokenizer = AutoModel.from_pretrained(vq_hub, trust_remote_code=True).eval().to(get_device())
processor = Emu3Processor(image_processor, image_tokenizer, tokenizer)
processor.image_area = config.image_area
return processor
def get_model(self, model_dir: str, config, processor, model_kwargs):
model = super().get_model(model_dir, config, processor, model_kwargs)
model.generation_config.do_sample = True
register_model(
ModelMeta(
MLLMModelType.emu3_gen,
[
ModelGroup([
Model('BAAI/Emu3-Gen', 'BAAI/Emu3-Gen'),
]),
],
Emu3GenLoader,
template=TemplateType.emu3_gen,
architectures=['Emu3ForCausalLM'],
model_arch=ModelArch.emu3_chat,
tags=['t2i'],
))
class Emu3ChatLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer = super().get_processor(model_dir, config)
# download and load vision tokenizer
from transformers import AutoImageProcessor
vq_model = safe_snapshot_download('BAAI/Emu3-VisionTokenizer', check_local=True)
image_processor = AutoImageProcessor.from_pretrained(vq_model, trust_remote_code=True)
image_tokenizer = AutoModel.from_pretrained(
vq_model, device_map=self.model_kwargs['device_map'], trust_remote_code=True)
image_tokenizer.requires_grad_(False)
image_tokenizer.to(get_device())
# load processor
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/baaivision/Emu3.git')
sys.path.append(local_repo_path)
from emu3.mllm.processing_emu3 import Emu3Processor
return Emu3Processor(image_processor, image_tokenizer, tokenizer)
register_model(
ModelMeta(
MLLMModelType.emu3_chat,
[
ModelGroup([
Model('BAAI/Emu3-Chat', 'BAAI/Emu3-Chat'),
]),
],
Emu3ChatLoader,
template=TemplateType.emu3_chat,
architectures=['Emu3ForCausalLM'],
model_arch=ModelArch.emu3_chat,
tags=['vision'],
requires=['transformers>=4.44.0'],
))
class BgeRerankerLoader(ModelLoader):
def get_model(self, *args, **kwargs) -> PreTrainedModel:
self.auto_model_cls = self.auto_model_cls or AutoModelForSequenceClassification
return super().get_model(*args, **kwargs)
register_model(
ModelMeta(
LLMModelType.bge_reranker,
[
ModelGroup([
Model('BAAI/bge-reranker-base', 'BAAI/bge-reranker-base'),
Model('BAAI/bge-reranker-v2-m3', 'BAAI/bge-reranker-v2-m3'),
Model('BAAI/bge-reranker-large', 'BAAI/bge-reranker-large'),
]),
],
BgeRerankerLoader,
template=TemplateType.bge_reranker,
task_type='reranker',
architectures=['XLMRobertaForSequenceClassification'],
))
+131
View File
@@ -0,0 +1,131 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import torch.nn.functional as F
from torch import Tensor
from transformers import PreTrainedModel
from types import MethodType
from swift.template import TemplateType
from swift.utils import get_logger
from ..constant import LLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
logger = get_logger()
class BaichuanLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
# baichuan-13b does not implement the `get_input_embeddings` function
# fix gradient_checkpointing bug
try:
model.get_input_embeddings()
except NotImplementedError:
model.__class__.get_input_embeddings = lambda self: self.model.embed_tokens
return model
register_model(
ModelMeta(
LLMModelType.baichuan, [
ModelGroup([
Model('baichuan-inc/Baichuan-13B-Chat', 'baichuan-inc/Baichuan-13B-Chat'),
Model('baichuan-inc/Baichuan-13B-Base', 'baichuan-inc/Baichuan-13B-Base'),
Model('baichuan-inc/baichuan-7B', 'baichuan-inc/Baichuan-7B'),
]),
],
BaichuanLoader,
template=TemplateType.baichuan,
architectures=['BaichuanForCausalLM', 'BaiChuanForCausalLM'],
model_arch=ModelArch.baichuan,
requires=['transformers<4.34']))
class BaichuanM1Loader(BaichuanLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers.dynamic_module_utils import get_class_from_dynamic_module
rotary_embedding = get_class_from_dynamic_module('modeling_baichuan.RotaryEmbedding', model_dir)
_old_forward = rotary_embedding.forward
def _new_forward(self, q, k, seqlen_offset=None, cu_seqlens=None, max_seqlen=None):
q = q.to(k.dtype)
res = _old_forward(self, q, k, seqlen_offset, cu_seqlens, max_seqlen)
return res
rotary_embedding.forward = _new_forward
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
LLMModelType.baichuan_m1, [
ModelGroup([
Model('baichuan-inc/Baichuan-M1-14B-Instruct', 'baichuan-inc/Baichuan-M1-14B-Instruct'),
]),
],
BaichuanM1Loader,
template=TemplateType.baichuan_m1,
architectures=['BaichuanM1ForCausalLM'],
model_arch=ModelArch.baichuan,
requires=['transformers>=4.48']))
def patch_baichuan2_lm_head_forward(self, hidden_states: Tensor) -> Tensor:
# patch: baichuan2 lm_head (fp32 bug)
if self.training:
norm_weight = F.normalize(self.weight).to(self.weight.dtype)
elif self.first_flag:
self.first_flag = False
self.weight.data = F.normalize(self.weight).to(self.weight.dtype)
norm_weight = self.weight
else:
norm_weight = self.weight
return F.linear(hidden_states, norm_weight)
class Baichuan2Loader(ModelLoader):
def get_model(self, model_dir: str, config, *args, **kwargs) -> PreTrainedModel:
if not hasattr(config, 'z_loss_weight'):
config.z_loss_weight = 0
# patch: baichuan2_13b configuration_baichuan.py bug
if hasattr(config, 'gradient_checkpointing'):
gradient_checkpointing = config.gradient_checkpointing
if isinstance(gradient_checkpointing, (tuple, list)):
config.gradient_checkpointing = gradient_checkpointing[0]
model = super().get_model(model_dir, config, *args, **kwargs)
model_ori = model
if not hasattr(model, 'lm_head'): # fix awq
model = model.model
new_forward = MethodType(patch_baichuan2_lm_head_forward, model.lm_head)
if hasattr(model, '_old_forward'): # device_map
model.lm_head._old_forward = new_forward
else:
model.lm_head.forward = new_forward
return model_ori
register_model(
ModelMeta(
LLMModelType.baichuan2,
[
ModelGroup([
Model('baichuan-inc/Baichuan2-7B-Chat', 'baichuan-inc/Baichuan2-7B-Chat'),
Model('baichuan-inc/Baichuan2-7B-Base', 'baichuan-inc/Baichuan2-7B-Base'),
Model('baichuan-inc/Baichuan2-13B-Chat', 'baichuan-inc/Baichuan2-13B-Chat'),
Model('baichuan-inc/Baichuan2-13B-Base', 'baichuan-inc/Baichuan2-13B-Base'),
]),
ModelGroup([
Model('baichuan-inc/Baichuan2-7B-Chat-4bits', 'baichuan-inc/Baichuan2-7B-Chat-4bits'),
Model('baichuan-inc/Baichuan2-13B-Chat-4bits', 'baichuan-inc/Baichuan2-13B-Chat-4bits'),
],
requires=['bitsandbytes<0.41.2', 'accelerate<0.26'])
],
Baichuan2Loader,
template=TemplateType.baichuan,
architectures=['BaichuanForCausalLM', 'BaiChuanForCausalLM'],
model_arch=ModelArch.baichuan,
))
+112
View File
@@ -0,0 +1,112 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from swift.template import TemplateType
from swift.utils import get_logger
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
logger = get_logger()
register_model(
ModelMeta(
LLMModelType.ernie4_5,
[
ModelGroup([
Model('PaddlePaddle/ERNIE-4.5-0.3B-Base-PT', 'baidu/ERNIE-4.5-0.3B-PT'),
Model('PaddlePaddle/ERNIE-4.5-0.3B-PT', 'baidu/ERNIE-4.5-0.3B-PT'),
], TemplateType.ernie),
],
architectures=['Ernie4_5_ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.ernie4_5_moe,
[
ModelGroup([
Model('PaddlePaddle/ERNIE-4.5-21B-A3B-Base-PT', 'baidu/ERNIE-4.5-21B-A3B-Base-PT'),
Model('PaddlePaddle/ERNIE-4.5-21B-A3B-PT', 'baidu/ERNIE-4.5-21B-A3B-PT'),
Model('PaddlePaddle/ERNIE-4.5-300B-A47B-Base-PT', 'baidu/ERNIE-4.5-300B-A47B-Base-PT'),
Model('PaddlePaddle/ERNIE-4.5-300B-A47B-PT', 'baidu/ERNIE-4.5-300B-A47B-PT'),
], TemplateType.ernie),
ModelGroup([
Model('PaddlePaddle/ERNIE-4.5-21B-A3B-Thinking', 'baidu/ERNIE-4.5-21B-A3B-Thinking'),
], TemplateType.ernie_thinking),
],
architectures=['Ernie4_5_MoeForCausalLM'],
))
class ErnieVLLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
MOEAllGatherLayerV2 = get_class_from_dynamic_module('modeling_ernie4_5_vl.MOEAllGatherLayerV2', model_dir)
self.leaf_modules = MOEAllGatherLayerV2
model = super().get_model(model_dir, config, processor, model_kwargs)
model.add_image_preprocess(processor)
return model
register_model(
ModelMeta(
MLLMModelType.ernie_vl,
[
ModelGroup([
Model('PaddlePaddle/ERNIE-4.5-VL-28B-A3B-PT', 'baidu/ERNIE-4.5-VL-28B-A3B-PT'),
Model('PaddlePaddle/ERNIE-4.5-VL-424B-A47B-PT', 'baidu/ERNIE-4.5-VL-424B-A47B-PT'),
Model('PaddlePaddle/ERNIE-4.5-VL-28B-A3B-Base-PT', 'baidu/ERNIE-4.5-VL-28B-A3B-Base-PT'),
Model('PaddlePaddle/ERNIE-4.5-VL-424B-A47B-Base-PT', 'baidu/ERNIE-4.5-VL-424B-A47B-Base-PT'),
], TemplateType.ernie_vl),
ModelGroup([
Model('PaddlePaddle/ERNIE-4.5-VL-28B-A3B-Thinking', 'baidu/ERNIE-4.5-VL-28B-A3B-Thinking'),
], TemplateType.ernie_vl_thinking),
],
ErnieVLLoader,
model_arch=ModelArch.ernie_vl,
architectures=['Ernie4_5_VLMoeForConditionalGeneration'],
requires=['transformers>=4.52', 'moviepy'],
))
register_model(
ModelMeta(
MLLMModelType.paddle_ocr,
[
ModelGroup([
Model('PaddlePaddle/PaddleOCR-VL', 'PaddlePaddle/PaddleOCR-VL'),
]),
],
template=TemplateType.paddle_ocr,
model_arch=ModelArch.keye_vl,
architectures=['PaddleOCRVLForConditionalGeneration'],
requires=['transformers<5.0'],
))
class PaddleOCR1_5Loader(ModelLoader):
default_trust_remote_code = False
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import AutoModelForImageTextToText
self.auto_model_cls = self.auto_model_cls or AutoModelForImageTextToText
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.paddleocr_vl,
[
ModelGroup([
Model('PaddlePaddle/PaddleOCR-VL-1.5', 'PaddlePaddle/PaddleOCR-VL-1.5'),
Model('PaddlePaddle/PaddleOCR-VL-1.6', 'PaddlePaddle/PaddleOCR-VL-1.6'),
],
template=TemplateType.paddle_ocr_1_5),
],
PaddleOCR1_5Loader,
model_arch=ModelArch.paddleocr_vl,
requires=['transformers>=5.0'],
architectures=['PaddleOCRVLForConditionalGeneration'],
))
+89
View File
@@ -0,0 +1,89 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import torch.nn.functional as F
from transformers import AutoModel, AutoModelForSequenceClassification, PreTrainedModel
from swift.template import TemplateType
from swift.utils import get_logger
from ..constant import BertModelType, LLMModelType
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
logger = get_logger()
class ModernBertLoader(ModelLoader):
def get_model(self, model_dir: str, config, *args, **kwargs) -> PreTrainedModel:
config.reference_compile = False
return super().get_model(model_dir, config, *args, **kwargs)
register_model(
ModelMeta(
BertModelType.modern_bert, [
ModelGroup([
Model('answerdotai/ModernBERT-base', 'answerdotai/ModernBERT-base'),
Model('answerdotai/ModernBERT-large', 'answerdotai/ModernBERT-large'),
])
],
ModernBertLoader,
template=TemplateType.dummy,
requires=['transformers>=4.48'],
architectures=['ModernBertForMaskedLM'],
tags=['bert']))
class GTEBertLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
self.auto_model_cls = self.auto_model_cls or AutoModel
model = super().get_model(model_dir, *args, **kwargs)
def _normalizer_hook(module, input, output):
output.last_hidden_state = F.normalize(output.last_hidden_state[:, 0], p=2, dim=1)
return output
model.register_forward_hook(_normalizer_hook)
return model
register_model(
ModelMeta(
BertModelType.modern_bert_gte,
[ModelGroup([
Model('iic/gte-modernbert-base', 'Alibaba-NLP/gte-modernbert-base'),
])],
GTEBertLoader,
template=TemplateType.dummy,
requires=['transformers>=4.48'],
architectures=['ModernBertModel'],
tags=['bert', 'embedding']))
class GTEBertReranker(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
self.auto_model_cls = self.auto_model_cls or AutoModelForSequenceClassification
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
LLMModelType.modern_bert_gte_reranker,
[ModelGroup([
Model('iic/gte-reranker-modernbert-base', 'Alibaba-NLP/gte-reranker-modernbert-base'),
])],
GTEBertReranker,
template=TemplateType.bert,
requires=['transformers>=4.48'],
architectures=['ModernBertForSequenceClassification'],
task_type='reranker',
tags=['bert', 'reranker']))
register_model(
ModelMeta(
BertModelType.bert, [ModelGroup([
Model('iic/nlp_structbert_backbone_base_std'),
])],
template=TemplateType.dummy,
tags=['bert']))
+63
View File
@@ -0,0 +1,63 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import AutoTokenizer, PretrainedConfig
from swift.template import TemplateType
from swift.utils import Processor
from ..constant import LLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
from .glm import ChatGLMLoader
from .qwen import QwenLoader
register_model(
ModelMeta(
LLMModelType.codefuse_qwen, [
ModelGroup([
Model('codefuse-ai/CodeFuse-QWen-14B', 'codefuse-ai/CodeFuse-QWen-14B'),
]),
],
QwenLoader,
template=TemplateType.codefuse,
architectures=['QWenLMHeadModel'],
model_arch=ModelArch.qwen,
tags=['coding']))
register_model(
ModelMeta(
LLMModelType.codefuse_codegeex2,
[
ModelGroup([Model('codefuse-ai/CodeFuse-CodeGeeX2-6B', 'codefuse-ai/CodeFuse-CodeGeeX2-6B')], ),
],
ChatGLMLoader,
template=TemplateType.codefuse,
architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
model_arch=ModelArch.chatglm,
tags=['coding'],
requires=['transformers<4.34'],
))
class CodeLlamaLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
return AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False, legacy=False)
register_model(
ModelMeta(
LLMModelType.codefuse_codellama,
[
ModelGroup(
[
Model('codefuse-ai/CodeFuse-CodeLlama-34B', 'codefuse-ai/CodeFuse-CodeLlama-34B'),
],
tags=['coding'],
),
],
CodeLlamaLoader,
template=TemplateType.codefuse_codellama,
model_arch=ModelArch.llama,
mcore_model_type='gpt',
architectures=['LlamaForCausalLM'],
))
+509
View File
@@ -0,0 +1,509 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import sys
import torch
from transformers import AutoModel, PretrainedConfig, PreTrainedModel
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, get_logger, git_clone_github
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_output_clone, patch_output_to_input_device
from ..register import ModelLoader, register_model
from ..utils import use_submodel_func
class DeepseekLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
# fix dtype bug
mlp_cls = model.model.layers[-1].mlp.__class__
for module in model.modules():
if isinstance(module, mlp_cls):
patch_output_to_input_device(module)
return model
register_model(
ModelMeta(
LLMModelType.deepseek,
[
ModelGroup([
Model('deepseek-ai/deepseek-moe-16b-chat', 'deepseek-ai/deepseek-moe-16b-chat'),
Model('deepseek-ai/deepseek-moe-16b-base', 'deepseek-ai/deepseek-moe-16b-base'),
], ),
],
DeepseekLoader,
template=TemplateType.deepseek,
architectures=['DeepseekForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.deepseek_v2,
[
ModelGroup([
Model('deepseek-ai/DeepSeek-Coder-V2-Instruct', 'deepseek-ai/DeepSeek-Coder-V2-Instruct'),
Model('deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct', 'deepseek-ai/DeepSeek-Coder-V2-Lite-Instruct'),
Model('deepseek-ai/DeepSeek-Coder-V2-Base', 'deepseek-ai/DeepSeek-Coder-V2-Base'),
Model('deepseek-ai/DeepSeek-Coder-V2-Lite-Base', 'deepseek-ai/DeepSeek-Coder-V2-Lite-Base'),
Model('deepseek-ai/DeepSeek-V2-Lite', 'deepseek-ai/DeepSeek-V2-Lite'),
Model('deepseek-ai/DeepSeek-V2-Lite-Chat', 'deepseek-ai/DeepSeek-V2-Lite-Chat'),
Model('deepseek-ai/DeepSeek-V2', 'deepseek-ai/DeepSeek-V2'),
Model('deepseek-ai/DeepSeek-V2-Chat', 'deepseek-ai/DeepSeek-V2-Chat'),
], TemplateType.deepseek),
ModelGroup([
Model('deepseek-ai/DeepSeek-V2.5', 'deepseek-ai/DeepSeek-V2.5'),
Model('deepseek-ai/DeepSeek-V2.5-1210', 'deepseek-ai/DeepSeek-V2.5-1210')
], TemplateType.deepseek_v2_5)
],
DeepseekLoader,
model_arch=ModelArch.deepseek_v2,
architectures=['DeepseekV2ForCausalLM'],
requires=['transformers>=4.39.3'],
))
register_model(
ModelMeta(
LLMModelType.deepseek_v3,
[
ModelGroup([
Model('deepseek-ai/DeepSeek-V3-Base', 'deepseek-ai/DeepSeek-V3-Base'),
Model('deepseek-ai/DeepSeek-V3', 'deepseek-ai/DeepSeek-V3'),
Model('deepseek-ai/DeepSeek-V3-0324', 'deepseek-ai/DeepSeek-V3-0324'),
], TemplateType.deepseek_v2_5),
ModelGroup([
Model('cognitivecomputations/DeepSeek-V3-awq', 'cognitivecomputations/DeepSeek-V3-AWQ'),
Model('cognitivecomputations/DeepSeek-V3-0324-AWQ', 'cognitivecomputations/DeepSeek-V3-0324-AWQ')
], TemplateType.deepseek_v2_5),
ModelGroup([
Model('deepseek-ai/DeepSeek-Prover-V2-7B', 'deepseek-ai/DeepSeek-Prover-V2-7B'),
Model('deepseek-ai/DeepSeek-Prover-V2-671B', 'deepseek-ai/DeepSeek-Prover-V2-671B'),
], TemplateType.deepseek_v2_5),
ModelGroup([
Model('unsloth/DeepSeek-V3-bf16', 'unsloth/DeepSeek-V3-bf16'),
Model('unsloth/DeepSeek-V3-0324-BF16', 'unsloth/DeepSeek-V3-0324-BF16'),
Model('unsloth/DeepSeek-Prover-V2-671B-BF16', 'unsloth/DeepSeek-Prover-V2-671B-BF16'),
], TemplateType.deepseek_v2_5),
ModelGroup([
Model('deepseek-ai/DeepSeek-R1', 'deepseek-ai/DeepSeek-R1'),
Model('deepseek-ai/DeepSeek-R1-Zero', 'deepseek-ai/DeepSeek-R1-Zero'),
Model('deepseek-ai/DeepSeek-R1-0528', 'deepseek-ai/DeepSeek-R1-0528'),
], TemplateType.deepseek_r1),
ModelGroup([
Model('cognitivecomputations/DeepSeek-R1-awq', 'cognitivecomputations/DeepSeek-R1-AWQ'),
Model('cognitivecomputations/DeepSeek-R1-0528-AWQ', 'cognitivecomputations/DeepSeek-R1-0528-AWQ'),
], TemplateType.deepseek_r1),
ModelGroup([
Model('unsloth/DeepSeek-R1-BF16', 'unsloth/DeepSeek-R1-BF16'),
Model('unsloth/DeepSeek-R1-Zero-BF16', 'unsloth/DeepSeek-R1-Zero-BF16'),
Model('unsloth/DeepSeek-R1-0528-BF16', 'unsloth/DeepSeek-R1-0528-BF16'),
], TemplateType.deepseek_r1),
ModelGroup([
Model('moonshotai/Moonlight-16B-A3B', 'moonshotai/Moonlight-16B-A3B'),
Model('moonshotai/Moonlight-16B-A3B-Instruct', 'moonshotai/Moonlight-16B-A3B-Instruct'),
],
TemplateType.moonlight,
requires=['transformers<4.49']),
ModelGroup([
Model('moonshotai/Kimi-K2-Base', 'moonshotai/Kimi-K2-Base'),
Model('moonshotai/Kimi-K2-Instruct', 'moonshotai/Kimi-K2-Instruct'),
Model('moonshotai/Kimi-K2-Instruct-0905', 'moonshotai/Kimi-K2-Instruct-0905'),
Model('moonshotai/Kimi-K2-Thinking', 'moonshotai/Kimi-K2-Thinking'),
], TemplateType.kimi_k2),
ModelGroup([
Model('deepseek-ai/DeepSeek-V3.1-Base', 'deepseek-ai/DeepSeek-V3.1-Base'),
Model('deepseek-ai/DeepSeek-V3.1', 'deepseek-ai/DeepSeek-V3.1'),
Model('deepseek-ai/DeepSeek-V3.1-Terminus', 'deepseek-ai/DeepSeek-V3.1-Terminus'),
], TemplateType.deepseek_v3_1),
],
DeepseekLoader,
model_arch=ModelArch.deepseek_v2,
architectures=['DeepseekV3ForCausalLM'],
requires=['transformers>=4.39.3'],
))
class DeepseekV32Loader(ModelLoader):
def get_config(self, model_dir: str):
try:
from transformers.models.deepseek_v32 import DeepseekV32Config
except ImportError:
from transformers.models.deepseek_v3 import DeepseekV3Config as DeepseekV32Config
return DeepseekV32Config.from_pretrained(model_dir)
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
try:
from transformers.models.deepseek_v32 import DeepseekV32ForCausalLM
except ImportError:
# Its only for compatibility with Megatron training or vllm/sglang infer,
# while we wait for Transformers to support deepseek_v32.
from transformers.models.deepseek_v3 import DeepseekV3ForCausalLM as DeepseekV32ForCausalLM
if not self.return_dummy_model:
raise ValueError('DeepSeek-V3.2 is not supported in transformers.')
self.auto_model_cls = DeepseekV32ForCausalLM
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
LLMModelType.deepseek_v32,
[
ModelGroup([
Model('deepseek-ai/DeepSeek-V3.2', 'deepseek-ai/DeepSeek-V3.2'),
Model('deepseek-ai/DeepSeek-V3.2-Speciale', 'deepseek-ai/DeepSeek-V3.2-Speciale'),
Model('deepseek-ai/DeepSeek-V3.2-Exp', 'deepseek-ai/DeepSeek-V3.2-Exp'),
Model('deepseek-ai/DeepSeek-V3.2-Exp-Base', 'deepseek-ai/DeepSeek-V3.2-Exp-Base'),
Model('deepseek-ai/DeepSeek-Math-V2', 'deepseek-ai/DeepSeek-Math-V2'),
]),
],
DeepseekV32Loader,
template=TemplateType.deepseek_v3_1,
architectures=['DeepseekV32ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.deepseek_v4,
[
ModelGroup([
Model('deepseek-ai/DeepSeek-V4-Flash', 'deepseek-ai/DeepSeek-V4-Flash'),
Model('deepseek-ai/DeepSeek-V4-Flash-Base', 'deepseek-ai/DeepSeek-V4-Flash-Base'),
]),
ModelGroup([
Model('deepseek-ai/DeepSeek-V4-Pro', 'deepseek-ai/DeepSeek-V4-Pro'),
Model('deepseek-ai/DeepSeek-V4-Pro-Base', 'deepseek-ai/DeepSeek-V4-Pro-Base'),
]),
],
template=TemplateType.deepseek_v4,
architectures=['DeepseekV4ForCausalLM'],
))
class DeepseekVLLoader(ModelLoader):
def get_config(self, model_dir: str):
# compat with python==3.10
if sys.version_info.minor >= 10:
import collections
import collections.abc
for type_name in collections.abc.__all__:
setattr(collections, type_name, getattr(collections.abc, type_name))
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/deepseek-ai/DeepSeek-VL')
sys.path.append(local_repo_path)
from deepseek_vl.models import VLChatProcessor
self.auto_tokenizer_cls = VLChatProcessor
return super().get_config(model_dir)
def _get_model(self, model_dir: str, llm_prefix, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
llm = getattr(model, llm_prefix)
patch_output_clone(llm.model.embed_tokens)
patch_output_to_input_device(llm.model.embed_tokens)
use_submodel_func(model, llm_prefix)
model.generation_config = llm.generation_config
return model
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
return self._get_model(model_dir, 'language_model', *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.deepseek_vl,
[
ModelGroup([
Model('deepseek-ai/deepseek-vl-1.3b-chat', 'deepseek-ai/deepseek-vl-1.3b-chat'),
Model('deepseek-ai/deepseek-vl-7b-chat', 'deepseek-ai/deepseek-vl-7b-chat'),
], ),
],
DeepseekVLLoader,
template=TemplateType.deepseek_vl,
architectures=['MultiModalityCausalLM'],
model_arch=ModelArch.deepseek_vl,
tags=['vision'],
))
class DeepseekJanusLoader(DeepseekVLLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
return self._get_model(model_dir, 'language_model', *args, **kwargs)
def get_config(self, model_dir: str):
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/deepseek-ai/Janus')
sys.path.append(local_repo_path)
from janus.models import VLChatProcessor
self.auto_tokenizer_cls = VLChatProcessor
return super(DeepseekVLLoader, self).get_config(model_dir)
register_model(
ModelMeta(
MLLMModelType.deepseek_janus,
[
ModelGroup([
Model('deepseek-ai/Janus-1.3B', 'deepseek-ai/Janus-1.3B'),
]),
],
DeepseekJanusLoader,
template=TemplateType.deepseek_janus,
model_arch=ModelArch.deepseek_janus,
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.deepseek_janus_pro,
[
ModelGroup([
Model('deepseek-ai/Janus-Pro-1B', 'deepseek-ai/Janus-Pro-1B'),
Model('deepseek-ai/Janus-Pro-7B', 'deepseek-ai/Janus-Pro-7B'),
]),
],
DeepseekJanusLoader,
template=TemplateType.deepseek_janus_pro,
model_arch=ModelArch.deepseek_janus,
tags=['vision'],
))
class DeepseekVL2Loader(DeepseekVLLoader):
def get_config(self, model_dir: str):
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/deepseek-ai/DeepSeek-VL2')
sys.path.append(local_repo_path)
try:
from deepseek_vl2.models import DeepseekVLV2Processor
except ImportError:
# compat transformers>=4.42
import transformers
transformers.models.llama.modeling_llama.LlamaFlashAttention2 = None
from deepseek_vl2.models import DeepseekVLV2Processor
self.auto_tokenizer_cls = DeepseekVLV2Processor
return super(DeepseekVLLoader, self).get_config(model_dir)
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
return super()._get_model(model_dir, 'language', *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.deepseek_vl2,
[
ModelGroup([
Model('deepseek-ai/deepseek-vl2-tiny', 'deepseek-ai/deepseek-vl2-tiny'),
Model('deepseek-ai/deepseek-vl2-small', 'deepseek-ai/deepseek-vl2-small'),
Model('deepseek-ai/deepseek-vl2', 'deepseek-ai/deepseek-vl2'),
]),
],
DeepseekVL2Loader,
template=TemplateType.deepseek_vl2,
model_arch=ModelArch.deepseek_vl2,
requires=['transformers<4.42'],
tags=['vision'],
))
class DeepseekOCRLoader(ModelLoader):
visual_name = 'vision_model'
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
self.auto_model_cls = self.auto_model_cls or AutoModel
model = super().get_model(model_dir, *args, **kwargs)
patch_output_clone(model.model.embed_tokens)
patch_output_to_input_device(model.model.sam_model)
patch_output_to_input_device(getattr(model.model, self.visual_name))
patch_output_to_input_device(model.model.projector)
return model
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
from transformers import AutoProcessor, AutoTokenizer
# When not loading model (e.g., vllm backend), avoid triggering AutoConfig which would execute
# trust_remote_code and cause transformers version compatibility issues
# For vllm backend, we only need the processor/tokenizer
try:
processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)
except Exception:
# Fallback to AutoTokenizer if AutoProcessor is not available
processor = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
return processor
class DeepseekOCR2Loader(DeepseekOCRLoader):
visual_name = 'qwen2_model'
register_model(
ModelMeta(
MLLMModelType.deepseek_ocr,
[
ModelGroup([
Model('deepseek-ai/DeepSeek-OCR', 'deepseek-ai/DeepSeek-OCR'),
]),
],
DeepseekOCRLoader,
template=TemplateType.deepseek_ocr,
model_arch=ModelArch.deepseek_ocr,
architectures=['DeepseekOCRForCausalLM'],
requires=['transformers==4.46.3', 'easydict'],
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.deepseek_ocr2,
[
ModelGroup([
Model('deepseek-ai/DeepSeek-OCR-2', 'deepseek-ai/DeepSeek-OCR-2'),
]),
],
DeepseekOCR2Loader,
template=TemplateType.deepseek_ocr2,
model_arch=ModelArch.deepseek_ocr2,
architectures=['DeepseekOCR2ForCausalLM'],
requires=['transformers==4.46.3', 'easydict'],
tags=['vision'],
))
class UnlimitedOCRLoader(DeepseekOCRLoader):
visual_name = 'vision_model'
@staticmethod
def _apply_multi_gpu_patch():
"""
Fixed two bugs affecting `UnlimitedOCRModel` in multi-GPU scenarios using `device_map='auto'`:
Bug 1 - Device mismatch in `torch.cat`:
`image_newline` and `view_seperator` are `nn.Parameter`s;
under `device_map='auto'`, their device placement might not align
with the image features.
Bug 2 - Device mismatch in `masked_scatter_`:
Hard-coded `.cuda()` usage caused a conflict where `images_in_this_batch`
resided on the projector's device (e.g., `cuda:7`),
while `inputs_embeds` resided on the device hosting `embed_tokens` (e.g., `cuda:0`).
Fix strategy: Temporarily replace `torch.cat` and `torch.Tensor.masked_scatter_` during the forward pass
to handle device placement automatically, then restore the original methods after execution.
"""
modeling_module = None
for mod_name, mod in sys.modules.items():
if 'modeling_unlimitedocr' in mod_name:
modeling_module = mod
break
if modeling_module is None:
return False
UnlimitedOCRModel = getattr(modeling_module, 'UnlimitedOCRModel', None)
if UnlimitedOCRModel is None:
return False
# Avoid redundant patching
if getattr(UnlimitedOCRModel, '_swift_multi_gpu_patched', False):
return True
_original_forward = UnlimitedOCRModel.forward
def _patched_forward(self, *args, **kwargs):
_orig_cat = torch.cat
_orig_masked_scatter_ = torch.Tensor.masked_scatter_
def _safe_cat(tensors, dim=0, **cat_kwargs):
# Using the device of the first tensor as the reference, the others are aligned to it.
ref_device = None
for t in tensors:
if isinstance(t, torch.Tensor):
ref_device = t.device
break
if ref_device is None:
return _orig_cat(tensors, dim, **cat_kwargs)
aligned = [
t.to(ref_device) if isinstance(t, torch.Tensor) and t.device != ref_device else t for t in tensors
]
return _orig_cat(aligned, dim, **cat_kwargs)
def _safe_masked_scatter_(tensor_self, mask, source):
# Use the device of tensor_self (inputs_embeds[idx]) as the reference.
dev = tensor_self.device
if mask.device != dev:
mask = mask.to(dev)
if source.device != dev:
source = source.to(dev)
return _orig_masked_scatter_(tensor_self, mask, source)
# Simultaneously replace the module namespace and the global scope (double insurance).
modeling_module.torch.cat = _safe_cat
torch.cat = _safe_cat
torch.Tensor.masked_scatter_ = _safe_masked_scatter_
try:
return _original_forward(self, *args, **kwargs)
finally:
# Restore the state to avoid contaminating other modules.
modeling_module.torch.cat = _orig_cat
torch.cat = _orig_cat
torch.Tensor.masked_scatter_ = _orig_masked_scatter_
UnlimitedOCRModel.forward = _patched_forward
UnlimitedOCRModel._swift_multi_gpu_patched = True
return True
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
logger = get_logger()
self.auto_model_cls = self.auto_model_cls or AutoModel
model = super(DeepseekOCRLoader, self).get_model(model_dir, *args, **kwargs)
patch_output_clone(model.model.embed_tokens)
patch_output_to_input_device(model.model.sam_model)
patch_output_to_input_device(getattr(model.model, self.visual_name))
patch_output_to_input_device(model.model.projector)
patch_output_to_input_device(model.model)
_orig_sw = (getattr(model.config, 'sliding_window_size', None) or getattr(model.config, 'sliding_window', None))
if _orig_sw is not None:
model.config._ring_window = _orig_sw
model.config.sliding_window = None
logger.info('[UnlimitedOCR] R-SWA enabled: ring_window=%d', _orig_sw)
else:
logger.warning('[UnlimitedOCR] sliding_window config not found, R-SWA may not work.')
n_devices = len(set(str(p.device) for p in model.parameters() if p.device.type == 'cuda'))
if n_devices > 1:
if self._apply_multi_gpu_patch():
logger.info('[UnlimitedOCR] Multi-GPU patch applied (%d GPUs).', n_devices)
else:
logger.warning('[UnlimitedOCR] Multi-GPU deployment failed to apply patch.'
'If an inference error occurs, please check whether'
' `modeling_unlimitedocr` has been loaded correctly.')
return model
register_model(
ModelMeta(
MLLMModelType.unlimited_ocr,
[
ModelGroup([
Model('PaddlePaddle/Unlimited-OCR', 'PaddlePaddle/Unlimited-OCR'),
]),
],
UnlimitedOCRLoader,
template=TemplateType.unlimited_ocr,
model_arch=ModelArch.unlimited_ocr,
architectures=['UnlimitedOCRForCausalLM'],
requires=['transformers==4.46.3', 'easydict'],
tags=['vision'],
))
+508
View File
@@ -0,0 +1,508 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import inspect
import torch
import torch.distributed as dist
import transformers
from packaging import version
from PIL import Image
from transformers import PreTrainedModel
from types import MethodType
from swift.template import TemplateType
from swift.utils import is_deepspeed_enabled, to_device
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_output_to_input_device
from ..register import ModelLoader, SentenceTransformersLoader, register_model
transformers_5_9 = version.parse(transformers.__version__) >= version.parse('5.9')
class PaligemmaVisionLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import PaliGemmaForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or PaliGemmaForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.paligemma,
[
ModelGroup([
Model('AI-ModelScope/paligemma-3b-pt-224', 'google/paligemma-3b-pt-224'),
Model('AI-ModelScope/paligemma-3b-pt-448', 'google/paligemma-3b-pt-448'),
Model('AI-ModelScope/paligemma-3b-pt-896', 'google/paligemma-3b-pt-896'),
]),
ModelGroup([
Model('AI-ModelScope/paligemma-3b-mix-224', 'google/paligemma-3b-mix-224'),
Model('AI-ModelScope/paligemma-3b-mix-448', 'google/paligemma-3b-mix-448'),
]),
ModelGroup([
Model('AI-ModelScope/paligemma2-3b-pt-224', 'google/paligemma2-3b-pt-224'),
Model('AI-ModelScope/paligemma2-3b-pt-448', 'google/paligemma2-3b-pt-448'),
Model('AI-ModelScope/paligemma2-3b-pt-896', 'google/paligemma2-3b-pt-896'),
Model('AI-ModelScope/paligemma2-10b-pt-224', 'google/paligemma2-10b-pt-224'),
Model('AI-ModelScope/paligemma2-10b-pt-448', 'google/paligemma2-10b-pt-448'),
Model('AI-ModelScope/paligemma2-10b-pt-896', 'google/paligemma2-10b-pt-896'),
Model('AI-ModelScope/paligemma2-28b-pt-224', 'google/paligemma2-28b-pt-224'),
Model('AI-ModelScope/paligemma2-28b-pt-448', 'google/paligemma2-28b-pt-448'),
Model('AI-ModelScope/paligemma2-28b-pt-896', 'google/paligemma2-28b-pt-896'),
]),
ModelGroup([
Model('AI-ModelScope/paligemma2-3b-ft-docci-448', 'google/paligemma2-3b-ft-docci-448'),
Model('AI-ModelScope/paligemma2-10b-ft-docci-448', 'google/paligemma2-10b-ft-docci-448'),
]),
],
PaligemmaVisionLoader,
template=TemplateType.paligemma,
architectures=['PaliGemmaForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.41'],
tags=['vision'],
))
register_model(
ModelMeta(
LLMModelType.gemma,
[
ModelGroup([
Model('AI-ModelScope/gemma-2b-it', 'google/gemma-2b-it'),
Model('AI-ModelScope/gemma-2b', 'google/gemma-2b'),
Model('AI-ModelScope/gemma-7b', 'google/gemma-7b'),
Model('AI-ModelScope/gemma-7b-it', 'google/gemma-7b-it'),
], ),
],
template=TemplateType.gemma,
architectures=['GemmaForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.38'],
))
register_model(
ModelMeta(
LLMModelType.gemma2,
[
ModelGroup([
Model('LLM-Research/gemma-2-2b-it', 'google/gemma-2-2b-it'),
Model('LLM-Research/gemma-2-2b', 'google/gemma-2-2b'),
Model('LLM-Research/gemma-2-9b', 'google/gemma-2-9b'),
Model('LLM-Research/gemma-2-9b-it', 'google/gemma-2-9b-it'),
Model('LLM-Research/gemma-2-27b', 'google/gemma-2-27b'),
Model('LLM-Research/gemma-2-27b-it', 'google/gemma-2-27b-it'),
], ),
],
template=TemplateType.gemma,
architectures=['Gemma2ForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.42'],
))
class Gemma3TextLoader(ModelLoader):
def get_config(self, model_dir):
# It is strongly recommended to train Gemma3 models with the `eager` attention implementation instead of `sdpa`.
self.attn_impl = self.attn_impl or 'eager'
return super().get_config(model_dir)
register_model(
ModelMeta(
LLMModelType.gemma3_text,
[
ModelGroup([
Model('LLM-Research/gemma-3-1b-pt', 'google/gemma-3-1b-pt'),
Model('LLM-Research/gemma-3-1b-it', 'google/gemma-3-1b-it'),
Model('google/gemma-3-270m', 'google/gemma-3-270m'),
Model('google/gemma-3-270m-it', 'google/gemma-3-270m-it'),
Model('google/medgemma-27b-text-it', 'google/medgemma-27b-text-it'),
], ),
],
Gemma3TextLoader,
template=TemplateType.gemma3_text,
architectures=['Gemma3ForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.49'],
))
class Gemma3VisionLoader(ModelLoader):
def get_config(self, model_dir):
# It is strongly recommended to train Gemma3 models with the `eager` attention implementation instead of `sdpa`.
self.attn_impl = self.attn_impl or 'eager'
return super().get_config(model_dir)
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import Gemma3ForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Gemma3ForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.gemma3_vision,
[
ModelGroup([
Model('LLM-Research/gemma-3-4b-pt', 'google/gemma-3-4b-pt'),
Model('LLM-Research/gemma-3-4b-it', 'google/gemma-3-4b-it'),
Model('LLM-Research/gemma-3-12b-pt', 'google/gemma-3-12b-pt'),
Model('LLM-Research/gemma-3-12b-it', 'google/gemma-3-12b-it'),
Model('LLM-Research/gemma-3-27b-pt', 'google/gemma-3-27b-pt'),
Model('LLM-Research/gemma-3-27b-it', 'google/gemma-3-27b-it'),
Model('google/medgemma-4b-pt', 'google/medgemma-4b-pt'),
Model('google/medgemma-4b-it', 'google/medgemma-4b-it'),
Model('google/medgemma-27b-it', 'google/medgemma-27b-it'),
], ),
],
Gemma3VisionLoader,
template=TemplateType.gemma3_vision,
architectures=['Gemma3ForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.49'],
))
class Gemma3nLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import Gemma3nForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Gemma3nForConditionalGeneration
model = super().get_model(model_dir, *args, **kwargs)
patch_output_to_input_device(model.model.embed_vision)
patch_output_to_input_device(model.model.embed_audio)
return model
register_model(
ModelMeta(
MLLMModelType.gemma3n,
[
ModelGroup([
Model('google/gemma-3n-E2B', 'google/gemma-3n-E2B'),
Model('google/gemma-3n-E4B', 'google/gemma-3n-E4B'),
Model('google/gemma-3n-E2B-it', 'google/gemma-3n-E2B-it'),
Model('google/gemma-3n-E4B-it', 'google/gemma-3n-E4B-it'),
], ),
],
Gemma3nLoader,
template=TemplateType.gemma3n,
architectures=['Gemma3nForConditionalGeneration'],
model_arch=ModelArch.gemma3n,
requires=['transformers>=4.53.1'],
))
register_model(
ModelMeta(
LLMModelType.gemma_emb,
[
ModelGroup([
Model('google/embeddinggemma-300m', 'google/embeddinggemma-300m'),
], ),
],
SentenceTransformersLoader,
template=TemplateType.dummy,
architectures=['Gemma3TextModel'],
))
def _patch_gemma4_forward(model, processor, is_gemma4_unified: bool = False):
if is_gemma4_unified:
from transformers.models.gemma4_unified.modeling_gemma4_unified import \
Gemma4UnifiedModelOutputWithPast as Gemma4ModelOutputWithPast
from transformers.models.gemma4_unified.modeling_gemma4_unified import (create_masks_for_generate,
torch_compilable_check)
else:
from transformers.models.gemma4.modeling_gemma4 import (Gemma4ModelOutputWithPast, create_masks_for_generate,
torch_compilable_check)
if hasattr(model, 'origin_forward'):
return
def _forward_dummy_image(model, inputs_embeds):
images = [Image.new('RGB', (32, 32), (0, 0, 0))]
image_inputs = processor.image_processor(images=images, return_tensors='pt')
image_inputs = to_device(image_inputs, inputs_embeds.device)
dummy_pixel = image_inputs['pixel_values'].to(model.dtype)
dummy_pos_ids = image_inputs.get('image_position_ids')
image_features = model.get_image_features(dummy_pixel, dummy_pos_ids, return_dict=True).pooler_output
inputs_embeds = inputs_embeds + image_features.mean() * 0.
return inputs_embeds
# transformers 5.6.2
def forward(
self,
input_ids: torch.LongTensor | None = None,
pixel_values: torch.FloatTensor | None = None,
pixel_values_videos: torch.FloatTensor | None = None,
input_features: torch.FloatTensor | None = None,
attention_mask: torch.Tensor | None = None,
input_features_mask: torch.Tensor | None = None,
position_ids: torch.LongTensor | None = None,
past_key_values=None,
mm_token_type_ids: torch.LongTensor | None = None,
inputs_embeds: torch.FloatTensor | None = None,
use_cache: bool | None = None,
image_position_ids: torch.LongTensor | None = None,
video_position_ids: torch.LongTensor | None = None,
per_layer_inputs: torch.Tensor | None = None,
**kwargs,
) -> Gemma4ModelOutputWithPast:
r"""
input_features_mask (`torch.FloatTensor]` of shape `(num_images, seq_length)`):
The attention mask for the input audio.
image_position_ids (`torch.LongTensor` of shape `(batch_size, max_patches, 2)`, *optional*):
2D patch position coordinates from the image processor, with `(-1, -1)` indicating padding.
Passed through to the vision encoder for positional embedding computation.
video_position_ids (`torch.LongTensor` of shape `(num_videos, num_frames, max_patches, 2)`, *optional*):
2D patch position coordinates from the video processor, with `(-1, -1)` indicating padding.
Passed through to the vision encoder for positional embedding computation.
"""
if (input_ids is None) ^ (inputs_embeds is not None):
raise ValueError('You must specify exactly one of input_ids or inputs_embeds')
image_mask, video_mask, audio_mask = self.get_placeholder_mask(input_ids, inputs_embeds)
multimodal_mask = image_mask | video_mask | audio_mask
# Replace image id with PAD if the image token if OOV, to avoid index-errors
llm_input_ids = None
if inputs_embeds is None:
llm_input_ids = input_ids.clone()
llm_input_ids[multimodal_mask] = self.config.text_config.pad_token_id
inputs_embeds = self.get_input_embeddings()(llm_input_ids)
if per_layer_inputs is None and self.config.get_text_config().hidden_size_per_layer_input:
pad_embedding = self.language_model.embed_tokens.weight[self.config.text_config.pad_token_id, :]
pad_embedding = pad_embedding.to(device=multimodal_mask.device)
llm_inputs_embeds = torch.where(multimodal_mask[..., None], pad_embedding.view(1, 1, -1), inputs_embeds)
per_layer_inputs = self.language_model.get_per_layer_inputs(llm_input_ids, llm_inputs_embeds)
else:
per_layer_inputs = None
state = input_ids.new_tensor(
[pixel_values is not None or pixel_values_videos is not None, input_features is not None], dtype=torch.bool)
if dist.is_initialized() and is_deepspeed_enabled():
dist.all_reduce(state, dist.ReduceOp.MAX)
has_image, has_audio = state.tolist()
# Mixed modality training with both images and videos is not currently supported.
if pixel_values is None and pixel_values_videos is None and has_image:
inputs_embeds = _forward_dummy_image(self, inputs_embeds)
# Merge text and images
if pixel_values is not None:
image_features = self.get_image_features(pixel_values, image_position_ids, return_dict=True).pooler_output
image_features = image_features.to(inputs_embeds.device, inputs_embeds.dtype)
# Confirm the number of soft tokens from the vision tower matches the number of slots in the embeddings.
n_image_tokens = image_mask.sum()
image_mask = image_mask.unsqueeze(-1).expand_as(inputs_embeds).to(inputs_embeds.device)
torch_compilable_check(
inputs_embeds[image_mask].numel() == image_features.numel(),
f'Image features and image tokens do not match, tokens: {n_image_tokens}, features:'
f' {image_features.shape[0]}',
)
inputs_embeds = inputs_embeds.masked_scatter(
image_mask.to(inputs_embeds.device), image_features.to(inputs_embeds.device))
if pixel_values_videos is not None:
video_features = self.get_video_features(
pixel_values_videos, video_position_ids, return_dict=True).pooler_output
video_features = video_features.to(inputs_embeds.device, inputs_embeds.dtype)
# Confirm the number of soft tokens from the vision tower matches the number of slots in the embeddings.
n_video_tokens = video_mask.sum()
video_mask = video_mask.unsqueeze(-1).expand_as(inputs_embeds).to(inputs_embeds.device)
torch_compilable_check(
inputs_embeds[video_mask].numel() == video_features.numel(),
f'Video features and video tokens do not match, tokens: {n_video_tokens}, features:'
f' {video_features.shape[0]}',
)
inputs_embeds = inputs_embeds.masked_scatter(
video_mask.to(inputs_embeds.device), video_features.to(inputs_embeds.device))
# Merge text and audio
if input_features is not None and input_features_mask is not None:
audio_output = self.get_audio_features(input_features, input_features_mask, return_dict=True)
audio_features = audio_output.pooler_output
audio_mask_from_encoder = audio_output.attention_mask # True = valid
# Strip padding tokens: only keep real (non-padding) audio soft tokens.
# audio_mask_from_encoder is True for valid positions, False for padding tokens.
# This mirrors the vision encoder's padding stripping (see Gemma4VisionEncoder.forward).
audio_features = audio_features[audio_mask_from_encoder]
n_audio_tokens = audio_mask.sum()
audio_mask = audio_mask.unsqueeze(-1).expand_as(inputs_embeds).to(inputs_embeds.device)
torch_compilable_check(
inputs_embeds[audio_mask].numel() == audio_features.numel(),
f'Audio features and audio tokens do not match, tokens: {n_audio_tokens}, features:'
f' {audio_features.shape[0] * audio_features.shape[1]}',
)
inputs_embeds = inputs_embeds.masked_scatter(
audio_mask.to(inputs_embeds.device), audio_features.to(inputs_embeds.device))
elif has_audio and self.audio_tower is not None:
feature_size = processor.feature_extractor.feature_size
dummy_features = input_ids.new_zeros([1, 128, feature_size], dtype=self.audio_tower.dtype)
dummy_mask = input_ids.new_ones([1, 128], dtype=torch.bool)
audio_output = self.get_audio_features(dummy_features, dummy_mask, return_dict=True)
audio_features = audio_output.pooler_output
inputs_embeds = inputs_embeds + audio_features.mean() * 0.
# It may already have been prepared by, e.g., `generate`
if position_ids is None:
past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0
position_ids = torch.arange(inputs_embeds.shape[1], device=inputs_embeds.device) + past_seen_tokens
position_ids = position_ids.unsqueeze(0)
bi_vision_attn = self.config.get_text_config().use_bidirectional_attention == 'vision'
if not isinstance(causal_mask_mapping := attention_mask, dict):
if bi_vision_attn and not transformers_5_9:
from transformers.models.gemma4.modeling_gemma4 import create_causal_mask_mapping
# Larger Gemma 4 models use Gemma 3's bidirectional attention mask for vision inputs
causal_mask_mapping = create_causal_mask_mapping(
self.config,
inputs_embeds=inputs_embeds,
attention_mask=attention_mask,
past_key_values=past_key_values,
position_ids=position_ids,
mm_token_type_ids=mm_token_type_ids,
)
else:
mask_kwargs = {
'config': self.config,
'inputs_embeds': inputs_embeds,
'attention_mask': attention_mask,
'past_key_values': past_key_values,
'position_ids': position_ids,
}
if bi_vision_attn:
from transformers.models.gemma4.modeling_gemma4 import get_block_sequence_ids_for_mask
block_sequence_ids = torch.full([*inputs_embeds.size()[:-1]], -1, device=inputs_embeds.device)
if mm_token_type_ids is not None:
kwargs = {
'device': inputs_embeds.device
} if 'device' in inspect.signature(get_block_sequence_ids_for_mask).parameters else {}
block_sequence_ids = get_block_sequence_ids_for_mask(mm_token_type_ids, **kwargs)
mask_kwargs['block_sequence_ids'] = block_sequence_ids
causal_mask_mapping = create_masks_for_generate(**mask_kwargs)
kwargs.pop('return_dict', None)
outputs = self.language_model(
per_layer_inputs=per_layer_inputs,
attention_mask=causal_mask_mapping,
position_ids=position_ids,
past_key_values=past_key_values,
inputs_embeds=inputs_embeds,
use_cache=use_cache,
return_dict=True,
**kwargs,
)
return Gemma4ModelOutputWithPast(
last_hidden_state=outputs.last_hidden_state,
past_key_values=outputs.past_key_values,
hidden_states=outputs.hidden_states,
attentions=outputs.attentions,
image_hidden_states=image_features if pixel_values is not None else None,
audio_hidden_states=audio_features if input_features is not None else None,
)
model.origin_forward = model.forward
model.forward = MethodType(forward, model)
class Gemma4Loader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
from transformers import Gemma4ForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Gemma4ForConditionalGeneration
model = super().get_model(model_dir, config, processor, model_kwargs)
_patch_gemma4_forward(model.model, processor)
return model
register_model(
ModelMeta(
MLLMModelType.gemma4,
[
ModelGroup([
Model('google/gemma-4-E2B', 'google/gemma-4-E2B'),
Model('google/gemma-4-E2B-it', 'google/gemma-4-E2B-it'),
Model('google/gemma-4-E4B', 'google/gemma-4-E4B'),
Model('google/gemma-4-E4B-it', 'google/gemma-4-E4B-it'),
],
template=TemplateType.gemma4_nothinking),
ModelGroup([
Model('google/gemma-4-31B', 'google/gemma-4-31B'),
Model('google/gemma-4-31B-it', 'google/gemma-4-31B-it'),
Model('google/gemma-4-26B-A4B', 'google/gemma-4-26B-A4B'),
Model('google/gemma-4-26B-A4B-it', 'google/gemma-4-26B-A4B-it'),
],
template=TemplateType.gemma4),
],
Gemma4Loader,
architectures=['Gemma4ForConditionalGeneration'],
model_arch=ModelArch.gemma3n,
))
class Gemma4UnifiedLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
from transformers import Gemma4UnifiedForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Gemma4UnifiedForConditionalGeneration
model = super().get_model(model_dir, config, processor, model_kwargs)
_patch_gemma4_forward(model.model, processor, is_gemma4_unified=True)
return model
register_model(
ModelMeta(
MLLMModelType.gemma4_unified,
[
ModelGroup([
Model('google/gemma-4-12B', 'google/gemma-4-12B'),
Model('google/gemma-4-12B-it', 'google/gemma-4-12B-it'),
],
template=TemplateType.gemma4),
],
Gemma4UnifiedLoader,
architectures=['Gemma4UnifiedForConditionalGeneration'],
model_arch=ModelArch.gemma4_unified,
requires=['transformers>=5.10.1'],
))
class DiffusionGemmaLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
from transformers import DiffusionGemmaForBlockDiffusion
self.auto_model_cls = self.auto_model_cls or DiffusionGemmaForBlockDiffusion
model = super().get_model(model_dir, config, processor, model_kwargs)
model.prepare_inputs_for_generation = None
model.config.use_cache = True
return model
register_model(
ModelMeta(
MLLMModelType.diffusion_gemma,
[
ModelGroup([
Model('google/diffusiongemma-26B-A4B-it', 'google/diffusiongemma-26B-A4B-it'),
],
template=TemplateType.diffusion_gemma),
],
DiffusionGemmaLoader,
architectures=['DiffusionGemmaForBlockDiffusion'],
model_arch=ModelArch.diffusion_gemma,
requires=['transformers>=5.11'],
))
+518
View File
@@ -0,0 +1,518 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import inspect
import torch
import transformers
from packaging import version
from transformers import AutoTokenizer, PretrainedConfig, PreTrainedModel, PreTrainedTokenizerBase
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from transformers.models.auto.tokenization_auto import get_tokenizer_config
from typing import Any, Dict, Type
from swift.template import TemplateType
from swift.utils import Processor, get_device_count, get_dist_setting, get_logger, safe_snapshot_download
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_get_input_embeddings, patch_output_to_input_device
from ..register import ModelLoader, register_model
logger = get_logger()
def remove_property(tokenizer_cls: Type[PreTrainedTokenizerBase], tokenizer_config: Dict[str, Any]) -> None:
for k, v in tokenizer_cls.__dict__.items():
if k.endswith('_token') and isinstance(v, property) and k in tokenizer_config:
setattr(tokenizer_cls, k, tokenizer_config[k])
def _patch_tokenizer(tokenizer):
tokenizer_cls = tokenizer.__class__
if hasattr(tokenizer_cls, '_origin_pad'):
return
tokenizer_cls._origin_pad = tokenizer_cls._pad
parameters = inspect.signature(tokenizer_cls._origin_pad).parameters
def _pad(self, *args, **kwargs):
if 'padding_side' in kwargs and kwargs['padding_side'] is None and 'padding_side' not in parameters:
kwargs.pop('padding_side')
return tokenizer_cls._origin_pad(self, *args, **kwargs)
tokenizer_cls._pad = _pad
class ChatGLMLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
if model_kwargs.get('quantization_config') is not None:
model_kwargs['quantization_config'].llm_int8_skip_modules = ['output_layer']
model = super().get_model(model_dir, config, processor, model_kwargs)
from torch.nn import CrossEntropyLoss
__old_forward = CrossEntropyLoss.forward
def cross_entropy_forward(self, inputs: torch.Tensor, target: torch.Tensor) -> torch.Tensor:
target = target.to(device=inputs.device)
return __old_forward(self, inputs, target)
CrossEntropyLoss.forward = cross_entropy_forward
return model
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
# fix transformers>=4.34 bug
if version.parse(transformers.__version__) >= version.parse('4.34'):
tokenizer_config = get_tokenizer_config(model_dir)
class_ref = tokenizer_config['auto_map']['AutoTokenizer'][0]
tokenizer_cls: Type[PreTrainedTokenizerBase] = get_class_from_dynamic_module(class_ref, model_dir)
tokenizer_cls._auto_class = 'AutoTokenizer'
remove_property(tokenizer_cls, tokenizer_config)
tokenizer = tokenizer_cls.from_pretrained(model_dir, trust_remote_code=True)
else:
tokenizer = super().get_processor(model_dir, config)
_patch_tokenizer(tokenizer)
return tokenizer
register_model(
ModelMeta(
LLMModelType.chatglm2, [
ModelGroup([
Model('ZhipuAI/chatglm2-6b', 'zai-org/chatglm2-6b'),
Model('ZhipuAI/chatglm2-6b-32k', 'zai-org/chatglm2-6b-32k')
],
requires=['transformers<4.42']),
ModelGroup(
[Model('ZhipuAI/codegeex2-6b', 'zai-org/codegeex2-6b')],
requires=['transformers<4.34'],
tags=['coding'],
),
],
ChatGLMLoader,
template=TemplateType.chatglm2,
architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
model_arch=ModelArch.chatglm))
register_model(
ModelMeta(
LLMModelType.chatglm3, [
ModelGroup([
Model('ZhipuAI/chatglm3-6b', 'zai-org/chatglm3-6b'),
Model('ZhipuAI/chatglm3-6b-base', 'zai-org/chatglm3-6b-base'),
Model('ZhipuAI/chatglm3-6b-32k', 'zai-org/chatglm3-6b-32k'),
Model('ZhipuAI/chatglm3-6b-128k', 'zai-org/chatglm3-6b-128k'),
])
],
ChatGLMLoader,
template=TemplateType.chatglm4,
architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
requires=['transformers<4.42'],
model_arch=ModelArch.chatglm))
class ChatGLM4Loader(ChatGLMLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer = super().get_processor(model_dir, config)
if len(tokenizer.encode('<|user|>', add_special_tokens=False)) > 1:
for k in tokenizer.special_tokens.keys():
tokenizer.add_tokens(k)
return tokenizer
register_model(
ModelMeta(
LLMModelType.chatglm4,
[
ModelGroup([
Model('ZhipuAI/glm-4-9b-chat', 'zai-org/glm-4-9b-chat'),
Model('ZhipuAI/glm-4-9b', 'zai-org/glm-4-9b'),
Model('ZhipuAI/glm-4-9b-chat-1m', 'zai-org/glm-4-9b-chat-1m'),
]),
ModelGroup([
Model('ZhipuAI/LongWriter-glm4-9b', 'zai-org/LongWriter-glm4-9b'),
])
],
ChatGLM4Loader,
template=TemplateType.chatglm4,
architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
model_arch=ModelArch.chatglm,
requires=['transformers>=4.42'],
))
register_model(
ModelMeta(
LLMModelType.glm4,
[
ModelGroup([
Model('ZhipuAI/GLM-4-9B-0414', 'zai-org/GLM-4-9B-0414'),
Model('ZhipuAI/GLM-4-32B-0414', 'zai-org/GLM-4-32B-0414'),
Model('ZhipuAI/GLM-4-32B-Base-0414', 'zai-org/GLM-4-32B-Base-0414'),
Model('ZhipuAI/GLM-Z1-9B-0414', 'zai-org/GLM-Z1-9B-0414'),
Model('ZhipuAI/GLM-Z1-32B-0414', 'zai-org/GLM-Z1-32B-0414'),
], TemplateType.glm4),
ModelGroup([
Model('ZhipuAI/GLM-Z1-Rumination-32B-0414', 'zai-org/GLM-Z1-Rumination-32B-0414'),
], TemplateType.glm4_z1_rumination)
],
requires=['transformers>=4.51'],
architectures=['Glm4ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.codegeex4,
[ModelGroup([
Model('ZhipuAI/codegeex4-all-9b', 'zai-org/codegeex4-all-9b'),
])],
ChatGLM4Loader,
template=TemplateType.codegeex4,
requires=['transformers<4.42'],
architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
model_arch=ModelArch.chatglm,
tags=['coding'],
))
class ChatGLM4vLoader(ChatGLMLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
# fix device_map 4
n_gpu = get_device_count()
local_world_size = get_dist_setting()[3]
if n_gpu // local_world_size >= 4:
for layer in model.transformer.vision.transformer.layers:
patch_output_to_input_device(layer.mlp)
patch_output_to_input_device(layer.post_attention_layernorm)
device = next(model.transformer.vision.linear_proj.parameters()).device
model.transformer.vision.boi.data = model.transformer.vision.boi.to(device)
model.transformer.vision.eoi.data = model.transformer.vision.eoi.to(device)
return model
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
processor = super().get_processor(model_dir, config)
processor.init_kwargs['image_size'] = 1120
return processor
register_model(
ModelMeta(
MLLMModelType.chatglm4v,
[
ModelGroup(
[
Model('ZhipuAI/glm-4v-9b', 'zai-org/glm-4v-9b'),
],
requires=['transformers>=4.42,<4.45'],
),
ModelGroup(
[
Model('ZhipuAI/cogagent-9b-20241220', 'zai-org/cogagent-9b-20241220'),
],
requires=['transformers>=4.42'],
)
],
ChatGLM4vLoader,
template=TemplateType.chatglm4v,
architectures=['ChatGLMModel', 'ChatGLMForConditionalGeneration'],
model_arch=ModelArch.chatglm4v,
))
class GLM4vLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import Glm4vForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Glm4vForConditionalGeneration
model = super().get_model(model_dir, *args, **kwargs)
if hasattr(model, 'visual'):
patch_get_input_embeddings(model.visual, 'patch_embed')
return model
register_model(
ModelMeta(
MLLMModelType.glm4v,
[
ModelGroup(
[
Model('ZhipuAI/GLM-4.1V-9B-Base', 'zai-org/GLM-4.1V-9B-Base'),
Model('ZhipuAI/GLM-4.1V-9B-Thinking', 'zai-org/GLM-4.1V-9B-Thinking'),
Model('ZhipuAI/AutoGLM-Phone-9B', 'zai-org/AutoGLM-Phone-9B')
],
template=TemplateType.glm4v,
requires=['transformers>=4.53'],
),
ModelGroup(
[
Model('ZhipuAI/Glyph', 'zai-org/Glyph'),
],
template=TemplateType.glm4_5v,
requires=['transformers>=4.57'],
),
ModelGroup(
[
Model('ZhipuAI/GLM-4.6V-Flash', 'zai-org/GLM-4.6V-Flash'),
],
template=TemplateType.glm4_5v,
requires=['transformers>=5.0.0.dev'],
),
],
GLM4vLoader,
model_arch=ModelArch.glm4v,
architectures=['Glm4vForConditionalGeneration'],
))
class CogVLMLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
logger.warning('CogAgent with FusedLayerNorm will cause an training loss of NAN, '
'to avoid this, please uninstall apex.')
logger.info('Please ignore the unimported warning.')
return super().get_model(model_dir, *args, **kwargs)
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer_dir = safe_snapshot_download('AI-ModelScope/vicuna-7b-v1.5', download_model=False, check_local=True)
tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir, trust_remote_code=True)
return tokenizer
register_model(
ModelMeta(
MLLMModelType.cogvlm, [
ModelGroup([
Model('ZhipuAI/cogvlm-chat', 'zai-org/cogvlm-chat-hf'),
]),
],
CogVLMLoader,
template=TemplateType.cogvlm,
architectures=['CogVLMForCausalLM'],
requires=['transformers<4.42'],
model_arch=ModelArch.cogvlm))
register_model(
ModelMeta(
MLLMModelType.cogagent_chat, [
ModelGroup([
Model('ZhipuAI/cogagent-chat', 'zai-org/cogagent-chat-hf'),
]),
],
CogVLMLoader,
template=TemplateType.cogagent_chat,
architectures=['CogAgentForCausalLM'],
requires=['transformers<4.42', 'timm'],
model_arch=ModelArch.cogvlm))
register_model(
ModelMeta(
MLLMModelType.cogagent_vqa, [ModelGroup([
Model('ZhipuAI/cogagent-vqa', 'zai-org/cogagent-vqa-hf'),
])],
CogVLMLoader,
template=TemplateType.cogagent_vqa,
architectures=['CogAgentForCausalLM'],
requires=['transformers<4.42'],
model_arch=ModelArch.cogvlm))
class CogVLM2Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
# fix device map 4
for layer in model.model.vision.transformer.layers:
patch_output_to_input_device(layer.mlp)
patch_output_to_input_device(layer.post_attention_layernorm)
device = next(model.model.vision.linear_proj.parameters()).device
model.model.vision.boi.data = model.model.vision.boi.to(device)
model.model.vision.eoi.data = model.model.vision.eoi.to(device)
return model
register_model(
ModelMeta(
MLLMModelType.cogvlm2, [
ModelGroup([
Model('ZhipuAI/cogvlm2-llama3-chat-19B', 'zai-org/cogvlm2-llama3-chat-19B'),
Model('ZhipuAI/cogvlm2-llama3-chinese-chat-19B', 'zai-org/cogvlm2-llama3-chinese-chat-19B'),
]),
],
CogVLM2Loader,
template=TemplateType.cogvlm2,
architectures=['CogVLMForCausalLM'],
requires=['transformers<4.42'],
model_arch=ModelArch.cogvlm))
register_model(
ModelMeta(
MLLMModelType.cogvlm2_video,
[
ModelGroup([
Model('ZhipuAI/cogvlm2-video-llama3-chat', 'zai-org/cogvlm2-video-llama3-chat'),
]),
],
CogVLM2Loader,
template=TemplateType.cogvlm2_video,
architectures=['CogVLMVideoForCausalLM'],
requires=['decord', 'pytorchvideo', 'transformers>=4.42'],
model_arch=ModelArch.cogvlm,
tags=['video'],
))
register_model(
ModelMeta(
LLMModelType.glm_edge,
[
ModelGroup([
Model('ZhipuAI/glm-edge-1.5b-chat', 'zai-org/glm-edge-1.5b-chat'),
Model('ZhipuAI/glm-edge-4b-chat', 'zai-org/glm-edge-4b-chat'),
]),
],
template=TemplateType.chatglm4,
architectures=['GlmForCausalLM'],
requires=['transformers>=4.46'],
))
class GLMEdgeVLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
from transformers import AutoImageProcessor
self.auto_tokenizer_cls = AutoImageProcessor
return super().get_processor(model_dir, config)
register_model(
ModelMeta(
MLLMModelType.glm_edge_v,
[
ModelGroup([
Model('ZhipuAI/glm-edge-v-2b', 'zai-org/glm-edge-v-2b'),
Model('ZhipuAI/glm-edge-4b-chat', 'zai-org/glm-edge-4b-chat'),
]),
],
GLMEdgeVLoader,
template=TemplateType.glm_edge_v,
architectures=['GlmForCausalLM'],
requires=['transformers>=4.46'],
model_arch=ModelArch.glm_edge_v,
tags=['vision'],
))
register_model(
ModelMeta(
LLMModelType.glm4_moe,
[
ModelGroup([
Model('ZhipuAI/GLM-4.5-Air-Base', 'zai-org/GLM-4.5-Air-Base'),
Model('ZhipuAI/GLM-4.5-Air', 'zai-org/GLM-4.5-Air'),
Model('ZhipuAI/GLM-4.5-Air-FP8', 'zai-org/GLM-4.5-Air-FP8'),
Model('ZhipuAI/GLM-4.5-Base', 'zai-org/GLM-4.5-Base'),
Model('ZhipuAI/GLM-4.5', 'zai-org/GLM-4.5'),
Model('ZhipuAI/GLM-4.5-FP8', 'zai-org/GLM-4.5-FP8'),
], TemplateType.glm4_5),
ModelGroup([
Model('ZhipuAI/GLM-4.6', 'zai-org/GLM-4.6'),
Model('ZhipuAI/GLM-4.6-FP8', 'zai-org/GLM-4.6-FP8'),
], TemplateType.glm4_5),
ModelGroup([
Model('ZhipuAI/GLM-4.7', 'zai-org/GLM-4.7'),
Model('ZhipuAI/GLM-4.7-FP8', 'zai-org/GLM-4.7-FP8'),
], TemplateType.glm4_7),
],
requires=['transformers>=4.54'],
architectures=['Glm4MoeForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.glm4_moe_lite,
[
ModelGroup([
Model('ZhipuAI/GLM-4.7-Flash', 'zai-org/GLM-4.7-Flash'),
], TemplateType.glm4_7),
],
requires=['transformers>=5.0.0.dev'],
architectures=['Glm4MoeLiteForCausalLM'],
))
class Glm4vMoeLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import Glm4vMoeForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Glm4vMoeForConditionalGeneration
model = super().get_model(model_dir, *args, **kwargs)
patch_get_input_embeddings(model.visual, 'patch_embed')
return model
register_model(
ModelMeta(
MLLMModelType.glm4v_moe,
[
ModelGroup([
Model('ZhipuAI/GLM-4.5V', 'zai-org/GLM-4.5V'),
Model('ZhipuAI/GLM-4.5V-FP8', 'zai-org/GLM-4.5V-FP8'),
]),
ModelGroup([
Model('ZhipuAI/GLM-4.6V', 'zai-org/GLM-4.6V'),
Model('ZhipuAI/GLM-4.6V-FP8', 'zai-org/GLM-4.6V-FP8'),
],
requires=['transformers>=5.0.0.dev']),
],
Glm4vMoeLoader,
template=TemplateType.glm4_5v,
model_arch=ModelArch.glm4v,
architectures=['Glm4vMoeForConditionalGeneration'],
requires=['transformers>=4.56'],
))
class GLMOCRLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import AutoModelForImageTextToText
self.auto_model_cls = self.auto_model_cls or AutoModelForImageTextToText
model = super().get_model(model_dir, *args, **kwargs)
if hasattr(model, 'visual'):
patch_get_input_embeddings(model.visual, 'patch_embed')
return model
register_model(
ModelMeta(
MLLMModelType.glm_ocr,
[
ModelGroup([
Model('ZhipuAI/GLM-OCR', 'zai-org/GLM-OCR'),
]),
],
GLMOCRLoader,
template=TemplateType.glm_ocr,
model_arch=ModelArch.glm4v,
architectures=['GlmOcrForConditionalGeneration'],
requires=['transformers>=5.0.1dev0'],
))
register_model(
ModelMeta(
LLMModelType.glm_moe_dsa,
[
ModelGroup([
Model('ZhipuAI/GLM-5', 'zai-org/GLM-5'),
], template=TemplateType.glm4_7),
ModelGroup([
Model('ZhipuAI/GLM-5.1', 'zai-org/GLM-5.1'),
Model('ZhipuAI/GLM-5.1-FP8', 'ZhipuAI/GLM-5.1-FP8'),
],
template=TemplateType.glm5_1),
ModelGroup([
Model('ZhipuAI/GLM-5.2', 'ZhipuAI/GLM-5.2'),
Model('ZhipuAI/GLM-5.2-FP8', 'ZhipuAI/GLM-5.2-FP8'),
],
template=TemplateType.glm5_2),
],
architectures=['GlmMoeDsaForCausalLM'],
requires=['transformers>=5.2.0'],
))
+507
View File
@@ -0,0 +1,507 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import AutoTokenizer, PretrainedConfig, PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, safe_snapshot_download
from ..constant import LLMModelType, MLLMModelType, RMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_output_clone, patch_output_to_input_device
from ..register import ModelLoader, RewardModelLoader, register_model
from ..utils import use_submodel_func
from .qwen import Qwen2AudioLoader
register_model(
ModelMeta(
LLMModelType.internlm,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm-chat-7b', 'internlm/internlm-chat-7b'),
Model('Shanghai_AI_Laboratory/internlm-7b', 'internlm/internlm-7b'),
Model('Shanghai_AI_Laboratory/internlm-chat-7b-8k'),
Model('Shanghai_AI_Laboratory/internlm-20b', 'internlm/internlm-20b'),
Model('Shanghai_AI_Laboratory/internlm-chat-20b', 'internlm/internlm-chat-20b'),
])
],
template=TemplateType.internlm,
architectures=['InternLMForCausalLM'],
model_arch=ModelArch.llama,
))
register_model(
ModelMeta(
LLMModelType.internlm2,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm2-chat-1_8b', 'internlm/internlm2-chat-1_8b'),
Model('Shanghai_AI_Laboratory/internlm2-1_8b', 'internlm/internlm2-1_8b'),
Model('Shanghai_AI_Laboratory/internlm2-chat-1_8b-sft', 'internlm/internlm2-chat-1_8b-sft'),
Model('Shanghai_AI_Laboratory/internlm2-base-7b', 'internlm/internlm2-base-7b'),
Model('Shanghai_AI_Laboratory/internlm2-7b', 'internlm/internlm2-7b'),
Model('Shanghai_AI_Laboratory/internlm2-chat-7b', 'internlm/internlm2-chat-7b'),
Model('Shanghai_AI_Laboratory/internlm2-chat-7b-sft', 'internlm/internlm2-chat-7b-sft'),
Model('Shanghai_AI_Laboratory/internlm2-base-20b', 'internlm/internlm2-base-20b'),
Model('Shanghai_AI_Laboratory/internlm2-20b', 'internlm/internlm2-20b'),
Model('Shanghai_AI_Laboratory/internlm2-chat-20b', 'internlm/internlm2-chat-20b'),
Model('Shanghai_AI_Laboratory/internlm2-chat-20b-sft', 'internlm/internlm2-chat-20b-sft'),
]),
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm2-math-7b', 'internlm/internlm2-math-7b'),
Model('Shanghai_AI_Laboratory/internlm2-math-base-7b', 'internlm/internlm2-math-base-7b'),
Model('Shanghai_AI_Laboratory/internlm2-math-base-20b', 'internlm/internlm2-math-base-20b'),
Model('Shanghai_AI_Laboratory/internlm2-math-20b', 'internlm/internlm2-math-20b'),
],
tags=['math']),
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm2_5-1_8b-chat', 'internlm/internlm2_5-1_8b-chat'),
Model('Shanghai_AI_Laboratory/internlm2_5-1_8b', 'internlm/internlm2_5-1_8b'),
Model('Shanghai_AI_Laboratory/internlm2_5-7b', 'internlm/internlm2_5-7b'),
Model('Shanghai_AI_Laboratory/internlm2_5-7b-chat', 'internlm/internlm2_5-7b-chat'),
Model('Shanghai_AI_Laboratory/internlm2_5-7b-chat-1m', 'internlm/internlm2_5-7b-chat-1m'),
Model('Shanghai_AI_Laboratory/internlm2_5-20b', 'internlm/internlm2_5-20b'),
Model('Shanghai_AI_Laboratory/internlm2_5-20b-chat', 'internlm/internlm2_5-20b-chat'),
])
],
template=TemplateType.internlm2,
requires=['transformers>=4.38'],
architectures=['InternLM2ForCausalLM'],
model_arch=ModelArch.internlm2,
))
register_model(
ModelMeta(
LLMModelType.internlm3,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm3-8b-instruct', 'internlm/internlm3-8b-instruct'),
]),
],
template=TemplateType.internlm2,
requires=['transformers>=4.48'],
architectures=['InternLM3ForCausalLM'],
model_arch=ModelArch.llama,
))
class InternVLLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
self.auto_tokenizer_cls = AutoTokenizer
return super().get_processor(model_dir, config)
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
if self.model_info.quant_method == 'bnb': # 'is_training'
# patch: bnb backward shape mismatch bug
if model is not None and model.language_model is not None:
model.language_model.output.state.force_no_igemmlt = True
use_submodel_func(model, 'language_model')
patch_output_clone(model.language_model.get_input_embeddings())
return model
register_model(
ModelMeta(
MLLMModelType.internvl_chat,
[
ModelGroup([
Model('OpenGVLab/Mini-InternVL-Chat-2B-V1-5', 'OpenGVLab/Mini-InternVL-Chat-2B-V1-5'),
Model('AI-ModelScope/InternVL-Chat-V1-5', 'OpenGVLab/InternVL-Chat-V1-5'),
Model('AI-ModelScope/InternVL-Chat-V1-5-int8', 'OpenGVLab/InternVL-Chat-V1-5-int8'),
],
template=TemplateType.internvl,
requires=['transformers>=4.35', 'timm'],
tags=['vision']),
ModelGroup([
Model('OpenGVLab/Mini-InternVL-Chat-4B-V1-5', 'OpenGVLab/Mini-InternVL-Chat-4B-V1-5'),
],
template=TemplateType.internvl_phi3,
requires=['transformers>=4.35,<4.42', 'timm'],
tags=['vision']),
ModelGroup(
[
Model('OpenGVLab/InternVL2-1B', 'OpenGVLab/InternVL2-1B'),
Model('OpenGVLab/InternVL2-2B', 'OpenGVLab/InternVL2-2B'),
Model('OpenGVLab/InternVL2-8B', 'OpenGVLab/InternVL2-8B'),
Model('OpenGVLab/InternVL2-26B', 'OpenGVLab/InternVL2-26B'),
Model('OpenGVLab/InternVL2-40B', 'OpenGVLab/InternVL2-40B'),
Model('OpenGVLab/InternVL2-Llama3-76B', 'OpenGVLab/InternVL2-Llama3-76B'),
# (infer use lmdeploy)
Model('OpenGVLab/InternVL2-2B-AWQ', 'OpenGVLab/InternVL2-2B-AWQ'),
Model('OpenGVLab/InternVL2-8B-AWQ', 'OpenGVLab/InternVL2-8B-AWQ'),
Model('OpenGVLab/InternVL2-26B-AWQ', 'OpenGVLab/InternVL2-26B-AWQ'),
Model('OpenGVLab/InternVL2-40B-AWQ', 'OpenGVLab/InternVL2-40B-AWQ'),
Model('OpenGVLab/InternVL2-Llama3-76B-AWQ', 'OpenGVLab/InternVL2-Llama3-76B-AWQ'),
# mpo
Model('OpenGVLab/InternVL2-8B-MPO', 'OpenGVLab/InternVL2-8B-MPO'),
# pretrain
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-1B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-1B-Pretrain'),
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-2B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-2B-Pretrain'),
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-4B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-4B-Pretrain'),
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-8B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-8B-Pretrain'),
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-26B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-26B-Pretrain'),
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-40B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-40B-Pretrain'),
Model('OpenGVLab/InternVL2-Pretrain-Models:InternVL2-Llama3-76B-Pretrain',
'OpenGVLab/InternVL2-Pretrain-Models:InternVL2-Llama3-76B-Pretrain'),
],
template=TemplateType.internvl2,
requires=['transformers>=4.36', 'timm'],
tags=['vision', 'video'],
),
ModelGroup(
[
Model('OpenGVLab/InternVL2-4B', 'OpenGVLab/InternVL2-4B'),
],
template=TemplateType.internvl2_phi3,
requires=['transformers>=4.36,<4.42', 'timm'],
tags=['vision', 'video'],
),
ModelGroup(
[
Model('OpenGVLab/InternVL2_5-1B', 'OpenGVLab/InternVL2_5-1B'),
Model('OpenGVLab/InternVL2_5-2B', 'OpenGVLab/InternVL2_5-2B'),
Model('OpenGVLab/InternVL2_5-4B', 'OpenGVLab/InternVL2_5-4B'),
Model('OpenGVLab/InternVL2_5-8B', 'OpenGVLab/InternVL2_5-8B'),
Model('OpenGVLab/InternVL2_5-26B', 'OpenGVLab/InternVL2_5-26B'),
Model('OpenGVLab/InternVL2_5-38B', 'OpenGVLab/InternVL2_5-38B'),
Model('OpenGVLab/InternVL2_5-78B', 'OpenGVLab/InternVL2_5-78B'),
# quant (infer use lmdeploy)
Model('OpenGVLab/InternVL2_5-4B-AWQ', 'OpenGVLab/InternVL2_5-4B-AWQ'),
Model('OpenGVLab/InternVL2_5-8B-AWQ', 'OpenGVLab/InternVL2_5-8B-AWQ'),
Model('OpenGVLab/InternVL2_5-26B-AWQ', 'OpenGVLab/InternVL2_5-26B-AWQ'),
Model('OpenGVLab/InternVL2_5-38B-AWQ', 'OpenGVLab/InternVL2_5-38B-AWQ'),
Model('OpenGVLab/InternVL2_5-78B-AWQ', 'OpenGVLab/InternVL2_5-78B-AWQ'),
# mpo
Model('OpenGVLab/InternVL2_5-1B-MPO', 'OpenGVLab/InternVL2_5-1B-MPO'),
Model('OpenGVLab/InternVL2_5-2B-MPO', 'OpenGVLab/InternVL2_5-2B-MPO'),
Model('OpenGVLab/InternVL2_5-4B-MPO', 'OpenGVLab/InternVL2_5-4B-MPO'),
Model('OpenGVLab/InternVL2_5-8B-MPO', 'OpenGVLab/InternVL2_5-8B-MPO'),
Model('OpenGVLab/InternVL2_5-26B-MPO', 'OpenGVLab/InternVL2_5-26B-MPO'),
Model('OpenGVLab/InternVL2_5-38B-MPO', 'OpenGVLab/InternVL2_5-38B-MPO'),
Model('OpenGVLab/InternVL2_5-78B-MPO', 'OpenGVLab/InternVL2_5-78B-MPO'),
],
template=TemplateType.internvl2_5,
requires=['transformers>=4.36', 'timm'],
tags=['vision', 'video'],
),
ModelGroup(
[
# pretrain
Model('OpenGVLab/InternVL3-1B-Pretrained', 'OpenGVLab/InternVL3-1B-Pretrained'),
Model('OpenGVLab/InternVL3-2B-Pretrained', 'OpenGVLab/InternVL3-2B-Pretrained'),
Model('OpenGVLab/InternVL3-8B-Pretrained', 'OpenGVLab/InternVL3-8B-Pretrained'),
Model('OpenGVLab/InternVL3-9B-Pretrained', 'OpenGVLab/InternVL3-9B-Pretrained'),
Model('OpenGVLab/InternVL3-14B-Pretrained', 'OpenGVLab/InternVL3-14B-Pretrained'),
Model('OpenGVLab/InternVL3-38B-Pretrained', 'OpenGVLab/InternVL3-38B-Pretrained'),
Model('OpenGVLab/InternVL3-78B-Pretrained', 'OpenGVLab/InternVL3-78B-Pretrained'),
# instruct
Model('OpenGVLab/InternVL3-1B-Instruct', 'OpenGVLab/InternVL3-1B-Instruct'),
Model('OpenGVLab/InternVL3-2B-Instruct', 'OpenGVLab/InternVL3-2B-Instruct'),
Model('OpenGVLab/InternVL3-8B-Instruct', 'OpenGVLab/InternVL3-8B-Instruct'),
Model('OpenGVLab/InternVL3-9B-Instruct', 'OpenGVLab/InternVL3-9B-Instruct'),
Model('OpenGVLab/InternVL3-14B-Instruct', 'OpenGVLab/InternVL3-14B-Instruct'),
Model('OpenGVLab/InternVL3-38B-Instruct', 'OpenGVLab/InternVL3-38B-Instruct'),
Model('OpenGVLab/InternVL3-78B-Instruct', 'OpenGVLab/InternVL3-78B-Instruct'),
# mpo
Model('OpenGVLab/InternVL3-1B', 'OpenGVLab/InternVL3-1B'),
Model('OpenGVLab/InternVL3-2B', 'OpenGVLab/InternVL3-2B'),
Model('OpenGVLab/InternVL3-8B', 'OpenGVLab/InternVL3-8B'),
Model('OpenGVLab/InternVL3-9B', 'OpenGVLab/InternVL3-9B'),
Model('OpenGVLab/InternVL3-14B', 'OpenGVLab/InternVL3-14B'),
Model('OpenGVLab/InternVL3-38B', 'OpenGVLab/InternVL3-38B'),
Model('OpenGVLab/InternVL3-78B', 'OpenGVLab/InternVL3-78B'),
# awq (Use lmdeploy for inference.)
Model('OpenGVLab/InternVL3-1B-AWQ', 'OpenGVLab/InternVL3-1B-AWQ'),
Model('OpenGVLab/InternVL3-2B-AWQ', 'OpenGVLab/InternVL3-2B-AWQ'),
Model('OpenGVLab/InternVL3-8B-AWQ', 'OpenGVLab/InternVL3-8B-AWQ'),
Model('OpenGVLab/InternVL3-9B-AWQ', 'OpenGVLab/InternVL3-9B-AWQ'),
Model('OpenGVLab/InternVL3-14B-AWQ', 'OpenGVLab/InternVL3-14B-AWQ'),
Model('OpenGVLab/InternVL3-38B-AWQ', 'OpenGVLab/InternVL3-38B-AWQ'),
Model('OpenGVLab/InternVL3-78B-AWQ', 'OpenGVLab/InternVL3-78B-AWQ'),
# SenseNova-SI
Model('SenseNova/SenseNova-SI-InternVL3-2B', 'sensenova/SenseNova-SI-InternVL3-2B'),
Model('SenseNova/SenseNova-SI-InternVL3-8B', 'sensenova/SenseNova-SI-InternVL3-8B'),
Model('SenseNova/SenseNova-SI-1.1-InternVL3-2B', 'sensenova/SenseNova-SI-1.1-InternVL3-2B'),
Model('SenseNova/SenseNova-SI-1.1-InternVL3-8B', 'sensenova/SenseNova-SI-1.1-InternVL3-8B'),
],
template=TemplateType.internvl2_5,
requires=['transformers>=4.37.2', 'timm'],
tags=['vision', 'video'],
),
ModelGroup(
[
# pretrain
Model('OpenGVLab/InternVL3_5-1B-Pretrained', 'OpenGVLab/InternVL3_5-1B-Pretrained'),
Model('OpenGVLab/InternVL3_5-2B-Pretrained', 'OpenGVLab/InternVL3_5-2B-Pretrained'),
Model('OpenGVLab/InternVL3_5-4B-Pretrained', 'OpenGVLab/InternVL3_5-4B-Pretrained'),
Model('OpenGVLab/InternVL3_5-8B-Pretrained', 'OpenGVLab/InternVL3_5-8B-Pretrained'),
Model('OpenGVLab/InternVL3_5-14B-Pretrained', 'OpenGVLab/InternVL3_5-14B-Pretrained'),
Model('OpenGVLab/InternVL3_5-38B-Pretrained', 'OpenGVLab/InternVL3_5-38B-Pretrained'),
Model('OpenGVLab/InternVL3_5-30B-A3B-Pretrained', 'OpenGVLab/InternVL3_5-30B-A3B-Pretrained'),
Model('OpenGVLab/InternVL3_5-241B-A28B-Pretrained', 'OpenGVLab/InternVL3_5-241B-A28B-Pretrained'),
# Instruct
Model('OpenGVLab/InternVL3_5-1B-Instruct', 'OpenGVLab/InternVL3_5-1B-Instruct'),
Model('OpenGVLab/InternVL3_5-2B-Instruct', 'OpenGVLab/InternVL3_5-2B-Instruct'),
Model('OpenGVLab/InternVL3_5-4B-Instruct', 'OpenGVLab/InternVL3_5-4B-Instruct'),
Model('OpenGVLab/InternVL3_5-8B-Instruct', 'OpenGVLab/InternVL3_5-8B-Instruct'),
Model('OpenGVLab/InternVL3_5-14B-Instruct', 'OpenGVLab/InternVL3_5-14B-Instruct'),
Model('OpenGVLab/InternVL3_5-38B-Instruct', 'OpenGVLab/InternVL3_5-38B-Instruct'),
Model('OpenGVLab/InternVL3_5-30B-A3B-Instruct', 'OpenGVLab/InternVL3_5-30B-A3B-Instruct'),
Model('OpenGVLab/InternVL3_5-241B-A28B-Instruct', 'OpenGVLab/InternVL3_5-241B-A28B-Instruct'),
# MPO
Model('OpenGVLab/InternVL3_5-1B-MPO', 'OpenGVLab/InternVL3_5-1B-MPO'),
Model('OpenGVLab/InternVL3_5-2B-MPO', 'OpenGVLab/InternVL3_5-2B-MPO'),
Model('OpenGVLab/InternVL3_5-4B-MPO', 'OpenGVLab/InternVL3_5-4B-MPO'),
Model('OpenGVLab/InternVL3_5-8B-MPO', 'OpenGVLab/InternVL3_5-8B-MPO'),
Model('OpenGVLab/InternVL3_5-14B-MPO', 'OpenGVLab/InternVL3_5-14B-MPO'),
Model('OpenGVLab/InternVL3_5-38B-MPO', 'OpenGVLab/InternVL3_5-38B-MPO'),
Model('OpenGVLab/InternVL3_5-30B-A3B-MPO', 'OpenGVLab/InternVL3_5-30B-A3B-MPO'),
Model('OpenGVLab/InternVL3_5-241B-A28B-MPO', 'OpenGVLab/InternVL3_5-241B-A28B-MPO'),
#
Model('OpenGVLab/InternVL3_5-1B', 'OpenGVLab/InternVL3_5-1B'),
Model('OpenGVLab/InternVL3_5-2B', 'OpenGVLab/InternVL3_5-2B'),
Model('OpenGVLab/InternVL3_5-4B', 'OpenGVLab/InternVL3_5-4B'),
Model('OpenGVLab/InternVL3_5-8B', 'OpenGVLab/InternVL3_5-8B'),
Model('OpenGVLab/InternVL3_5-14B', 'OpenGVLab/InternVL3_5-14B'),
Model('OpenGVLab/InternVL3_5-38B', 'OpenGVLab/InternVL3_5-38B'),
Model('OpenGVLab/InternVL3_5-30B-A3B', 'OpenGVLab/InternVL3_5-30B-A3B'),
Model('OpenGVLab/InternVL3_5-241B-A28B', 'OpenGVLab/InternVL3_5-241B-A28B'),
],
template=TemplateType.internvl3_5,
requires=['transformers>=4.37.2', 'timm'],
tags=['vision', 'video'],
),
ModelGroup(
[
Model('OpenGVLab/InternVL3_5-GPT-OSS-20B-A4B-Preview',
'OpenGVLab/InternVL3_5-GPT-OSS-20B-A4B-Preview'),
],
template=TemplateType.internvl3_5_gpt,
requires=['transformers>=4.37.2', 'timm'],
tags=['vision', 'video'],
),
],
InternVLLoader,
architectures=['InternVLChatModel'],
model_arch=ModelArch.internvl,
))
class Interns1Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers.modeling_utils import PreTrainedModel
model = super().get_model(model_dir, *args, **kwargs)
if not hasattr(PreTrainedModel, '_old_enable_input_require_grads'):
old_enable_input_require_grads = PreTrainedModel.enable_input_require_grads
def patched_enable_input_require_grads(self):
def make_inputs_require_grads(module, input, output):
if isinstance(output, tuple):
output[0].requires_grad_(True)
else:
output.requires_grad_(True)
self._require_grads_hook = self.get_input_embeddings().register_forward_hook(make_inputs_require_grads)
PreTrainedModel.enable_input_require_grads = patched_enable_input_require_grads
PreTrainedModel._old_enable_input_require_grads = old_enable_input_require_grads
return model
class InternVLHfLoader(Interns1Loader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import AutoModelForImageTextToText
self.auto_model_cls = self.auto_model_cls or AutoModelForImageTextToText
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.internvl,
[
ModelGroup([
Model('OpenGVLab/InternVL3-1B-hf', 'OpenGVLab/InternVL3-1B-hf'),
Model('OpenGVLab/InternVL3-2B-hf', 'OpenGVLab/InternVL3-2B-hf'),
Model('OpenGVLab/InternVL3-8B-hf', 'OpenGVLab/InternVL3-8B-hf'),
Model('OpenGVLab/InternVL3-9B-hf', 'OpenGVLab/InternVL3-9B-hf'),
Model('OpenGVLab/InternVL3-14B-hf', 'OpenGVLab/InternVL3-14B-hf'),
Model('OpenGVLab/InternVL3-38B-hf', 'OpenGVLab/InternVL3-38B-hf'),
Model('OpenGVLab/InternVL3-78B-hf', 'OpenGVLab/InternVL3-78B-hf'),
],
template=TemplateType.internvl_hf,
requires=['transformers>=4.52.1', 'timm']),
ModelGroup([
Model('OpenGVLab/InternVL3_5-1B-HF', 'OpenGVLab/InternVL3_5-1B-HF'),
Model('OpenGVLab/InternVL3_5-2B-HF', 'OpenGVLab/InternVL3_5-2B-HF'),
Model('OpenGVLab/InternVL3_5-4B-HF', 'OpenGVLab/InternVL3_5-4B-HF'),
Model('OpenGVLab/InternVL3_5-8B-HF', 'OpenGVLab/InternVL3_5-8B-HF'),
Model('OpenGVLab/InternVL3_5-14B-HF', 'OpenGVLab/InternVL3_5-14B-HF'),
Model('OpenGVLab/InternVL3_5-38B-HF', 'OpenGVLab/InternVL3_5-38B-HF'),
Model('OpenGVLab/InternVL3_5-30B-A3B-HF', 'OpenGVLab/InternVL3_5-30B-A3B-HF'),
Model('OpenGVLab/InternVL3_5-241B-A28B-HF', 'OpenGVLab/InternVL3_5-241B-A28B-HF'),
],
template=TemplateType.internvl_hf,
requires=['transformers>=4.52.1', 'timm']),
ModelGroup([
Model('OpenGVLab/InternVL3_5-GPT-OSS-20B-A4B-Preview-HF',
'OpenGVLab/InternVL3_5-GPT-OSS-20B-A4B-Preview-HF'),
],
template=TemplateType.internvl_hf,
requires=['transformers>=4.55.0', 'timm']),
],
InternVLHfLoader,
architectures=['InternVLForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
tags=['vision', 'video'],
))
register_model(
ModelMeta(
MLLMModelType.interns1,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/Intern-S1-mini', 'internlm/Intern-S1-mini'),
Model('Shanghai_AI_Laboratory/Intern-S1', 'internlm/Intern-S1'),
Model('Shanghai_AI_Laboratory/Intern-S1-mini-FP8', 'internlm/Intern-S1-mini-FP8'),
Model('Shanghai_AI_Laboratory/Intern-S1-FP8', 'internlm/Intern-S1-FP8'),
]),
],
Interns1Loader,
template=TemplateType.interns1,
architectures=['InternS1ForConditionalGeneration'],
model_arch=ModelArch.interns1,
requires=['transformers>=4.55.2,<4.56'],
tags=['vision', 'video'],
))
class Xcomposer2Loader(ModelLoader):
version = 'v2'
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
if self.version == 'v2-4khd':
from transformers import CLIPVisionModel
def load_model(self):
self.vision_tower_name = safe_snapshot_download(
'AI-ModelScope/clip-vit-large-patch14-336', check_local=True)
self.vision_tower = CLIPVisionModel.from_pretrained(self.vision_tower_name)
self.vision_tower.requires_grad_(False)
self.is_loaded = True
CLIPVisionTower = get_class_from_dynamic_module('build_mlp.CLIPVisionTower', model_dir)
CLIPVisionTower.load_model = load_model
model = super().get_model(model_dir, *args, **kwargs)
model.vit.vision_tower.gradient_checkpointing_enable()
if self.version == 'v2':
# fix AttributeError: no attribute 'attention_dropout'
model.model.layers[0].attention.__class__.attention_dropout = 0.
if self.version == 'v2.5':
patch_output_to_input_device(model.vit)
patch_output_to_input_device(model.vision_proj)
register_model(
ModelMeta(
MLLMModelType.xcomposer2,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm-xcomposer2-7b', 'internlm/internlm-xcomposer2-7b'),
], ),
],
Xcomposer2Loader,
template=TemplateType.xcomposer2,
architectures=['InternLMXComposer2ForCausalLM'],
model_arch=ModelArch.xcomposer,
tags=['vision'],
))
class Xcomposer2_4khdLoader(Xcomposer2Loader):
version = 'v2-4khd'
register_model(
ModelMeta(
MLLMModelType.xcomposer2_4khd,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm-xcomposer2-4khd-7b', 'internlm/internlm-xcomposer2-4khd-7b'),
], ),
],
Xcomposer2_4khdLoader,
template=TemplateType.xcomposer2,
architectures=['InternLM2ForCausalLM', 'InternLMXComposer2ForCausalLM'],
model_arch=ModelArch.xcomposer,
tags=['vision'],
))
class Xcomposer2_5Loader(Xcomposer2Loader):
version = 'v2.5'
register_model(
ModelMeta(
MLLMModelType.xcomposer2_5,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm-xcomposer2d5-7b', 'internlm/internlm-xcomposer2d5-7b'),
Model('Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b:base',
'internlm/internlm-xcomposer2d5-ol-7b:base')
]),
],
Xcomposer2_5Loader,
template=TemplateType.xcomposer2_5,
architectures=['InternLMXComposer2ForCausalLM'],
model_arch=ModelArch.xcomposer,
tags=['vision'],
requires=['decord'],
# target_modules: attention.wqkv attention.wo feed_forward.w1 feed_forward.w2 feed_forward.w3
))
register_model(
ModelMeta(
MLLMModelType.xcomposer2_5_ol_audio,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm-xcomposer2d5-ol-7b:audio',
'internlm/internlm-xcomposer2d5-ol-7b:audio'),
]),
],
Qwen2AudioLoader,
template=TemplateType.qwen2_audio,
requires=['transformers>=4.45'],
architectures=['Qwen2AudioForConditionalGeneration'],
model_arch=ModelArch.qwen2_audio,
tags=['audio'],
))
register_model(
ModelMeta(
RMModelType.internlm2_reward,
[
ModelGroup([
Model('Shanghai_AI_Laboratory/internlm2-1_8b-reward', 'internlm/internlm2-1_8b-reward'),
Model('Shanghai_AI_Laboratory/internlm2-7b-reward', 'internlm/internlm2-7b-reward'),
Model('Shanghai_AI_Laboratory/internlm2-20b-reward', 'internlm/internlm2-20b-reward'),
]),
],
RewardModelLoader,
template=TemplateType.internlm2_reward,
is_reward=True,
requires=['transformers>=4.38'],
architectures=['InternLM2ForRewardModel'],
))
+348
View File
@@ -0,0 +1,348 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import os
import sys
from transformers import PreTrainedModel
from swift.template import TemplateType
from swift.utils import get_device, git_clone_github
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
class LlamaLoader(ModelLoader):
def get_config(self, model_dir):
config = super().get_config(model_dir)
if getattr(config, 'pretraining_tp', 1) > 1:
config.pretraining_tp = 1
return config
register_model(
ModelMeta(
LLMModelType.llama,
[
# llama2
ModelGroup(
[
# base
Model('modelscope/Llama-2-7b-ms', 'meta-llama/Llama-2-7b-hf'),
Model('modelscope/Llama-2-13b-ms', 'meta-llama/Llama-2-13b-hf'),
Model('modelscope/Llama-2-70b-ms', 'meta-llama/Llama-2-70b-hf'),
# chat
Model('modelscope/Llama-2-7b-chat-ms', 'meta-llama/Llama-2-7b-chat-hf'),
Model('modelscope/Llama-2-13b-chat-ms', 'meta-llama/Llama-2-13b-chat-hf'),
Model('modelscope/Llama-2-70b-chat-ms', 'meta-llama/Llama-2-70b-chat-hf'),
],
TemplateType.llama,
ignore_patterns=[r'.+\.bin$']),
# chinese-llama2
ModelGroup(
[
# base
Model('AI-ModelScope/chinese-llama-2-1.3b', 'hfl/chinese-llama-2-1.3b'),
Model('AI-ModelScope/chinese-llama-2-7b', 'hfl/chinese-llama-2-7b'),
Model('AI-ModelScope/chinese-llama-2-7b-16k', 'hfl/chinese-llama-2-7b-16k'),
Model('AI-ModelScope/chinese-llama-2-7b-64k', 'hfl/chinese-llama-2-7b-64k'),
Model('AI-ModelScope/chinese-llama-2-13b', 'hfl/chinese-llama-2-13b'),
Model('AI-ModelScope/chinese-llama-2-13b-16k', 'hfl/chinese-llama-2-13b-16k'),
# chat
Model('AI-ModelScope/chinese-alpaca-2-1.3b', 'hfl/chinese-alpaca-2-1.3b'),
Model('AI-ModelScope/chinese-alpaca-2-7b', 'hfl/chinese-alpaca-2-7b'),
Model('AI-ModelScope/chinese-alpaca-2-7b-16k', 'hfl/chinese-alpaca-2-7b-16k'),
Model('AI-ModelScope/chinese-alpaca-2-7b-64k', 'hfl/chinese-alpaca-2-7b-64k'),
Model('AI-ModelScope/chinese-alpaca-2-13b', 'hfl/chinese-alpaca-2-13b'),
Model('AI-ModelScope/chinese-alpaca-2-13b-16k', 'hfl/chinese-alpaca-2-13b-16k'),
],
TemplateType.llama),
# base quant
ModelGroup([
Model('AI-ModelScope/Llama-2-7b-AQLM-2Bit-1x16-hf', 'ISTA-DASLab/Llama-2-7b-AQLM-2Bit-1x16-hf'),
],
TemplateType.llama,
requires=['transformers>=4.38', 'aqlm', 'torch>=2.2.0']),
ModelGroup([
Model('FlagAlpha/Atom-7B', 'FlagAlpha/Atom-7B'),
Model('FlagAlpha/Atom-7B-Chat', 'FlagAlpha/Atom-7B-Chat'),
],
template=TemplateType.atom),
ModelGroup([
Model('langboat/Mengzi3-13B-Base', 'Langboat/Mengzi3-13B-Base'),
],
template=TemplateType.mengzi),
ModelGroup([
Model('AI-ModelScope/NuminaMath-7B-TIR', 'AI-MO/NuminaMath-7B-TIR'),
],
template=TemplateType.numina,
tags=['math']),
ModelGroup([
Model('Fengshenbang/Ziya2-13B-Base', 'IDEA-CCNL/Ziya2-13B-Base'),
Model('Fengshenbang/Ziya2-13B-Chat', 'IDEA-CCNL/Ziya2-13B-Chat'),
],
template=TemplateType.ziya),
ModelGroup([
Model('InfiniAI/Megrez-3b-Instruct', 'Infinigence/Megrez-3B-Instruct'),
], TemplateType.megrez),
# deepseek
ModelGroup([
Model('deepseek-ai/deepseek-llm-7b-base', 'deepseek-ai/deepseek-llm-7b-base'),
Model('deepseek-ai/deepseek-llm-7b-chat', 'deepseek-ai/deepseek-llm-7b-chat'),
Model('deepseek-ai/deepseek-llm-67b-base', 'deepseek-ai/deepseek-llm-67b-base'),
Model('deepseek-ai/deepseek-llm-67b-chat', 'deepseek-ai/deepseek-llm-67b-chat'),
], TemplateType.deepseek),
ModelGroup(
[
Model('deepseek-ai/deepseek-math-7b-base', 'deepseek-ai/deepseek-math-7b-base'),
Model('deepseek-ai/deepseek-math-7b-instruct', 'deepseek-ai/deepseek-math-7b-instruct'),
Model('deepseek-ai/deepseek-math-7b-rl', 'deepseek-ai/deepseek-math-7b-rl'),
],
TemplateType.deepseek,
tags=['math'],
),
ModelGroup(
[
Model('deepseek-ai/deepseek-coder-1.3b-base', 'deepseek-ai/deepseek-coder-1.3b-base'),
Model('deepseek-ai/deepseek-coder-1.3b-instruct', 'deepseek-ai/deepseek-coder-1.3b-instruct'),
Model('deepseek-ai/deepseek-coder-6.7b-base', 'deepseek-ai/deepseek-coder-6.7b-base'),
Model('deepseek-ai/deepseek-coder-6.7b-instruct', 'deepseek-ai/deepseek-coder-6.7b-instruct'),
Model('deepseek-ai/deepseek-coder-33b-base', 'deepseek-ai/deepseek-coder-33b-base'),
Model('deepseek-ai/deepseek-coder-33b-instruct', 'deepseek-ai/deepseek-coder-33b-instruct'),
],
TemplateType.deepseek,
tags=['coding'],
),
# MiniMind2
ModelGroup(
[
# MiniMind2
Model('gongjy/MiniMind2', 'jingyaogong/MiniMind2'),
# MiniMind2-Small
Model(None, 'jingyaogong/MiniMind2-Small'),
],
TemplateType.minimind,
requires=['transformers>=4.57.1']),
# llama3
ModelGroup(
[
# chat
Model('LLM-Research/Meta-Llama-3-8B-Instruct', 'meta-llama/Meta-Llama-3-8B-Instruct'),
Model('LLM-Research/Meta-Llama-3-70B-Instruct', 'meta-llama/Meta-Llama-3-70B-Instruct'),
# base
Model('LLM-Research/Meta-Llama-3-8B', 'meta-llama/Meta-Llama-3-8B'),
Model('LLM-Research/Meta-Llama-3-70B', 'meta-llama/Meta-Llama-3-70B'),
],
TemplateType.llama3),
# llama3-quant
ModelGroup([
Model('swift/Meta-Llama-3-8B-Instruct-GPTQ-Int4', 'study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int4'),
Model('swift/Meta-Llama-3-8B-Instruct-GPTQ-Int8', 'study-hjt/Meta-Llama-3-8B-Instruct-GPTQ-Int8'),
Model('swift/Meta-Llama-3-8B-Instruct-AWQ', 'study-hjt/Meta-Llama-3-8B-Instruct-AWQ'),
Model('swift/Meta-Llama-3-70B-Instruct-GPTQ-Int4', 'study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int4'),
Model('swift/Meta-Llama-3-70B-Instruct-GPTQ-Int8', 'study-hjt/Meta-Llama-3-70B-Instruct-GPTQ-Int8'),
Model('swift/Meta-Llama-3-70B-Instruct-AWQ', 'study-hjt/Meta-Llama-3-70B-Instruct-AWQ'),
], TemplateType.llama3),
# chinese-llama3
ModelGroup([
Model('ChineseAlpacaGroup/llama-3-chinese-8b-instruct', 'hfl/llama-3-chinese-8b-instruct'),
Model('ChineseAlpacaGroup/llama-3-chinese-8b', 'hfl/llama-3-chinese-8b'),
], TemplateType.llama3),
# llama3.1
ModelGroup(
[
# chat
Model('LLM-Research/Meta-Llama-3.1-8B-Instruct', 'meta-llama/Meta-Llama-3.1-8B-Instruct'),
Model('LLM-Research/Meta-Llama-3.1-70B-Instruct', 'meta-llama/Meta-Llama-3.1-70B-Instruct'),
Model('LLM-Research/Meta-Llama-3.1-405B-Instruct', 'meta-llama/Meta-Llama-3.1-405B-Instruct'),
# base
Model('LLM-Research/Meta-Llama-3.1-8B', 'meta-llama/Meta-Llama-3.1-8B'),
Model('LLM-Research/Meta-Llama-3.1-70B', 'meta-llama/Meta-Llama-3.1-70B'),
Model('LLM-Research/Meta-Llama-3.1-405B', 'meta-llama/Meta-Llama-3.1-405B'),
# fp8
Model('LLM-Research/Meta-Llama-3.1-70B-Instruct-FP8', 'meta-llama/Meta-Llama-3.1-70B-Instruct-FP8'),
Model('LLM-Research/Meta-Llama-3.1-405B-Instruct-FP8',
'meta-llama/Meta-Llama-3.1-405B-Instruct-FP8'),
],
TemplateType.llama3_2,
requires=['transformers>=4.43']),
# llama3.1-quant
ModelGroup(
[
# bnb-nf4
Model('LLM-Research/Meta-Llama-3.1-8B-Instruct-BNB-NF4',
'hugging-quants/Meta-Llama-3.1-8B-Instruct-BNB-NF4'),
Model('LLM-Research/Meta-Llama-3.1-70B-Instruct-bnb-4bit',
'unsloth/Meta-Llama-3.1-70B-Instruct-bnb-4bit'),
Model('LLM-Research/Meta-Llama-3.1-405B-Instruct-BNB-NF4',
'hugging-quants/Meta-Llama-3.1-405B-Instruct-BNB-NF4'),
# gptq-int4
Model('LLM-Research/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4',
'hugging-quants/Meta-Llama-3.1-8B-Instruct-GPTQ-INT4'),
Model('LLM-Research/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4',
'hugging-quants/Meta-Llama-3.1-70B-Instruct-GPTQ-INT4'),
Model('LLM-Research/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4',
'hugging-quants/Meta-Llama-3.1-405B-Instruct-GPTQ-INT4'),
# awq-int4
Model('LLM-Research/Meta-Llama-3.1-8B-Instruct-AWQ-INT4',
'hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4'),
Model('LLM-Research/Meta-Llama-3.1-70B-Instruct-AWQ-INT4',
'hugging-quants/Meta-Llama-3.1-70B-Instruct-AWQ-INT4'),
Model('LLM-Research/Meta-Llama-3.1-405B-Instruct-AWQ-INT4',
'hugging-quants/Meta-Llama-3.1-405B-Instruct-AWQ-INT4'),
],
TemplateType.llama3_2,
requires=['transformers>=4.43']),
# nvidia Nemotron
ModelGroup([
Model('AI-ModelScope/Llama-3.1-Nemotron-70B-Instruct-HF', 'nvidia/Llama-3.1-Nemotron-70B-Instruct-HF'),
],
TemplateType.llama3_2,
requires=['transformers>=4.43']),
ModelGroup([
Model('AI-ModelScope/Skywork-o1-Open-Llama-3.1-8B', 'Skywork/Skywork-o1-Open-Llama-3.1-8B'),
],
TemplateType.skywork_o1,
requires=['transformers>=4.43']),
ModelGroup([
Model('LLM-Research/Llama-3.2-1B', 'meta-llama/Llama-3.2-1B'),
Model('LLM-Research/Llama-3.2-3B', 'meta-llama/Llama-3.2-3B'),
Model('LLM-Research/Llama-3.2-1B-Instruct', 'meta-llama/Llama-3.2-1B-Instruct'),
Model('LLM-Research/Llama-3.2-3B-Instruct', 'meta-llama/Llama-3.2-3B-Instruct'),
],
template=TemplateType.llama3_2,
requires=['transformers>=4.43']),
ModelGroup([
Model('LLM-Research/Llama-3.3-70B-Instruct', 'meta-llama/Llama-3.3-70B-Instruct'),
Model('unsloth/Llama-3.3-70B-Instruct-bnb-4bit', 'unsloth/Llama-3.3-70B-Instruct-bnb-4bit'),
],
template=TemplateType.llama3_2,
requires=['transformers>=4.43']),
ModelGroup([
Model('ZhipuAI/LongWriter-llama3.1-8b', 'zai-org/LongWriter-llama3.1-8b'),
],
TemplateType.longwriter_llama,
requires=['transformers>=4.43']),
ModelGroup([
Model('deepseek-ai/DeepSeek-R1-Distill-Llama-8B', 'deepseek-ai/DeepSeek-R1-Distill-Llama-8B'),
Model('deepseek-ai/DeepSeek-R1-Distill-Llama-70B', 'deepseek-ai/DeepSeek-R1-Distill-Llama-70B'),
], TemplateType.deepseek_r1),
# MiniCPM5
ModelGroup([
Model('OpenBMB/MiniCPM5-1B', 'openbmb/MiniCPM5-1B'),
Model('OpenBMB/MiniCPM5-1B-Base', 'openbmb/MiniCPM5-1B-Base'),
Model('OpenBMB/MiniCPM5-1B-SFT', 'openbmb/MiniCPM5-1B-SFT'),
],
TemplateType.minicpm5,
requires=['transformers>=5.6']),
ModelGroup([
Model('LLM-Research/Reflection-Llama-3.1-70B', 'mattshumer/Reflection-Llama-3.1-70B'),
],
TemplateType.reflection,
requires=['transformers>=4.43']),
],
LlamaLoader,
model_arch=ModelArch.llama,
architectures=['LlamaForCausalLM'],
))
class Llama3_2VisionLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import MllamaForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or MllamaForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llama3_2_vision,
[
ModelGroup([
Model('LLM-Research/Llama-3.2-11B-Vision-Instruct', 'meta-llama/Llama-3.2-11B-Vision-Instruct'),
Model('LLM-Research/Llama-3.2-90B-Vision-Instruct', 'meta-llama/Llama-3.2-90B-Vision-Instruct'),
Model('LLM-Research/Llama-3.2-11B-Vision', 'meta-llama/Llama-3.2-11B-Vision'),
Model('LLM-Research/Llama-3.2-90B-Vision', 'meta-llama/Llama-3.2-90B-Vision'),
])
],
Llama3_2VisionLoader,
template=TemplateType.llama3_2_vision,
requires=['transformers>=4.45'],
architectures=['MllamaForConditionalGeneration'],
model_arch=ModelArch.llama3_2_vision,
tags=['vision'],
))
class Llama4Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import Llama4ForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Llama4ForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llama4,
[
ModelGroup([
Model('LLM-Research/Llama-4-Scout-17B-16E', 'meta-llama/Llama-4-Scout-17B-16E'),
Model('LLM-Research/Llama-4-Maverick-17B-128E', 'meta-llama/Llama-4-Maverick-17B-128E'),
Model('LLM-Research/Llama-4-Scout-17B-16E-Instruct', 'meta-llama/Llama-4-Scout-17B-16E-Instruct'),
Model('LLM-Research/Llama-4-Maverick-17B-128E-Instruct-FP8',
'meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8'),
Model('LLM-Research/Llama-4-Maverick-17B-128E-Instruct',
'meta-llama/Llama-4-Maverick-17B-128E-Instruct'),
])
],
Llama4Loader,
template=TemplateType.llama4,
requires=['transformers>=4.51'],
model_arch=ModelArch.llama4,
architectures=['Llama4ForConditionalGeneration'],
tags=['vision'],
))
class Llama3OmniLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/ictnlp/LLaMA-Omni')
sys.path.append(self.local_repo_path)
import whisper
from omni_speech.model import OmniSpeech2SLlamaForCausalLM, OmniSpeechLlamaForCausalLM
config.speech_encoder = os.path.join(model_dir, 'large-v3.pt')
if not os.path.exists(config.speech_encoder):
whisper.load_model('large-v3', download_root=model_dir)
self.auto_model_cls = self.auto_model_cls or OmniSpeech2SLlamaForCausalLM
for key in ['forward', 'generate']:
try:
delattr(OmniSpeech2SLlamaForCausalLM, key)
delattr(OmniSpeechLlamaForCausalLM, key)
except AttributeError:
pass
# not support device_map='auto'
device_map = model_kwargs['device_map']
model_kwargs['device_map'] = None
model = super().get_model(model_dir, config, processor, model_kwargs)
model.to(get_device() if device_map == 'auto' else device_map)
return model
register_model(
ModelMeta(
MLLMModelType.llama3_1_omni,
[ModelGroup([
Model('ICTNLP/Llama-3.1-8B-Omni', 'ICTNLP/Llama-3.1-8B-Omni'),
], )],
Llama3OmniLoader,
template=TemplateType.llama3_1_omni,
architectures=['OmniSpeech2SLlamaForCausalLM'],
model_arch=ModelArch.llama3_1_omni,
requires=['openai-whisper'],
tags=['audio'],
))
+455
View File
@@ -0,0 +1,455 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import sys
from functools import wraps
from transformers import PretrainedConfig, PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from swift.template import TemplateType
from swift.utils import git_clone_github, safe_snapshot_download
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_get_input_embeddings
from ..register import ModelLoader, register_model
class LlavaLlamaHfLoader(ModelLoader):
def get_config(self, model_dir: str):
from transformers import LlavaConfig
self.auto_config_cls = LlavaConfig
return super().get_config(model_dir)
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import LlavaForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or LlavaForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llava_llama3_hf,
[
ModelGroup([
Model('AI-ModelScope/llava-llama-3-8b-v1_1-transformers', 'xtuner/llava-llama-3-8b-v1_1-transformers'),
]),
],
LlavaLlamaHfLoader,
template=TemplateType.llava_llama3_hf,
architectures=['LlavaForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.36'],
tags=['vision'],
))
def _patch_llava(model):
if hasattr(model, '__old_generate'):
return
generate = model.generate
model.__old_generate = generate
@wraps(generate)
def _new_generate(inputs=None, *args, **kwargs):
input_ids = kwargs.pop('input_ids', None)
if inputs is None and input_ids is not None:
inputs = input_ids
return generate(inputs, *args, **kwargs)
model.generate = _new_generate
class LlavahfLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import LlavaForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or LlavaForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llava1_5_hf,
[
ModelGroup([
Model('llava-hf/llava-1.5-7b-hf', 'llava-hf/llava-1.5-7b-hf'),
Model('llava-hf/llava-1.5-13b-hf', 'llava-hf/llava-1.5-13b-hf'),
]),
],
LlavahfLoader,
template=TemplateType.llava1_5_hf,
architectures=['LlavaForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.36'],
tags=['vision'],
))
class LlavaOnevisionHfLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import LlavaOnevisionForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or LlavaOnevisionForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llava_onevision_hf,
[
ModelGroup([
Model('llava-hf/llava-onevision-qwen2-0.5b-ov-hf', 'llava-hf/llava-onevision-qwen2-0.5b-ov-hf'),
Model('llava-hf/llava-onevision-qwen2-7b-ov-hf', 'llava-hf/llava-onevision-qwen2-7b-ov-hf'),
Model('llava-hf/llava-onevision-qwen2-72b-ov-hf', 'llava-hf/llava-onevision-qwen2-72b-ov-hf'),
], ),
],
LlavaOnevisionHfLoader,
template=TemplateType.llava_onevision_hf,
architectures=['LlavaOnevisionForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.45'],
tags=['vision', 'video'],
))
class LlavaNextHfLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import LlavaNextForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or LlavaNextForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llava_next_qwen_hf,
[
ModelGroup([
Model('llava-hf/llava-next-72b-hf', 'llava-hf/llava-next-72b-hf'),
Model('llava-hf/llava-next-110b-hf', 'llava-hf/llava-next-110b-hf'),
], ),
],
LlavaNextHfLoader,
template=TemplateType.llava_next_qwen_hf,
architectures=['LlavaNextForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.39'],
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.llama3_llava_next_hf,
[
ModelGroup([
Model('llava-hf/llama3-llava-next-8b-hf', 'llava-hf/llama3-llava-next-8b-hf'),
], ),
],
LlavaNextHfLoader,
template=TemplateType.llama3_llava_next_hf,
architectures=['LlavaNextForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.39'],
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.llava1_6_vicuna_hf,
[
ModelGroup([
Model('llava-hf/llava-v1.6-vicuna-7b-hf', 'llava-hf/llava-v1.6-vicuna-7b-hf'),
Model('llava-hf/llava-v1.6-vicuna-13b-hf', 'llava-hf/llava-v1.6-vicuna-13b-hf'),
], ),
],
LlavaNextHfLoader,
template=TemplateType.llava1_6_vicuna_hf,
architectures=['LlavaNextForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.39'],
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.llava1_6_mistral_hf,
[
ModelGroup([
Model('llava-hf/llava-v1.6-mistral-7b-hf', 'llava-hf/llava-v1.6-mistral-7b-hf'),
], ),
],
LlavaNextHfLoader,
template=TemplateType.llava1_6_mistral_hf,
architectures=['LlavaNextForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.39'],
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.llava_llama3_1_hf,
[
ModelGroup([
Model('swift/llava-llama3.1-8b'),
], ),
],
LlavaNextHfLoader,
template=TemplateType.llava_llama3_1_hf,
architectures=['LlavaNextForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.41'],
tags=['vision'],
))
class LlavaNextYiHfLoader(LlavaNextHfLoader):
def get_config(self, model_dir: str) -> PretrainedConfig:
config = super().get_config(model_dir)
config.image_token_index = 64003
return config
register_model(
ModelMeta(
MLLMModelType.llava1_6_yi_hf,
[
ModelGroup([
Model('llava-hf/llava-v1.6-34b-hf', 'llava-hf/llava-v1.6-34b-hf'),
], ),
],
LlavaNextHfLoader,
template=TemplateType.llava1_6_yi_hf,
architectures=['LlavaNextForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.39'],
tags=['vision'],
))
class LlavaNextVideoHfLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import LlavaNextVideoForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or LlavaNextVideoForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.llava_next_video_hf,
[
ModelGroup([
Model('llava-hf/LLaVA-NeXT-Video-7B-DPO-hf', 'llava-hf/LLaVA-NeXT-Video-7B-DPO-hf'),
Model('llava-hf/LLaVA-NeXT-Video-7B-32K-hf', 'llava-hf/LLaVA-NeXT-Video-7B-32K-hf'),
Model('llava-hf/LLaVA-NeXT-Video-7B-hf', 'llava-hf/LLaVA-NeXT-Video-7B-hf'),
], ),
],
LlavaNextVideoHfLoader,
template=TemplateType.llava_next_video_hf,
architectures=['LlavaNextVideoForConditionalGeneration'],
model_arch=ModelArch.llava_next_video_hf,
requires=['transformers>=4.42', 'av'],
tags=['video'],
))
class LlavaNextVideoYiHfLoader(LlavaNextVideoHfLoader):
def get_config(self, model_dir: str) -> PretrainedConfig:
config = super().get_config(model_dir)
config.video_token_index = 64003
config.image_token_index = 64004
return config
register_model(
ModelMeta(
MLLMModelType.llava_next_video_yi_hf,
[
ModelGroup([
Model('llava-hf/LLaVA-NeXT-Video-34B-hf', 'llava-hf/LLaVA-NeXT-Video-34B-hf'),
], ),
],
LlavaNextVideoYiHfLoader,
template=TemplateType.llava_next_video_hf,
architectures=['LlavaNextVideoForConditionalGeneration'],
model_arch=ModelArch.llava_next_video_hf,
requires=['transformers>=4.42', 'av'],
tags=['video'],
))
class LlavaLoader(ModelLoader):
llm_model_type = None
def get_config(self, model_dir: str):
local_repo_path = self.local_repo_path
if not local_repo_path:
if 'next' in self.llm_model_type:
repo_path = 'https://github.com/LLaVA-VL/LLaVA-NeXT'
else:
repo_path = 'https://github.com/haotian-liu/LLaVA'
local_repo_path = git_clone_github(repo_path)
sys.path.append(local_repo_path)
if self.llm_model_type == 'mistral':
from llava.model import LlavaMistralConfig
self.auto_config_cls = LlavaMistralConfig
elif 'llama' in self.llm_model_type: # llama
from llava.model import LlavaConfig
self.auto_config_cls = LlavaConfig
config = super().get_config(model_dir)
if not hasattr(config, 'max_sequence_length'):
config.max_sequence_length = 2048
return config
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
if self.llm_model_type == 'mistral':
from llava.model import LlavaMistralForCausalLM
auto_model_cls = LlavaMistralForCausalLM
elif 'llama' in self.llm_model_type: # llama
from llava.model import LlavaLlamaForCausalLM
if not hasattr(LlavaLlamaForCausalLM, '__old_forward'): # Avoid double patching
forward = LlavaLlamaForCausalLM.forward
LlavaLlamaForCausalLM.__old_forward = forward
@wraps(forward)
def _new_forward(*args, **kwargs):
kwargs.pop('cache_position', None)
return forward(*args, **kwargs)
LlavaLlamaForCausalLM.forward = _new_forward
auto_model_cls = LlavaLlamaForCausalLM
else: # qwen
from llava.model import LlavaQwenForCausalLM
auto_model_cls = LlavaQwenForCausalLM
config.mm_vision_tower = safe_snapshot_download('AI-ModelScope/clip-vit-large-patch14-336', check_local=True)
self.auto_model_cls = self.auto_model_cls or auto_model_cls
model = super().get_model(model_dir, config, processor, model_kwargs)
vision_tower = model.get_vision_tower()
device_map = str(model_kwargs.get('device_map', str(model.device)))
if not vision_tower.is_loaded:
vision_tower.load_model(device_map=device_map)
_patch_llava(model)
model.resize_token_embeddings(len(processor))
processor.image_processor = vision_tower.image_processor
return model
class Llama3LlavaNextLoader(LlavaLoader):
llm_model_type = 'next_llama'
register_model(
ModelMeta(
MLLMModelType.llama3_llava_next,
[
ModelGroup([
Model('AI-ModelScope/llama3-llava-next-8b', 'lmms-lab/llama3-llava-next-8b'),
], ),
],
Llama3LlavaNextLoader,
template=TemplateType.llama3_llava_next,
architectures=['LlavaLlamaForCausalLM'],
model_arch=ModelArch.llava_llama,
requires=['transformers>=4.42', 'av'],
tags=['vision'],
))
class LlavaMistralLoader(LlavaLoader):
llm_model_type = 'next_llama'
register_model(
ModelMeta(
MLLMModelType.llava1_6_mistral,
[
ModelGroup([
Model('AI-ModelScope/llava-v1.6-mistral-7b', 'liuhaotian/llava-v1.6-mistral-7b'),
], ),
],
LlavaMistralLoader,
template=TemplateType.llava1_6_mistral,
requires=['transformers>=4.34'],
architectures=['LlavaMistralForCausalLM'],
model_arch=ModelArch.llava_mistral,
tags=['vision'],
))
class LlavaLlamaLoader(LlavaLoader):
llm_model_type = 'llama'
register_model(
ModelMeta(
MLLMModelType.llava1_6_yi, [
ModelGroup([
Model('AI-ModelScope/llava-v1.6-34b', 'liuhaotian/llava-v1.6-34b'),
], ),
],
LlavaLlamaLoader,
template=TemplateType.llava1_6_yi,
requires=['transformers>=4.34'],
architectures=['LlavaLlamaForCausalLM'],
tags=['vision'],
model_arch=None))
class LlavaNextQwenLoader(LlavaLoader):
llm_model_type = 'next_qwen'
register_model(
ModelMeta(
MLLMModelType.llava_next_qwen, [
ModelGroup([
Model('AI-ModelScope/llava-next-72b', 'lmms-lab/llava-next-72b'),
Model('AI-ModelScope/llava-next-110b', 'lmms-lab/llava-next-110b'),
], ),
],
LlavaNextQwenLoader,
template=TemplateType.llava_next_qwen,
architectures=['LlavaQwenForCausalLM'],
requires=['transformers>=4.42', 'av'],
tags=['vision'],
model_arch=None))
class LlavaOnevisionLoader(ModelLoader):
def get_config(self, model_dir: str) -> PretrainedConfig:
config = super().get_config(model_dir)
config.vision_start_token_id = 151652
return config
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model_cls = get_class_from_dynamic_module(
'modeling_llavaonevision1_5.LLaVAOneVision1_5_ForConditionalGeneration', model_dir)
model_cls._no_split_modules = ['LLaVAOneVision1_5_DecoderLayer', 'RiceBlock']
model = super().get_model(model_dir, *args, **kwargs)
patch_get_input_embeddings(model.visual, 'patch_embed')
return model
register_model(
ModelMeta(
MLLMModelType.llava_onevision1_5,
[
ModelGroup([
Model('lmms-lab/LLaVA-OneVision-1.5-4B-Instruct', 'lmms-lab/LLaVA-OneVision-1.5-4B-Instruct'),
Model('lmms-lab/LLaVA-OneVision-1.5-8B-Instruct', 'lmms-lab/LLaVA-OneVision-1.5-8B-Instruct'),
Model('lmms-lab/LLaVA-OneVision-1.5-4B-Base', 'lmms-lab/LLaVA-OneVision-1.5-4B-Base'),
Model('lmms-lab/LLaVA-OneVision-1.5-8B-Base', 'lmms-lab/LLaVA-OneVision-1.5-8B-Base'),
], ),
],
LlavaOnevisionLoader,
template=TemplateType.llava_onevision1_5,
architectures=['LLaVAOneVision1_5_ForConditionalGeneration'],
model_arch=ModelArch.llava_onevision1_5,
requires=['transformers>=4.53.0', 'qwen_vl_utils'],
tags=['vision'],
))
+441
View File
@@ -0,0 +1,441 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import AutoTokenizer, PretrainedConfig
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, get_logger, safe_snapshot_download
from ..constant import LLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, SentenceTransformersLoader, register_model
logger = get_logger()
class GrokLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer_dir = safe_snapshot_download('AI-ModelScope/grok-1-tokenizer', download_model=False, check_local=True)
tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir, trust_remote_code=True)
return tokenizer
register_model(
ModelMeta(
LLMModelType.grok, [
ModelGroup([
Model('colossalai/grok-1-pytorch', 'hpcai-tech/grok-1'),
]),
],
GrokLoader,
template=TemplateType.default,
architectures=['Grok1ModelForCausalLM'],
model_arch=ModelArch.llama))
class PolyLMLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
return AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False, legacy=True)
register_model(
ModelMeta(
LLMModelType.polylm,
[
ModelGroup(
[
# base
Model('damo/nlp_polylm_13b_text_generation', 'DAMO-NLP-MT/polylm-13b'),
], ),
],
PolyLMLoader,
template=TemplateType.default,
architectures=['GPT2LMHeadModel'],
model_arch=ModelArch.qwen))
class YuanLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer = AutoTokenizer.from_pretrained(
model_dir, add_eos_token=False, add_bos_token=False, eos_token='<eod>', legacy=True)
addi_tokens = [
'<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>', '<commit_before>',
'<commit_msg>', '<commit_after>', '<jupyter_start>', '<jupyter_text>', '<jupyter_code>', '<jupyter_output>',
'<empty_output>'
]
tokenizer.add_tokens(addi_tokens, special_tokens=True)
return tokenizer
register_model(
ModelMeta(
LLMModelType.yuan2,
[
ModelGroup([
Model('IEITYuan/Yuan2.0-2B-hf', 'IEITYuan/Yuan2-2B-hf'),
Model('IEITYuan/Yuan2.0-51B-hf', 'IEITYuan/Yuan2-51B-hf'),
Model('IEITYuan/Yuan2.0-102B-hf', 'IEITYuan/Yuan2-102B-hf'),
Model('IEITYuan/Yuan2-2B-Janus-hf', 'IEITYuan/Yuan2-2B-Janus-hf'),
]),
ModelGroup([
Model('IEITYuan/Yuan2-M32-hf', 'IEITYuan/Yuan2-M32-hf'),
]),
],
YuanLoader,
template=TemplateType.yuan,
model_arch=ModelArch.llama,
architectures=['YuanForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.orion,
[
ModelGroup([
Model('OrionStarAI/Orion-14B-Chat', 'OrionStarAI/Orion-14B-Chat'),
Model('OrionStarAI/Orion-14B-Base', 'OrionStarAI/Orion-14B-Base'),
]),
],
template=TemplateType.orion,
model_arch=ModelArch.llama,
architectures=['OrionForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.dbrx, [
ModelGroup([
Model('AI-ModelScope/dbrx-base', 'databricks/dbrx-base'),
Model('AI-ModelScope/dbrx-instruct', 'databricks/dbrx-instruct'),
]),
],
template=TemplateType.dbrx,
model_arch=ModelArch.dbrx,
architectures=['DbrxForCausalLM'],
requires=['transformers>=4.36']))
register_model(
ModelMeta(
LLMModelType.bluelm,
[
ModelGroup([
Model('vivo-ai/BlueLM-7B-Chat-32K', 'vivo-ai/BlueLM-7B-Chat-32K'),
Model('vivo-ai/BlueLM-7B-Chat', 'vivo-ai/BlueLM-7B-Chat'),
Model('vivo-ai/BlueLM-7B-Base-32K', 'vivo-ai/BlueLM-7B-Base-32K'),
Model('vivo-ai/BlueLM-7B-Base', 'vivo-ai/BlueLM-7B-Base'),
]),
],
template=TemplateType.bluelm,
model_arch=ModelArch.llama,
architectures=['BlueLMForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.seggpt,
[
ModelGroup([
Model('damo/nlp_seqgpt-560m', 'DAMO-NLP/SeqGPT-560M'),
]),
],
template=TemplateType.default,
model_arch=None,
architectures=['BloomForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.xverse,
[
ModelGroup([
Model('xverse/XVERSE-7B-Chat', 'xverse/XVERSE-7B-Chat'),
Model('xverse/XVERSE-7B', 'xverse/XVERSE-7B'),
Model('xverse/XVERSE-13B', 'xverse/XVERSE-13B'),
Model('xverse/XVERSE-13B-Chat', 'xverse/XVERSE-13B-Chat'),
Model('xverse/XVERSE-65B', 'xverse/XVERSE-65B'),
Model('xverse/XVERSE-65B-2', 'xverse/XVERSE-65B-2'),
Model('xverse/XVERSE-65B-Chat', 'xverse/XVERSE-65B-Chat'),
Model('xverse/XVERSE-13B-256K', 'xverse/XVERSE-13B-256K', ms_revision='v1.0.0'),
]),
],
template=TemplateType.xverse,
model_arch=ModelArch.llama,
architectures=['XverseForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.xverse_moe,
[
ModelGroup([
Model('xverse/XVERSE-MoE-A4.2B', 'xverse/XVERSE-MoE-A4.2B'),
]),
],
template=TemplateType.xverse,
model_arch=ModelArch.llama,
architectures=['XverseForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.c4ai,
[
ModelGroup([
Model('AI-ModelScope/c4ai-command-r-v01', 'CohereForAI/c4ai-command-r-v01'),
Model('AI-ModelScope/c4ai-command-r-plus', 'CohereForAI/c4ai-command-r-plus'),
]),
],
template=TemplateType.c4ai,
model_arch=ModelArch.llama,
architectures=['CohereForCausalLM'],
requires=['transformers>=4.39'],
))
register_model(
ModelMeta(
LLMModelType.aya, [
ModelGroup([
Model('AI-ModelScope/aya-expanse-8b', 'CohereForAI/aya-expanse-8b'),
Model('AI-ModelScope/aya-expanse-32b', 'CohereForAI/aya-expanse-32b'),
]),
],
template=TemplateType.aya,
model_arch=ModelArch.llama,
architectures=['CohereForCausalLM'],
requires=['transformers>=4.44.0']))
register_model(
ModelMeta(
LLMModelType.ling,
[
ModelGroup([
Model('inclusionAI/Ling-lite', 'inclusionAI/Ling-lite'),
Model('inclusionAI/Ling-plus', 'inclusionAI/Ling-plus'),
Model('inclusionAI/Ling-lite-base', 'inclusionAI/Ling-lite-base'),
Model('inclusionAI/Ling-plus-base', 'inclusionAI/Ling-plus-base'),
]),
],
template=TemplateType.ling,
architectures=['BailingMoeForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.qwen2_gte, [
ModelGroup([
Model('iic/gte_Qwen2-1.5B-instruct', 'Alibaba-NLP/gte-Qwen2-1.5B-instruct'),
Model('iic/gte_Qwen2-7B-instruct', 'Alibaba-NLP/gte-Qwen2-7B-instruct'),
]),
],
SentenceTransformersLoader,
template=TemplateType.dummy,
architectures=['Qwen2ForCausalLM']))
register_model(
ModelMeta(
LLMModelType.mimo, [
ModelGroup([
Model('XiaomiMiMo/MiMo-7B-Base', 'XiaomiMiMo/MiMo-7B-Base'),
Model('XiaomiMiMo/MiMo-7B-SFT', 'XiaomiMiMo/MiMo-7B-SFT'),
Model('XiaomiMiMo/MiMo-7B-RL-Zero', 'XiaomiMiMo/MiMo-7B-RL-Zero'),
Model('XiaomiMiMo/MiMo-7B-RL', 'XiaomiMiMo/MiMo-7B-RL'),
], TemplateType.qwen),
ModelGroup([
Model('XiaomiMiMo/MiMo-7B-RL-0530', 'XiaomiMiMo/MiMo-7B-RL-0530'),
], TemplateType.mimo_rl),
],
model_arch=ModelArch.llama,
architectures=['MiMoForCausalLM'],
requires=['transformers>=4.37']))
register_model(
ModelMeta(
LLMModelType.dots1,
[
ModelGroup([
Model('rednote-hilab/dots.llm1.base', 'rednote-hilab/dots.llm1.base'),
Model('rednote-hilab/dots.llm1.inst', 'rednote-hilab/dots.llm1.inst'),
])
],
template=TemplateType.dots1,
architectures=['Dots1ForCausalLM'],
requires=['transformers>=4.53'],
))
register_model(
ModelMeta(
LLMModelType.hunyuan,
[ModelGroup([
Model('Tencent-Hunyuan/Hunyuan-A13B-Instruct', 'tencent/Hunyuan-A13B-Instruct'),
])],
template=TemplateType.hunyuan_moe,
architectures=['HunYuanMoEV1ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.hunyuan_v1_dense,
[
ModelGroup([
Model('Tencent-Hunyuan/Hunyuan-0.5B-Instruct', 'tencent/Hunyuan-0.5B-Instruct'),
Model('Tencent-Hunyuan/Hunyuan-1.8B-Instruct', 'tencent/Hunyuan-1.8B-Instruct'),
Model('Tencent-Hunyuan/Hunyuan-4B-Instruct', 'tencent/Hunyuan-4B-Instruct'),
Model('Tencent-Hunyuan/Hunyuan-7B-Instruct', 'tencent/Hunyuan-7B-Instruct'),
# pretrain
Model('Tencent-Hunyuan/Hunyuan-0.5B-Pretrain', 'tencent/Hunyuan-0.5B-Pretrain'),
Model('Tencent-Hunyuan/Hunyuan-1.8B-Pretrain', 'tencent/Hunyuan-1.8B-Pretrain'),
Model('Tencent-Hunyuan/Hunyuan-4B-Pretrain', 'tencent/Hunyuan-4B-Pretrain'),
Model('Tencent-Hunyuan/Hunyuan-7B-Pretrain', 'tencent/Hunyuan-7B-Pretrain'),
# fp8
Model('Tencent-Hunyuan/Hunyuan-0.5B-Instruct-FP8', 'tencent/Hunyuan-0.5B-Instruct-FP8'),
Model('Tencent-Hunyuan/Hunyuan-1.8B-Instruct-FP8', 'tencent/Hunyuan-1.8B-Instruct-FP8'),
Model('Tencent-Hunyuan/Hunyuan-4B-Instruct-FP8', 'tencent/Hunyuan-4B-Instruct-FP8'),
Model('Tencent-Hunyuan/Hunyuan-7B-Instruct-FP8', 'tencent/Hunyuan-7B-Instruct-FP8'),
# awq
Model('Tencent-Hunyuan/Hunyuan-0.5B-Instruct-AWQ-Int4', 'tencent/Hunyuan-0.5B-Instruct-AWQ-Int4'),
Model('Tencent-Hunyuan/Hunyuan-1.8B-Instruct-AWQ-Int4', 'tencent/Hunyuan-1.8B-Instruct-AWQ-Int4'),
Model('Tencent-Hunyuan/Hunyuan-4B-Instruct-AWQ-Int4', 'tencent/Hunyuan-4B-Instruct-AWQ-Int4'),
Model('Tencent-Hunyuan/Hunyuan-7B-Instruct-AWQ-Int4', 'tencent/Hunyuan-7B-Instruct-AWQ-Int4'),
# gptq
Model('Tencent-Hunyuan/Hunyuan-0.5B-Instruct-GPTQ-Int4', 'tencent/Hunyuan-0.5B-Instruct-GPTQ-Int4'),
Model('Tencent-Hunyuan/Hunyuan-1.8B-Instruct-GPTQ-Int4', 'tencent/Hunyuan-1.8B-Instruct-GPTQ-Int4'),
Model('Tencent-Hunyuan/Hunyuan-4B-Instruct-GPTQ-Int4', 'tencent/Hunyuan-4B-Instruct-GPTQ-Int4'),
Model('Tencent-Hunyuan/Hunyuan-7B-Instruct-GPTQ-Int4', 'tencent/Hunyuan-7B-Instruct-GPTQ-Int4'),
])
],
template=TemplateType.hunyuan,
requires=['transformers>=4.55.0.dev0'],
architectures=['HunYuanDenseV1ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.hy_v3,
[
ModelGroup([
Model('Tencent-Hunyuan/Hy3-preview', 'tencent/Hy3-preview'),
Model('Tencent-Hunyuan/Hy3-preview-Base', 'tencent/Hy3-preview-Base'),
],
template=TemplateType.hy_v3_preview),
ModelGroup([
Model('Tencent-Hunyuan/Hy3', 'tencent/Hy3'),
Model('Tencent-Hunyuan/Hy3-FP8', 'tencent/Hy3-FP8'),
],
template=TemplateType.hy_v3),
],
requires=['transformers>=5.6.0'],
architectures=['HYV3ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.gpt_oss, [
ModelGroup([
Model('openai-mirror/gpt-oss-20b', 'openai/gpt-oss-20b'),
Model('openai-mirror/gpt-oss-120b', 'openai/gpt-oss-120b'),
])
],
template=TemplateType.gpt_oss,
ignore_patterns=['metal/', 'original/'],
architectures=['GptOssForCausalLM'],
requires=['transformers>=4.55']))
register_model(
ModelMeta(
LLMModelType.longchat,
[
ModelGroup([
Model('meituan-longcat/LongCat-Flash-Chat', 'meituan-longcat/LongCat-Flash-Chat'),
Model('meituan-longcat/LongCat-Flash-Chat-FP8', 'meituan-longcat/LongCat-Flash-Chat-FP8'),
])
],
template=TemplateType.longchat,
architectures=['LongcatFlashForCausalLM'],
requires=['transformers>=4.54,<4.56'],
))
register_model(
ModelMeta(
LLMModelType.bailing_moe,
[
ModelGroup([
Model('inclusionAI/Ling-mini-2.0', 'inclusionAI/Ling-mini-2.0'),
Model('inclusionAI/Ling-mini-base-2.0', 'inclusionAI/Ling-mini-base-2.0'),
Model('inclusionAI/Ling-1T', 'inclusionAI/Ling-1T'),
],
template=TemplateType.ling2),
ModelGroup([
Model('inclusionAI/Ring-mini-2.0', 'inclusionAI/Ring-mini-2.0'),
], template=TemplateType.ring2)
],
architectures=['BailingMoeV2ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.bailing_hybrid,
[
ModelGroup([
Model('inclusionAI/Ling-2.5-1T', 'inclusionAI/Ling-2.5-1T'),
Model('inclusionAI/Ling-2.6-1T', 'inclusionAI/Ling-2.6-1T'),
Model('inclusionAI/Ling-2.6-flash', 'inclusionAI/Ling-2.6-flash'),
],
template=TemplateType.ling2),
ModelGroup([
Model('inclusionAI/Ring-2.5-1T', 'inclusionAI/Ring-2.5-1T'),
Model('inclusionAI/Ring-2.6-1T', 'inclusionAI/Ring-2.6-1T'),
],
template=TemplateType.ring2_5),
],
architectures=['BailingMoeV2_5ForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.iquestcoder,
[
ModelGroup([
Model('IQuestLab/IQuest-Coder-V1-40B-Base-Stage1', 'IQuestLab/IQuest-Coder-V1-40B-Base-Stage1'),
Model('IQuestLab/IQuest-Coder-V1-40B-Base', 'IQuestLab/IQuest-Coder-V1-40B-Base'),
Model('IQuestLab/IQuest-Coder-V1-40B-Instruct', 'IQuestLab/IQuest-Coder-V1-40B-Instruct'),
])
],
template=TemplateType.iquestcoder,
requires=['transformers==4.52.4'],
architectures=['IQuestCoderForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.youtu_llm,
[
ModelGroup([
Model('Tencent-YouTu-Research/Youtu-LLM-2B', 'tencent/Youtu-LLM-2B'),
Model('Tencent-YouTu-Research/Youtu-LLM-2B-Base', 'tencent/Youtu-LLM-2B-Base'),
])
],
template=TemplateType.youtu_llm,
architectures=['YoutuForCausalLM'],
requires=['transformers>=4.56'],
))
register_model(
ModelMeta(
LLMModelType.olmoe,
[
ModelGroup([
Model('allenai/OLMoE-1B-7B-0125', 'allenai/OLMoE-1B-7B-0125'),
Model('allenai/OLMoE-1B-7B-0125-Instruct', 'allenai/OLMoE-1B-7B-0125-Instruct'),
],
template=TemplateType.olmoe),
ModelGroup([
Model('allenai/OLMoE-1B-7B-0924', 'allenai/OLMoE-1B-7B-0924'),
Model('allenai/OLMoE-1B-7B-0924-Instruct', 'allenai/OLMoE-1B-7B-0924-Instruct'),
Model('allenai/OLMoE-1B-7B-0924-SFT', 'allenai/OLMoE-1B-7B-0924-SFT'),
],
template=TemplateType.olmoe_0924)
],
architectures=['OlmoeForCausalLM'],
))
+40
View File
@@ -0,0 +1,40 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import PreTrainedModel
from swift.template import TemplateType
from swift.utils import get_logger
from ..constant import LLMModelType
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
logger = get_logger()
class MambaLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
logger.info(
'[IMPORTANT] Remember installing causal-conv1d>=1.2.0 and mamba-ssm, or you training and inference will'
'be really slow!')
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
LLMModelType.mamba,
[
ModelGroup([
Model('AI-ModelScope/mamba-130m-hf', 'state-spaces/mamba-130m-hf'),
Model('AI-ModelScope/mamba-370m-hf', 'state-spaces/mamba-370m-hf'),
Model('AI-ModelScope/mamba-390m-hf', 'state-spaces/mamba-390m-hf'),
Model('AI-ModelScope/mamba-790m-hf', 'state-spaces/mamba-790m-hf'),
Model('AI-ModelScope/mamba-1.4b-hf', 'state-spaces/mamba-1.4b-hf'),
Model('AI-ModelScope/mamba-2.8b-hf', 'state-spaces/mamba-2.8b-hf'),
])
],
MambaLoader,
template=TemplateType.default,
architectures=['MambaForCausalLM'],
model_arch=None,
requires=['transformers>=4.39.0'],
))
+210
View File
@@ -0,0 +1,210 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import PretrainedConfig, PreTrainedModel
from types import MethodType
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, get_device, get_env_args
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_ignore_check_imports, patch_output_clone
from ..register import ModelLoader, register_model
from ..utils import use_submodel_func
class Phi3VisionLoader(ModelLoader):
num_crops = 4
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
processor_kwargs = {'num_crops': get_env_args('num_crops', int, self.num_crops)}
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True, **processor_kwargs)
return processor
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
patch_output_clone(model.model.vision_embed_tokens.wte)
return model
register_model(
ModelMeta(
MLLMModelType.phi3_vision,
[
ModelGroup([
Model('LLM-Research/Phi-3-vision-128k-instruct', 'microsoft/Phi-3-vision-128k-instruct'),
Model('LLM-Research/Phi-3.5-vision-instruct', 'microsoft/Phi-3.5-vision-instruct'),
])
],
Phi3VisionLoader,
template=TemplateType.phi3_vision,
architectures=['Phi3VForCausalLM'],
model_arch=ModelArch.phi3_vision,
requires=['transformers>=4.36'],
tags=['vision'],
))
class Phi4MultimodalLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
processor = super().get_processor(model_dir, config)
processor.audio_processor.audio_compression_rate = processor.audio_processor.compression_rate
processor.audio_processor.audio_downsample_rate = processor.audio_processor.qformer_compression_rate
processor.audio_processor.audio_feat_stride = processor.audio_processor.feat_stride
del processor.audio_processor.feature_size
del processor.audio_processor.sampling_rate
del processor.audio_processor.padding_value
del processor.__class__.chat_template
processor.chat_template = None
return processor
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
model.set_lora_adapter(['vision', 'speech'])
return model
register_model(
ModelMeta(
MLLMModelType.phi4_multimodal,
[ModelGroup([
Model('LLM-Research/Phi-4-multimodal-instruct', 'microsoft/Phi-4-multimodal-instruct'),
])],
Phi4MultimodalLoader,
template=TemplateType.phi4_multimodal,
architectures=['Phi4MMForCausalLM'],
model_arch=ModelArch.phi4_multimodal,
requires=['transformers>=4.36,<4.49', 'backoff', 'soundfile'],
tags=['vision', 'audio'],
))
class FlorenceLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
config.vision_config.model_type = 'davit' # fix merge-lora
if model_kwargs['device_map'] == 'auto':
model_kwargs['device_map'] = get_device()
with patch_ignore_check_imports():
model = super().get_model(model_dir, config, processor, model_kwargs)
model.vision_tower.enable_checkpoint = True
use_submodel_func(model, 'language_model', ['generate', 'forward'])
return model
register_model(
ModelMeta(
MLLMModelType.florence,
[
# llama2
ModelGroup([
Model('AI-ModelScope/Florence-2-base-ft', 'microsoft/Florence-2-base-ft'),
Model('AI-ModelScope/Florence-2-base', 'microsoft/Florence-2-base'),
Model('AI-ModelScope/Florence-2-large', 'microsoft/Florence-2-large'),
Model('AI-ModelScope/Florence-2-large-ft', 'microsoft/Florence-2-large-ft'),
]),
],
FlorenceLoader,
template=TemplateType.florence,
architectures=['Florence2ForConditionalGeneration'],
model_arch=ModelArch.florence,
tags=['vision'],
))
class Phi3SmallLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
def rotary_emb(self, query_states, key_states, **kwargs):
q_type = query_states.dtype
k_type = key_states.dtype
query_states, key_states = self.rotory_emb_origin(query_states, key_states, **kwargs)
query_states = query_states.to(q_type)
key_states = key_states.to(k_type)
return query_states, key_states
for i in range(32): # TODO: 32
re = model.model.layers[i].self_attn.rotary_emb
re.rotory_emb_origin = re.forward
re.forward = MethodType(rotary_emb, re)
return model
register_model(
ModelMeta(
LLMModelType.phi3_small,
[
ModelGroup([
Model('LLM-Research/Phi-3-small-8k-instruct', 'microsoft/Phi-3-small-8k-instruct'),
Model('LLM-Research/Phi-3-small-128k-instruct', 'microsoft/Phi-3-small-128k-instruct'),
]),
],
Phi3SmallLoader,
template=TemplateType.phi3,
architectures=['Phi3SmallForCausalLM'],
model_arch=ModelArch.phi3_small,
requires=['transformers>=4.36'],
))
register_model(
ModelMeta(
LLMModelType.phi2,
[
ModelGroup([
Model('AI-ModelScope/phi-2', 'microsoft/phi-2'),
]),
],
template=TemplateType.default,
architectures=['PhiForCausalLM'],
model_arch=ModelArch.phi2,
))
register_model(
ModelMeta(
LLMModelType.phi3,
[
ModelGroup([
Model('LLM-Research/Phi-3-mini-4k-instruct', 'microsoft/Phi-3-mini-4k-instruct'),
Model('LLM-Research/Phi-3-mini-128k-instruct', 'microsoft/Phi-3-mini-128k-instruct'),
Model('LLM-Research/Phi-3-medium-4k-instruct', 'microsoft/Phi-3-medium-4k-instruct'),
Model('LLM-Research/Phi-3-medium-128k-instruct', 'microsoft/Phi-3-medium-128k-instruct'),
Model('LLM-Research/Phi-3.5-mini-instruct', 'microsoft/Phi-3.5-mini-instruct'),
]),
ModelGroup([Model('LLM-Research/Phi-4-mini-instruct', 'microsoft/Phi-4-mini-instruct')])
],
template=TemplateType.phi3,
architectures=['Phi3ForCausalLM'],
requires=['transformers>=4.36'],
model_arch=ModelArch.phi3,
))
register_model(
ModelMeta(
LLMModelType.phi4,
[
ModelGroup([
Model('LLM-Research/phi-4', 'microsoft/phi-4'),
]),
],
template=TemplateType.phi4,
architectures=['Phi3ForCausalLM'],
requires=['transformers>=4.36'],
model_arch=ModelArch.phi3,
))
register_model(
ModelMeta(
LLMModelType.phi3_moe,
[
ModelGroup([
Model('LLM-Research/Phi-3.5-MoE-instruct', 'microsoft/Phi-3.5-MoE-instruct'),
]),
],
template=TemplateType.phi3,
architectures=['PhiMoEForCausalLM'],
requires=['transformers>=4.36'],
))
+268
View File
@@ -0,0 +1,268 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import torch
from transformers import PreTrainedModel
from transformers.utils import strtobool
from types import MethodType
from swift.template import TemplateType
from swift.utils import get_env_args
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_device_map, patch_fixed_device, patch_output_clone
from ..register import ModelLoader, register_model
from ..utils import use_submodel_func
from .deepseek import DeepseekLoader
register_model(
ModelMeta(
LLMModelType.minicpm_moe,
[
ModelGroup([
Model('OpenBMB/MiniCPM-MoE-8x2B', 'openbmb/MiniCPM-MoE-8x2B'),
]),
],
DeepseekLoader,
template=TemplateType.minicpm,
architectures=['MiniCPMForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.36'],
))
def _patch_minicpmv_device_map(model) -> None:
if not hasattr(model, 'hf_device_map') or len(model.hf_device_map.values()) == 1:
return
device = list(model.hf_device_map.values())[0]
if hasattr(model, 'get_vision_embedding') and not hasattr(model, '_old_get_vision_embedding'):
# minicpm-v-v2-chat; avoid double patching
_old_get_vision_embedding = model.__class__.get_vision_embedding
def _get_vision_embedding(self, pixel_values):
output = _old_get_vision_embedding(self, pixel_values)
if len(pixel_values) == 0:
return output
if isinstance(output, list):
return [x.to(device=device) if isinstance(x, torch.Tensor) else x for x in output]
else:
return output.to(device=device)
model.__class__._old_get_vision_embedding = _old_get_vision_embedding
model.__class__.get_vision_embedding = _get_vision_embedding
if hasattr(model, 'resampler'): # minicpm-v-v2_5-chat
patch_fixed_device(model.resampler, device)
class MiniCPMVLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, config, processor, model_kwargs)
model.resampler.to(self.torch_dtype) # fix float32
_patch_minicpmv_device_map(model)
func_list = ['generate', 'get_input_embeddings', 'forward']
use_submodel_func(model, 'llm', func_list)
if hasattr(model, 'get_slice_image_placeholder'):
processor.get_slice_image_placeholder = MethodType(model.get_slice_image_placeholder, processor)
processor.transform = MethodType(model.transform, processor)
return model
register_model(
ModelMeta(
MLLMModelType.minicpmv,
[
ModelGroup([
Model('OpenBMB/MiniCPM-V', 'openbmb/MiniCPM-V'),
Model('OpenBMB/MiniCPM-V-2', 'openbmb/MiniCPM-V-2'),
], ),
],
MiniCPMVLoader,
template=TemplateType.minicpmv,
architectures=['MiniCPMV'],
model_arch=ModelArch.minicpmv,
requires=['timm', 'transformers<4.42'],
tags=['vision'],
))
class MiniCPMV2Loader(MiniCPMVLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
with patch_device_map():
model = super().get_model(model_dir, *args, **kwargs)
embedding = model.get_input_embeddings()
patch_output_clone(embedding)
return model
register_model(
ModelMeta(
MLLMModelType.minicpmv2_5,
[
ModelGroup([
Model('OpenBMB/MiniCPM-Llama3-V-2_5', 'openbmb/MiniCPM-Llama3-V-2_5'),
], ),
],
MiniCPMV2Loader,
template=TemplateType.minicpmv2_5,
architectures=['MiniCPMV'],
model_arch=ModelArch.minicpmv,
requires=['timm', 'transformers>=4.36'],
tags=['vision'],
))
register_model(
ModelMeta(
MLLMModelType.minicpmv2_6,
[
ModelGroup([
Model('OpenBMB/MiniCPM-V-2_6', 'openbmb/MiniCPM-V-2_6'),
], ),
],
MiniCPMV2Loader,
template=TemplateType.minicpmv2_6,
architectures=['MiniCPMV'],
model_arch=ModelArch.minicpmv,
requires=['timm', 'transformers>=4.36', 'decord'],
tags=['vision', 'video'],
))
class MiniCPMO2Loader(MiniCPMV2Loader):
def get_model(self, model_dir: str, config, *args, **kwargs) -> PreTrainedModel:
config.init_tts = strtobool(get_env_args('init_tts', str, 'false'))
config.init_audio = strtobool(get_env_args('init_audio', str, 'true'))
return super().get_model(model_dir, config, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.minicpmo,
[
ModelGroup([
Model('OpenBMB/MiniCPM-o-2_6', 'openbmb/MiniCPM-o-2_6'),
], template=TemplateType.minicpmo),
ModelGroup(
[
Model('OpenBMB/MiniCPM-o-4_5', 'openbmb/MiniCPM-o-4_5'),
],
template=TemplateType.minicpmo4_5,
requires=['timm', 'transformers==4.51.3', 'decord', 'soundfile', 'minicpmo-utils==1.0.6'],
),
],
MiniCPMO2Loader,
architectures=['MiniCPMO'],
model_arch=ModelArch.minicpmo,
requires=['timm', 'transformers>=4.36', 'decord', 'soundfile'],
tags=['vision', 'video', 'omni', 'audio'],
))
register_model(
ModelMeta(
MLLMModelType.minicpmv4,
[
ModelGroup([
Model('OpenBMB/MiniCPM-V-4', 'openbmb/MiniCPM-V-4'),
], ),
],
MiniCPMV2Loader,
template=TemplateType.minicpmv4,
architectures=['MiniCPMV'],
model_arch=ModelArch.minicpmv,
requires=['timm', 'transformers>=4.36', 'decord'],
tags=['vision', 'video'],
))
register_model(
ModelMeta(
MLLMModelType.minicpmv4_5,
[
ModelGroup([
Model('OpenBMB/MiniCPM-V-4_5', 'openbmb/MiniCPM-V-4_5'),
], ),
],
MiniCPMV2Loader,
template=TemplateType.minicpmv4_5,
architectures=['MiniCPMV'],
model_arch=ModelArch.minicpmv,
requires=['timm', 'transformers>=4.36', 'decord'],
tags=['vision', 'video'],
))
class MiniCPMV4_6Loader(ModelLoader):
def get_model(self, *args, **kwargs) -> PreTrainedModel:
from transformers import AutoModelForImageTextToText
self.auto_model_cls = self.auto_model_cls or AutoModelForImageTextToText
from .qwen import _patch_qwen3_5_linear_attention_sequence_parallel
_patch_qwen3_5_linear_attention_sequence_parallel()
return super().get_model(*args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.minicpmv4_6,
[
ModelGroup([
Model('OpenBMB/MiniCPM-V-4.6', 'openbmb/MiniCPM-V-4.6'),
], ),
],
MiniCPMV4_6Loader,
template=TemplateType.minicpmv4_6,
architectures=['MiniCPMV4_6ForConditionalGeneration'],
model_arch=ModelArch.minicpmv4_6,
requires=['transformers>=5.7.0'],
tags=['vision', 'video'],
))
register_model(
ModelMeta(
LLMModelType.minicpm,
[
ModelGroup([
Model('OpenBMB/MiniCPM-2B-sft-fp32', 'openbmb/MiniCPM-2B-sft-fp32'),
Model('OpenBMB/MiniCPM-2B-dpo-fp32', 'openbmb/MiniCPM-2B-dpo-fp32'),
Model('OpenBMB/MiniCPM-1B-sft-bf16', 'openbmb/MiniCPM-1B-sft-bf16'),
], ),
],
template=TemplateType.minicpm,
architectures=['MiniCPMForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.36.0'],
))
register_model(
ModelMeta(
LLMModelType.minicpm_chatml,
[
ModelGroup([
Model('OpenBMB/MiniCPM-2B-128k', 'openbmb/MiniCPM-2B-128k'),
]),
ModelGroup([
Model('OpenBMB/MiniCPM4-0.5B', 'openbmb/MiniCPM4-0.5B'),
Model('OpenBMB/MiniCPM4-8B', 'openbmb/MiniCPM4-8B'),
]),
],
template=TemplateType.chatml,
architectures=['MiniCPMForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.36'],
))
register_model(
ModelMeta(
LLMModelType.minicpm3,
[
ModelGroup([
Model('OpenBMB/MiniCPM3-4B', 'openbmb/MiniCPM3-4B'),
]),
],
template=TemplateType.chatml,
architectures=['MiniCPM3ForCausalLM'],
model_arch=ModelArch.deepseek_v2,
requires=['transformers>=4.36'],
))
+193
View File
@@ -0,0 +1,193 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import json
import os
from transformers import AutoProcessor, PretrainedConfig, PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from swift.template import TemplateType
from swift.utils import Processor, get_device, get_device_count, get_dist_setting, get_logger
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_ignore_check_imports
from ..register import ModelLoader, register_model
logger = get_logger()
class MiniMaxVLLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
logger.warn('NOTE: minimax-vl-01 model does not support training.')
n_gpu = get_device_count()
_, local_rank, _, local_world_size = get_dist_setting()
device_ids = list(range(max(local_rank, 0), n_gpu, local_world_size))
if 'quantization_config' in model_kwargs:
quantization_config = model_kwargs['quantization_config']
from transformers import QuantoConfig
if isinstance(quantization_config, QuantoConfig):
quantization_config.modules_to_not_convert = (
[
'vision_tower',
'image_newline',
'multi_modal_projector',
'lm_head',
'embed_tokens',
] + [f'model.layers.{i}.coefficient' for i in range(config.text_config.num_hidden_layers)]
+ [f'model.layers.{i}.block_sparse_moe.gate' for i in range(config.text_config.num_hidden_layers)])
if len(device_ids) > 1:
model_safetensors_index_path = os.path.join(model_dir, 'model.safetensors.index.json')
with open(model_safetensors_index_path, 'r') as f:
model_safetensors_index = json.load(f)
weight_map = model_safetensors_index['weight_map']
vision_map = {}
for key, value in weight_map.items():
if 'vision_tower' in key or 'image_newline' in key or 'multi_modal_projector' in key:
new_key = key.replace('.weight', '').replace('.bias', '')
if new_key not in vision_map:
vision_map[new_key] = value
device_map = {
'language_model.model.embed_tokens': get_device(device_ids[0]),
'language_model.model.norm': get_device(device_ids[len(device_ids) - 1]),
'language_model.lm_head': get_device(device_ids[len(device_ids) - 1])
}
for key, value in vision_map.items():
device_map[key] = get_device(device_ids[0])
device_map['vision_tower.vision_model.post_layernorm'] = get_device(device_ids[0])
layers_per_device = config.text_config.num_hidden_layers // len(device_ids)
for i in range(len(device_ids)):
for j in range(layers_per_device):
device_map[f'language_model.model.layers.{i * layers_per_device + j}'] = get_device(device_ids[i])
model_kwargs['device_map'] = device_map
with patch_ignore_check_imports():
return super().get_model(model_dir, config, processor, model_kwargs)
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
MiniMaxVL01ProcessorKwargs = get_class_from_dynamic_module(
'processing_minimax_vl_01.MiniMaxVL01ProcessorKwargs', model_dir)
get_hw_multiple_of = get_class_from_dynamic_module('processing_minimax_vl_01.get_hw_multiple_of', model_dir)
get_num_token = get_class_from_dynamic_module('processing_minimax_vl_01.get_num_token', model_dir)
processor = AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)
processor.MiniMaxVL01ProcessorKwargs = MiniMaxVL01ProcessorKwargs
processor.get_hw_multiple_of = get_hw_multiple_of
processor.get_num_token = get_num_token
return processor
register_model(
ModelMeta(
MLLMModelType.minimax_vl, [
ModelGroup([
Model('MiniMax/MiniMax-VL-01', 'MiniMaxAI/MiniMax-VL-01'),
]),
],
MiniMaxVLLoader,
template=TemplateType.minimax_vl,
architectures=['MiniMaxVL01ForConditionalGeneration'],
tags=['vision']))
class MinimaxTextLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
logger.warn('NOTE: minimax-text-01 model does not support training.')
n_gpu = get_device_count()
_, local_rank, _, local_world_size = get_dist_setting()
device_ids = list(range(max(local_rank, 0), n_gpu, local_world_size))
if 'quantization_config' in model_kwargs:
quantization_config = model_kwargs['quantization_config']
from transformers import QuantoConfig
if isinstance(quantization_config, QuantoConfig):
quantization_config.modules_to_not_convert = (
[
'lm_head',
'embed_tokens',
] + [f'model.layers.{i}.coefficient' for i in range(config.num_hidden_layers)]
+ [f'model.layers.{i}.block_sparse_moe.gate' for i in range(config.num_hidden_layers)])
if len(device_ids) > 1:
layers_per_device = config.num_hidden_layers // len(device_ids)
# set device map
device_map = {
'model.embed_tokens': get_device(0),
'model.norm': get_device(len(device_ids) - 1),
'lm_head': get_device(len(device_ids) - 1)
}
for i in range(len(device_ids)):
for j in range(layers_per_device):
device_map[f'model.layers.{i * layers_per_device + j}'] = get_device(i)
model_kwargs['device_map'] = device_map
with patch_ignore_check_imports():
return super().get_model(model_dir, config, processor, model_kwargs)
register_model(
ModelMeta(
LLMModelType.minimax, [
ModelGroup([
Model('MiniMax/MiniMax-Text-01', 'MiniMaxAI/MiniMax-Text-01'),
]),
],
MinimaxTextLoader,
template=TemplateType.minimax,
architectures=['MiniMaxText01ForCausalLM']))
register_model(
ModelMeta(
LLMModelType.minimax_m1, [
ModelGroup([
Model('MiniMax/MiniMax-M1-40k', 'MiniMaxAI/MiniMax-M1-40k'),
Model('MiniMax/MiniMax-M1-80k', 'MiniMaxAI/MiniMax-M1-80k'),
]),
],
MinimaxTextLoader,
template=TemplateType.minimax_m1,
architectures=['MiniMaxM1ForCausalLM']))
register_model(
ModelMeta(
LLMModelType.minimax_m2, [
ModelGroup([
Model('MiniMax/MiniMax-M2', 'MiniMaxAI/MiniMax-M2'),
], TemplateType.minimax_m2),
ModelGroup([
Model('MiniMax/MiniMax-M2.1', 'MiniMaxAI/MiniMax-M2.1'),
], TemplateType.minimax_m2_1),
ModelGroup([
Model('MiniMax/MiniMax-M2.5', 'MiniMaxAI/MiniMax-M2.5'),
], TemplateType.minimax_m2_5),
ModelGroup([
Model('MiniMax/MiniMax-M2.7', 'MiniMaxAI/MiniMax-M2.7'),
], TemplateType.minimax_m2_7),
],
requires=['transformers==4.57.1'],
architectures=['MiniMaxM2ForCausalLM']))
class MinimaxM3VLLoader(ModelLoader):
default_trust_remote_code = False
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
return AutoProcessor.from_pretrained(model_dir, trust_remote_code=True)
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
from transformers import AutoModelForImageTextToText
self.auto_model_cls = self.auto_model_cls or AutoModelForImageTextToText
return super().get_model(model_dir, config, processor, model_kwargs)
register_model(
ModelMeta(
MLLMModelType.minimax_m3_vl, [
ModelGroup([
Model('MiniMax/MiniMax-M3', 'MiniMaxAI/MiniMax-M3'),
]),
],
MinimaxM3VLLoader,
template=TemplateType.minimax_m3_vl,
model_arch=ModelArch.minimax_m3_vl,
architectures=['MiniMaxM3SparseForConditionalGeneration'],
tags=['vision', 'video']))
+210
View File
@@ -0,0 +1,210 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import AutoProcessor, AutoTokenizer, PretrainedConfig, PreTrainedModel
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, safe_snapshot_download
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
register_model(
ModelMeta(
LLMModelType.mistral,
[
ModelGroup([
Model('AI-ModelScope/Mistral-7B-Instruct-v0.1', 'mistralai/Mistral-7B-Instruct-v0.1'),
Model('AI-ModelScope/Mistral-7B-Instruct-v0.2', 'mistralai/Mistral-7B-Instruct-v0.2'),
Model('LLM-Research/Mistral-7B-Instruct-v0.3', 'mistralai/Mistral-7B-Instruct-v0.3'),
Model('AI-ModelScope/Mistral-7B-v0.1', 'mistralai/Mistral-7B-v0.1'),
Model('AI-ModelScope/Mistral-7B-v0.2-hf', 'alpindale/Mistral-7B-v0.2-hf'),
]),
ModelGroup([
Model('swift/Codestral-22B-v0.1', 'mistralai/Codestral-22B-v0.1'),
]),
],
template=TemplateType.llama,
architectures=['MistralForCausalLM'],
model_arch=ModelArch.llama,
requires=['transformers>=4.34'],
))
register_model(
ModelMeta(
LLMModelType.mixtral, [
ModelGroup([
Model('AI-ModelScope/Mixtral-8x7B-Instruct-v0.1', 'mistralai/Mixtral-8x7B-Instruct-v0.1'),
Model('AI-ModelScope/Mixtral-8x7B-v0.1', 'mistralai/Mixtral-8x7B-v0.1'),
Model('AI-ModelScope/Mixtral-8x22B-v0.1', 'mistral-community/Mixtral-8x22B-v0.1'),
],
requires=['transformers>=4.36']),
ModelGroup([
Model('AI-ModelScope/Mixtral-8x7b-AQLM-2Bit-1x16-hf', 'ISTA-DASLab/Mixtral-8x7b-AQLM-2Bit-1x16-hf'),
],
requires=['transformers>=4.38', 'aqlm', 'torch>=2.2.0']),
],
template=TemplateType.llama,
architectures=['MixtralForCausalLM'],
model_arch=ModelArch.llama))
register_model(
ModelMeta(
LLMModelType.mistral_nemo, [
ModelGroup([
Model('AI-ModelScope/Mistral-Small-Instruct-2409', 'mistralai/Mistral-Small-Instruct-2409'),
Model('LLM-Research/Mistral-Large-Instruct-2407', 'mistralai/Mistral-Large-Instruct-2407'),
Model('AI-ModelScope/Mistral-Nemo-Base-2407', 'mistralai/Mistral-Nemo-Base-2407'),
Model('AI-ModelScope/Mistral-Nemo-Instruct-2407', 'mistralai/Mistral-Nemo-Instruct-2407'),
],
requires=['transformers>=4.43']),
ModelGroup([
Model('AI-ModelScope/Ministral-8B-Instruct-2410', 'mistralai/Ministral-8B-Instruct-2410'),
],
requires=['transformers>=4.46']),
],
template=TemplateType.mistral_nemo,
architectures=['MistralForCausalLM'],
model_arch=ModelArch.llama))
register_model(
ModelMeta(
LLMModelType.mistral_2501, [
ModelGroup([
Model('mistralai/Mistral-Small-24B-Base-2501', 'mistralai/Mistral-Small-24B-Base-2501'),
Model('mistralai/Mistral-Small-24B-Instruct-2501', 'mistralai/Mistral-Small-24B-Instruct-2501'),
]),
],
template=TemplateType.mistral_2501,
architectures=['MistralForCausalLM'],
model_arch=ModelArch.llama))
register_model(
ModelMeta(
LLMModelType.zephyr,
[
ModelGroup([
Model('modelscope/zephyr-7b-beta', 'HuggingFaceH4/zephyr-7b-beta'),
]),
],
template=TemplateType.zephyr,
model_arch=ModelArch.llama,
architectures=['MistralForCausalLM'],
requires=['transformers>=4.34'],
))
register_model(
ModelMeta(
LLMModelType.wizardlm2_moe,
[ModelGroup([
Model('AI-ModelScope/WizardLM-2-8x22B', 'alpindale/WizardLM-2-8x22B'),
])],
template=TemplateType.wizardlm2_moe,
architectures=['MixtralForCausalLM'],
requires=['transformers>=4.36'],
))
register_model(
ModelMeta(
LLMModelType.wizardlm2,
[ModelGroup([
Model('AI-ModelScope/WizardLM-2-7B-AWQ', 'MaziyarPanahi/WizardLM-2-7B-AWQ'),
])],
template=TemplateType.wizardlm2,
architectures=['MistralForCausalLM'],
requires=['transformers>=4.34'],
))
class DevstralLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
# src: sglang did the same (https://github.com/sgl-project/sglang/pull/6547)
tokenizer_dir = safe_snapshot_download('mistralai/Mistral-Small-3.1-24B-Instruct-2503', download_model=False)
tokenizer = AutoTokenizer.from_pretrained(tokenizer_dir)
return tokenizer
register_model(
ModelMeta(
LLMModelType.devstral, [
ModelGroup([
Model('mistralai/Devstral-Small-2505', 'mistralai/Devstral-Small-2505'),
],
requires=['transformers>=4.43', 'mistral-common>=1.5.5'])
],
DevstralLoader,
template=TemplateType.devstral,
architectures=['MistralForCausalLM'],
model_arch=ModelArch.llama))
class Mistral3Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import Mistral3ForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or Mistral3ForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.mistral3,
[
ModelGroup([
Model('mistralai/Mistral-Small-3.1-24B-Base-2503', 'mistralai/Mistral-Small-3.1-24B-Base-2503'),
Model('mistralai/Mistral-Small-3.1-24B-Instruct-2503', 'mistralai/Mistral-Small-3.1-24B-Instruct-2503'),
],
requires=['transformers>=4.49']),
ModelGroup([
Model('mistralai/Ministral-3-3B-Base-2512', 'mistralai/Ministral-3-3B-Base-2512'),
Model('mistralai/Ministral-3-3B-Instruct-2512', 'mistralai/Ministral-3-3B-Instruct-2512'),
Model('mistralai/Ministral-3-3B-Instruct-2512-BF16', 'mistralai/Ministral-3-3B-Instruct-2512-BF16'),
Model('mistralai/Ministral-3-8B-Base-2512', 'mistralai/Ministral-3-8B-Base-2512'),
Model('mistralai/Ministral-3-8B-Instruct-2512', 'mistralai/Ministral-3-8B-Instruct-2512'),
Model('mistralai/Ministral-3-8B-Instruct-2512-BF16', 'mistralai/Ministral-3-8B-Instruct-2512-BF16'),
Model('mistralai/Ministral-3-14B-Base-2512', 'mistralai/Ministral-3-14B-Base-2512'),
Model('mistralai/Ministral-3-14B-Instruct-2512', 'mistralai/Ministral-3-14B-Instruct-2512'),
Model('mistralai/Ministral-3-14B-Instruct-2512-BF16', 'mistralai/Ministral-3-14B-Instruct-2512-BF16'),
],
TemplateType.mistral_2512,
requires=['transformers>=5.0.0.dev0', 'mistral-common>=1.8.6']),
ModelGroup([
Model('mistralai/Ministral-3-3B-Reasoning-2512', 'mistralai/Ministral-3-3B-Reasoning-2512'),
Model('mistralai/Ministral-3-8B-Reasoning-2512', 'mistralai/Ministral-3-8B-Reasoning-2512'),
Model('mistralai/Ministral-3-14B-Reasoning-2512', 'mistralai/Ministral-3-14B-Reasoning-2512'),
],
TemplateType.mistral_2512_thinking,
requires=['transformers>=5.0.0.dev0', 'mistral-common>=1.8.6']),
],
Mistral3Loader,
template=TemplateType.mistral_2503,
model_arch=ModelArch.llava_hf,
architectures=['Mistral3ForConditionalGeneration'],
tags=['vision'],
ignore_patterns=[],
))
class Mistral3_2506Loader(Mistral3Loader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer_dir = safe_snapshot_download('mistralai/Mistral-Small-3.1-24B-Instruct-2503', download_model=False)
processor = AutoProcessor.from_pretrained(tokenizer_dir)
return processor
register_model(
ModelMeta(
MLLMModelType.mistral3_2506,
[
ModelGroup([
Model('mistralai/Mistral-Small-3.2-24B-Instruct-2506', 'mistralai/Mistral-Small-3.2-24B-Instruct-2506'),
]),
],
Mistral3_2506Loader,
template=TemplateType.mistral_2506,
architectures=['Mistral3ForConditionalGeneration'],
model_arch=ModelArch.llava_hf,
requires=['transformers>=4.49'],
))
+390
View File
@@ -0,0 +1,390 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import torch
from transformers import PretrainedConfig, PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from types import MethodType
from swift.template import TemplateType
from swift.utils import Processor, get_logger
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_output_clone
from ..register import ModelLoader, register_model
from ..utils import use_submodel_func
from .qwen import Qwen2VLLoader, patch_qwen_vl_utils
logger = get_logger()
class Idefics3Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import AutoModelForVision2Seq
self.auto_model_cls = self.auto_model_cls or AutoModelForVision2Seq
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.idefics3,
[
ModelGroup([
Model('AI-ModelScope/Idefics3-8B-Llama3', 'HuggingFaceM4/Idefics3-8B-Llama3'),
]),
],
Idefics3Loader,
template=TemplateType.idefics3,
model_arch=ModelArch.idefics3,
architectures=['Idefics3ForConditionalGeneration'],
tags=['vision'],
requires=['transformers>=4.45'],
))
class PixtralLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import LlavaForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or LlavaForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.pixtral,
[
ModelGroup([
Model('AI-ModelScope/pixtral-12b', 'mistral-community/pixtral-12b'),
]),
],
PixtralLoader,
template=TemplateType.pixtral,
model_arch=ModelArch.llava_hf,
architectures=['LlavaForConditionalGeneration'],
requires=['transformers>=4.45'],
tags=['vision'],
))
class MolMoeLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
# fix bug for molmoe-1b
def to_dict(self, *args, **kwargs):
res = self._to_dict(*args, **kwargs)
res['vision_backbone'] = self.vision_backbone.__dict__
res.pop('to_dict')
res.pop('_to_dict')
return res
model.config._to_dict = model.config.to_dict
model.config.to_dict = MethodType(to_dict, model.config)
patch_output_clone(model.model.transformer.wte)
return model
register_model(
ModelMeta(
MLLMModelType.molmoe,
[
ModelGroup([
Model('LLM-Research/MolmoE-1B-0924', 'allenai/MolmoE-1B-0924'),
]),
],
MolMoeLoader,
template=TemplateType.molmo,
model_arch=ModelArch.molmo,
torch_dtype=torch.float32,
architectures=['OLMoForCausalLM'],
tags=['vision'],
requires=['transformers>=4.45'],
))
class MolmoLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model_cls = get_class_from_dynamic_module('modeling_molmo.MolmoForCausalLM', model_dir)
model_cls._no_split_modules = ['MolmoSequentialBlock']
model = super().get_model(model_dir, *args, **kwargs)
patch_output_clone(model.model.transformer.wte)
return model
register_model(
ModelMeta(
MLLMModelType.molmo,
[
ModelGroup([
Model('LLM-Research/Molmo-7B-O-0924', 'allenai/Molmo-7B-O-0924'),
Model('LLM-Research/Molmo-7B-D-0924', 'allenai/Molmo-7B-D-0924'),
Model('LLM-Research/Molmo-72B-0924', 'allenai/Molmo-72B-0924'),
]),
],
MolmoLoader,
template=TemplateType.molmo,
model_arch=ModelArch.molmo,
architectures=['MolmoForCausalLM'],
tags=['vision'],
requires=['transformers>=4.45'],
))
class Molmo2Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import AutoModelForImageTextToText
model_cls = get_class_from_dynamic_module('modeling_molmo2.Molmo2ForConditionalGeneration', model_dir)
no_split_modules = getattr(model_cls, '_no_split_modules', []) or []
if 'MolmoSequentialBlock' not in no_split_modules:
model_cls._no_split_modules = no_split_modules + ['MolmoSequentialBlock']
self.auto_model_cls = self.auto_model_cls or AutoModelForImageTextToText
model = super().get_model(model_dir, *args, **kwargs)
patch_output_clone(model.model.transformer.wte)
return model
register_model(
ModelMeta(
MLLMModelType.molmo2,
[
ModelGroup([
Model('allenai/Molmo2-4B', 'allenai/Molmo2-4B'),
Model('allenai/Molmo2-8B', 'allenai/Molmo2-8B'),
Model('allenai/Molmo2-O-7B', 'allenai/Molmo2-O-7B'),
]),
],
Molmo2Loader,
template=TemplateType.molmo2,
model_arch=ModelArch.molmo,
architectures=['Molmo2ForConditionalGeneration'],
tags=['vision', 'video'],
requires=['transformers>=4.57.1,<5', 'decord'],
))
class MegrezOmniLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model_cls = get_class_from_dynamic_module('modeling_megrezo.MegrezO', model_dir)
model_cls._no_split_modules = ['ResidualAttentionBlock', 'LlamaDecoderLayer']
model_cls = get_class_from_dynamic_module('modeling_megrezo.SiglipVisionTransformer', model_dir)
model_cls._no_split_modules = ['SiglipEncoderLayer']
model = super().get_model(model_dir, *args, **kwargs)
patch_output_clone(model.llm.model.embed_tokens)
use_submodel_func(model, 'llm')
return model
def _get_model_processor(self, model_dir, config):
model, processor = super().get_processor(model_dir, config)
if model:
processor = model._get_or_init_processor()
return model, processor
register_model(
ModelMeta(
MLLMModelType.megrez_omni,
[
ModelGroup([
Model('InfiniAI/Megrez-3B-Omni', 'Infinigence/Megrez-3B-Omni'),
]),
],
MegrezOmniLoader,
template=TemplateType.megrez_omni,
model_arch=ModelArch.megrez_omni,
architectures=['MegrezO'],
tags=['vision', 'audio'],
))
register_model(
ModelMeta(
MLLMModelType.qwen2_gme, [
ModelGroup([
Model('iic/gme-Qwen2-VL-2B-Instruct', 'Alibaba-NLP/gme-Qwen2-VL-2B-Instruct'),
Model('iic/gme-Qwen2-VL-7B-Instruct', 'Alibaba-NLP/gme-Qwen2-VL-7B-Instruct'),
]),
],
Qwen2VLLoader,
template=TemplateType.qwen2_gme,
model_arch=ModelArch.qwen2_vl,
architectures=['Qwen2VLForConditionalGeneration'],
tags=['vision']))
class JinaRerankerM0Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
# Use AutoModel to respect the model repo's dynamic class mapping
# and load the custom Jina reranker head via trust_remote_code.
from transformers import AutoModel
from transformers.modeling_outputs import SequenceClassifierOutputWithPast
self.auto_model_cls = self.auto_model_cls or AutoModel
model = super().get_model(model_dir, *args, **kwargs)
# Patch forward to return a sequence-classification-style output with `.logits`
# Use the model's own head (already present in jina-reranker-m0), just wrap outputs.
if not hasattr(model, '_forward_origin'):
model._forward_origin = model.forward
model.logit_bias = 2.65
def forward(self,
input_ids=None,
attention_mask=None,
position_ids=None,
inputs_embeds=None,
pixel_values=None,
image_grid_thw=None,
video_grid_thw=None,
output_attentions=None,
output_hidden_states=None,
return_dict=None,
**kwargs):
# Remove labels to avoid upstream asserts in ranking models
kwargs.pop('labels', None)
if return_dict is None:
return_dict = True
out = self._forward_origin(
input_ids=input_ids,
attention_mask=attention_mask,
position_ids=position_ids,
inputs_embeds=inputs_embeds,
pixel_values=pixel_values,
image_grid_thw=image_grid_thw,
video_grid_thw=video_grid_thw,
output_attentions=output_attentions,
output_hidden_states=output_hidden_states,
return_dict=return_dict,
**kwargs)
logits = out.unsqueeze(-1) - self.logit_bias
if not return_dict:
return (logits, )
return SequenceClassifierOutputWithPast(logits=logits)
model.forward = MethodType(forward, model)
def padding_free_fn(self, output, kwargs, padding_side):
return_dict = kwargs.get('return_dict', None)
output.logits = output['last_hidden_state'][:, -1]
logits = self.score(output.logits)
logits = logits - self.logit_bias
if not return_dict:
return (logits, )
return SequenceClassifierOutputWithPast(logits=logits)
model.padding_free_fn = MethodType(padding_free_fn, model)
return model
register_model(
ModelMeta(
MLLMModelType.jina_reranker_m0,
[ModelGroup([Model('JinaAI/jina-reranker-m0', 'JinaAI/jina-reranker-m0')])],
JinaRerankerM0Loader,
template=TemplateType.jina_reranker_m0,
model_arch=ModelArch.qwen2_vl,
architectures=['JinaRerankerM0ForConditionalGeneration'],
task_type='reranker',
tags=['reranker', 'vision'],
))
class KeyeVLLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
processor = super().get_processor(model_dir, config)
from keye_vl_utils import vision_process
global_vars = patch_qwen_vl_utils(vision_process)
processor.global_vars = global_vars
return processor
register_model(
ModelMeta(
MLLMModelType.keye_vl,
[
ModelGroup([
Model('Kwai-Keye/Keye-VL-8B-Preview', 'Kwai-Keye/Keye-VL-8B-Preview'),
]),
],
KeyeVLLoader,
template=TemplateType.keye_vl,
model_arch=ModelArch.keye_vl,
architectures=['KeyeForConditionalGeneration'],
tags=['vision'],
requires=['keye_vl_utils'],
))
register_model(
ModelMeta(
MLLMModelType.keye_vl_1_5,
[
ModelGroup([
Model('Kwai-Keye/Keye-VL-1_5-8B', 'Kwai-Keye/Keye-VL-1_5-8B'),
]),
],
KeyeVLLoader,
template=TemplateType.keye_vl_1_5,
model_arch=ModelArch.keye_vl,
architectures=['KeyeVL1_5ForConditionalGeneration'],
tags=['vision'],
requires=['keye_vl_utils>=1.5.2', 'transformers==4.52.4'],
))
class DotsOCRLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model_cls = get_class_from_dynamic_module('modeling_dots_vision.DotsVisionTransformer', model_dir)
model_cls._no_split_modules = ['DotsVisionBlock']
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.dots_ocr,
[ModelGroup([
Model('rednote-hilab/dots.ocr', 'rednote-hilab/dots.ocr'),
])],
DotsOCRLoader,
template=TemplateType.dots_ocr,
model_arch=ModelArch.dots_ocr,
architectures=['DotsOCRForCausalLM'],
requires=['transformers>=4.51.0'],
))
class Sail2VLLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
use_submodel_func(model, 'language_model')
return model
register_model(
ModelMeta(
MLLMModelType.sail_vl2, [
ModelGroup([
Model('BytedanceDouyinContent/SAIL-VL2-2B', 'BytedanceDouyinContent/SAIL-VL2-2B'),
Model('BytedanceDouyinContent/SAIL-VL2-2B-Thinking', 'BytedanceDouyinContent/SAIL-VL2-2B-Thinking'),
Model('BytedanceDouyinContent/SAIL-VL2-8B', 'BytedanceDouyinContent/SAIL-VL2-8B'),
Model('BytedanceDouyinContent/SAIL-VL2-8B-Thinking', 'BytedanceDouyinContent/SAIL-VL2-8B-Thinking'),
])
],
Sail2VLLoader,
template=TemplateType.sail_vl2,
model_arch=ModelArch.internvl,
architectures=['SAILVLModel'],
requires=['transformers<=4.51.3'],
tags=['vision']))
+57
View File
@@ -0,0 +1,57 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from swift.template import TemplateType
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_get_input_embeddings
from ..register import ModelLoader, register_model
class KimiVLLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
KimiVLPreTrainedModel = get_class_from_dynamic_module('modeling_kimi_vl.KimiVLPreTrainedModel', model_dir)
try:
del KimiVLPreTrainedModel._supports_sdpa
except AttributeError:
pass
model = super().get_model(model_dir, *args, **kwargs)
patch_get_input_embeddings(model.vision_tower, 'patch_embed')
return model
register_model(
ModelMeta(
MLLMModelType.kimi_vl,
[
ModelGroup([
Model('moonshotai/Kimi-VL-A3B-Instruct', 'moonshotai/Kimi-VL-A3B-Instruct'),
Model('moonshotai/Kimi-VL-A3B-Thinking', 'moonshotai/Kimi-VL-A3B-Thinking'),
Model('moonshotai/Kimi-VL-A3B-Thinking-2506', 'moonshotai/Kimi-VL-A3B-Thinking-2506'),
])
],
KimiVLLoader,
template=TemplateType.kimi_vl,
model_arch=ModelArch.llava_hf_legacy,
architectures=['KimiVLForConditionalGeneration'],
requires=['transformers<4.49'],
))
register_model(
ModelMeta(
MLLMModelType.kimi_k25,
[
ModelGroup([
Model('moonshotai/Kimi-K2.5', 'moonshotai/Kimi-K2.5'),
Model('moonshotai/Kimi-K2.6', 'moonshotai/Kimi-K2.6'),
Model('moonshotai/Kimi-K2.7-Code', 'moonshotai/Kimi-K2.7-Code'),
])
],
template=TemplateType.kimi_k25,
model_arch=ModelArch.kimi_k25,
architectures=['KimiK25ForConditionalGeneration'],
requires=['transformers>=4.57.1,<5.0.0'],
))
+163
View File
@@ -0,0 +1,163 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import os
import sys
from collections import OrderedDict
from transformers import PretrainedConfig, PreTrainedModel
from transformers.dynamic_module_utils import get_class_from_dynamic_module
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, get_logger, git_clone_github
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
from ..utils import use_submodel_func
from .qwen import QwenLoader
logger = get_logger()
class MplugOwl2Loader(ModelLoader):
def _get_model(self, model_dir: str, vocab_size, *args, **kwargs) -> PreTrainedModel:
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/X-PLUG/mPLUG-Owl')
local_repo_path = os.path.join(local_repo_path, 'mPLUG-Owl2')
sys.path.append(local_repo_path)
# register
# https://github.com/X-PLUG/mPLUG-Owl/blob/main/mPLUG-Owl2/mplug_owl2/model/modeling_mplug_owl2.py#L447
from mplug_owl2 import MPLUGOwl2LlamaForCausalLM
if vocab_size is not None:
config.vocab_size = vocab_size
model = super().get_model(model_dir, *args, **kwargs)
logger.info('Please ignore the unimported warning.')
return model
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
return self._get_model(model_dir, None, *args, **kwargs)
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
from transformers.models.clip.image_processing_clip import CLIPImageProcessor
processor = CLIPImageProcessor.from_pretrained(model_dir)
return processor
register_model(
ModelMeta(
MLLMModelType.mplug_owl2, [ModelGroup([
Model('iic/mPLUG-Owl2', 'MAGAer13/mplug-owl2-llama2-7b'),
])],
MplugOwl2Loader,
template=TemplateType.mplug_owl2,
model_arch=ModelArch.mplug_owl2,
requires=['transformers<4.35', 'icecream'],
tags=['vision']), )
class MplugOwl2_1Loader(QwenLoader, MplugOwl2Loader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
return self._get_model(model_dir, 151851, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.mplug_owl2_1, [ModelGroup([
Model('iic/mPLUG-Owl2.1', 'Mizukiluke/mplug_owl_2_1'),
])],
MplugOwl2_1Loader,
template=TemplateType.mplug_owl2,
model_arch=ModelArch.mplug_owl2_1,
requires=['transformers<4.35', 'icecream'],
tags=['vision']))
class MplugOwl3Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
get_class_from_dynamic_module('configuration_hyper_qwen2.HyperQwen2Config', model_dir)
model_cls = get_class_from_dynamic_module('modeling_mplugowl3.mPLUGOwl3Model', model_dir)
model_cls._no_split_modules = ['SiglipEncoderLayer']
model = super().get_model(model_dir, *args, **kwargs)
func_list = ['generate', 'forward']
use_submodel_func(model, 'language_model', func_list)
all_hooks = OrderedDict()
hooks_with_kwargs = OrderedDict()
def append_hooks(sub_module, inc_id=0):
for id, hook in sub_module._forward_hooks.items():
all_hooks[inc_id] = hook
if id in sub_module._forward_hooks_with_kwargs:
hooks_with_kwargs[inc_id] = sub_module._forward_hooks_with_kwargs[id]
inc_id += 1
return inc_id
inc_id = append_hooks(model.language_model)
append_hooks(model, inc_id)
model._forward_hooks = all_hooks
model._forward_hooks_with_kwargs = hooks_with_kwargs
return model
def _get_model_processor(self, model_dir, config):
model, tokenizer = super()._get_model_processor(model_dir, config)
if model:
tokenizer = model.init_processor(tokenizer)
return model, tokenizer
register_model(
ModelMeta(
MLLMModelType.mplug_owl3, [
ModelGroup([
Model('iic/mPLUG-Owl3-1B-241014', 'mPLUG/mPLUG-Owl3-1B-241014'),
Model('iic/mPLUG-Owl3-2B-241014', 'mPLUG/mPLUG-Owl3-2B-241014'),
Model('iic/mPLUG-Owl3-7B-240728', 'mPLUG/mPLUG-Owl3-7B-240728'),
]),
],
MplugOwl3Loader,
template=TemplateType.mplug_owl3,
architectures=['mPLUGOwl3Model'],
model_arch=ModelArch.mplug_owl3,
requires=['transformers>=4.36', 'icecream', 'decord'],
tags=['vision', 'video']))
register_model(
ModelMeta(
MLLMModelType.mplug_owl3_241101, [
ModelGroup([
Model('iic/mPLUG-Owl3-7B-241101', 'mPLUG/mPLUG-Owl3-7B-241101'),
]),
],
MplugOwl3Loader,
template=TemplateType.mplug_owl3_241101,
architectures=['mPLUGOwl3Model'],
model_arch=ModelArch.mplug_owl3,
requires=['transformers>=4.36', 'icecream'],
tags=['vision', 'video']))
class DocOwl2Loader(ModelLoader):
def _get_model_processor(self, model_dir, config):
model, tokenizer = super()._get_model_processor(model_dir, config)
if model:
tokenizer = model.init_processor(tokenizer, basic_image_size=504, crop_anchors='grid_12')
return model, tokenizer
register_model(
ModelMeta(
MLLMModelType.doc_owl2, [
ModelGroup([
Model('iic/DocOwl2', 'mPLUG/DocOwl2'),
]),
],
DocOwl2Loader,
template=TemplateType.doc_owl2,
architectures=['mPLUGDocOwl2'],
model_arch=ModelArch.doc_owl2,
requires=['transformers>=4.36', 'icecream'],
tags=['vision']))
+74
View File
@@ -0,0 +1,74 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from swift.template import TemplateType
from swift.utils import get_logger
from ..constant import LLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import register_model
logger = get_logger()
register_model(
ModelMeta(
LLMModelType.openbuddy_llama,
[
ModelGroup([
Model('OpenBuddy/openbuddy-llama-65b-v8-bf16', 'OpenBuddy/openbuddy-llama-65b-v8-bf16'),
], TemplateType.openbuddy),
ModelGroup([
Model('OpenBuddy/openbuddy-llama2-13b-v8.1-fp16', 'OpenBuddy/openbuddy-llama2-13b-v8.1-fp16'),
Model('OpenBuddy/openbuddy-llama2-70b-v10.1-bf16', 'OpenBuddy/openbuddy-llama2-70b-v10.1-bf16'),
], TemplateType.openbuddy),
ModelGroup([
Model('OpenBuddy/openbuddy-deepseek-67b-v15.2', 'OpenBuddy/openbuddy-deepseek-67b-v15.2'),
], TemplateType.openbuddy),
ModelGroup([
Model('OpenBuddy/openbuddy-llama3-8b-v21.1-8k', 'OpenBuddy/openbuddy-llama3-8b-v21.1-8k'),
Model('OpenBuddy/openbuddy-llama3-70b-v21.1-8k', 'OpenBuddy/openbuddy-llama3-70b-v21.1-8k'),
Model('OpenBuddy/openbuddy-yi1.5-34b-v21.3-32k', 'OpenBuddy/openbuddy-yi1.5-34b-v21.3-32k'),
], TemplateType.openbuddy2),
ModelGroup([
Model('OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k', 'OpenBuddy/openbuddy-llama3.1-8b-v22.1-131k'),
Model('OpenBuddy/openbuddy-nemotron-70b-v23.2-131k', 'OpenBuddy/openbuddy-nemotron-70b-v23.2-131k'),
],
TemplateType.openbuddy2,
requires=['transformers>=4.43']),
ModelGroup(
[Model('OpenBuddy/openbuddy-llama3.3-70b-v24.3-131k', 'OpenBuddy/openbuddy-llama3.3-70b-v24.3-131k')],
TemplateType.openbuddy2,
requires=['transformers>=4.45']),
],
model_arch=ModelArch.llama,
mcore_model_type='gpt',
architectures=['LlamaForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.openbuddy_mistral,
[
ModelGroup([
Model('OpenBuddy/openbuddy-mistral-7b-v17.1-32k', 'OpenBuddy/openbuddy-mistral-7b-v17.1-32k'),
]),
ModelGroup([
Model('OpenBuddy/openbuddy-zephyr-7b-v14.1', 'OpenBuddy/openbuddy-zephyr-7b-v14.1'),
]),
],
template=TemplateType.openbuddy,
model_arch=ModelArch.llama,
requires=['transformers>=4.34'],
architectures=['MistralForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.openbuddy_mixtral,
[
ModelGroup([
Model('OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k', 'OpenBuddy/openbuddy-mixtral-7bx8-v18.1-32k'),
], ),
],
template=TemplateType.openbuddy,
architectures=['MixtralForCausalLM'],
requires=['transformers>=4.36'],
))
File diff suppressed because it is too large Load Diff
+21
View File
@@ -0,0 +1,21 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from swift.template import TemplateType
from swift.utils import get_logger
from ..constant import LLMModelType
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import register_model
logger = get_logger()
register_model(
ModelMeta(
LLMModelType.seed_oss, [
ModelGroup([
Model('ByteDance-Seed/Seed-OSS-36B-Instruct', 'ByteDance-Seed/Seed-OSS-36B-Instruct'),
Model('ByteDance-Seed/Seed-OSS-36B-Base', 'ByteDance-Seed/Seed-OSS-36B-Base'),
Model('ByteDance-Seed/Seed-OSS-36B-Base-woSyn', 'ByteDance-Seed/Seed-OSS-36B-Base-woSyn'),
])
],
template=TemplateType.seed_oss,
architectures=['SeedOssForCausalLM'],
requires=['transformers>=4.56']))
+70
View File
@@ -0,0 +1,70 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import PretrainedConfig
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor
from ..constant import LLMModelType, RMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
class SkyworkLoader(ModelLoader):
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
tokenizer = super().get_processor(model_dir, config)
tokenizer.add_tokens('[USER]')
tokenizer.add_tokens('[BOT]')
tokenizer.add_tokens('[SEP]')
return tokenizer
register_model(
ModelMeta(
LLMModelType.skywork,
[
ModelGroup([
Model('skywork/Skywork-13B-base', 'skywork/Skywork-13B-base'),
Model('skywork/Skywork-13B-chat'),
]),
],
template=TemplateType.skywork,
architectures=['SkyworkForCausalLM'],
model_arch=ModelArch.llama,
))
register_model(
ModelMeta(
RMModelType.llama3_2_reward,
[
ModelGroup([
Model('AI-ModelScope/Skywork-Reward-Llama-3.1-8B', 'Skywork/Skywork-Reward-Llama-3.1-8B'),
Model('AI-ModelScope/Skywork-Reward-Llama-3.1-8B-v0.2', 'Skywork/Skywork-Reward-Llama-3.1-8B-v0.2'),
]),
ModelGroup([
Model('AI-ModelScope/GRM_Llama3.1_8B_rewardmodel-ft', 'Ray2333/GRM_Llama3.1_8B_rewardmodel-ft'),
Model('AI-ModelScope/GRM-llama3.2-3B-rewardmodel-ft', 'Ray2333/GRM-llama3.2-3B-rewardmodel-ft'),
])
],
template=TemplateType.llama3_2,
requires=['transformers>=4.43'],
architectures=['LlamaForSequenceClassification'],
model_arch=ModelArch.llama,
))
register_model(
ModelMeta(
RMModelType.gemma_reward,
[
ModelGroup([
Model('AI-ModelScope/Skywork-Reward-Gemma-2-27B', 'Skywork/Skywork-Reward-Gemma-2-27B'),
Model('AI-ModelScope/Skywork-Reward-Gemma-2-27B-v0.2', 'Skywork/Skywork-Reward-Gemma-2-27B-v0.2'),
]),
],
template=TemplateType.gemma,
requires=['transformers>=4.42'],
architectures=['Gemma2ForSequenceClassification'],
model_arch=ModelArch.llama,
))
+167
View File
@@ -0,0 +1,167 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import sys
from functools import wraps
from transformers import AutoModel, PretrainedConfig, PreTrainedModel
from swift.template import TemplateType
from swift.utils import Processor, git_clone_github, safe_snapshot_download
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..patcher import patch_output_clone
from ..register import ModelLoader, register_model
class GotOCR2Loader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
self.auto_model_cls = AutoModel
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.got_ocr2, [
ModelGroup([
Model('stepfun-ai/GOT-OCR2_0', 'stepfun-ai/GOT-OCR2_0'),
]),
],
GotOCR2Loader,
template=TemplateType.got_ocr2,
model_arch=ModelArch.got_ocr2,
architectures=['GOTQwenForCausalLM'],
tags=['vision']))
class GotOCR2HfLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers.models.got_ocr2 import GotOcr2ForConditionalGeneration
GotOcr2ForConditionalGeneration._no_split_modules = ['GotOcr2VisionLayer']
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.got_ocr2_hf, [
ModelGroup([
Model('stepfun-ai/GOT-OCR-2.0-hf', 'stepfun-ai/GOT-OCR-2.0-hf'),
]),
],
GotOCR2HfLoader,
template=TemplateType.got_ocr2_hf,
model_arch=ModelArch.llava_hf,
architectures=['GotOcr2ForConditionalGeneration'],
tags=['vision']))
class StepAudioLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/stepfun-ai/Step-Audio.git')
sys.path.append(local_repo_path)
from tokenizer import StepAudioTokenizer
encoder_path = safe_snapshot_download('stepfun-ai/Step-Audio-Tokenizer', check_local=True)
model = super().get_model(model_dir, *args, **kwargs)
model.encoder = StepAudioTokenizer(encoder_path)
# from tts import StepAudioTTS
# if not os.path.exists('speakers'):
# shutil.copytree(os.path.join(local_repo_path, 'speakers'), 'speakers')
# decoder_path = safe_snapshot_download('stepfun-ai/Step-Audio-TTS-3B', check_local=True)
# model.decoder = StepAudioTTS(decoder_path, model.encoder)
return model
register_model(
ModelMeta(
MLLMModelType.step_audio, [
ModelGroup([
Model('stepfun-ai/Step-Audio-Chat', 'stepfun-ai/Step-Audio-Chat'),
]),
],
StepAudioLoader,
template=TemplateType.step_audio,
architectures=['Step1ForCausalLM'],
requires=['funasr', 'sox', 'conformer', 'openai-whisper', 'librosa'],
tags=['audio']))
def _patch_step_audio2_mini(model):
if hasattr(model.__class__, 'origin_forward'):
return
model.__class__.origin_forward = model.__class__.forward
@wraps(model.__class__.origin_forward)
def _forward(self, *args, **kwargs):
labels = kwargs.get('labels')
output = self.origin_forward(*args, **kwargs)
if labels is not None and output.loss is None:
output['loss'] = self.loss_function(
logits=output.logits, labels=labels, vocab_size=self.config.get_text_config().vocab_size)
return output
model.__class__.forward = _forward
class StepAudio2MiniLoader(ModelLoader):
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, *args, **kwargs)
patch_output_clone(model.model.embed_tokens)
_patch_step_audio2_mini(model)
return model
register_model(
ModelMeta(
MLLMModelType.step_audio2_mini,
[ModelGroup([
Model('stepfun-ai/Step-Audio-2-mini', 'stepfun-ai/Step-Audio-2-mini'),
])],
StepAudio2MiniLoader,
template=TemplateType.step_audio2_mini,
model_arch=ModelArch.step_audio2_mini,
architectures=['StepAudio2ForCausalLM'],
requires=['transformers==4.53.3', 'torchaudio', 'librosa'],
tags=['audio'],
))
class Step3VLLoader(ModelLoader):
def get_config(self, model_dir: str) -> PretrainedConfig:
config = super().get_config(model_dir)
config.vocab_size = config.text_config.vocab_size
return config
def get_model(self, model_dir: str, config: PretrainedConfig, processor: Processor,
model_kwargs) -> PreTrainedModel:
key_mapping = {
'^vision_model': 'model.vision_model',
r'^model(?!\.(language_model|vision_model))': 'model.language_model',
'vit_large_projector': 'model.vit_large_projector',
}
model_kwargs = model_kwargs.copy()
model_kwargs['key_mapping'] = key_mapping
return super().get_model(model_dir, config, processor, model_kwargs)
register_model(
ModelMeta(
MLLMModelType.step3_vl,
[
ModelGroup([
Model('stepfun-ai/Step3-VL-10B-Base', 'stepfun-ai/Step3-VL-10B-Base'),
Model('stepfun-ai/Step3-VL-10B', 'stepfun-ai/Step3-VL-10B'),
])
],
Step3VLLoader,
template=TemplateType.step3_vl,
model_arch=ModelArch.step3_vl,
architectures=['StepVLForConditionalGeneration'],
requires=['transformers>=4.57.0'],
tags=['vision'],
))
+60
View File
@@ -0,0 +1,60 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import GenerationConfig, PretrainedConfig, PreTrainedModel, PreTrainedTokenizerBase
from swift.template import TemplateType
from ..constant import LLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
class TeleChatLoader(ModelLoader):
def get_model(self, model_dir: str, config, processor, **kwargs) -> PreTrainedModel:
model = super().get_model(model_dir, config, processor, **kwargs)
generation_config = GenerationConfig.from_pretrained(model_dir)
for k in ['bos_token_id', 'eos_token_id', 'pad_token_id', 'user_token_id', 'bot_token_id']:
setattr(processor, k, getattr(generation_config, k))
return model
register_model(
ModelMeta(
LLMModelType.telechat,
[
ModelGroup([
Model('TeleAI/TeleChat-7B', 'Tele-AI/telechat-7B'),
Model('TeleAI/TeleChat-12B', 'Tele-AI/TeleChat-12B'),
Model('TeleAI/TeleChat-12B-v2', 'Tele-AI/TeleChat-12B-v2'),
Model('TeleAI/TeleChat-52B', 'TeleAI/TeleChat-52B'),
]),
ModelGroup([
Model('swift/TeleChat-12B-V2-GPTQ-Int4'),
]),
ModelGroup([
Model('TeleAI/TeleChat2-35B', 'Tele-AI/TeleChat2-35B'),
Model('TeleAI/TeleChat2-115B', 'Tele-AI/TeleChat2-115B'),
]),
],
TeleChatLoader,
template=TemplateType.telechat,
model_arch=ModelArch.telechat,
architectures=['TelechatForCausalLM', 'TeleChatForCausalLM'],
))
register_model(
ModelMeta(
LLMModelType.telechat2,
[
ModelGroup([
Model('TeleAI/TeleChat2-3B', 'Tele-AI/TeleChat2-3B'),
Model('TeleAI/TeleChat2-7B-32K', 'Tele-AI/TeleChat2-7B-32K'),
Model('TeleAI/TeleChat2-35B-32K', 'Tele-AI/TeleChat2-35B-32K'),
Model('TeleAI/TeleChat2-35B-Nov', 'Tele-AI/TeleChat2-35B-Nov'),
]),
],
template=TemplateType.telechat2,
model_arch=ModelArch.telechat,
architectures=['TeleChat2ForCausalLM'],
))
+37
View File
@@ -0,0 +1,37 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
from transformers import PreTrainedModel
from swift.template import TemplateType
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
class HunyuanVLLoader(ModelLoader):
def get_config(self, model_dir: str):
self.attn_impl = self.attn_impl or 'eager'
return super().get_config(model_dir)
def get_model(self, model_dir: str, *args, **kwargs) -> PreTrainedModel:
from transformers import HunYuanVLForConditionalGeneration
self.auto_model_cls = self.auto_model_cls or HunYuanVLForConditionalGeneration
return super().get_model(model_dir, *args, **kwargs)
register_model(
ModelMeta(
MLLMModelType.hunyuan_ocr,
[
ModelGroup([
Model('Tencent-Hunyuan/HunyuanOCR', 'tencent/HunyuanOCR'),
]),
],
HunyuanVLLoader,
template=TemplateType.hunyuan_ocr,
architectures=['HunYuanVLForConditionalGeneration'],
model_arch=ModelArch.hunyuan_vl,
requires=['transformers>=4.49.0'],
))
+80
View File
@@ -0,0 +1,80 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import sys
from functools import wraps
from transformers import PreTrainedModel
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import git_clone_github, safe_snapshot_download
from ..constant import MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
class ValleyLoader(ModelLoader):
def get_config(self, model_dir: str):
local_repo_path = self.local_repo_path
if not local_repo_path:
repo_path = 'https://github.com/bytedance/Valley.git'
local_repo_path = git_clone_github(repo_path)
sys.path.append(local_repo_path)
from valley_eagle.model.language_model.valley_qwen2 import ValleyConfig
self.auto_config_cls = ValleyConfig
return super().get_config(model_dir)
def get_model(self, model_dir: str, config, processor, model_kwargs) -> PreTrainedModel:
from transformers.modeling_outputs import CausalLMOutputWithPast
from valley_eagle.model.language_model.valley_qwen2 import ValleyQwen2ForCausalLM
config.mm_vision_tower = safe_snapshot_download('AI-ModelScope/siglip-so400m-patch14-384', check_local=True)
config.eagle_vision_tower = safe_snapshot_download('Qwen/Qwen2-VL-7B-Instruct', check_local=True)
auto_model_cls = ValleyQwen2ForCausalLM
if not hasattr(ValleyQwen2ForCausalLM, '_origin_forward'):
forward = ValleyQwen2ForCausalLM.forward
ValleyQwen2ForCausalLM._origin_forward = forward
@wraps(forward)
def new_forward(*args, **kwargs):
import torch
outputs = forward(*args, **kwargs)
loss = outputs.loss
if loss is not None and loss.shape[-1] > 0:
loss = torch.mean(loss, dim=-1)
return CausalLMOutputWithPast(
loss=loss,
logits=outputs.logits,
past_key_values=outputs.past_key_values,
hidden_states=outputs.hidden_states,
attentions=outputs.attentions,
)
ValleyQwen2ForCausalLM.forward = new_forward
self.auto_model_cls = auto_model_cls
model = super().get_model(model_dir, config, processor, model_kwargs)
model.generation_config.repetition_penalty = 1.0 # Otherwise, Error. Same for original code.
from transformers import AutoProcessor, SiglipImageProcessor
processor.image_processor = SiglipImageProcessor.from_pretrained(model.config.mm_vision_tower)
processor.qwen2vl_processor = AutoProcessor.from_pretrained(
model.config.eagle_vision_tower, max_pixels=1280 * 28 * 28)
processor.image_processor.crop_size = processor.image_processor.size['height']
return model
register_model(
ModelMeta(
MLLMModelType.valley,
[
ModelGroup([
Model('bytedance-research/Valley-Eagle-7B'),
], ),
],
ValleyLoader,
template=TemplateType.valley,
architectures=['ValleyQwen2ForCausalLM'],
model_arch=ModelArch.valley,
requires=['transformers>=4.42', 'av'],
tags=['vision'],
))
+123
View File
@@ -0,0 +1,123 @@
# Copyright (c) ModelScope Contributors. All rights reserved.
import os
import sys
from transformers import AutoTokenizer, PretrainedConfig, PreTrainedModel
from typing import Any, Dict
from swift.template import TemplateType
from swift.utils import Processor, get_logger, git_clone_github
from ..constant import LLMModelType, MLLMModelType
from ..model_arch import ModelArch
from ..model_meta import Model, ModelGroup, ModelMeta
from ..register import ModelLoader, register_model
logger = get_logger()
class YiVLLoader(ModelLoader):
def get_config(self, model_dir: str) -> PretrainedConfig:
local_repo_path = self.local_repo_path
if not local_repo_path:
local_repo_path = git_clone_github('https://github.com/01-ai/Yi')
sys.path.append(os.path.join(local_repo_path, 'VL'))
from llava.model import LlavaConfig
config = LlavaConfig.from_pretrained(model_dir)
mm_vision_tower = config.mm_vision_tower
config.mm_vision_tower = os.path.join(model_dir, *mm_vision_tower.rsplit('/', maxsplit=2)[-2:])
config.attention_dropout = 0.
if not hasattr(config, 'max_sequence_length'):
config.max_sequence_length = 2048
return config
def get_processor(self, model_dir: str, config: PretrainedConfig) -> Processor:
return AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True, use_fast=False)
def get_model(self, model_dir: str, config, processor, **kwargs) -> PreTrainedModel:
from llava.model import LlavaLlamaForCausalLM
from llava.model.constants import key_info
key_info['model_path'] = model_dir
self.auto_model_cls = self.auto_model_cls or LlavaLlamaForCausalLM
model = super().get_model(model_dir, config, processor, **kwargs)
vision_tower = model.get_vision_tower()
vision_tower.load_model()
vision_tower.to(device=model.device, dtype=config.torch_dtype)
logger.info('Please ignore the above warning.')
logger.info('Loading the parameters of vision_tower...')
model.resize_token_embeddings(len(processor))
processor.image_processor = vision_tower.image_processor
return model
register_model(
ModelMeta(
MLLMModelType.yi_vl,
[
ModelGroup([
Model('01ai/Yi-VL-6B', '01-ai/Yi-VL-6B'),
Model('01ai/Yi-VL-34B', '01-ai/Yi-VL-34B'),
], ),
],
YiVLLoader,
template=TemplateType.yi_vl,
model_arch=ModelArch.llava_llama,
architectures=['LlavaLlamaForCausalLM'],
requires=['transformers>=4.34'],
tags=['vision'],
))
register_model(
ModelMeta(
LLMModelType.yi,
[ # yi
ModelGroup([
Model('01ai/Yi-6B', '01-ai/Yi-6B'),
Model('01ai/Yi-6B-200K', '01-ai/Yi-6B-200K'),
Model('01ai/Yi-6B-Chat', '01-ai/Yi-6B-Chat'),
Model('01ai/Yi-6B-Chat-4bits', '01-ai/Yi-6B-Chat-4bits'),
Model('01ai/Yi-6B-Chat-8bits', '01-ai/Yi-6B-Chat-8bits'),
Model('01ai/Yi-9B', '01-ai/Yi-9B'),
Model('01ai/Yi-9B-200K', '01-ai/Yi-9B-200K'),
Model('01ai/Yi-34B', '01-ai/Yi-34B'),
Model('01ai/Yi-34B-200K', '01-ai/Yi-34B-200K'),
Model('01ai/Yi-34B-Chat', '01-ai/Yi-34B-Chat'),
Model('01ai/Yi-34B-Chat-4bits', '01-ai/Yi-34B-Chat-4bits'),
Model('01ai/Yi-34B-Chat-8bits', '01-ai/Yi-34B-Chat-8bits'),
], TemplateType.chatml),
# yi1.5
ModelGroup([
Model('01ai/Yi-1.5-6B', '01-ai/Yi-1.5-6B'),
Model('01ai/Yi-1.5-6B-Chat', '01-ai/Yi-1.5-6B-Chat'),
Model('01ai/Yi-1.5-9B', '01-ai/Yi-1.5-9B'),
Model('01ai/Yi-1.5-9B-Chat', '01-ai/Yi-1.5-9B-Chat'),
Model('01ai/Yi-1.5-9B-Chat-16K', '01-ai/Yi-1.5-9B-Chat-16K'),
Model('01ai/Yi-1.5-34B', '01-ai/Yi-1.5-34B'),
Model('01ai/Yi-1.5-34B-Chat', '01-ai/Yi-1.5-34B-Chat'),
Model('01ai/Yi-1.5-34B-Chat-16K', '01-ai/Yi-1.5-34B-Chat-16K'),
], TemplateType.chatml),
# yi1.5-quant
ModelGroup([
Model('AI-ModelScope/Yi-1.5-6B-Chat-GPTQ', 'modelscope/Yi-1.5-6B-Chat-GPTQ'),
Model('AI-ModelScope/Yi-1.5-6B-Chat-AWQ', 'modelscope/Yi-1.5-6B-Chat-AWQ'),
Model('AI-ModelScope/Yi-1.5-9B-Chat-GPTQ', 'modelscope/Yi-1.5-9B-Chat-GPTQ'),
Model('AI-ModelScope/Yi-1.5-9B-Chat-AWQ', 'modelscope/Yi-1.5-9B-Chat-AWQ'),
Model('AI-ModelScope/Yi-1.5-34B-Chat-GPTQ', 'modelscope/Yi-1.5-34B-Chat-GPTQ'),
Model('AI-ModelScope/Yi-1.5-34B-Chat-AWQ', 'modelscope/Yi-1.5-34B-Chat-AWQ'),
], TemplateType.chatml),
ModelGroup([
Model('01ai/Yi-Coder-1.5B', '01-ai/Yi-Coder-1.5B'),
Model('01ai/Yi-Coder-9B', '01-ai/Yi-Coder-9B'),
Model('01ai/Yi-Coder-1.5B-Chat', '01-ai/Yi-Coder-1.5B-Chat'),
Model('01ai/Yi-Coder-9B-Chat', '01-ai/Yi-Coder-9B-Chat'),
],
TemplateType.yi_coder,
tags=['coding']),
ModelGroup([
Model('SUSTC/SUS-Chat-34B', 'SUSTech/SUS-Chat-34B'),
], TemplateType.sus),
],
architectures=['LlamaForCausalLM'],
mcore_model_type='gpt',
model_arch=ModelArch.llama,
))