aquaman164 commited on
Commit
be7b5bd
·
verified ·
1 Parent(s): a4eb704

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
LICENSE ADDED
@@ -0,0 +1,202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright 2026 Alibaba Cloud
191
+
192
+ Licensed under the Apache License, Version 2.0 (the "License");
193
+ you may not use this file except in compliance with the License.
194
+ You may obtain a copy of the License at
195
+
196
+ http://www.apache.org/licenses/LICENSE-2.0
197
+
198
+ Unless required by applicable law or agreed to in writing, software
199
+ distributed under the License is distributed on an "AS IS" BASIS,
200
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201
+ See the License for the specific language governing permissions and
202
+ limitations under the License.
README.md ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ base_model: Qwen/Qwen3.6-35B-A3B
4
+ library_name: mlx
5
+ pipeline_tag: text-generation
6
+ tags:
7
+ - mlx
8
+ - quantized
9
+ - vq
10
+ - aqlm
11
+ - codebook
12
+ - mixed-bit
13
+ - moe
14
+ - qwen3_5_moe
15
+ - custom-code
16
+ ---
17
+
18
+ # Qwen3.6-35B-A3B — MLX **VQ** (trained-codebook) @2.6 bpw, custom Metal kernel
19
+
20
+ **Vector-quantized** (AQLM-style, trained codebooks + GPTQ compensation) MLX build of
21
+ [Qwen/Qwen3.6-35B-A3B](https://huggingface.co/Qwen/Qwen3.6-35B-A3B) — to our knowledge the first
22
+ trained-codebook VQ model served on Apple Silicon, via the bundled `mx.fast.metal_kernel`
23
+ implementation (`code/`). **11.53 GB**, measurably better than scalar quantization at the same size.
24
+
25
+ ⚠️ **Not loadable by stock mlx-lm / LM Studio / Ollama / oMLX** — the experts use a VQ format that
26
+ needs the bundled loader + Metal kernel (~400 lines of Python, `mlx>=0.31` only, no compilation).
27
+
28
+ ## The scalar-vs-VQ tradeoff this build wins
29
+
30
+ | build | size | think-ja PPL vs bf16 | multilingual |
31
+ |---|---|---|---|
32
+ | [GPTQ-3.5bpw](https://huggingface.co/aquaman164/Qwen3.6-35B-A3B-MLX-GPTQ-3.5bpw) (scalar) | 15.35 GB | +6.6% | +6.9% |
33
+ | [GPTQ-2.7bpw](https://huggingface.co/aquaman164/Qwen3.6-35B-A3B-MLX-GPTQ-2.7bpw) (scalar) | 12.03 GB | +17.5% | +15.4% |
34
+ | **this (VQ)** | **11.53 GB** | **+12.4%** | **+12.2%** |
35
+
36
+ Smaller *and* significantly better than the scalar 2.7bpw build — the point of codebook
37
+ quantization at low bits.
38
+
39
+ ## Recipe
40
+
41
+ - **Experts (91.7% of params)**: per-(layer,tensor) bits {2bit: 69, 3bit: 11 tensors} chosen by
42
+ Fisher/gxw MCKP; **Qwen-native codebooks** (d=4, K=256 / K=4096; k-means on group-normalized
43
+ subvectors — GLM-fit books measurably transfer worse, so refit); **GPTQ error compensation**
44
+ (pooled per-layer input Hessians, ja-centric calibration). Expert avg 2.38 bpw + fp16 group scales.
45
+ - **Spine**: GPTQ 4bit gs64 (linear-attention qkv/z/out, attention q/k/v/o, shared experts),
46
+ `lm_head` 6bit, routers 8bit, embeddings 4bit — inherited from the 2.7bpw scalar build.
47
+ - **Vision tower**: unquantized bf16.
48
+ - Format: `switch_mlp.*.vq_codes` (LSB-first packed 8/12-bit indices, int32) +
49
+ `vq_scales` (fp16 per-128 group) + `vq_codebooks.safetensors`; metadata in `config.json["vq"]`.
50
+
51
+ ## Speed (M-series, measured on 48 GB)
52
+
53
+ - **decode ~66 tok/s**, **prefill ~213 tok/s** — fused Metal kernels
54
+ (gate+up+SiLU in one dispatch; simdgroup-per-row GEMV with half4 loads).
55
+
56
+ ## Run (Apple Silicon, ≥16 GB unified memory)
57
+
58
+ ```bash
59
+ pip install "mlx>=0.31" "mlx-lm>=0.31"
60
+ hf download aquaman164/Qwen3.6-35B-A3B-MLX-VQ-2.6bpw --local-dir qwen-vq
61
+
62
+ # OpenAI-compatible server
63
+ python qwen-vq/code/vq_serve.py --model qwen-vq --port 8090
64
+ # then: curl http://127.0.0.1:8090/v1/chat/completions -d '{"model":"qwen-vq", ...}'
65
+ # (use the model id returned by /v1/models)
66
+
67
+ # or a one-shot generation test
68
+ python qwen-vq/code/vq_generate.py qwen-vq 100
69
+ ```
70
+
71
+ `code/vq_switch.py` exposes `load_vq_model(path) -> (model, config)` if you want to embed it.
72
+ Thinking mode is on by default (Qwen3.6 native); pass `enable_thinking=False` via the chat
73
+ template for direct answers.
74
+
75
+ ## Provenance / license
76
+
77
+ Base model © Alibaba Cloud, Apache-2.0. Quantization pipeline: loss-aware allocation +
78
+ GPTQ-VQ encode built on [OneCompression](https://github.com/mmzz164/OneCompression);
79
+ serving adapter published as model #3 of [vqmoe](https://github.com/mmzz164/vqmoe).
chat_template.jinja ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {%- set image_count = namespace(value=0) %}
2
+ {%- set video_count = namespace(value=0) %}
3
+ {%- macro render_content(content, do_vision_count, is_system_content=false) %}
4
+ {%- if content is string %}
5
+ {{- content }}
6
+ {%- elif content is iterable and content is not mapping %}
7
+ {%- for item in content %}
8
+ {%- if 'image' in item or 'image_url' in item or item.type == 'image' %}
9
+ {%- if is_system_content %}
10
+ {{- raise_exception('System message cannot contain images.') }}
11
+ {%- endif %}
12
+ {%- if do_vision_count %}
13
+ {%- set image_count.value = image_count.value + 1 %}
14
+ {%- endif %}
15
+ {%- if add_vision_id %}
16
+ {{- 'Picture ' ~ image_count.value ~ ': ' }}
17
+ {%- endif %}
18
+ {{- '<|vision_start|><|image_pad|><|vision_end|>' }}
19
+ {%- elif 'video' in item or item.type == 'video' %}
20
+ {%- if is_system_content %}
21
+ {{- raise_exception('System message cannot contain videos.') }}
22
+ {%- endif %}
23
+ {%- if do_vision_count %}
24
+ {%- set video_count.value = video_count.value + 1 %}
25
+ {%- endif %}
26
+ {%- if add_vision_id %}
27
+ {{- 'Video ' ~ video_count.value ~ ': ' }}
28
+ {%- endif %}
29
+ {{- '<|vision_start|><|video_pad|><|vision_end|>' }}
30
+ {%- elif 'text' in item %}
31
+ {{- item.text }}
32
+ {%- else %}
33
+ {{- raise_exception('Unexpected item type in content.') }}
34
+ {%- endif %}
35
+ {%- endfor %}
36
+ {%- elif content is none or content is undefined %}
37
+ {{- '' }}
38
+ {%- else %}
39
+ {{- raise_exception('Unexpected content type.') }}
40
+ {%- endif %}
41
+ {%- endmacro %}
42
+ {%- if not messages %}
43
+ {{- raise_exception('No messages provided.') }}
44
+ {%- endif %}
45
+ {%- if tools and tools is iterable and tools is not mapping %}
46
+ {{- '<|im_start|>system\n' }}
47
+ {{- "# Tools\n\nYou have access to the following functions:\n\n<tools>" }}
48
+ {%- for tool in tools %}
49
+ {{- "\n" }}
50
+ {{- tool | tojson }}
51
+ {%- endfor %}
52
+ {{- "\n</tools>" }}
53
+ {{- '\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n<tool_call>\n<function=example_function_name>\n<parameter=example_parameter_1>\nvalue_1\n</parameter>\n<parameter=example_parameter_2>\nThis is the value for the second parameter\nthat can span\nmultiple lines\n</parameter>\n</function>\n</tool_call>\n\n<IMPORTANT>\nReminder:\n- Function calls MUST follow the specified format: an inner <function=...></function> block must be nested within <tool_call></tool_call> XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n- If there is no function call available, answer the question like normal with your current knowledge and do not tell the user about function calls\n</IMPORTANT>' }}
54
+ {%- if messages[0].role == 'system' %}
55
+ {%- set content = render_content(messages[0].content, false, true)|trim %}
56
+ {%- if content %}
57
+ {{- '\n\n' + content }}
58
+ {%- endif %}
59
+ {%- endif %}
60
+ {{- '<|im_end|>\n' }}
61
+ {%- else %}
62
+ {%- if messages[0].role == 'system' %}
63
+ {%- set content = render_content(messages[0].content, false, true)|trim %}
64
+ {{- '<|im_start|>system\n' + content + '<|im_end|>\n' }}
65
+ {%- endif %}
66
+ {%- endif %}
67
+ {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}
68
+ {%- for message in messages[::-1] %}
69
+ {%- set index = (messages|length - 1) - loop.index0 %}
70
+ {%- if ns.multi_step_tool and message.role == "user" %}
71
+ {%- set content = render_content(message.content, false)|trim %}
72
+ {%- if not(content.startswith('<tool_response>') and content.endswith('</tool_response>')) %}
73
+ {%- set ns.multi_step_tool = false %}
74
+ {%- set ns.last_query_index = index %}
75
+ {%- endif %}
76
+ {%- endif %}
77
+ {%- endfor %}
78
+ {%- if ns.multi_step_tool %}
79
+ {{- raise_exception('No user query found in messages.') }}
80
+ {%- endif %}
81
+ {%- for message in messages %}
82
+ {%- set content = render_content(message.content, true)|trim %}
83
+ {%- if message.role == "system" %}
84
+ {%- if not loop.first %}
85
+ {{- raise_exception('System message must be at the beginning.') }}
86
+ {%- endif %}
87
+ {%- elif message.role == "user" %}
88
+ {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>' + '\n' }}
89
+ {%- elif message.role == "assistant" %}
90
+ {%- set reasoning_content = '' %}
91
+ {%- if message.reasoning_content is string %}
92
+ {%- set reasoning_content = message.reasoning_content %}
93
+ {%- else %}
94
+ {%- if '</think>' in content %}
95
+ {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
96
+ {%- set content = content.split('</think>')[-1].lstrip('\n') %}
97
+ {%- endif %}
98
+ {%- endif %}
99
+ {%- set reasoning_content = reasoning_content|trim %}
100
+ {%- if (preserve_thinking is defined and preserve_thinking is true) or (loop.index0 > ns.last_query_index) %}
101
+ {{- '<|im_start|>' + message.role + '\n<think>\n' + reasoning_content + '\n</think>\n\n' + content }}
102
+ {%- else %}
103
+ {{- '<|im_start|>' + message.role + '\n' + content }}
104
+ {%- endif %}
105
+ {%- if message.tool_calls and message.tool_calls is iterable and message.tool_calls is not mapping %}
106
+ {%- for tool_call in message.tool_calls %}
107
+ {%- if tool_call.function is defined %}
108
+ {%- set tool_call = tool_call.function %}
109
+ {%- endif %}
110
+ {%- if loop.first %}
111
+ {%- if content|trim %}
112
+ {{- '\n\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
113
+ {%- else %}
114
+ {{- '<tool_call>\n<function=' + tool_call.name + '>\n' }}
115
+ {%- endif %}
116
+ {%- else %}
117
+ {{- '\n<tool_call>\n<function=' + tool_call.name + '>\n' }}
118
+ {%- endif %}
119
+ {%- if tool_call.arguments is defined %}
120
+ {%- for args_name, args_value in tool_call.arguments|items %}
121
+ {{- '<parameter=' + args_name + '>\n' }}
122
+ {%- set args_value = args_value | string if args_value is string else args_value | tojson | safe %}
123
+ {{- args_value }}
124
+ {{- '\n</parameter>\n' }}
125
+ {%- endfor %}
126
+ {%- endif %}
127
+ {{- '</function>\n</tool_call>' }}
128
+ {%- endfor %}
129
+ {%- endif %}
130
+ {{- '<|im_end|>\n' }}
131
+ {%- elif message.role == "tool" %}
132
+ {%- if loop.previtem and loop.previtem.role != "tool" %}
133
+ {{- '<|im_start|>user' }}
134
+ {%- endif %}
135
+ {{- '\n<tool_response>\n' }}
136
+ {{- content }}
137
+ {{- '\n</tool_response>' }}
138
+ {%- if not loop.last and loop.nextitem.role != "tool" %}
139
+ {{- '<|im_end|>\n' }}
140
+ {%- elif loop.last %}
141
+ {{- '<|im_end|>\n' }}
142
+ {%- endif %}
143
+ {%- else %}
144
+ {{- raise_exception('Unexpected message role.') }}
145
+ {%- endif %}
146
+ {%- endfor %}
147
+ {%- if add_generation_prompt %}
148
+ {{- '<|im_start|>assistant\n' }}
149
+ {%- if enable_thinking is defined and enable_thinking is false %}
150
+ {{- '<think>\n\n</think>\n\n' }}
151
+ {%- else %}
152
+ {{- '<think>\n' }}
153
+ {%- endif %}
154
+ {%- endif %}
code/vq_generate.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """End-to-end VQ integration test on the Mac: load_vq_model + real generation.
2
+
3
+ Run: ~/work/llm/omlx/.venv/bin/python vq_generate.py <artifact_dir> [max_tokens]
4
+ Loads the full qwen3_5_moe model with VQSwitchLinear experts (level-0 pure-MLX
5
+ decode), runs a short Japanese generation, reports text + tok/s.
6
+ """
7
+ import os
8
+ import sys
9
+ import time
10
+
11
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
12
+ from vq_switch import load_vq_model
13
+
14
+ ART = sys.argv[1] if len(sys.argv) > 1 else os.path.expanduser("~/models/Qwen3.6-35B-A3B-MLX-VQ-map12")
15
+ MAXTOK = int(sys.argv[2]) if len(sys.argv) > 2 else 40
16
+
17
+ t0 = time.time()
18
+ def log(m): print(f"[vqgen +{time.time()-t0:.0f}s] {m}", flush=True)
19
+
20
+ log(f"loading VQ model from {ART} ...")
21
+ model, config = load_vq_model(ART)
22
+ log("model loaded (strict) — VQ modules live")
23
+
24
+ from mlx_lm.utils import load_tokenizer
25
+ from pathlib import Path
26
+ tokenizer = load_tokenizer(Path(ART))
27
+ msgs = [{"role": "user", "content": "東京の観光名所を3つ、名前だけ簡潔に教えてください。"}]
28
+ prompt = tokenizer.apply_chat_template(msgs, add_generation_prompt=True)
29
+ log(f"prompt tokens: {len(prompt)}")
30
+
31
+ from mlx_lm import generate
32
+ t1 = time.time()
33
+ out = generate(model, tokenizer, prompt=prompt, max_tokens=MAXTOK, verbose=False)
34
+ dt = time.time() - t1
35
+ log(f"generated {MAXTOK} tokens in {dt:.1f}s ({MAXTOK/dt:.2f} tok/s, level-0)")
36
+ print("---- OUTPUT ----")
37
+ print(out)
38
+ print("----------------")
39
+ print("VQ_GENERATE_DONE")
code/vq_kernel.py ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Fused VQ gather-GEMV Metal kernel (v3 level-1) for map12 (d=4, nbits 8|12).
2
+
3
+ One thread per (pair n, output row r):
4
+ y[n,r] = sum_g scale[e,r,g] * sum_{sub in g} dot(cb[idx(e,r,sub)], x[n, sub*4 .. +4])
5
+ codes are LSB-first packed (8-bit idx for K256 / 12-bit for K4096) in uint32 words.
6
+ Correctness reference = VQSwitchLinear._decode (level-0); see vq_test kernel section.
7
+ """
8
+ import mlx.core as mx
9
+
10
+ _SRC = """
11
+ uint r = thread_position_in_grid.x;
12
+ uint n = thread_position_in_grid.y;
13
+ const uint C = (uint)params[0];
14
+ const uint R = (uint)params[1];
15
+ const uint nbits = (uint)params[3];
16
+ const uint PC = (uint)params[4];
17
+ const uint NG = (uint)params[5];
18
+ if (r >= R) return;
19
+ uint e = (uint)eidx[n];
20
+ device const uint* crow = codes + ((ulong)e * R + r) * PC;
21
+ device const half* srow = scales + ((ulong)e * R + r) * NG;
22
+ device const half* xr = x + (ulong)n * C;
23
+ float acc = 0.0f;
24
+ const uint SPG = 32u; // subvectors (d=4) per 128-group
25
+ for (uint g = 0; g < NG; ++g) {
26
+ float s = (float)srow[g];
27
+ float gacc = 0.0f;
28
+ uint base = g * SPG;
29
+ for (uint j = 0; j < SPG; ++j) {
30
+ uint k = base + j;
31
+ uint idx;
32
+ if (nbits == 8u) {
33
+ idx = (crow[k >> 2] >> ((k & 3u) * 8u)) & 255u;
34
+ } else {
35
+ uint pos = k * 12u; uint w = pos >> 5; uint off = pos & 31u;
36
+ uint v = crow[w] >> off;
37
+ if (off > 20u) { v |= crow[w + 1u] << (32u - off); }
38
+ idx = v & 4095u;
39
+ }
40
+ device const half* cv = cb + (ulong)idx * 4u;
41
+ uint c0 = k * 4u;
42
+ gacc += (float)cv[0] * (float)xr[c0]
43
+ + (float)cv[1] * (float)xr[c0 + 1u]
44
+ + (float)cv[2] * (float)xr[c0 + 2u]
45
+ + (float)cv[3] * (float)xr[c0 + 3u];
46
+ }
47
+ acc += s * gacc;
48
+ }
49
+ y[(ulong)n * R + r] = (half)acc;
50
+ """
51
+
52
+ _KERNEL = mx.fast.metal_kernel(
53
+ name="vq_gemv_d4",
54
+ input_names=["x", "codes", "scales", "cb", "eidx", "params"],
55
+ output_names=["y"],
56
+ source=_SRC,
57
+ )
58
+
59
+ # ---- v2: one simdgroup (32 lanes) per output row, half4 vector loads ----
60
+ _SRC2 = """
61
+ uint tid = thread_position_in_grid.x;
62
+ uint r = tid / 32u;
63
+ uint lane = tid % 32u;
64
+ uint n = thread_position_in_grid.y;
65
+ const uint C = (uint)params[0];
66
+ const uint R = (uint)params[1];
67
+ const uint nbits = (uint)params[3];
68
+ const uint PC = (uint)params[4];
69
+ if (r >= R) return;
70
+ uint e = (uint)eidx[n];
71
+ device const uint* crow = codes + ((ulong)e * R + r) * PC;
72
+ device const half* srow = scales + ((ulong)e * R + r) * (C >> 7);
73
+ device const half4* xr4 = (device const half4*)(x + (ulong)n * C);
74
+ device const half4* cb4 = (device const half4*)cb;
75
+ const uint nsub = C >> 2;
76
+ float acc = 0.0f;
77
+ for (uint k = lane; k < nsub; k += 32u) {
78
+ uint idx;
79
+ if (nbits == 8u) {
80
+ idx = (crow[k >> 2] >> ((k & 3u) * 8u)) & 255u;
81
+ } else {
82
+ uint pos = k * 12u; uint w = pos >> 5; uint off = pos & 31u;
83
+ uint v = crow[w] >> off;
84
+ if (off > 20u) { v |= crow[w + 1u] << (32u - off); }
85
+ idx = v & 4095u;
86
+ }
87
+ half4 cv = cb4[idx];
88
+ half4 xv = xr4[k];
89
+ float s = (float)srow[k >> 5];
90
+ acc += s * ((float)cv.x * (float)xv.x + (float)cv.y * (float)xv.y
91
+ + (float)cv.z * (float)xv.z + (float)cv.w * (float)xv.w);
92
+ }
93
+ acc = simd_sum(acc);
94
+ if (lane == 0u) { y[(ulong)n * R + r] = (half)acc; }
95
+ """
96
+
97
+ _KERNEL2 = mx.fast.metal_kernel(
98
+ name="vq_gemv_d4_sg",
99
+ input_names=["x", "codes", "scales", "cb", "eidx", "params"],
100
+ output_names=["y"],
101
+ source=_SRC2,
102
+ )
103
+
104
+
105
+ def vq_gemv2(x_f16, codes_u32, scales_f16, cb_f16, eidx_i32, nbits):
106
+ """simdgroup-per-row variant. Same contract as vq_gemv."""
107
+ N, C = x_f16.shape
108
+ E, R, PC = codes_u32.shape
109
+ NG = scales_f16.shape[-1]
110
+ params = mx.array([C, R, 4, nbits, PC, NG], dtype=mx.int32)
111
+ (y,) = _KERNEL2(
112
+ inputs=[x_f16, codes_u32, scales_f16, cb_f16, eidx_i32, params],
113
+ output_shapes=[(N, R)],
114
+ output_dtypes=[mx.float16],
115
+ grid=(R * 32, N, 1),
116
+ threadgroup=(256, 1, 1),
117
+ )
118
+ return y
119
+
120
+
121
+ # ---- v3: fused gate+up GEMV + SiLU (one dispatch per layer instead of two + eltwise) ----
122
+ _SRC3 = """
123
+ uint tid = thread_position_in_grid.x;
124
+ uint r = tid / 32u;
125
+ uint lane = tid % 32u;
126
+ uint n = thread_position_in_grid.y;
127
+ const uint C = (uint)params[0];
128
+ const uint R = (uint)params[1];
129
+ const uint nbits = (uint)params[3];
130
+ const uint PC = (uint)params[4];
131
+ if (r >= R) return;
132
+ uint e = (uint)eidx[n];
133
+ ulong row = (ulong)e * R + r;
134
+ device const uint* cg = codes_g + row * PC;
135
+ device const uint* cu = codes_u + row * PC;
136
+ device const half* sg = scales_g + row * (C >> 7);
137
+ device const half* su = scales_u + row * (C >> 7);
138
+ device const half4* xr4 = (device const half4*)(x + (ulong)n * C);
139
+ device const half4* cb4 = (device const half4*)cb;
140
+ const uint nsub = C >> 2;
141
+ float ag = 0.0f, au = 0.0f;
142
+ for (uint k = lane; k < nsub; k += 32u) {
143
+ uint ig, iu;
144
+ if (nbits == 8u) {
145
+ ig = (cg[k >> 2] >> ((k & 3u) * 8u)) & 255u;
146
+ iu = (cu[k >> 2] >> ((k & 3u) * 8u)) & 255u;
147
+ } else {
148
+ uint pos = k * 12u; uint w = pos >> 5; uint off = pos & 31u;
149
+ uint vg = cg[w] >> off; uint vu = cu[w] >> off;
150
+ if (off > 20u) { vg |= cg[w + 1u] << (32u - off); vu |= cu[w + 1u] << (32u - off); }
151
+ ig = vg & 4095u; iu = vu & 4095u;
152
+ }
153
+ half4 xv = xr4[k];
154
+ half4 g4 = cb4[ig];
155
+ half4 u4 = cb4[iu];
156
+ float dx = (float)g4.x * (float)xv.x + (float)g4.y * (float)xv.y
157
+ + (float)g4.z * (float)xv.z + (float)g4.w * (float)xv.w;
158
+ float du = (float)u4.x * (float)xv.x + (float)u4.y * (float)xv.y
159
+ + (float)u4.z * (float)xv.z + (float)u4.w * (float)xv.w;
160
+ ag += (float)sg[k >> 5] * dx;
161
+ au += (float)su[k >> 5] * du;
162
+ }
163
+ ag = simd_sum(ag);
164
+ au = simd_sum(au);
165
+ if (lane == 0u) {
166
+ float act = ag / (1.0f + metal::exp(-ag)); // silu(gate)
167
+ y[(ulong)n * R + r] = (half)(act * au);
168
+ }
169
+ """
170
+
171
+ _KERNEL3 = mx.fast.metal_kernel(
172
+ name="vq_swiglu_d4",
173
+ input_names=["x", "codes_g", "scales_g", "codes_u", "scales_u", "cb", "eidx", "params"],
174
+ output_names=["y"],
175
+ source=_SRC3,
176
+ )
177
+
178
+
179
+ def vq_swiglu(x_f16, cg_u32, sg_f16, cu_u32, su_f16, cb_f16, eidx_i32, nbits):
180
+ """Fused silu(gate(x)) * up(x) over VQ experts -> intermediate [N, R] f16."""
181
+ N, C = x_f16.shape
182
+ E, R, PC = cg_u32.shape
183
+ params = mx.array([C, R, 4, nbits, PC, C // 128], dtype=mx.int32)
184
+ (y,) = _KERNEL3(
185
+ inputs=[x_f16, cg_u32, sg_f16, cu_u32, su_f16, cb_f16, eidx_i32, params],
186
+ output_shapes=[(N, R)],
187
+ output_dtypes=[mx.float16],
188
+ grid=(R * 32, N, 1),
189
+ threadgroup=(256, 1, 1),
190
+ )
191
+ return y
192
+
193
+
194
+ def vq_gemv(x_f16, codes_u32, scales_f16, cb_f16, eidx_i32, nbits):
195
+ """x [N,C] f16, codes [E,R,PC] uint32, scales [E,R,NG] f16, cb [K,4] f16, eidx [N] int32 -> y [N,R] f16."""
196
+ N, C = x_f16.shape
197
+ E, R, PC = codes_u32.shape
198
+ NG = scales_f16.shape[-1]
199
+ params = mx.array([C, R, 4, nbits, PC, NG], dtype=mx.int32)
200
+ (y,) = _KERNEL(
201
+ inputs=[x_f16, codes_u32, scales_f16, cb_f16, eidx_i32, params],
202
+ output_shapes=[(N, R)],
203
+ output_dtypes=[mx.float16],
204
+ grid=(R, N, 1),
205
+ threadgroup=(min(R, 256), 1, 1),
206
+ )
207
+ return y
code/vq_serve.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ """OpenAI-compatible server for the VQ (map12) model — mlx_lm.server with the VQ loader.
3
+
4
+ Usage: python vq_serve.py --model ~/models/Qwen3.6-35B-A3B-MLX-VQ-map12 --port 8090
5
+ Then: curl http://127.0.0.1:8090/v1/chat/completions -d '{"model":"vq","messages":[...]}'
6
+
7
+ Any model dir whose config.json has a "vq" section loads through vq_switch.load_vq_model
8
+ (VQSwitchLinear experts + Metal kernel); everything else falls back to stock mlx_lm.
9
+ """
10
+ import json
11
+ import os
12
+ import sys
13
+ from pathlib import Path
14
+
15
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
16
+ os.environ.setdefault("VQ_KERNEL", "2")
17
+ os.environ.setdefault("VQ_FUSED", "1")
18
+
19
+ import mlx_lm.server as S
20
+ from mlx_lm.utils import load_tokenizer
21
+ from vq_switch import load_vq_model
22
+
23
+ _stock_load = S.load
24
+
25
+
26
+ def _vq_load(model_path, *args, **kw):
27
+ p = str(model_path)
28
+ cfg_path = os.path.join(p, "config.json")
29
+ if os.path.isdir(p) and os.path.exists(cfg_path):
30
+ with open(cfg_path) as f:
31
+ if "vq" in json.load(f):
32
+ model, _config = load_vq_model(p)
33
+ tok = load_tokenizer(Path(p), kw.get("tokenizer_config") or {})
34
+ return model, tok
35
+ return _stock_load(model_path, *args, **kw)
36
+
37
+
38
+ S.load = _vq_load
39
+
40
+ if __name__ == "__main__":
41
+ S.main()
code/vq_switch.py ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """VQSwitchLinear — pure-MLX VQ (codebook) switch linear for Qwen3.6 map12 (v3, level 0).
2
+
3
+ Drop-in replacement for mlx_lm's QuantizedSwitchLinear on the switch_mlp projections.
4
+ Weights per module (loaded via model.load_weights):
5
+ vq_codes int32 [E, R, PC] LSB-first packed nbits-bit codebook indices
6
+ vq_scales float16[E, R, C/128] per-128-group std scales
7
+ Shared codebook cb [K, d] float16 is set post-load via set_codebook().
8
+
9
+ Call contract mirrors QuantizedSwitchLinear.__call__(x, indices, sorted_indices):
10
+ x [..., 1, C] broadcast against indices [..., k] -> y [..., k, R] (matching gather_qmm).
11
+ Level 0 = decode active experts on the fly (correctness first; Metal kernel later).
12
+
13
+ Also provides load_vq_model(path): builds the mlx_lm qwen3_5_moe model, quantizes the
14
+ spine per config, swaps switch_mlp projections for VQSwitchLinear, strict-loads the
15
+ artifact, installs codebooks. Needs mlx_lm >= 0.31 (qwen3_5_moe).
16
+ """
17
+ import glob
18
+ import json
19
+ import math
20
+ import os
21
+
22
+ import mlx.core as mx
23
+ import mlx.nn as nn
24
+
25
+
26
+ def _unpack_plan(nbits, nsub):
27
+ """Per-subvector (word, off, need_hi) for LSB-first nbits packing into 32-bit words."""
28
+ words, offs, hi = [], [], []
29
+ for k in range(nsub):
30
+ pos = k * nbits
31
+ words.append(pos // 32)
32
+ offs.append(pos % 32)
33
+ hi.append(1 if (pos % 32) + nbits > 32 else 0)
34
+ return words, offs, hi
35
+
36
+
37
+ class VQSwitchLinear(nn.Module):
38
+ def __init__(self, num_experts, output_dims, input_dims, nbits, d, norm_group=128):
39
+ super().__init__()
40
+ nsub = input_dims // d
41
+ pc = (nsub * nbits + 31) // 32
42
+ self.vq_codes = mx.zeros((num_experts, output_dims, pc), dtype=mx.int32)
43
+ self.vq_scales = mx.zeros((num_experts, output_dims, input_dims // norm_group),
44
+ dtype=mx.float16)
45
+ self._nbits, self._d, self._C, self._ng = nbits, d, input_dims, norm_group
46
+ w, o, h = _unpack_plan(nbits, nsub)
47
+ self._uw = mx.array(w, dtype=mx.int32) # [nsub] word index
48
+ self._uo = mx.array(o, dtype=mx.uint32) # [nsub] bit offset
49
+ self._uh = mx.array(h, dtype=mx.uint32) # [nsub] straddles word boundary
50
+ self._cb = None
51
+ self.freeze()
52
+
53
+ def set_codebook(self, cb):
54
+ self._cb = cb.astype(mx.float16) # [K, d]
55
+ self._codes_u32 = mx.view(self.vq_codes, mx.uint32)
56
+ self._sc16 = self.vq_scales.astype(mx.float16)
57
+ kv = os.environ.get("VQ_KERNEL", "2")
58
+ if kv in ("1", "2") and self._d == 4:
59
+ import vq_kernel
60
+ self._gemv = vq_kernel.vq_gemv2 if kv == "2" else vq_kernel.vq_gemv
61
+ else:
62
+ self._gemv = None
63
+
64
+ @property
65
+ def input_dims(self):
66
+ return self._C
67
+
68
+ @property
69
+ def output_dims(self):
70
+ return self.vq_codes.shape[1]
71
+
72
+ @property
73
+ def num_experts(self):
74
+ return self.vq_codes.shape[0]
75
+
76
+ def _unpack(self, packed):
77
+ """packed [..., PC] int32 -> codes [..., nsub] int32 (logical shifts via uint32 view)."""
78
+ u = mx.view(packed, mx.uint32)
79
+ lo = mx.take(u, self._uw, axis=-1) # [..., nsub]
80
+ lo = mx.right_shift(lo, self._uo)
81
+ pc = u.shape[-1]
82
+ wnext = mx.minimum(self._uw + 1, pc - 1)
83
+ hi = mx.take(u, wnext, axis=-1)
84
+ hi = mx.left_shift(hi, 32 - self._uo) * self._uh
85
+ codes = mx.bitwise_or(lo, hi) & ((1 << self._nbits) - 1)
86
+ return codes.astype(mx.int32)
87
+
88
+ def _decode(self, eidx):
89
+ """eidx [N] int -> dequantized weights [N, R, C] float16."""
90
+ codes = self._unpack(mx.take(self.vq_codes, eidx, axis=0)) # [N, R, nsub]
91
+ sub = mx.take(self._cb, codes.reshape(-1), axis=0) # [N*R*nsub, d]
92
+ N = eidx.shape[0]
93
+ R, nsub = codes.shape[1], codes.shape[2]
94
+ sub = sub.reshape(N, R, nsub, self._d)
95
+ sc = mx.take(self.vq_scales, eidx, axis=0) # [N, R, C/ng]
96
+ sc = mx.repeat(sc, self._ng // self._d, axis=-1) # [N, R, nsub]
97
+ return (sub * sc[..., None]).reshape(N, R, self._C)
98
+
99
+ def __call__(self, x, indices, sorted_indices=False):
100
+ # x [..., 1, C]; indices [...]; returns [..., 1, R] per index position
101
+ if getattr(self, "_gemv", None) is not None:
102
+ flat = indices.reshape(-1).astype(mx.int32)
103
+ xk = mx.broadcast_to(x, (*indices.shape, 1, self._C)).reshape(-1, self._C)
104
+ y = self._gemv(xk.astype(mx.float16), self._codes_u32, self._sc16,
105
+ self._cb, flat, self._nbits)
106
+ return y.reshape(*indices.shape, 1, -1).astype(x.dtype)
107
+ flat = indices.reshape(-1)
108
+ W = self._decode(flat) # [N, R, C]
109
+ W = W.reshape(*indices.shape, *W.shape[1:]) # [..., R, C]
110
+ y = mx.matmul(x.astype(W.dtype), mx.swapaxes(W, -1, -2)) # [..., 1|k, R]-broadcast
111
+ return y
112
+
113
+
114
+ class VQSwitchGLU(nn.Module):
115
+ """Fused replacement for mlx_lm SwitchGLU on VQ layers: one Metal dispatch for
116
+ silu(gate)*up + one for down. Children keep SwitchGLU's names so load_weights
117
+ resolves ...switch_mlp.{gate,up,down}_proj.vq_codes unchanged."""
118
+
119
+ def __init__(self, gate_proj, up_proj, down_proj):
120
+ super().__init__()
121
+ self.gate_proj = gate_proj
122
+ self.up_proj = up_proj
123
+ self.down_proj = down_proj
124
+
125
+ def __call__(self, x, indices):
126
+ from mlx_lm.models.switch_layers import _gather_sort, _scatter_unsort
127
+ from vq_kernel import vq_swiglu
128
+ g, u, dn = self.gate_proj, self.up_proj, self.down_proj
129
+ if getattr(dn, "_gemv", None) is None or getattr(g, "_cb", None) is None:
130
+ # fallback: reference SwitchGLU flow through the modules (level-0)
131
+ x = mx.expand_dims(x, (-2, -3))
132
+ do_sort = indices.size >= 64
133
+ idx, inv_order = indices, None
134
+ if do_sort:
135
+ x, idx, inv_order = _gather_sort(x, indices)
136
+ xu = u(x, idx, sorted_indices=do_sort)
137
+ xg = g(x, idx, sorted_indices=do_sort)
138
+ y = dn(mx.sigmoid(xg) * xg * xu, idx, sorted_indices=do_sort)
139
+ if do_sort:
140
+ y = _scatter_unsort(y, inv_order, indices.shape)
141
+ return y.squeeze(-2)
142
+ dtype = x.dtype
143
+ x = mx.expand_dims(x, (-2, -3))
144
+ do_sort = indices.size >= 64
145
+ idx, inv_order = indices, None
146
+ if do_sort:
147
+ x, idx, inv_order = _gather_sort(x, indices)
148
+ flat = idx.reshape(-1).astype(mx.int32)
149
+ xk = mx.broadcast_to(x, (*idx.shape, 1, g._C)).reshape(-1, g._C).astype(mx.float16)
150
+ inter = vq_swiglu(xk, g._codes_u32, g._sc16, u._codes_u32, u._sc16,
151
+ g._cb, flat, g._nbits) # [N, R]
152
+ y = dn._gemv(inter, dn._codes_u32, dn._sc16, dn._cb, flat, dn._nbits) # [N, C]
153
+ y = y.reshape(*idx.shape, 1, -1).astype(dtype)
154
+ if do_sort:
155
+ y = _scatter_unsort(y, inv_order, indices.shape)
156
+ return y.squeeze(-2)
157
+
158
+
159
+ def load_vq_model(path):
160
+ """Build qwen3_5_moe, quantize spine per config, swap switch_mlp -> VQ, load weights."""
161
+ import importlib
162
+
163
+ with open(os.path.join(path, "config.json")) as f:
164
+ config = json.load(f)
165
+ arch = importlib.import_module(f"mlx_lm.models.{config['model_type']}")
166
+ model = arch.Model(arch.ModelArgs.from_dict(config))
167
+
168
+ vq_meta = config["vq"]["modules"]
169
+ quant = config.get("quantization", {})
170
+
171
+ # 1) spine quantization exactly like mlx_lm.load_model
172
+ def class_predicate(p, m):
173
+ if p in vq_meta:
174
+ return False # VQ modules: skip nn.quantize
175
+ if p in quant:
176
+ return quant[p]
177
+ if not hasattr(m, "to_quantized"):
178
+ return False
179
+ return True
180
+
181
+ nn.quantize(model, group_size=quant.get("group_size", 64), bits=quant.get("bits", 4),
182
+ mode=quant.get("mode", "affine"), class_predicate=class_predicate)
183
+
184
+ # 2) swap switch_mlp projections, then the whole switch_mlp for the fused GLU
185
+ glu_parents = {}
186
+ for mpath, meta in vq_meta.items():
187
+ parts = mpath.split(".")
188
+ parent = model
189
+ for q in parts[:-1]:
190
+ parent = parent[int(q)] if q.isdigit() else getattr(parent, q)
191
+ old = getattr(parent, parts[-1])
192
+ vql = VQSwitchLinear(num_experts=256, output_dims=old.output_dims if hasattr(old, "output_dims") else old.weight.shape[1],
193
+ input_dims=meta["in_dims"], nbits=meta["nbits"], d=meta["d"],
194
+ norm_group=meta["norm_group"])
195
+ setattr(parent, parts[-1], vql)
196
+ glu_parents[".".join(parts[:-1])] = parent
197
+ if os.environ.get("VQ_FUSED", "1") == "1":
198
+ for gpath, sw in glu_parents.items():
199
+ parts = gpath.split(".")
200
+ gp = model
201
+ for q in parts[:-1]:
202
+ gp = gp[int(q)] if q.isdigit() else getattr(gp, q)
203
+ setattr(gp, parts[-1], VQSwitchGLU(sw.gate_proj, sw.up_proj, sw.down_proj))
204
+
205
+ # 3) strict load
206
+ shards = sorted(glob.glob(os.path.join(path, "model-*.safetensors")))
207
+ weights = {}
208
+ for s in shards:
209
+ weights.update(mx.load(s))
210
+ if hasattr(model, "sanitize"):
211
+ weights = model.sanitize(weights)
212
+ model.load_weights(list(weights.items()), strict=True)
213
+
214
+ # 4) codebooks
215
+ cbs = mx.load(os.path.join(path, config["vq"]["codebooks_file"]))
216
+ for mpath, meta in vq_meta.items():
217
+ parts = mpath.split(".")
218
+ parent = model
219
+ for q in parts[:-1]:
220
+ parent = parent[int(q)] if q.isdigit() else getattr(parent, q)
221
+ getattr(parent, parts[-1]).set_codebook(cbs[f"cb{meta['vq_bits']}"])
222
+
223
+ mx.eval(model.parameters())
224
+ model.eval()
225
+ return model, config
code/vq_test.py ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Mac-side VQ shim test (module level): golden check + micro-benchmark.
2
+
3
+ Run on the Mac: python vq_test.py <artifact_dir> <golden.npz>
4
+ 1. Metal smoke: trivial mx.fast.metal_kernel JIT + run (proves SSH+Metal+no-keychain).
5
+ 2. Golden: build VQSwitchLinear for the two reference modules straight from artifact
6
+ tensors, decode, y = x @ W_e.T, compare vs CUDA golden (fp16 tolerance).
7
+ 3. Micro-bench: decode+matmul timing for a [1 tok, 8 experts] call (level-0 speed).
8
+ """
9
+ import json
10
+ import os
11
+ import sys
12
+ import time
13
+
14
+ import mlx.core as mx
15
+ import numpy as np
16
+
17
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
18
+ from vq_switch import VQSwitchLinear
19
+
20
+ ART = sys.argv[1] if len(sys.argv) > 1 else os.path.expanduser("~/models/Qwen3.6-35B-A3B-MLX-VQ-map12")
21
+ GOLD = sys.argv[2] if len(sys.argv) > 2 else os.path.expanduser("~/models/vq_golden.npz")
22
+
23
+ print(f"mlx {mx.__version__} device={mx.default_device()}")
24
+
25
+ # ---- 1. Metal custom-kernel smoke ----
26
+ src = """
27
+ uint i = thread_position_in_grid.x;
28
+ if (i < inp_shape[0]) { out[i] = inp[i] * 2.0f + 1.0f; }
29
+ """
30
+ try:
31
+ k = mx.fast.metal_kernel(name="smoke", input_names=["inp"], output_names=["out"], source=src)
32
+ a = mx.arange(8, dtype=mx.float32)
33
+ (o,) = k(inputs=[a], output_shapes=[a.shape], output_dtypes=[mx.float32],
34
+ grid=(8, 1, 1), threadgroup=(8, 1, 1))
35
+ mx.eval(o)
36
+ ok = bool(mx.all(o == a * 2 + 1))
37
+ print(f"[1] metal_kernel JIT smoke: {'PASS' if ok else 'FAIL'} ({o.tolist()[:4]}...)")
38
+ except Exception as e:
39
+ print(f"[1] metal_kernel smoke FAILED: {e!r}")
40
+
41
+ # ---- 2. golden check ----
42
+ cfg = json.load(open(os.path.join(ART, "config.json")))
43
+ meta = cfg["vq"]["modules"]
44
+ idx = json.load(open(os.path.join(ART, "model.safetensors.index.json")))["weight_map"]
45
+ cbs = mx.load(os.path.join(ART, cfg["vq"]["codebooks_file"]))
46
+ g = np.load(GOLD)
47
+ mods = sorted(set(k.rsplit("__", 1)[0].replace("__", ".") for k in g.files))
48
+ worst = 0.0
49
+ for m in mods:
50
+ info = meta[m]
51
+ key = m.replace(".", "__")
52
+ x = mx.array(g[key + "__x"]) # [4, C]
53
+ y_ref = g[key + "__y"] # [4exp, 4tok, R]
54
+ experts = [int(e) for e in g[key + "__experts"]]
55
+ shard = mx.load(os.path.join(ART, idx[m + ".vq_codes"]))
56
+ codes = shard[m + ".vq_codes"]
57
+ scales = mx.load(os.path.join(ART, idx[m + ".vq_scales"]))[m + ".vq_scales"]
58
+ R = codes.shape[1]
59
+ vq = VQSwitchLinear(num_experts=codes.shape[0], output_dims=R,
60
+ input_dims=info["in_dims"], nbits=info["nbits"], d=info["d"],
61
+ norm_group=info["norm_group"])
62
+ vq.vq_codes = codes
63
+ vq.vq_scales = scales
64
+ vq.set_codebook(cbs[f"cb{info['vq_bits']}"])
65
+ W = vq._decode(mx.array(experts)) # [4exp, R, C]
66
+ y = mx.matmul(x[None].astype(W.dtype), mx.swapaxes(W, -1, -2)) # [4exp, 4tok, R]
67
+ mx.eval(y)
68
+ err = float(mx.abs(y - mx.array(y_ref)).max())
69
+ rel = err / (abs(y_ref).max() + 1e-9)
70
+ worst = max(worst, rel)
71
+ print(f"[2] {m.split('layers.')[1]}: max|dy|={err:.4e} rel={rel:.2e} {'PASS' if rel < 2e-2 else 'FAIL'}")
72
+ print(f"[2] golden worst rel = {worst:.2e} -> {'PASS' if worst < 2e-2 else 'FAIL'}")
73
+
74
+ # ---- 3. kernel vs level-0: correctness then speed ----
75
+ os.environ["VQ_KERNEL"] = "1"
76
+ x1 = mx.random.normal((1, 1, 1, vq._C)).astype(mx.float16)
77
+ idx8 = mx.array([[0, 5, 17, 42, 99, 123, 200, 255]])
78
+ vq.set_codebook(vq._cb) # rebind with kernel enabled
79
+ yk = vq(x1, idx8); mx.eval(yk)
80
+ vq._gemv = None # force level-0
81
+ y0 = vq(x1, idx8).astype(mx.float16); mx.eval(y0)
82
+ kerr = float(mx.abs(yk.astype(mx.float32) - y0.astype(mx.float32)).max())
83
+ kref = float(mx.abs(y0).max())
84
+ print(f"[3] kernel-vs-level0: max|dy|={kerr:.4e} rel={kerr/(kref+1e-9):.2e} "
85
+ f"{'PASS' if kerr/(kref+1e-9) < 2e-2 else 'FAIL'}")
86
+
87
+ def bench(fn, n=50):
88
+ for _ in range(5): mx.eval(fn())
89
+ t = time.time()
90
+ for _ in range(n): mx.eval(fn())
91
+ return (time.time() - t) / n * 1000
92
+
93
+ vq.set_codebook(vq._cb) # kernel on
94
+ tk = bench(lambda: vq(x1, idx8))
95
+ vq._gemv = None
96
+ t0b = bench(lambda: vq(x1, idx8), n=20)
97
+ print(f"[4] 1tok x 8exp: kernel {tk:.3f} ms vs level-0 {t0b:.2f} ms (x{t0b/max(tk,1e-6):.1f} speedup)"
98
+ f" -> layer-stack est ≈ {tk*120:.1f} ms/token ≈ {1000/max(tk*120,1e-6):.1f} tok/s bound")
99
+ print("VQ_TEST_DONE")
config.json ADDED
@@ -0,0 +1,1748 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Qwen3_5MoeForConditionalGeneration"
4
+ ],
5
+ "eos_token_id": [
6
+ 248046,
7
+ 248044
8
+ ],
9
+ "image_token_id": 248056,
10
+ "model_type": "qwen3_5_moe",
11
+ "quantization": {
12
+ "group_size": 64,
13
+ "bits": 4,
14
+ "mode": "affine",
15
+ "language_model.model.layers.0.mlp.gate": {
16
+ "group_size": 64,
17
+ "bits": 8
18
+ },
19
+ "language_model.model.layers.0.mlp.shared_expert_gate": {
20
+ "group_size": 64,
21
+ "bits": 8
22
+ },
23
+ "language_model.model.layers.1.mlp.gate": {
24
+ "group_size": 64,
25
+ "bits": 8
26
+ },
27
+ "language_model.model.layers.1.mlp.shared_expert_gate": {
28
+ "group_size": 64,
29
+ "bits": 8
30
+ },
31
+ "language_model.model.layers.2.mlp.gate": {
32
+ "group_size": 64,
33
+ "bits": 8
34
+ },
35
+ "language_model.model.layers.2.mlp.shared_expert_gate": {
36
+ "group_size": 64,
37
+ "bits": 8
38
+ },
39
+ "language_model.model.layers.3.mlp.gate": {
40
+ "group_size": 64,
41
+ "bits": 8
42
+ },
43
+ "language_model.model.layers.3.mlp.shared_expert_gate": {
44
+ "group_size": 64,
45
+ "bits": 8
46
+ },
47
+ "language_model.model.layers.4.mlp.gate": {
48
+ "group_size": 64,
49
+ "bits": 8
50
+ },
51
+ "language_model.model.layers.4.mlp.shared_expert_gate": {
52
+ "group_size": 64,
53
+ "bits": 8
54
+ },
55
+ "language_model.model.layers.5.mlp.gate": {
56
+ "group_size": 64,
57
+ "bits": 8
58
+ },
59
+ "language_model.model.layers.5.mlp.shared_expert_gate": {
60
+ "group_size": 64,
61
+ "bits": 8
62
+ },
63
+ "language_model.model.layers.6.mlp.gate": {
64
+ "group_size": 64,
65
+ "bits": 8
66
+ },
67
+ "language_model.model.layers.6.mlp.shared_expert_gate": {
68
+ "group_size": 64,
69
+ "bits": 8
70
+ },
71
+ "language_model.model.layers.7.mlp.gate": {
72
+ "group_size": 64,
73
+ "bits": 8
74
+ },
75
+ "language_model.model.layers.7.mlp.shared_expert_gate": {
76
+ "group_size": 64,
77
+ "bits": 8
78
+ },
79
+ "language_model.model.layers.8.mlp.gate": {
80
+ "group_size": 64,
81
+ "bits": 8
82
+ },
83
+ "language_model.model.layers.8.mlp.shared_expert_gate": {
84
+ "group_size": 64,
85
+ "bits": 8
86
+ },
87
+ "language_model.model.layers.9.mlp.gate": {
88
+ "group_size": 64,
89
+ "bits": 8
90
+ },
91
+ "language_model.model.layers.9.mlp.shared_expert_gate": {
92
+ "group_size": 64,
93
+ "bits": 8
94
+ },
95
+ "language_model.model.layers.10.mlp.gate": {
96
+ "group_size": 64,
97
+ "bits": 8
98
+ },
99
+ "language_model.model.layers.10.mlp.shared_expert_gate": {
100
+ "group_size": 64,
101
+ "bits": 8
102
+ },
103
+ "language_model.model.layers.11.mlp.gate": {
104
+ "group_size": 64,
105
+ "bits": 8
106
+ },
107
+ "language_model.model.layers.11.mlp.shared_expert_gate": {
108
+ "group_size": 64,
109
+ "bits": 8
110
+ },
111
+ "language_model.model.layers.12.mlp.gate": {
112
+ "group_size": 64,
113
+ "bits": 8
114
+ },
115
+ "language_model.model.layers.12.mlp.shared_expert_gate": {
116
+ "group_size": 64,
117
+ "bits": 8
118
+ },
119
+ "language_model.model.layers.13.mlp.gate": {
120
+ "group_size": 64,
121
+ "bits": 8
122
+ },
123
+ "language_model.model.layers.13.mlp.shared_expert_gate": {
124
+ "group_size": 64,
125
+ "bits": 8
126
+ },
127
+ "language_model.model.layers.14.mlp.gate": {
128
+ "group_size": 64,
129
+ "bits": 8
130
+ },
131
+ "language_model.model.layers.14.mlp.shared_expert_gate": {
132
+ "group_size": 64,
133
+ "bits": 8
134
+ },
135
+ "language_model.model.layers.15.mlp.gate": {
136
+ "group_size": 64,
137
+ "bits": 8
138
+ },
139
+ "language_model.model.layers.15.mlp.shared_expert_gate": {
140
+ "group_size": 64,
141
+ "bits": 8
142
+ },
143
+ "language_model.model.layers.16.mlp.gate": {
144
+ "group_size": 64,
145
+ "bits": 8
146
+ },
147
+ "language_model.model.layers.16.mlp.shared_expert_gate": {
148
+ "group_size": 64,
149
+ "bits": 8
150
+ },
151
+ "language_model.model.layers.17.mlp.gate": {
152
+ "group_size": 64,
153
+ "bits": 8
154
+ },
155
+ "language_model.model.layers.17.mlp.shared_expert_gate": {
156
+ "group_size": 64,
157
+ "bits": 8
158
+ },
159
+ "language_model.model.layers.18.mlp.gate": {
160
+ "group_size": 64,
161
+ "bits": 8
162
+ },
163
+ "language_model.model.layers.18.mlp.shared_expert_gate": {
164
+ "group_size": 64,
165
+ "bits": 8
166
+ },
167
+ "language_model.model.layers.19.mlp.gate": {
168
+ "group_size": 64,
169
+ "bits": 8
170
+ },
171
+ "language_model.model.layers.19.mlp.shared_expert_gate": {
172
+ "group_size": 64,
173
+ "bits": 8
174
+ },
175
+ "language_model.model.layers.20.mlp.gate": {
176
+ "group_size": 64,
177
+ "bits": 8
178
+ },
179
+ "language_model.model.layers.20.mlp.shared_expert_gate": {
180
+ "group_size": 64,
181
+ "bits": 8
182
+ },
183
+ "language_model.model.layers.21.mlp.gate": {
184
+ "group_size": 64,
185
+ "bits": 8
186
+ },
187
+ "language_model.model.layers.21.mlp.shared_expert_gate": {
188
+ "group_size": 64,
189
+ "bits": 8
190
+ },
191
+ "language_model.model.layers.22.mlp.gate": {
192
+ "group_size": 64,
193
+ "bits": 8
194
+ },
195
+ "language_model.model.layers.22.mlp.shared_expert_gate": {
196
+ "group_size": 64,
197
+ "bits": 8
198
+ },
199
+ "language_model.model.layers.23.mlp.gate": {
200
+ "group_size": 64,
201
+ "bits": 8
202
+ },
203
+ "language_model.model.layers.23.mlp.shared_expert_gate": {
204
+ "group_size": 64,
205
+ "bits": 8
206
+ },
207
+ "language_model.model.layers.24.mlp.gate": {
208
+ "group_size": 64,
209
+ "bits": 8
210
+ },
211
+ "language_model.model.layers.24.mlp.shared_expert_gate": {
212
+ "group_size": 64,
213
+ "bits": 8
214
+ },
215
+ "language_model.model.layers.25.mlp.gate": {
216
+ "group_size": 64,
217
+ "bits": 8
218
+ },
219
+ "language_model.model.layers.25.mlp.shared_expert_gate": {
220
+ "group_size": 64,
221
+ "bits": 8
222
+ },
223
+ "language_model.model.layers.26.mlp.gate": {
224
+ "group_size": 64,
225
+ "bits": 8
226
+ },
227
+ "language_model.model.layers.26.mlp.shared_expert_gate": {
228
+ "group_size": 64,
229
+ "bits": 8
230
+ },
231
+ "language_model.model.layers.27.mlp.gate": {
232
+ "group_size": 64,
233
+ "bits": 8
234
+ },
235
+ "language_model.model.layers.27.mlp.shared_expert_gate": {
236
+ "group_size": 64,
237
+ "bits": 8
238
+ },
239
+ "language_model.model.layers.28.mlp.gate": {
240
+ "group_size": 64,
241
+ "bits": 8
242
+ },
243
+ "language_model.model.layers.28.mlp.shared_expert_gate": {
244
+ "group_size": 64,
245
+ "bits": 8
246
+ },
247
+ "language_model.model.layers.29.mlp.gate": {
248
+ "group_size": 64,
249
+ "bits": 8
250
+ },
251
+ "language_model.model.layers.29.mlp.shared_expert_gate": {
252
+ "group_size": 64,
253
+ "bits": 8
254
+ },
255
+ "language_model.model.layers.30.mlp.gate": {
256
+ "group_size": 64,
257
+ "bits": 8
258
+ },
259
+ "language_model.model.layers.30.mlp.shared_expert_gate": {
260
+ "group_size": 64,
261
+ "bits": 8
262
+ },
263
+ "language_model.model.layers.31.mlp.gate": {
264
+ "group_size": 64,
265
+ "bits": 8
266
+ },
267
+ "language_model.model.layers.31.mlp.shared_expert_gate": {
268
+ "group_size": 64,
269
+ "bits": 8
270
+ },
271
+ "language_model.model.layers.32.mlp.gate": {
272
+ "group_size": 64,
273
+ "bits": 8
274
+ },
275
+ "language_model.model.layers.32.mlp.shared_expert_gate": {
276
+ "group_size": 64,
277
+ "bits": 8
278
+ },
279
+ "language_model.model.layers.33.mlp.gate": {
280
+ "group_size": 64,
281
+ "bits": 8
282
+ },
283
+ "language_model.model.layers.33.mlp.shared_expert_gate": {
284
+ "group_size": 64,
285
+ "bits": 8
286
+ },
287
+ "language_model.model.layers.34.mlp.gate": {
288
+ "group_size": 64,
289
+ "bits": 8
290
+ },
291
+ "language_model.model.layers.34.mlp.shared_expert_gate": {
292
+ "group_size": 64,
293
+ "bits": 8
294
+ },
295
+ "language_model.model.layers.35.mlp.gate": {
296
+ "group_size": 64,
297
+ "bits": 8
298
+ },
299
+ "language_model.model.layers.35.mlp.shared_expert_gate": {
300
+ "group_size": 64,
301
+ "bits": 8
302
+ },
303
+ "language_model.model.layers.36.mlp.gate": {
304
+ "group_size": 64,
305
+ "bits": 8
306
+ },
307
+ "language_model.model.layers.36.mlp.shared_expert_gate": {
308
+ "group_size": 64,
309
+ "bits": 8
310
+ },
311
+ "language_model.model.layers.37.mlp.gate": {
312
+ "group_size": 64,
313
+ "bits": 8
314
+ },
315
+ "language_model.model.layers.37.mlp.shared_expert_gate": {
316
+ "group_size": 64,
317
+ "bits": 8
318
+ },
319
+ "language_model.model.layers.38.mlp.gate": {
320
+ "group_size": 64,
321
+ "bits": 8
322
+ },
323
+ "language_model.model.layers.38.mlp.shared_expert_gate": {
324
+ "group_size": 64,
325
+ "bits": 8
326
+ },
327
+ "language_model.model.layers.39.mlp.gate": {
328
+ "group_size": 64,
329
+ "bits": 8
330
+ },
331
+ "language_model.model.layers.39.mlp.shared_expert_gate": {
332
+ "group_size": 64,
333
+ "bits": 8
334
+ },
335
+ "language_model.lm_head": {
336
+ "group_size": 64,
337
+ "bits": 6
338
+ }
339
+ },
340
+ "quantization_config": {
341
+ "group_size": 64,
342
+ "bits": 4,
343
+ "mode": "affine",
344
+ "language_model.model.layers.0.mlp.gate": {
345
+ "group_size": 64,
346
+ "bits": 8
347
+ },
348
+ "language_model.model.layers.0.mlp.shared_expert_gate": {
349
+ "group_size": 64,
350
+ "bits": 8
351
+ },
352
+ "language_model.model.layers.1.mlp.gate": {
353
+ "group_size": 64,
354
+ "bits": 8
355
+ },
356
+ "language_model.model.layers.1.mlp.shared_expert_gate": {
357
+ "group_size": 64,
358
+ "bits": 8
359
+ },
360
+ "language_model.model.layers.2.mlp.gate": {
361
+ "group_size": 64,
362
+ "bits": 8
363
+ },
364
+ "language_model.model.layers.2.mlp.shared_expert_gate": {
365
+ "group_size": 64,
366
+ "bits": 8
367
+ },
368
+ "language_model.model.layers.3.mlp.gate": {
369
+ "group_size": 64,
370
+ "bits": 8
371
+ },
372
+ "language_model.model.layers.3.mlp.shared_expert_gate": {
373
+ "group_size": 64,
374
+ "bits": 8
375
+ },
376
+ "language_model.model.layers.4.mlp.gate": {
377
+ "group_size": 64,
378
+ "bits": 8
379
+ },
380
+ "language_model.model.layers.4.mlp.shared_expert_gate": {
381
+ "group_size": 64,
382
+ "bits": 8
383
+ },
384
+ "language_model.model.layers.5.mlp.gate": {
385
+ "group_size": 64,
386
+ "bits": 8
387
+ },
388
+ "language_model.model.layers.5.mlp.shared_expert_gate": {
389
+ "group_size": 64,
390
+ "bits": 8
391
+ },
392
+ "language_model.model.layers.6.mlp.gate": {
393
+ "group_size": 64,
394
+ "bits": 8
395
+ },
396
+ "language_model.model.layers.6.mlp.shared_expert_gate": {
397
+ "group_size": 64,
398
+ "bits": 8
399
+ },
400
+ "language_model.model.layers.7.mlp.gate": {
401
+ "group_size": 64,
402
+ "bits": 8
403
+ },
404
+ "language_model.model.layers.7.mlp.shared_expert_gate": {
405
+ "group_size": 64,
406
+ "bits": 8
407
+ },
408
+ "language_model.model.layers.8.mlp.gate": {
409
+ "group_size": 64,
410
+ "bits": 8
411
+ },
412
+ "language_model.model.layers.8.mlp.shared_expert_gate": {
413
+ "group_size": 64,
414
+ "bits": 8
415
+ },
416
+ "language_model.model.layers.9.mlp.gate": {
417
+ "group_size": 64,
418
+ "bits": 8
419
+ },
420
+ "language_model.model.layers.9.mlp.shared_expert_gate": {
421
+ "group_size": 64,
422
+ "bits": 8
423
+ },
424
+ "language_model.model.layers.10.mlp.gate": {
425
+ "group_size": 64,
426
+ "bits": 8
427
+ },
428
+ "language_model.model.layers.10.mlp.shared_expert_gate": {
429
+ "group_size": 64,
430
+ "bits": 8
431
+ },
432
+ "language_model.model.layers.11.mlp.gate": {
433
+ "group_size": 64,
434
+ "bits": 8
435
+ },
436
+ "language_model.model.layers.11.mlp.shared_expert_gate": {
437
+ "group_size": 64,
438
+ "bits": 8
439
+ },
440
+ "language_model.model.layers.12.mlp.gate": {
441
+ "group_size": 64,
442
+ "bits": 8
443
+ },
444
+ "language_model.model.layers.12.mlp.shared_expert_gate": {
445
+ "group_size": 64,
446
+ "bits": 8
447
+ },
448
+ "language_model.model.layers.13.mlp.gate": {
449
+ "group_size": 64,
450
+ "bits": 8
451
+ },
452
+ "language_model.model.layers.13.mlp.shared_expert_gate": {
453
+ "group_size": 64,
454
+ "bits": 8
455
+ },
456
+ "language_model.model.layers.14.mlp.gate": {
457
+ "group_size": 64,
458
+ "bits": 8
459
+ },
460
+ "language_model.model.layers.14.mlp.shared_expert_gate": {
461
+ "group_size": 64,
462
+ "bits": 8
463
+ },
464
+ "language_model.model.layers.15.mlp.gate": {
465
+ "group_size": 64,
466
+ "bits": 8
467
+ },
468
+ "language_model.model.layers.15.mlp.shared_expert_gate": {
469
+ "group_size": 64,
470
+ "bits": 8
471
+ },
472
+ "language_model.model.layers.16.mlp.gate": {
473
+ "group_size": 64,
474
+ "bits": 8
475
+ },
476
+ "language_model.model.layers.16.mlp.shared_expert_gate": {
477
+ "group_size": 64,
478
+ "bits": 8
479
+ },
480
+ "language_model.model.layers.17.mlp.gate": {
481
+ "group_size": 64,
482
+ "bits": 8
483
+ },
484
+ "language_model.model.layers.17.mlp.shared_expert_gate": {
485
+ "group_size": 64,
486
+ "bits": 8
487
+ },
488
+ "language_model.model.layers.18.mlp.gate": {
489
+ "group_size": 64,
490
+ "bits": 8
491
+ },
492
+ "language_model.model.layers.18.mlp.shared_expert_gate": {
493
+ "group_size": 64,
494
+ "bits": 8
495
+ },
496
+ "language_model.model.layers.19.mlp.gate": {
497
+ "group_size": 64,
498
+ "bits": 8
499
+ },
500
+ "language_model.model.layers.19.mlp.shared_expert_gate": {
501
+ "group_size": 64,
502
+ "bits": 8
503
+ },
504
+ "language_model.model.layers.20.mlp.gate": {
505
+ "group_size": 64,
506
+ "bits": 8
507
+ },
508
+ "language_model.model.layers.20.mlp.shared_expert_gate": {
509
+ "group_size": 64,
510
+ "bits": 8
511
+ },
512
+ "language_model.model.layers.21.mlp.gate": {
513
+ "group_size": 64,
514
+ "bits": 8
515
+ },
516
+ "language_model.model.layers.21.mlp.shared_expert_gate": {
517
+ "group_size": 64,
518
+ "bits": 8
519
+ },
520
+ "language_model.model.layers.22.mlp.gate": {
521
+ "group_size": 64,
522
+ "bits": 8
523
+ },
524
+ "language_model.model.layers.22.mlp.shared_expert_gate": {
525
+ "group_size": 64,
526
+ "bits": 8
527
+ },
528
+ "language_model.model.layers.23.mlp.gate": {
529
+ "group_size": 64,
530
+ "bits": 8
531
+ },
532
+ "language_model.model.layers.23.mlp.shared_expert_gate": {
533
+ "group_size": 64,
534
+ "bits": 8
535
+ },
536
+ "language_model.model.layers.24.mlp.gate": {
537
+ "group_size": 64,
538
+ "bits": 8
539
+ },
540
+ "language_model.model.layers.24.mlp.shared_expert_gate": {
541
+ "group_size": 64,
542
+ "bits": 8
543
+ },
544
+ "language_model.model.layers.25.mlp.gate": {
545
+ "group_size": 64,
546
+ "bits": 8
547
+ },
548
+ "language_model.model.layers.25.mlp.shared_expert_gate": {
549
+ "group_size": 64,
550
+ "bits": 8
551
+ },
552
+ "language_model.model.layers.26.mlp.gate": {
553
+ "group_size": 64,
554
+ "bits": 8
555
+ },
556
+ "language_model.model.layers.26.mlp.shared_expert_gate": {
557
+ "group_size": 64,
558
+ "bits": 8
559
+ },
560
+ "language_model.model.layers.27.mlp.gate": {
561
+ "group_size": 64,
562
+ "bits": 8
563
+ },
564
+ "language_model.model.layers.27.mlp.shared_expert_gate": {
565
+ "group_size": 64,
566
+ "bits": 8
567
+ },
568
+ "language_model.model.layers.28.mlp.gate": {
569
+ "group_size": 64,
570
+ "bits": 8
571
+ },
572
+ "language_model.model.layers.28.mlp.shared_expert_gate": {
573
+ "group_size": 64,
574
+ "bits": 8
575
+ },
576
+ "language_model.model.layers.29.mlp.gate": {
577
+ "group_size": 64,
578
+ "bits": 8
579
+ },
580
+ "language_model.model.layers.29.mlp.shared_expert_gate": {
581
+ "group_size": 64,
582
+ "bits": 8
583
+ },
584
+ "language_model.model.layers.30.mlp.gate": {
585
+ "group_size": 64,
586
+ "bits": 8
587
+ },
588
+ "language_model.model.layers.30.mlp.shared_expert_gate": {
589
+ "group_size": 64,
590
+ "bits": 8
591
+ },
592
+ "language_model.model.layers.31.mlp.gate": {
593
+ "group_size": 64,
594
+ "bits": 8
595
+ },
596
+ "language_model.model.layers.31.mlp.shared_expert_gate": {
597
+ "group_size": 64,
598
+ "bits": 8
599
+ },
600
+ "language_model.model.layers.32.mlp.gate": {
601
+ "group_size": 64,
602
+ "bits": 8
603
+ },
604
+ "language_model.model.layers.32.mlp.shared_expert_gate": {
605
+ "group_size": 64,
606
+ "bits": 8
607
+ },
608
+ "language_model.model.layers.33.mlp.gate": {
609
+ "group_size": 64,
610
+ "bits": 8
611
+ },
612
+ "language_model.model.layers.33.mlp.shared_expert_gate": {
613
+ "group_size": 64,
614
+ "bits": 8
615
+ },
616
+ "language_model.model.layers.34.mlp.gate": {
617
+ "group_size": 64,
618
+ "bits": 8
619
+ },
620
+ "language_model.model.layers.34.mlp.shared_expert_gate": {
621
+ "group_size": 64,
622
+ "bits": 8
623
+ },
624
+ "language_model.model.layers.35.mlp.gate": {
625
+ "group_size": 64,
626
+ "bits": 8
627
+ },
628
+ "language_model.model.layers.35.mlp.shared_expert_gate": {
629
+ "group_size": 64,
630
+ "bits": 8
631
+ },
632
+ "language_model.model.layers.36.mlp.gate": {
633
+ "group_size": 64,
634
+ "bits": 8
635
+ },
636
+ "language_model.model.layers.36.mlp.shared_expert_gate": {
637
+ "group_size": 64,
638
+ "bits": 8
639
+ },
640
+ "language_model.model.layers.37.mlp.gate": {
641
+ "group_size": 64,
642
+ "bits": 8
643
+ },
644
+ "language_model.model.layers.37.mlp.shared_expert_gate": {
645
+ "group_size": 64,
646
+ "bits": 8
647
+ },
648
+ "language_model.model.layers.38.mlp.gate": {
649
+ "group_size": 64,
650
+ "bits": 8
651
+ },
652
+ "language_model.model.layers.38.mlp.shared_expert_gate": {
653
+ "group_size": 64,
654
+ "bits": 8
655
+ },
656
+ "language_model.model.layers.39.mlp.gate": {
657
+ "group_size": 64,
658
+ "bits": 8
659
+ },
660
+ "language_model.model.layers.39.mlp.shared_expert_gate": {
661
+ "group_size": 64,
662
+ "bits": 8
663
+ },
664
+ "language_model.lm_head": {
665
+ "group_size": 64,
666
+ "bits": 6
667
+ }
668
+ },
669
+ "text_config": {
670
+ "attention_bias": false,
671
+ "attention_dropout": 0.0,
672
+ "attn_output_gate": true,
673
+ "bos_token_id": 248044,
674
+ "dtype": "bfloat16",
675
+ "eos_token_id": 248044,
676
+ "full_attention_interval": 4,
677
+ "head_dim": 256,
678
+ "hidden_act": "silu",
679
+ "hidden_size": 2048,
680
+ "initializer_range": 0.02,
681
+ "layer_types": [
682
+ "linear_attention",
683
+ "linear_attention",
684
+ "linear_attention",
685
+ "full_attention",
686
+ "linear_attention",
687
+ "linear_attention",
688
+ "linear_attention",
689
+ "full_attention",
690
+ "linear_attention",
691
+ "linear_attention",
692
+ "linear_attention",
693
+ "full_attention",
694
+ "linear_attention",
695
+ "linear_attention",
696
+ "linear_attention",
697
+ "full_attention",
698
+ "linear_attention",
699
+ "linear_attention",
700
+ "linear_attention",
701
+ "full_attention",
702
+ "linear_attention",
703
+ "linear_attention",
704
+ "linear_attention",
705
+ "full_attention",
706
+ "linear_attention",
707
+ "linear_attention",
708
+ "linear_attention",
709
+ "full_attention",
710
+ "linear_attention",
711
+ "linear_attention",
712
+ "linear_attention",
713
+ "full_attention",
714
+ "linear_attention",
715
+ "linear_attention",
716
+ "linear_attention",
717
+ "full_attention",
718
+ "linear_attention",
719
+ "linear_attention",
720
+ "linear_attention",
721
+ "full_attention"
722
+ ],
723
+ "linear_conv_kernel_dim": 4,
724
+ "linear_key_head_dim": 128,
725
+ "linear_num_key_heads": 16,
726
+ "linear_num_value_heads": 32,
727
+ "linear_value_head_dim": 128,
728
+ "mamba_ssm_dtype": "float32",
729
+ "max_position_embeddings": 262144,
730
+ "model_type": "qwen3_5_moe_text",
731
+ "moe_intermediate_size": 512,
732
+ "mtp_num_hidden_layers": 1,
733
+ "mtp_use_dedicated_embeddings": false,
734
+ "num_attention_heads": 16,
735
+ "num_experts": 256,
736
+ "num_experts_per_tok": 8,
737
+ "num_hidden_layers": 40,
738
+ "num_key_value_heads": 2,
739
+ "output_router_logits": false,
740
+ "pad_token_id": null,
741
+ "partial_rotary_factor": 0.25,
742
+ "rms_norm_eps": 1e-06,
743
+ "rope_parameters": {
744
+ "mrope_interleaved": true,
745
+ "mrope_section": [
746
+ 11,
747
+ 11,
748
+ 10
749
+ ],
750
+ "partial_rotary_factor": 0.25,
751
+ "rope_theta": 10000000,
752
+ "rope_type": "default"
753
+ },
754
+ "router_aux_loss_coef": 0.001,
755
+ "shared_expert_intermediate_size": 512,
756
+ "tie_word_embeddings": false,
757
+ "use_cache": true,
758
+ "vocab_size": 248320
759
+ },
760
+ "tie_word_embeddings": false,
761
+ "transformers_version": "4.57.1",
762
+ "video_token_id": 248057,
763
+ "vision_config": {
764
+ "deepstack_visual_indexes": [],
765
+ "depth": 27,
766
+ "hidden_act": "gelu_pytorch_tanh",
767
+ "hidden_size": 1152,
768
+ "in_channels": 3,
769
+ "initializer_range": 0.02,
770
+ "intermediate_size": 4304,
771
+ "model_type": "qwen3_5_moe",
772
+ "num_heads": 16,
773
+ "num_position_embeddings": 2304,
774
+ "out_hidden_size": 2048,
775
+ "patch_size": 16,
776
+ "spatial_merge_size": 2,
777
+ "temporal_patch_size": 2
778
+ },
779
+ "vision_end_token_id": 248054,
780
+ "vision_start_token_id": 248053,
781
+ "vq": {
782
+ "modules": {
783
+ "language_model.model.layers.0.mlp.switch_mlp.down_proj": {
784
+ "vq_bits": 2,
785
+ "d": 4,
786
+ "K": 256,
787
+ "nbits": 8,
788
+ "in_dims": 512,
789
+ "norm_group": 128
790
+ },
791
+ "language_model.model.layers.0.mlp.switch_mlp.gate_proj": {
792
+ "vq_bits": 2,
793
+ "d": 4,
794
+ "K": 256,
795
+ "nbits": 8,
796
+ "in_dims": 2048,
797
+ "norm_group": 128
798
+ },
799
+ "language_model.model.layers.0.mlp.switch_mlp.up_proj": {
800
+ "vq_bits": 2,
801
+ "d": 4,
802
+ "K": 256,
803
+ "nbits": 8,
804
+ "in_dims": 2048,
805
+ "norm_group": 128
806
+ },
807
+ "language_model.model.layers.1.mlp.switch_mlp.down_proj": {
808
+ "vq_bits": 2,
809
+ "d": 4,
810
+ "K": 256,
811
+ "nbits": 8,
812
+ "in_dims": 512,
813
+ "norm_group": 128
814
+ },
815
+ "language_model.model.layers.1.mlp.switch_mlp.gate_proj": {
816
+ "vq_bits": 2,
817
+ "d": 4,
818
+ "K": 256,
819
+ "nbits": 8,
820
+ "in_dims": 2048,
821
+ "norm_group": 128
822
+ },
823
+ "language_model.model.layers.1.mlp.switch_mlp.up_proj": {
824
+ "vq_bits": 2,
825
+ "d": 4,
826
+ "K": 256,
827
+ "nbits": 8,
828
+ "in_dims": 2048,
829
+ "norm_group": 128
830
+ },
831
+ "language_model.model.layers.10.mlp.switch_mlp.down_proj": {
832
+ "vq_bits": 2,
833
+ "d": 4,
834
+ "K": 256,
835
+ "nbits": 8,
836
+ "in_dims": 512,
837
+ "norm_group": 128
838
+ },
839
+ "language_model.model.layers.10.mlp.switch_mlp.gate_proj": {
840
+ "vq_bits": 2,
841
+ "d": 4,
842
+ "K": 256,
843
+ "nbits": 8,
844
+ "in_dims": 2048,
845
+ "norm_group": 128
846
+ },
847
+ "language_model.model.layers.10.mlp.switch_mlp.up_proj": {
848
+ "vq_bits": 2,
849
+ "d": 4,
850
+ "K": 256,
851
+ "nbits": 8,
852
+ "in_dims": 2048,
853
+ "norm_group": 128
854
+ },
855
+ "language_model.model.layers.11.mlp.switch_mlp.down_proj": {
856
+ "vq_bits": 2,
857
+ "d": 4,
858
+ "K": 256,
859
+ "nbits": 8,
860
+ "in_dims": 512,
861
+ "norm_group": 128
862
+ },
863
+ "language_model.model.layers.11.mlp.switch_mlp.gate_proj": {
864
+ "vq_bits": 2,
865
+ "d": 4,
866
+ "K": 256,
867
+ "nbits": 8,
868
+ "in_dims": 2048,
869
+ "norm_group": 128
870
+ },
871
+ "language_model.model.layers.11.mlp.switch_mlp.up_proj": {
872
+ "vq_bits": 2,
873
+ "d": 4,
874
+ "K": 256,
875
+ "nbits": 8,
876
+ "in_dims": 2048,
877
+ "norm_group": 128
878
+ },
879
+ "language_model.model.layers.12.mlp.switch_mlp.down_proj": {
880
+ "vq_bits": 2,
881
+ "d": 4,
882
+ "K": 256,
883
+ "nbits": 8,
884
+ "in_dims": 512,
885
+ "norm_group": 128
886
+ },
887
+ "language_model.model.layers.12.mlp.switch_mlp.gate_proj": {
888
+ "vq_bits": 2,
889
+ "d": 4,
890
+ "K": 256,
891
+ "nbits": 8,
892
+ "in_dims": 2048,
893
+ "norm_group": 128
894
+ },
895
+ "language_model.model.layers.12.mlp.switch_mlp.up_proj": {
896
+ "vq_bits": 2,
897
+ "d": 4,
898
+ "K": 256,
899
+ "nbits": 8,
900
+ "in_dims": 2048,
901
+ "norm_group": 128
902
+ },
903
+ "language_model.model.layers.13.mlp.switch_mlp.down_proj": {
904
+ "vq_bits": 2,
905
+ "d": 4,
906
+ "K": 256,
907
+ "nbits": 8,
908
+ "in_dims": 512,
909
+ "norm_group": 128
910
+ },
911
+ "language_model.model.layers.13.mlp.switch_mlp.gate_proj": {
912
+ "vq_bits": 2,
913
+ "d": 4,
914
+ "K": 256,
915
+ "nbits": 8,
916
+ "in_dims": 2048,
917
+ "norm_group": 128
918
+ },
919
+ "language_model.model.layers.13.mlp.switch_mlp.up_proj": {
920
+ "vq_bits": 2,
921
+ "d": 4,
922
+ "K": 256,
923
+ "nbits": 8,
924
+ "in_dims": 2048,
925
+ "norm_group": 128
926
+ },
927
+ "language_model.model.layers.14.mlp.switch_mlp.down_proj": {
928
+ "vq_bits": 2,
929
+ "d": 4,
930
+ "K": 256,
931
+ "nbits": 8,
932
+ "in_dims": 512,
933
+ "norm_group": 128
934
+ },
935
+ "language_model.model.layers.14.mlp.switch_mlp.gate_proj": {
936
+ "vq_bits": 2,
937
+ "d": 4,
938
+ "K": 256,
939
+ "nbits": 8,
940
+ "in_dims": 2048,
941
+ "norm_group": 128
942
+ },
943
+ "language_model.model.layers.14.mlp.switch_mlp.up_proj": {
944
+ "vq_bits": 2,
945
+ "d": 4,
946
+ "K": 256,
947
+ "nbits": 8,
948
+ "in_dims": 2048,
949
+ "norm_group": 128
950
+ },
951
+ "language_model.model.layers.15.mlp.switch_mlp.down_proj": {
952
+ "vq_bits": 2,
953
+ "d": 4,
954
+ "K": 256,
955
+ "nbits": 8,
956
+ "in_dims": 512,
957
+ "norm_group": 128
958
+ },
959
+ "language_model.model.layers.15.mlp.switch_mlp.gate_proj": {
960
+ "vq_bits": 2,
961
+ "d": 4,
962
+ "K": 256,
963
+ "nbits": 8,
964
+ "in_dims": 2048,
965
+ "norm_group": 128
966
+ },
967
+ "language_model.model.layers.15.mlp.switch_mlp.up_proj": {
968
+ "vq_bits": 2,
969
+ "d": 4,
970
+ "K": 256,
971
+ "nbits": 8,
972
+ "in_dims": 2048,
973
+ "norm_group": 128
974
+ },
975
+ "language_model.model.layers.16.mlp.switch_mlp.down_proj": {
976
+ "vq_bits": 2,
977
+ "d": 4,
978
+ "K": 256,
979
+ "nbits": 8,
980
+ "in_dims": 512,
981
+ "norm_group": 128
982
+ },
983
+ "language_model.model.layers.16.mlp.switch_mlp.gate_proj": {
984
+ "vq_bits": 2,
985
+ "d": 4,
986
+ "K": 256,
987
+ "nbits": 8,
988
+ "in_dims": 2048,
989
+ "norm_group": 128
990
+ },
991
+ "language_model.model.layers.16.mlp.switch_mlp.up_proj": {
992
+ "vq_bits": 2,
993
+ "d": 4,
994
+ "K": 256,
995
+ "nbits": 8,
996
+ "in_dims": 2048,
997
+ "norm_group": 128
998
+ },
999
+ "language_model.model.layers.17.mlp.switch_mlp.down_proj": {
1000
+ "vq_bits": 2,
1001
+ "d": 4,
1002
+ "K": 256,
1003
+ "nbits": 8,
1004
+ "in_dims": 512,
1005
+ "norm_group": 128
1006
+ },
1007
+ "language_model.model.layers.17.mlp.switch_mlp.gate_proj": {
1008
+ "vq_bits": 2,
1009
+ "d": 4,
1010
+ "K": 256,
1011
+ "nbits": 8,
1012
+ "in_dims": 2048,
1013
+ "norm_group": 128
1014
+ },
1015
+ "language_model.model.layers.17.mlp.switch_mlp.up_proj": {
1016
+ "vq_bits": 2,
1017
+ "d": 4,
1018
+ "K": 256,
1019
+ "nbits": 8,
1020
+ "in_dims": 2048,
1021
+ "norm_group": 128
1022
+ },
1023
+ "language_model.model.layers.18.mlp.switch_mlp.down_proj": {
1024
+ "vq_bits": 2,
1025
+ "d": 4,
1026
+ "K": 256,
1027
+ "nbits": 8,
1028
+ "in_dims": 512,
1029
+ "norm_group": 128
1030
+ },
1031
+ "language_model.model.layers.18.mlp.switch_mlp.gate_proj": {
1032
+ "vq_bits": 2,
1033
+ "d": 4,
1034
+ "K": 256,
1035
+ "nbits": 8,
1036
+ "in_dims": 2048,
1037
+ "norm_group": 128
1038
+ },
1039
+ "language_model.model.layers.18.mlp.switch_mlp.up_proj": {
1040
+ "vq_bits": 2,
1041
+ "d": 4,
1042
+ "K": 256,
1043
+ "nbits": 8,
1044
+ "in_dims": 2048,
1045
+ "norm_group": 128
1046
+ },
1047
+ "language_model.model.layers.19.mlp.switch_mlp.down_proj": {
1048
+ "vq_bits": 2,
1049
+ "d": 4,
1050
+ "K": 256,
1051
+ "nbits": 8,
1052
+ "in_dims": 512,
1053
+ "norm_group": 128
1054
+ },
1055
+ "language_model.model.layers.19.mlp.switch_mlp.gate_proj": {
1056
+ "vq_bits": 2,
1057
+ "d": 4,
1058
+ "K": 256,
1059
+ "nbits": 8,
1060
+ "in_dims": 2048,
1061
+ "norm_group": 128
1062
+ },
1063
+ "language_model.model.layers.19.mlp.switch_mlp.up_proj": {
1064
+ "vq_bits": 2,
1065
+ "d": 4,
1066
+ "K": 256,
1067
+ "nbits": 8,
1068
+ "in_dims": 2048,
1069
+ "norm_group": 128
1070
+ },
1071
+ "language_model.model.layers.2.mlp.switch_mlp.down_proj": {
1072
+ "vq_bits": 2,
1073
+ "d": 4,
1074
+ "K": 256,
1075
+ "nbits": 8,
1076
+ "in_dims": 512,
1077
+ "norm_group": 128
1078
+ },
1079
+ "language_model.model.layers.2.mlp.switch_mlp.gate_proj": {
1080
+ "vq_bits": 2,
1081
+ "d": 4,
1082
+ "K": 256,
1083
+ "nbits": 8,
1084
+ "in_dims": 2048,
1085
+ "norm_group": 128
1086
+ },
1087
+ "language_model.model.layers.2.mlp.switch_mlp.up_proj": {
1088
+ "vq_bits": 2,
1089
+ "d": 4,
1090
+ "K": 256,
1091
+ "nbits": 8,
1092
+ "in_dims": 2048,
1093
+ "norm_group": 128
1094
+ },
1095
+ "language_model.model.layers.20.mlp.switch_mlp.down_proj": {
1096
+ "vq_bits": 2,
1097
+ "d": 4,
1098
+ "K": 256,
1099
+ "nbits": 8,
1100
+ "in_dims": 512,
1101
+ "norm_group": 128
1102
+ },
1103
+ "language_model.model.layers.20.mlp.switch_mlp.gate_proj": {
1104
+ "vq_bits": 2,
1105
+ "d": 4,
1106
+ "K": 256,
1107
+ "nbits": 8,
1108
+ "in_dims": 2048,
1109
+ "norm_group": 128
1110
+ },
1111
+ "language_model.model.layers.20.mlp.switch_mlp.up_proj": {
1112
+ "vq_bits": 2,
1113
+ "d": 4,
1114
+ "K": 256,
1115
+ "nbits": 8,
1116
+ "in_dims": 2048,
1117
+ "norm_group": 128
1118
+ },
1119
+ "language_model.model.layers.21.mlp.switch_mlp.down_proj": {
1120
+ "vq_bits": 2,
1121
+ "d": 4,
1122
+ "K": 256,
1123
+ "nbits": 8,
1124
+ "in_dims": 512,
1125
+ "norm_group": 128
1126
+ },
1127
+ "language_model.model.layers.21.mlp.switch_mlp.gate_proj": {
1128
+ "vq_bits": 2,
1129
+ "d": 4,
1130
+ "K": 256,
1131
+ "nbits": 8,
1132
+ "in_dims": 2048,
1133
+ "norm_group": 128
1134
+ },
1135
+ "language_model.model.layers.21.mlp.switch_mlp.up_proj": {
1136
+ "vq_bits": 2,
1137
+ "d": 4,
1138
+ "K": 256,
1139
+ "nbits": 8,
1140
+ "in_dims": 2048,
1141
+ "norm_group": 128
1142
+ },
1143
+ "language_model.model.layers.22.mlp.switch_mlp.down_proj": {
1144
+ "vq_bits": 2,
1145
+ "d": 4,
1146
+ "K": 256,
1147
+ "nbits": 8,
1148
+ "in_dims": 512,
1149
+ "norm_group": 128
1150
+ },
1151
+ "language_model.model.layers.22.mlp.switch_mlp.gate_proj": {
1152
+ "vq_bits": 2,
1153
+ "d": 4,
1154
+ "K": 256,
1155
+ "nbits": 8,
1156
+ "in_dims": 2048,
1157
+ "norm_group": 128
1158
+ },
1159
+ "language_model.model.layers.22.mlp.switch_mlp.up_proj": {
1160
+ "vq_bits": 2,
1161
+ "d": 4,
1162
+ "K": 256,
1163
+ "nbits": 8,
1164
+ "in_dims": 2048,
1165
+ "norm_group": 128
1166
+ },
1167
+ "language_model.model.layers.23.mlp.switch_mlp.down_proj": {
1168
+ "vq_bits": 2,
1169
+ "d": 4,
1170
+ "K": 256,
1171
+ "nbits": 8,
1172
+ "in_dims": 512,
1173
+ "norm_group": 128
1174
+ },
1175
+ "language_model.model.layers.23.mlp.switch_mlp.gate_proj": {
1176
+ "vq_bits": 2,
1177
+ "d": 4,
1178
+ "K": 256,
1179
+ "nbits": 8,
1180
+ "in_dims": 2048,
1181
+ "norm_group": 128
1182
+ },
1183
+ "language_model.model.layers.23.mlp.switch_mlp.up_proj": {
1184
+ "vq_bits": 2,
1185
+ "d": 4,
1186
+ "K": 256,
1187
+ "nbits": 8,
1188
+ "in_dims": 2048,
1189
+ "norm_group": 128
1190
+ },
1191
+ "language_model.model.layers.24.mlp.switch_mlp.down_proj": {
1192
+ "vq_bits": 2,
1193
+ "d": 4,
1194
+ "K": 256,
1195
+ "nbits": 8,
1196
+ "in_dims": 512,
1197
+ "norm_group": 128
1198
+ },
1199
+ "language_model.model.layers.24.mlp.switch_mlp.gate_proj": {
1200
+ "vq_bits": 2,
1201
+ "d": 4,
1202
+ "K": 256,
1203
+ "nbits": 8,
1204
+ "in_dims": 2048,
1205
+ "norm_group": 128
1206
+ },
1207
+ "language_model.model.layers.24.mlp.switch_mlp.up_proj": {
1208
+ "vq_bits": 2,
1209
+ "d": 4,
1210
+ "K": 256,
1211
+ "nbits": 8,
1212
+ "in_dims": 2048,
1213
+ "norm_group": 128
1214
+ },
1215
+ "language_model.model.layers.25.mlp.switch_mlp.down_proj": {
1216
+ "vq_bits": 2,
1217
+ "d": 4,
1218
+ "K": 256,
1219
+ "nbits": 8,
1220
+ "in_dims": 512,
1221
+ "norm_group": 128
1222
+ },
1223
+ "language_model.model.layers.25.mlp.switch_mlp.gate_proj": {
1224
+ "vq_bits": 2,
1225
+ "d": 4,
1226
+ "K": 256,
1227
+ "nbits": 8,
1228
+ "in_dims": 2048,
1229
+ "norm_group": 128
1230
+ },
1231
+ "language_model.model.layers.25.mlp.switch_mlp.up_proj": {
1232
+ "vq_bits": 2,
1233
+ "d": 4,
1234
+ "K": 256,
1235
+ "nbits": 8,
1236
+ "in_dims": 2048,
1237
+ "norm_group": 128
1238
+ },
1239
+ "language_model.model.layers.26.mlp.switch_mlp.down_proj": {
1240
+ "vq_bits": 2,
1241
+ "d": 4,
1242
+ "K": 256,
1243
+ "nbits": 8,
1244
+ "in_dims": 512,
1245
+ "norm_group": 128
1246
+ },
1247
+ "language_model.model.layers.26.mlp.switch_mlp.gate_proj": {
1248
+ "vq_bits": 2,
1249
+ "d": 4,
1250
+ "K": 256,
1251
+ "nbits": 8,
1252
+ "in_dims": 2048,
1253
+ "norm_group": 128
1254
+ },
1255
+ "language_model.model.layers.26.mlp.switch_mlp.up_proj": {
1256
+ "vq_bits": 2,
1257
+ "d": 4,
1258
+ "K": 256,
1259
+ "nbits": 8,
1260
+ "in_dims": 2048,
1261
+ "norm_group": 128
1262
+ },
1263
+ "language_model.model.layers.27.mlp.switch_mlp.down_proj": {
1264
+ "vq_bits": 2,
1265
+ "d": 4,
1266
+ "K": 256,
1267
+ "nbits": 8,
1268
+ "in_dims": 512,
1269
+ "norm_group": 128
1270
+ },
1271
+ "language_model.model.layers.27.mlp.switch_mlp.gate_proj": {
1272
+ "vq_bits": 2,
1273
+ "d": 4,
1274
+ "K": 256,
1275
+ "nbits": 8,
1276
+ "in_dims": 2048,
1277
+ "norm_group": 128
1278
+ },
1279
+ "language_model.model.layers.27.mlp.switch_mlp.up_proj": {
1280
+ "vq_bits": 2,
1281
+ "d": 4,
1282
+ "K": 256,
1283
+ "nbits": 8,
1284
+ "in_dims": 2048,
1285
+ "norm_group": 128
1286
+ },
1287
+ "language_model.model.layers.28.mlp.switch_mlp.down_proj": {
1288
+ "vq_bits": 2,
1289
+ "d": 4,
1290
+ "K": 256,
1291
+ "nbits": 8,
1292
+ "in_dims": 512,
1293
+ "norm_group": 128
1294
+ },
1295
+ "language_model.model.layers.28.mlp.switch_mlp.gate_proj": {
1296
+ "vq_bits": 2,
1297
+ "d": 4,
1298
+ "K": 256,
1299
+ "nbits": 8,
1300
+ "in_dims": 2048,
1301
+ "norm_group": 128
1302
+ },
1303
+ "language_model.model.layers.28.mlp.switch_mlp.up_proj": {
1304
+ "vq_bits": 2,
1305
+ "d": 4,
1306
+ "K": 256,
1307
+ "nbits": 8,
1308
+ "in_dims": 2048,
1309
+ "norm_group": 128
1310
+ },
1311
+ "language_model.model.layers.29.mlp.switch_mlp.down_proj": {
1312
+ "vq_bits": 2,
1313
+ "d": 4,
1314
+ "K": 256,
1315
+ "nbits": 8,
1316
+ "in_dims": 512,
1317
+ "norm_group": 128
1318
+ },
1319
+ "language_model.model.layers.29.mlp.switch_mlp.gate_proj": {
1320
+ "vq_bits": 2,
1321
+ "d": 4,
1322
+ "K": 256,
1323
+ "nbits": 8,
1324
+ "in_dims": 2048,
1325
+ "norm_group": 128
1326
+ },
1327
+ "language_model.model.layers.29.mlp.switch_mlp.up_proj": {
1328
+ "vq_bits": 2,
1329
+ "d": 4,
1330
+ "K": 256,
1331
+ "nbits": 8,
1332
+ "in_dims": 2048,
1333
+ "norm_group": 128
1334
+ },
1335
+ "language_model.model.layers.3.mlp.switch_mlp.down_proj": {
1336
+ "vq_bits": 2,
1337
+ "d": 4,
1338
+ "K": 256,
1339
+ "nbits": 8,
1340
+ "in_dims": 512,
1341
+ "norm_group": 128
1342
+ },
1343
+ "language_model.model.layers.3.mlp.switch_mlp.gate_proj": {
1344
+ "vq_bits": 2,
1345
+ "d": 4,
1346
+ "K": 256,
1347
+ "nbits": 8,
1348
+ "in_dims": 2048,
1349
+ "norm_group": 128
1350
+ },
1351
+ "language_model.model.layers.3.mlp.switch_mlp.up_proj": {
1352
+ "vq_bits": 2,
1353
+ "d": 4,
1354
+ "K": 256,
1355
+ "nbits": 8,
1356
+ "in_dims": 2048,
1357
+ "norm_group": 128
1358
+ },
1359
+ "language_model.model.layers.30.mlp.switch_mlp.down_proj": {
1360
+ "vq_bits": 2,
1361
+ "d": 4,
1362
+ "K": 256,
1363
+ "nbits": 8,
1364
+ "in_dims": 512,
1365
+ "norm_group": 128
1366
+ },
1367
+ "language_model.model.layers.30.mlp.switch_mlp.gate_proj": {
1368
+ "vq_bits": 2,
1369
+ "d": 4,
1370
+ "K": 256,
1371
+ "nbits": 8,
1372
+ "in_dims": 2048,
1373
+ "norm_group": 128
1374
+ },
1375
+ "language_model.model.layers.30.mlp.switch_mlp.up_proj": {
1376
+ "vq_bits": 2,
1377
+ "d": 4,
1378
+ "K": 256,
1379
+ "nbits": 8,
1380
+ "in_dims": 2048,
1381
+ "norm_group": 128
1382
+ },
1383
+ "language_model.model.layers.31.mlp.switch_mlp.down_proj": {
1384
+ "vq_bits": 2,
1385
+ "d": 4,
1386
+ "K": 256,
1387
+ "nbits": 8,
1388
+ "in_dims": 512,
1389
+ "norm_group": 128
1390
+ },
1391
+ "language_model.model.layers.31.mlp.switch_mlp.gate_proj": {
1392
+ "vq_bits": 2,
1393
+ "d": 4,
1394
+ "K": 256,
1395
+ "nbits": 8,
1396
+ "in_dims": 2048,
1397
+ "norm_group": 128
1398
+ },
1399
+ "language_model.model.layers.31.mlp.switch_mlp.up_proj": {
1400
+ "vq_bits": 2,
1401
+ "d": 4,
1402
+ "K": 256,
1403
+ "nbits": 8,
1404
+ "in_dims": 2048,
1405
+ "norm_group": 128
1406
+ },
1407
+ "language_model.model.layers.32.mlp.switch_mlp.down_proj": {
1408
+ "vq_bits": 2,
1409
+ "d": 4,
1410
+ "K": 256,
1411
+ "nbits": 8,
1412
+ "in_dims": 512,
1413
+ "norm_group": 128
1414
+ },
1415
+ "language_model.model.layers.32.mlp.switch_mlp.gate_proj": {
1416
+ "vq_bits": 2,
1417
+ "d": 4,
1418
+ "K": 256,
1419
+ "nbits": 8,
1420
+ "in_dims": 2048,
1421
+ "norm_group": 128
1422
+ },
1423
+ "language_model.model.layers.32.mlp.switch_mlp.up_proj": {
1424
+ "vq_bits": 2,
1425
+ "d": 4,
1426
+ "K": 256,
1427
+ "nbits": 8,
1428
+ "in_dims": 2048,
1429
+ "norm_group": 128
1430
+ },
1431
+ "language_model.model.layers.33.mlp.switch_mlp.down_proj": {
1432
+ "vq_bits": 3,
1433
+ "d": 4,
1434
+ "K": 4096,
1435
+ "nbits": 12,
1436
+ "in_dims": 512,
1437
+ "norm_group": 128
1438
+ },
1439
+ "language_model.model.layers.33.mlp.switch_mlp.gate_proj": {
1440
+ "vq_bits": 2,
1441
+ "d": 4,
1442
+ "K": 256,
1443
+ "nbits": 8,
1444
+ "in_dims": 2048,
1445
+ "norm_group": 128
1446
+ },
1447
+ "language_model.model.layers.33.mlp.switch_mlp.up_proj": {
1448
+ "vq_bits": 2,
1449
+ "d": 4,
1450
+ "K": 256,
1451
+ "nbits": 8,
1452
+ "in_dims": 2048,
1453
+ "norm_group": 128
1454
+ },
1455
+ "language_model.model.layers.34.mlp.switch_mlp.down_proj": {
1456
+ "vq_bits": 3,
1457
+ "d": 4,
1458
+ "K": 4096,
1459
+ "nbits": 12,
1460
+ "in_dims": 512,
1461
+ "norm_group": 128
1462
+ },
1463
+ "language_model.model.layers.34.mlp.switch_mlp.gate_proj": {
1464
+ "vq_bits": 3,
1465
+ "d": 4,
1466
+ "K": 4096,
1467
+ "nbits": 12,
1468
+ "in_dims": 2048,
1469
+ "norm_group": 128
1470
+ },
1471
+ "language_model.model.layers.34.mlp.switch_mlp.up_proj": {
1472
+ "vq_bits": 3,
1473
+ "d": 4,
1474
+ "K": 4096,
1475
+ "nbits": 12,
1476
+ "in_dims": 2048,
1477
+ "norm_group": 128
1478
+ },
1479
+ "language_model.model.layers.35.mlp.switch_mlp.down_proj": {
1480
+ "vq_bits": 2,
1481
+ "d": 4,
1482
+ "K": 256,
1483
+ "nbits": 8,
1484
+ "in_dims": 512,
1485
+ "norm_group": 128
1486
+ },
1487
+ "language_model.model.layers.35.mlp.switch_mlp.gate_proj": {
1488
+ "vq_bits": 2,
1489
+ "d": 4,
1490
+ "K": 256,
1491
+ "nbits": 8,
1492
+ "in_dims": 2048,
1493
+ "norm_group": 128
1494
+ },
1495
+ "language_model.model.layers.35.mlp.switch_mlp.up_proj": {
1496
+ "vq_bits": 2,
1497
+ "d": 4,
1498
+ "K": 256,
1499
+ "nbits": 8,
1500
+ "in_dims": 2048,
1501
+ "norm_group": 128
1502
+ },
1503
+ "language_model.model.layers.36.mlp.switch_mlp.down_proj": {
1504
+ "vq_bits": 3,
1505
+ "d": 4,
1506
+ "K": 4096,
1507
+ "nbits": 12,
1508
+ "in_dims": 512,
1509
+ "norm_group": 128
1510
+ },
1511
+ "language_model.model.layers.36.mlp.switch_mlp.gate_proj": {
1512
+ "vq_bits": 3,
1513
+ "d": 4,
1514
+ "K": 4096,
1515
+ "nbits": 12,
1516
+ "in_dims": 2048,
1517
+ "norm_group": 128
1518
+ },
1519
+ "language_model.model.layers.36.mlp.switch_mlp.up_proj": {
1520
+ "vq_bits": 3,
1521
+ "d": 4,
1522
+ "K": 4096,
1523
+ "nbits": 12,
1524
+ "in_dims": 2048,
1525
+ "norm_group": 128
1526
+ },
1527
+ "language_model.model.layers.37.mlp.switch_mlp.down_proj": {
1528
+ "vq_bits": 3,
1529
+ "d": 4,
1530
+ "K": 4096,
1531
+ "nbits": 12,
1532
+ "in_dims": 512,
1533
+ "norm_group": 128
1534
+ },
1535
+ "language_model.model.layers.37.mlp.switch_mlp.gate_proj": {
1536
+ "vq_bits": 3,
1537
+ "d": 4,
1538
+ "K": 4096,
1539
+ "nbits": 12,
1540
+ "in_dims": 2048,
1541
+ "norm_group": 128
1542
+ },
1543
+ "language_model.model.layers.37.mlp.switch_mlp.up_proj": {
1544
+ "vq_bits": 3,
1545
+ "d": 4,
1546
+ "K": 4096,
1547
+ "nbits": 12,
1548
+ "in_dims": 2048,
1549
+ "norm_group": 128
1550
+ },
1551
+ "language_model.model.layers.38.mlp.switch_mlp.down_proj": {
1552
+ "vq_bits": 3,
1553
+ "d": 4,
1554
+ "K": 4096,
1555
+ "nbits": 12,
1556
+ "in_dims": 512,
1557
+ "norm_group": 128
1558
+ },
1559
+ "language_model.model.layers.38.mlp.switch_mlp.gate_proj": {
1560
+ "vq_bits": 3,
1561
+ "d": 4,
1562
+ "K": 4096,
1563
+ "nbits": 12,
1564
+ "in_dims": 2048,
1565
+ "norm_group": 128
1566
+ },
1567
+ "language_model.model.layers.38.mlp.switch_mlp.up_proj": {
1568
+ "vq_bits": 3,
1569
+ "d": 4,
1570
+ "K": 4096,
1571
+ "nbits": 12,
1572
+ "in_dims": 2048,
1573
+ "norm_group": 128
1574
+ },
1575
+ "language_model.model.layers.39.mlp.switch_mlp.down_proj": {
1576
+ "vq_bits": 3,
1577
+ "d": 4,
1578
+ "K": 4096,
1579
+ "nbits": 12,
1580
+ "in_dims": 512,
1581
+ "norm_group": 128
1582
+ },
1583
+ "language_model.model.layers.39.mlp.switch_mlp.gate_proj": {
1584
+ "vq_bits": 3,
1585
+ "d": 4,
1586
+ "K": 4096,
1587
+ "nbits": 12,
1588
+ "in_dims": 2048,
1589
+ "norm_group": 128
1590
+ },
1591
+ "language_model.model.layers.39.mlp.switch_mlp.up_proj": {
1592
+ "vq_bits": 3,
1593
+ "d": 4,
1594
+ "K": 4096,
1595
+ "nbits": 12,
1596
+ "in_dims": 2048,
1597
+ "norm_group": 128
1598
+ },
1599
+ "language_model.model.layers.4.mlp.switch_mlp.down_proj": {
1600
+ "vq_bits": 2,
1601
+ "d": 4,
1602
+ "K": 256,
1603
+ "nbits": 8,
1604
+ "in_dims": 512,
1605
+ "norm_group": 128
1606
+ },
1607
+ "language_model.model.layers.4.mlp.switch_mlp.gate_proj": {
1608
+ "vq_bits": 2,
1609
+ "d": 4,
1610
+ "K": 256,
1611
+ "nbits": 8,
1612
+ "in_dims": 2048,
1613
+ "norm_group": 128
1614
+ },
1615
+ "language_model.model.layers.4.mlp.switch_mlp.up_proj": {
1616
+ "vq_bits": 2,
1617
+ "d": 4,
1618
+ "K": 256,
1619
+ "nbits": 8,
1620
+ "in_dims": 2048,
1621
+ "norm_group": 128
1622
+ },
1623
+ "language_model.model.layers.5.mlp.switch_mlp.down_proj": {
1624
+ "vq_bits": 2,
1625
+ "d": 4,
1626
+ "K": 256,
1627
+ "nbits": 8,
1628
+ "in_dims": 512,
1629
+ "norm_group": 128
1630
+ },
1631
+ "language_model.model.layers.5.mlp.switch_mlp.gate_proj": {
1632
+ "vq_bits": 2,
1633
+ "d": 4,
1634
+ "K": 256,
1635
+ "nbits": 8,
1636
+ "in_dims": 2048,
1637
+ "norm_group": 128
1638
+ },
1639
+ "language_model.model.layers.5.mlp.switch_mlp.up_proj": {
1640
+ "vq_bits": 2,
1641
+ "d": 4,
1642
+ "K": 256,
1643
+ "nbits": 8,
1644
+ "in_dims": 2048,
1645
+ "norm_group": 128
1646
+ },
1647
+ "language_model.model.layers.6.mlp.switch_mlp.down_proj": {
1648
+ "vq_bits": 2,
1649
+ "d": 4,
1650
+ "K": 256,
1651
+ "nbits": 8,
1652
+ "in_dims": 512,
1653
+ "norm_group": 128
1654
+ },
1655
+ "language_model.model.layers.6.mlp.switch_mlp.gate_proj": {
1656
+ "vq_bits": 2,
1657
+ "d": 4,
1658
+ "K": 256,
1659
+ "nbits": 8,
1660
+ "in_dims": 2048,
1661
+ "norm_group": 128
1662
+ },
1663
+ "language_model.model.layers.6.mlp.switch_mlp.up_proj": {
1664
+ "vq_bits": 2,
1665
+ "d": 4,
1666
+ "K": 256,
1667
+ "nbits": 8,
1668
+ "in_dims": 2048,
1669
+ "norm_group": 128
1670
+ },
1671
+ "language_model.model.layers.7.mlp.switch_mlp.down_proj": {
1672
+ "vq_bits": 2,
1673
+ "d": 4,
1674
+ "K": 256,
1675
+ "nbits": 8,
1676
+ "in_dims": 512,
1677
+ "norm_group": 128
1678
+ },
1679
+ "language_model.model.layers.7.mlp.switch_mlp.gate_proj": {
1680
+ "vq_bits": 2,
1681
+ "d": 4,
1682
+ "K": 256,
1683
+ "nbits": 8,
1684
+ "in_dims": 2048,
1685
+ "norm_group": 128
1686
+ },
1687
+ "language_model.model.layers.7.mlp.switch_mlp.up_proj": {
1688
+ "vq_bits": 2,
1689
+ "d": 4,
1690
+ "K": 256,
1691
+ "nbits": 8,
1692
+ "in_dims": 2048,
1693
+ "norm_group": 128
1694
+ },
1695
+ "language_model.model.layers.8.mlp.switch_mlp.down_proj": {
1696
+ "vq_bits": 2,
1697
+ "d": 4,
1698
+ "K": 256,
1699
+ "nbits": 8,
1700
+ "in_dims": 512,
1701
+ "norm_group": 128
1702
+ },
1703
+ "language_model.model.layers.8.mlp.switch_mlp.gate_proj": {
1704
+ "vq_bits": 2,
1705
+ "d": 4,
1706
+ "K": 256,
1707
+ "nbits": 8,
1708
+ "in_dims": 2048,
1709
+ "norm_group": 128
1710
+ },
1711
+ "language_model.model.layers.8.mlp.switch_mlp.up_proj": {
1712
+ "vq_bits": 2,
1713
+ "d": 4,
1714
+ "K": 256,
1715
+ "nbits": 8,
1716
+ "in_dims": 2048,
1717
+ "norm_group": 128
1718
+ },
1719
+ "language_model.model.layers.9.mlp.switch_mlp.down_proj": {
1720
+ "vq_bits": 2,
1721
+ "d": 4,
1722
+ "K": 256,
1723
+ "nbits": 8,
1724
+ "in_dims": 512,
1725
+ "norm_group": 128
1726
+ },
1727
+ "language_model.model.layers.9.mlp.switch_mlp.gate_proj": {
1728
+ "vq_bits": 2,
1729
+ "d": 4,
1730
+ "K": 256,
1731
+ "nbits": 8,
1732
+ "in_dims": 2048,
1733
+ "norm_group": 128
1734
+ },
1735
+ "language_model.model.layers.9.mlp.switch_mlp.up_proj": {
1736
+ "vq_bits": 2,
1737
+ "d": 4,
1738
+ "K": 256,
1739
+ "nbits": 8,
1740
+ "in_dims": 2048,
1741
+ "norm_group": 128
1742
+ }
1743
+ },
1744
+ "codebooks_file": "vq_codebooks.safetensors",
1745
+ "method": "gptq-vq",
1746
+ "map": "map12"
1747
+ }
1748
+ }
configuration.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"framework":"Pytorch","task":"visual-question-answering"}
generation_config.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token_id": 248044,
3
+ "do_sample": true,
4
+ "eos_token_id": [
5
+ 248046,
6
+ 248044
7
+ ],
8
+ "pad_token_id": 248044,
9
+ "temperature": 1.0,
10
+ "top_k": 20,
11
+ "top_p": 0.95
12
+ }
model-00001-of-00003.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3435fef45265f23bde60a970328181e35d0d9caa101532e1f90b120435e97b57
3
+ size 5318570592
model-00002-of-00003.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a3ae798d27788ab595009987850f42b6586cc08ec0fdbbabfe3d1d2a08c0958b
3
+ size 5363030360
model-00003-of-00003.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:be688405bf7c9d68e09d0665cd486ca32cb852b929221e386cb904fe63ade5f6
3
+ size 821583656
model.safetensors.index.json ADDED
The diff for this file is too large to render. See raw diff
 
preprocessor_config.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "size": {
3
+ "longest_edge": 16777216,
4
+ "shortest_edge": 65536
5
+ },
6
+ "patch_size": 16,
7
+ "temporal_patch_size": 2,
8
+ "merge_size": 2,
9
+ "image_mean": [
10
+ 0.5,
11
+ 0.5,
12
+ 0.5
13
+ ],
14
+ "image_std": [
15
+ 0.5,
16
+ 0.5,
17
+ 0.5
18
+ ],
19
+ "processor_class": "Qwen3VLProcessor",
20
+ "image_processor_type": "Qwen2VLImageProcessorFast"
21
+ }
processor_config.json ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "image_processor": {
3
+ "do_convert_rgb": true,
4
+ "do_normalize": true,
5
+ "do_rescale": true,
6
+ "do_resize": true,
7
+ "image_mean": [
8
+ 0.5,
9
+ 0.5,
10
+ 0.5
11
+ ],
12
+ "image_processor_type": "Qwen2VLImageProcessor",
13
+ "image_std": [
14
+ 0.5,
15
+ 0.5,
16
+ 0.5
17
+ ],
18
+ "max_pixels": 16777216,
19
+ "merge_size": 2,
20
+ "min_pixels": 65536,
21
+ "patch_size": 16,
22
+ "resample": 3,
23
+ "rescale_factor": 0.00392156862745098,
24
+ "size": {
25
+ "longest_edge": 16777216,
26
+ "shortest_edge": 65536
27
+ },
28
+ "temporal_patch_size": 2
29
+ },
30
+ "processor_class": "Qwen3VLProcessor",
31
+ "video_processor": {
32
+ "data_format": "channels_first",
33
+ "default_to_square": true,
34
+ "do_convert_rgb": true,
35
+ "do_normalize": true,
36
+ "do_rescale": true,
37
+ "do_resize": true,
38
+ "do_sample_frames": true,
39
+ "fps": 2,
40
+ "image_mean": [
41
+ 0.5,
42
+ 0.5,
43
+ 0.5
44
+ ],
45
+ "image_std": [
46
+ 0.5,
47
+ 0.5,
48
+ 0.5
49
+ ],
50
+ "max_frames": 768,
51
+ "merge_size": 2,
52
+ "min_frames": 4,
53
+ "patch_size": 16,
54
+ "resample": 3,
55
+ "rescale_factor": 0.00392156862745098,
56
+ "return_metadata": false,
57
+ "size": {
58
+ "longest_edge": 25165824,
59
+ "shortest_edge": 4096
60
+ },
61
+ "temporal_patch_size": 2,
62
+ "video_processor_type": "Qwen3VLVideoProcessor"
63
+ }
64
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:87a7830d63fcf43bf241c3c5242e96e62dd3fdc29224ca26fed8ea333db72de4
3
+ size 19989343
tokenizer_config.json ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_prefix_space": false,
3
+ "audio_bos_token": "<|audio_start|>",
4
+ "audio_eos_token": "<|audio_end|>",
5
+ "audio_token": "<|audio_pad|>",
6
+ "backend": "tokenizers",
7
+ "bos_token": null,
8
+ "clean_up_tokenization_spaces": false,
9
+ "eos_token": "<|im_end|>",
10
+ "errors": "replace",
11
+ "image_token": "<|image_pad|>",
12
+ "is_local": true,
13
+ "model_max_length": 262144,
14
+ "model_specific_special_tokens": {
15
+ "audio_bos_token": "<|audio_start|>",
16
+ "audio_eos_token": "<|audio_end|>",
17
+ "audio_token": "<|audio_pad|>",
18
+ "image_token": "<|image_pad|>",
19
+ "video_token": "<|video_pad|>",
20
+ "vision_bos_token": "<|vision_start|>",
21
+ "vision_eos_token": "<|vision_end|>"
22
+ },
23
+ "pad_token": "<|endoftext|>",
24
+ "pretokenize_regex": "(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\\r\\n\\p{L}\\p{N}]?[\\p{L}\\p{M}]+|\\p{N}| ?[^\\s\\p{L}\\p{M}\\p{N}]+[\\r\\n]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+",
25
+ "processor_class": "Qwen3VLProcessor",
26
+ "split_special_tokens": false,
27
+ "tokenizer_class": "TokenizersBackend",
28
+ "unk_token": null,
29
+ "video_token": "<|video_pad|>",
30
+ "vision_bos_token": "<|vision_start|>",
31
+ "vision_eos_token": "<|vision_end|>"
32
+ }
video_preprocessor_config.json ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "size": {
3
+ "longest_edge": 25165824,
4
+ "shortest_edge": 4096
5
+ },
6
+ "patch_size": 16,
7
+ "temporal_patch_size": 2,
8
+ "merge_size": 2,
9
+ "image_mean": [
10
+ 0.5,
11
+ 0.5,
12
+ 0.5
13
+ ],
14
+ "image_std": [
15
+ 0.5,
16
+ 0.5,
17
+ 0.5
18
+ ],
19
+ "processor_class": "Qwen3VLProcessor",
20
+ "video_processor_type": "Qwen3VLVideoProcessor"
21
+ }
vocab.json ADDED
The diff for this file is too large to render. See raw diff
 
vq_codebooks.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7c86f9c377f106bad8de38f5b45b2e6c8c092c237d47896600c612971856f9d1
3
+ size 39120