main
py 193 lines 6.77 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 # Copyright 2025 The Qwen Team and The HuggingFace Inc. team.
4 # All rights reserved.
5 #
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
9 #
10 # http://www.apache.org/licenses/LICENSE-2.0
11 #
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
17 """Qwen3.5 model configuration."""
18
19 from transformers.configuration_utils import PreTrainedConfig
20
21
22 class Qwen3_5TextConfig(PreTrainedConfig):
23 model_type = "qwen3_5_text"
24 keys_to_ignore_at_inference = ["past_key_values"]
25
26 base_model_tp_plan = {
27 "layers.*.self_attn.q_proj": "colwise",
28 "layers.*.self_attn.k_proj": "colwise",
29 "layers.*.self_attn.v_proj": "colwise",
30 "layers.*.self_attn.o_proj": "rowwise",
31 "layers.*.mlp.gate_proj": "colwise",
32 "layers.*.mlp.up_proj": "colwise",
33 "layers.*.mlp.down_proj": "rowwise",
34 }
35 base_model_pp_plan = {
36 "embed_tokens": (["input_ids"], ["inputs_embeds"]),
37 "layers": (["hidden_states", "attention_mask"], ["hidden_states"]),
38 "norm": (["hidden_states"], ["hidden_states"]),
39 }
40 base_config_key = "text_config"
41
42 def __init__(
43 self,
44 vocab_size=248320,
45 hidden_size=4096,
46 intermediate_size=12288,
47 num_hidden_layers=32,
48 num_attention_heads=16,
49 num_key_value_heads=4,
50 hidden_act="silu",
51 max_position_embeddings=32768,
52 initializer_range=0.02,
53 rms_norm_eps=1e-6,
54 use_cache=True,
55 tie_word_embeddings=False,
56 rope_parameters=None,
57 attention_bias=False,
58 attention_dropout=0.0,
59 head_dim=256,
60 linear_conv_kernel_dim=4,
61 linear_key_head_dim=128,
62 linear_value_head_dim=128,
63 linear_num_key_heads=16,
64 linear_num_value_heads=32,
65 layer_types=None,
66 pad_token_id=None,
67 bos_token_id=None,
68 eos_token_id=None,
69 **kwargs,
70 ):
71 self.vocab_size = vocab_size
72 self.max_position_embeddings = max_position_embeddings
73 self.hidden_size = hidden_size
74 self.intermediate_size = intermediate_size
75 self.num_hidden_layers = num_hidden_layers
76 self.num_attention_heads = num_attention_heads
77 self.num_key_value_heads = num_key_value_heads
78 self.hidden_act = hidden_act
79 self.initializer_range = initializer_range
80 self.rms_norm_eps = rms_norm_eps
81 self.use_cache = use_cache
82 self.attention_bias = attention_bias
83 self.attention_dropout = attention_dropout
84 self.head_dim = head_dim
85 self.rope_parameters = rope_parameters
86 kwargs.setdefault("partial_rotary_factor", 0.25)
87
88 self.layer_types = layer_types
89 if self.layer_types is None:
90 interval_pattern = kwargs.get("full_attention_interval", 4)
91 self.layer_types = [
92 "linear_attention"
93 if bool((i + 1) % interval_pattern)
94 else "full_attention"
95 for i in range(self.num_hidden_layers)
96 ]
97 kwargs["ignore_keys_at_rope_validation"] = {
98 "mrope_section",
99 "mrope_interleaved",
100 }
101 self.validate_layer_type()
102
103 # linear attention part
104 self.linear_conv_kernel_dim = linear_conv_kernel_dim
105 self.linear_key_head_dim = linear_key_head_dim
106 self.linear_value_head_dim = linear_value_head_dim
107 self.linear_num_key_heads = linear_num_key_heads
108 self.linear_num_value_heads = linear_num_value_heads
109 super().__init__(**kwargs)
110 # Set these AFTER super().__init__() because transformers v4's
111 # PreTrainedConfig.__init__ has these as explicit params with different
112 # defaults (e.g. tie_word_embeddings=True) that would overwrite our values.
113 self.pad_token_id = pad_token_id
114 self.bos_token_id = bos_token_id
115 self.eos_token_id = eos_token_id
116 self.tie_word_embeddings = tie_word_embeddings
117
118
119 class Qwen3_5VisionConfig(PreTrainedConfig):
120 model_type = "qwen3_5"
121 base_config_key = "vision_config"
122
123 def __init__(
124 self,
125 depth=27,
126 hidden_size=1152,
127 hidden_act="gelu_pytorch_tanh",
128 intermediate_size=4304,
129 num_heads=16,
130 in_channels=3,
131 patch_size=16,
132 spatial_merge_size=2,
133 temporal_patch_size=2,
134 out_hidden_size=3584,
135 num_position_embeddings=2304,
136 initializer_range=0.02,
137 **kwargs,
138 ):
139 super().__init__(**kwargs)
140
141 self.depth = depth
142 self.hidden_size = hidden_size
143 self.hidden_act = hidden_act
144 self.intermediate_size = intermediate_size
145 self.num_heads = num_heads
146 self.in_channels = in_channels
147 self.patch_size = patch_size
148 self.spatial_merge_size = spatial_merge_size
149 self.temporal_patch_size = temporal_patch_size
150 self.out_hidden_size = out_hidden_size
151 self.num_position_embeddings = num_position_embeddings
152 self.initializer_range = initializer_range
153
154
155 class Qwen3_5Config(PreTrainedConfig):
156 model_type = "qwen3_5"
157 sub_configs = {
158 "vision_config": Qwen3_5VisionConfig,
159 "text_config": Qwen3_5TextConfig,
160 }
161 keys_to_ignore_at_inference = ["past_key_values"]
162
163 def __init__(
164 self,
165 text_config=None,
166 vision_config=None,
167 image_token_id=248056,
168 video_token_id=248057,
169 vision_start_token_id=248053,
170 vision_end_token_id=248054,
171 tie_word_embeddings=False,
172 **kwargs,
173 ):
174 if isinstance(vision_config, dict):
175 self.vision_config = self.sub_configs["vision_config"](**vision_config)
176 elif vision_config is None:
177 self.vision_config = self.sub_configs["vision_config"]()
178
179 if isinstance(text_config, dict):
180 self.text_config = self.sub_configs["text_config"](**text_config)
181 elif text_config is None:
182 self.text_config = self.sub_configs["text_config"]()
183
184 self.image_token_id = image_token_id
185 self.video_token_id = video_token_id
186 self.vision_start_token_id = vision_start_token_id
187 self.vision_end_token_id = vision_end_token_id
188 super().__init__(**kwargs)
189 # Set after super().__init__() to avoid v4 PreTrainedConfig overwrite
190 self.tie_word_embeddings = tie_word_embeddings
191
192
193 __all__ = ["Qwen3_5Config", "Qwen3_5TextConfig"]