Upload model files
Browse files- .gitattributes +1 -0
- README.md +127 -0
- chat_template.jinja +159 -0
- config.json +606 -0
- configuration_minimax_m2.py +200 -0
- generation_config.json +9 -0
- model-00001-of-00027.safetensors +3 -0
- model-00002-of-00027.safetensors +3 -0
- model-00003-of-00027.safetensors +3 -0
- model-00004-of-00027.safetensors +3 -0
- model-00005-of-00027.safetensors +3 -0
- model-00006-of-00027.safetensors +3 -0
- model-00007-of-00027.safetensors +3 -0
- model-00008-of-00027.safetensors +3 -0
- model-00009-of-00027.safetensors +3 -0
- model-00010-of-00027.safetensors +3 -0
- model-00011-of-00027.safetensors +3 -0
- model-00012-of-00027.safetensors +3 -0
- model-00013-of-00027.safetensors +3 -0
- model-00014-of-00027.safetensors +3 -0
- model-00015-of-00027.safetensors +3 -0
- model-00016-of-00027.safetensors +3 -0
- model-00017-of-00027.safetensors +3 -0
- model-00018-of-00027.safetensors +3 -0
- model-00019-of-00027.safetensors +3 -0
- model-00020-of-00027.safetensors +3 -0
- model-00021-of-00027.safetensors +3 -0
- model-00022-of-00027.safetensors +3 -0
- model-00023-of-00027.safetensors +3 -0
- model-00024-of-00027.safetensors +3 -0
- model-00025-of-00027.safetensors +3 -0
- model-00026-of-00027.safetensors +3 -0
- model-00027-of-00027.safetensors +3 -0
- model.safetensors.index.json +0 -0
- modeling_minimax_m2.py +706 -0
- tokenizer.json +3 -0
- tokenizer_config.json +64 -0
.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
|
README.md
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
library_name: transformers
|
| 4 |
+
base_model:
|
| 5 |
+
- deepseek-ai/DeepSeek-V3.2-Exp-Base
|
| 6 |
+
base_model_relation: finetune
|
| 7 |
+
---
|
| 8 |
+
# DeepSeek-V3.2: Efficient Reasoning & Agentic AI
|
| 9 |
+
|
| 10 |
+
<!-- markdownlint-disable first-line-h1 -->
|
| 11 |
+
<!-- markdownlint-disable html -->
|
| 12 |
+
<!-- markdownlint-disable no-duplicate-header -->
|
| 13 |
+
|
| 14 |
+
<div align="center">
|
| 15 |
+
<img src="https://github.com/deepseek-ai/DeepSeek-V2/blob/main/figures/logo.svg?raw=true" width="60%" alt="DeepSeek-V3" />
|
| 16 |
+
</div>
|
| 17 |
+
<hr>
|
| 18 |
+
<div align="center" style="line-height: 1;">
|
| 19 |
+
<a href="https://www.deepseek.com/" target="_blank" style="margin: 2px;">
|
| 20 |
+
<img alt="Homepage" src="https://github.com/deepseek-ai/DeepSeek-V2/blob/main/figures/badge.svg?raw=true" style="display: inline-block; vertical-align: middle;"/>
|
| 21 |
+
</a>
|
| 22 |
+
<a href="https://chat.deepseek.com/" target="_blank" style="margin: 2px;">
|
| 23 |
+
<img alt="Chat" src="https://img.shields.io/badge/🤖%20Chat-DeepSeek%20V3-536af5?color=536af5&logoColor=white" style="display: inline-block; vertical-align: middle;"/>
|
| 24 |
+
</a>
|
| 25 |
+
<a href="https://huggingface.co/deepseek-ai" target="_blank" style="margin: 2px;">
|
| 26 |
+
<img alt="Hugging Face" src="https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-DeepSeek%20AI-ffc107?color=ffc107&logoColor=white" style="display: inline-block; vertical-align: middle;"/>
|
| 27 |
+
</a>
|
| 28 |
+
</div>
|
| 29 |
+
<div align="center" style="line-height: 1;">
|
| 30 |
+
<a href="https://discord.gg/Tc7c45Zzu5" target="_blank" style="margin: 2px;">
|
| 31 |
+
<img alt="Discord" src="https://img.shields.io/badge/Discord-DeepSeek%20AI-7289da?logo=discord&logoColor=white&color=7289da" style="display: inline-block; vertical-align: middle;"/>
|
| 32 |
+
</a>
|
| 33 |
+
<a href="https://github.com/deepseek-ai/DeepSeek-V2/blob/main/figures/qr.jpeg?raw=true" target="_blank" style="margin: 2px;">
|
| 34 |
+
<img alt="Wechat" src="https://img.shields.io/badge/WeChat-DeepSeek%20AI-brightgreen?logo=wechat&logoColor=white" style="display: inline-block; vertical-align: middle;"/>
|
| 35 |
+
</a>
|
| 36 |
+
<a href="https://twitter.com/deepseek_ai" target="_blank" style="margin: 2px;">
|
| 37 |
+
<img alt="Twitter Follow" src="https://img.shields.io/badge/Twitter-deepseek_ai-white?logo=x&logoColor=white" style="display: inline-block; vertical-align: middle;"/>
|
| 38 |
+
</a>
|
| 39 |
+
</div>
|
| 40 |
+
<div align="center" style="line-height: 1;">
|
| 41 |
+
<a href="LICENSE" style="margin: 2px;">
|
| 42 |
+
<img alt="License" src="https://img.shields.io/badge/License-MIT-f5de53?&color=f5de53" style="display: inline-block; vertical-align: middle;"/>
|
| 43 |
+
</a>
|
| 44 |
+
</div>
|
| 45 |
+
|
| 46 |
+
<p align="center">
|
| 47 |
+
<a href="https://huggingface.co/deepseek-ai/DeepSeek-V3.2/blob/main/assets/paper.pdf"><b>Technical Report</b>👁️</a>
|
| 48 |
+
</p>
|
| 49 |
+
|
| 50 |
+
## Introduction
|
| 51 |
+
|
| 52 |
+
We introduce **DeepSeek-V3.2**, a model that harmonizes high computational efficiency with superior reasoning and agent performance. Our approach is built upon three key technical breakthroughs:
|
| 53 |
+
|
| 54 |
+
1. **DeepSeek Sparse Attention (DSA):** We introduce DSA, an efficient attention mechanism that substantially reduces computational complexity while preserving model performance, specifically optimized for long-context scenarios.
|
| 55 |
+
2. **Scalable Reinforcement Learning Framework:** By implementing a robust RL protocol and scaling post-training compute, *DeepSeek-V3.2* performs comparably to GPT-5. Notably, our high-compute variant, **DeepSeek-V3.2-Speciale**, **surpasses GPT-5** and exhibits reasoning proficiency on par with Gemini-3.0-Pro.
|
| 56 |
+
- *Achievement:* 🥇 **Gold-medal performance** in the 2025 International Mathematical Olympiad (IMO) and International Olympiad in Informatics (IOI).
|
| 57 |
+
3. **Large-Scale Agentic Task Synthesis Pipeline:** To integrate **reasoning into tool-use** scenarios, we developed a novel synthesis pipeline that systematically generates training data at scale. This facilitates scalable agentic post-training, improving compliance and generalization in complex interactive environments.
|
| 58 |
+
|
| 59 |
+
<div align="center">
|
| 60 |
+
<img src="assets/benchmark.png" >
|
| 61 |
+
</div>
|
| 62 |
+
|
| 63 |
+
We have also released the final submissions for IOI 2025, ICPC World Finals, IMO 2025 and CMO 2025, which were selected based on our designed pipeline. These materials are provided for the community to conduct secondary verification. The files can be accessed at `assets/olympiad_cases`.
|
| 64 |
+
|
| 65 |
+
## Chat Template
|
| 66 |
+
|
| 67 |
+
DeepSeek-V3.2 introduces significant updates to its chat template compared to prior versions. The primary changes involve a revised format for tool calling and the introduction of a "thinking with tools" capability.
|
| 68 |
+
|
| 69 |
+
To assist the community in understanding and adapting to this new template, we have provided a dedicated `encoding` folder, which contains Python scripts and test cases demonstrating how to encode messages in OpenAI-compatible format into input strings for the model and how to parse the model's text output.
|
| 70 |
+
|
| 71 |
+
A brief example is illustrated below:
|
| 72 |
+
|
| 73 |
+
```python
|
| 74 |
+
import transformers
|
| 75 |
+
# encoding/encoding_dsv32.py
|
| 76 |
+
from encoding_dsv32 import encode_messages, parse_message_from_completion_text
|
| 77 |
+
|
| 78 |
+
tokenizer = transformers.AutoTokenizer.from_pretrained("deepseek-ai/DeepSeek-V3.2")
|
| 79 |
+
|
| 80 |
+
messages = [
|
| 81 |
+
{"role": "user", "content": "hello"},
|
| 82 |
+
{"role": "assistant", "content": "Hello! I am DeepSeek.", "reasoning_content": "thinking..."},
|
| 83 |
+
{"role": "user", "content": "1+1=?"}
|
| 84 |
+
]
|
| 85 |
+
encode_config = dict(thinking_mode="thinking", drop_thinking=True, add_default_bos_token=True)
|
| 86 |
+
|
| 87 |
+
# messages -> string
|
| 88 |
+
prompt = encode_messages(messages, **encode_config)
|
| 89 |
+
# Output: "<|begin▁of▁sentence|><|User|>hello<|Assistant|></think>Hello! I am DeepSeek.<|end▁of▁sentence|><|User|>1+1=?<|Assistant|><think>"
|
| 90 |
+
|
| 91 |
+
# string -> tokens
|
| 92 |
+
tokens = tokenizer.encode(prompt)
|
| 93 |
+
# Output: [0, 128803, 33310, 128804, 128799, 19923, 3, 342, 1030, 22651, 4374, 1465, 16, 1, 128803, 19, 13, 19, 127252, 128804, 128798]
|
| 94 |
+
```
|
| 95 |
+
|
| 96 |
+
Important Notes:
|
| 97 |
+
|
| 98 |
+
1. This release does not include a Jinja-format chat template. Please refer to the Python code mentioned above.
|
| 99 |
+
2. The output parsing function included in the code is designed to handle well-formatted strings only. It does not attempt to correct or recover from malformed output that the model might occasionally generate. It is not suitable for production use without robust error handling.
|
| 100 |
+
3. A new role named `developer` has been introduced in the chat template. This role is dedicated exclusively to search agent scenarios and is designated for no other tasks. The official API does not accept messages assigned to `developer`.
|
| 101 |
+
|
| 102 |
+
## How to Run Locally
|
| 103 |
+
|
| 104 |
+
The model structure of DeepSeek-V3.2 and DeepSeek-V3.2-Speciale are the same as DeepSeek-V3.2-Exp. Please visit [DeepSeek-V3.2-Exp](https://github.com/deepseek-ai/DeepSeek-V3.2-Exp) repo for more information about running this model locally.
|
| 105 |
+
|
| 106 |
+
Usage Recommendations:
|
| 107 |
+
|
| 108 |
+
1. For local deployment, we recommend setting the sampling parameters to `temperature = 1.0, top_p = 0.95`.
|
| 109 |
+
2. Please note that the DeepSeek-V3.2-Speciale variant is designed exclusively for deep reasoning tasks and does not support the tool-calling functionality.
|
| 110 |
+
|
| 111 |
+
## License
|
| 112 |
+
|
| 113 |
+
This repository and the model weights are licensed under the [MIT License](LICENSE).
|
| 114 |
+
|
| 115 |
+
## Citation
|
| 116 |
+
|
| 117 |
+
```
|
| 118 |
+
@misc{deepseekai2025deepseekv32,
|
| 119 |
+
title={DeepSeek-V3.2: Pushing the Frontier of Open Large Language Models},
|
| 120 |
+
author={DeepSeek-AI},
|
| 121 |
+
year={2025},
|
| 122 |
+
}
|
| 123 |
+
```
|
| 124 |
+
|
| 125 |
+
## Contact
|
| 126 |
+
|
| 127 |
+
If you have any questions, please raise an issue or contact us at [service@deepseek.com](service@deepseek.com).
|
chat_template.jinja
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{# ----------‑‑‑ special token variables ‑‑‑---------- #}
|
| 2 |
+
{%- set toolcall_begin_token = '<minimax:tool_call>' -%}
|
| 3 |
+
{%- set toolcall_end_token = '</minimax:tool_call>' -%}
|
| 4 |
+
{#- Tool Rendering Functions ============================================== -#}
|
| 5 |
+
{%- macro render_tool_namespace(namespace_name, tool_list) -%}
|
| 6 |
+
{%- for tool in tool_list -%}
|
| 7 |
+
<tool>{{ tool.function | tojson(ensure_ascii=False) }}</tool>
|
| 8 |
+
{% endfor -%}
|
| 9 |
+
{%- endmacro -%}
|
| 10 |
+
{%- macro visible_text(content) -%}
|
| 11 |
+
{%- if content is string -%}
|
| 12 |
+
{{ content }}
|
| 13 |
+
{%- elif content is iterable and content is not mapping -%}
|
| 14 |
+
{%- for item in content -%}
|
| 15 |
+
{%- if item is mapping and item.type == 'text' -%}
|
| 16 |
+
{{- item.text }}
|
| 17 |
+
{%- elif item is string -%}
|
| 18 |
+
{{- item }}
|
| 19 |
+
{%- endif -%}
|
| 20 |
+
{%- endfor -%}
|
| 21 |
+
{%- else -%}
|
| 22 |
+
{{- content }}
|
| 23 |
+
{%- endif -%}
|
| 24 |
+
{%- endmacro -%}
|
| 25 |
+
{#- System Message Construction ============================================ -#}
|
| 26 |
+
{%- macro build_system_message(system_message) -%}
|
| 27 |
+
{%- if system_message and system_message.content -%}
|
| 28 |
+
{{- visible_text(system_message.content) }}
|
| 29 |
+
{%- else -%}
|
| 30 |
+
{%- if model_identity is not defined -%}
|
| 31 |
+
{%- set model_identity = "You are a helpful assistant. Your name is MiniMax-M2.5 and is built by MiniMax." -%}
|
| 32 |
+
{%- endif -%}
|
| 33 |
+
{{- model_identity }}
|
| 34 |
+
{%- endif -%}
|
| 35 |
+
|
| 36 |
+
{#- Handle current_date -#}
|
| 37 |
+
{%- if system_message and system_message.current_date -%}
|
| 38 |
+
{{- '\n' ~ 'Current date: ' + system_message.current_date }}
|
| 39 |
+
{%- endif -%}
|
| 40 |
+
{#- Handle current_location -#}
|
| 41 |
+
{%- if system_message and system_message.current_location -%}
|
| 42 |
+
{{- '\n' ~ 'Current location: ' + system_message.current_location }}
|
| 43 |
+
{%- endif -%}
|
| 44 |
+
{%- endmacro -%}
|
| 45 |
+
{#- Main Template Logic ================================================= -#}
|
| 46 |
+
{#- Extract system message (only first message if it's system) -#}
|
| 47 |
+
{%- set system_message = none -%}
|
| 48 |
+
{%- set conversation_messages = messages -%}
|
| 49 |
+
{%- if messages and messages[0].role == "system" -%}
|
| 50 |
+
{%- set system_message = messages[0] -%}
|
| 51 |
+
{%- set conversation_messages = messages[1:] -%}
|
| 52 |
+
{%- endif -%}
|
| 53 |
+
{#- Get the last user message turn, for interleved thinking -#}
|
| 54 |
+
{%- set ns = namespace(last_user_index=-1) %}
|
| 55 |
+
{% for m in conversation_messages %}
|
| 56 |
+
{%- if m.role == 'user' %}
|
| 57 |
+
{% set ns.last_user_index = loop.index0 -%}
|
| 58 |
+
{%- endif %}
|
| 59 |
+
{%- endfor %}
|
| 60 |
+
{#- Render system message -#}
|
| 61 |
+
{{- ']~!b[' ~ ']~b]system' ~ '\n' }}
|
| 62 |
+
{{- build_system_message(system_message) }}
|
| 63 |
+
{#- Render tools if available -#}
|
| 64 |
+
{%- if tools -%}
|
| 65 |
+
{{- '\n\n' ~ '# Tools' ~ '\n' ~ 'You may call one or more tools to assist with the user query.\nHere are the tools available in JSONSchema format:' ~ '\n' }}
|
| 66 |
+
{{- '\n' ~ '<tools>' ~ '\n' }}
|
| 67 |
+
{{- render_tool_namespace("functions", tools) }}
|
| 68 |
+
{{- '</tools>' ~ '\n\n' }}
|
| 69 |
+
{{- 'When making tool calls, use XML format to invoke tools and pass parameters:' ~ '\n' }}
|
| 70 |
+
{{- '\n' ~ toolcall_begin_token }}
|
| 71 |
+
<invoke name="tool-name-1">
|
| 72 |
+
<parameter name="param-key-1">param-value-1</parameter>
|
| 73 |
+
<parameter name="param-key-2">param-value-2</parameter>
|
| 74 |
+
...
|
| 75 |
+
</invoke>
|
| 76 |
+
{{- '\n' ~ toolcall_end_token }}
|
| 77 |
+
{%- endif -%}
|
| 78 |
+
{{- '[e~[\n' }}
|
| 79 |
+
|
| 80 |
+
{#- Render messages -#}
|
| 81 |
+
{%- set last_tool_call = namespace(name=none) -%}
|
| 82 |
+
{%- for message in conversation_messages -%}
|
| 83 |
+
{%- if message.role == 'assistant' -%}
|
| 84 |
+
{#- Only render reasoning_content if no user message follows -#}
|
| 85 |
+
{{- ']~b]ai' ~ '\n' }}
|
| 86 |
+
|
| 87 |
+
{%- set reasoning_content = '' %}
|
| 88 |
+
{%- set content = visible_text(message.content) %}
|
| 89 |
+
{%- if message.reasoning_content is string %}
|
| 90 |
+
{%- set reasoning_content = message.reasoning_content %}
|
| 91 |
+
{%- else %}
|
| 92 |
+
{%- if '</think>' in content %}
|
| 93 |
+
{%- set reasoning_content = content.split('</think>')[0].strip('\n').split('<think>')[-1].strip('\n') %}
|
| 94 |
+
{%- set content = content.split('</think>')[-1].strip('\n') %}
|
| 95 |
+
{%- endif %}
|
| 96 |
+
{%- endif %}
|
| 97 |
+
{%- if reasoning_content and loop.index0 > ns.last_user_index -%}
|
| 98 |
+
{{- '<think>' ~ '\n' ~ reasoning_content ~ '\n' ~ '</think>' ~ '\n\n' }}
|
| 99 |
+
{%- endif -%}
|
| 100 |
+
{%- if content -%}
|
| 101 |
+
{{- content }}
|
| 102 |
+
{%- endif -%}
|
| 103 |
+
{%- if message.tool_calls -%}
|
| 104 |
+
{{- '\n' ~ toolcall_begin_token ~ '\n' }}
|
| 105 |
+
|
| 106 |
+
{%- for tool_call in message.tool_calls -%}
|
| 107 |
+
{%- if tool_call.function %}
|
| 108 |
+
{%- set tool_call = tool_call.function %}
|
| 109 |
+
{%- endif %}
|
| 110 |
+
{{- '<invoke name="' + tool_call.name + '">' }}
|
| 111 |
+
{% set _args = tool_call.arguments %}
|
| 112 |
+
{%- for k, v in _args.items() %}
|
| 113 |
+
{{- '<parameter name="' + k + '">' }}
|
| 114 |
+
{{- v | tojson(ensure_ascii=False) if v is not string else v }}
|
| 115 |
+
{{- '</parameter>' }}
|
| 116 |
+
{% endfor %}
|
| 117 |
+
{{- '</invoke>' ~ '\n' }}
|
| 118 |
+
{%- endfor -%}
|
| 119 |
+
|
| 120 |
+
{{- toolcall_end_token}}
|
| 121 |
+
{%- set last_tool_call.name = message.tool_calls[-1].name -%}
|
| 122 |
+
{%- else -%}
|
| 123 |
+
{%- set last_tool_call.name = none -%}
|
| 124 |
+
{%- endif -%}
|
| 125 |
+
{{- '[e~[' ~ '\n' }}
|
| 126 |
+
|
| 127 |
+
{%- elif message.role == 'tool' -%}
|
| 128 |
+
{%- if last_tool_call.name is none -%}
|
| 129 |
+
{{- raise_exception("Message has tool role, but there was no previous assistant message with a tool call!") }}
|
| 130 |
+
{%- endif -%}
|
| 131 |
+
{%- if loop.first or (conversation_messages[loop.index0 - 1].role != 'tool') -%}
|
| 132 |
+
{{- ']~b]tool' }}
|
| 133 |
+
{%- endif -%}
|
| 134 |
+
{%- if message.content is string -%}
|
| 135 |
+
{{- '\n<response>' }}
|
| 136 |
+
{{- message.content }}
|
| 137 |
+
{{- '</response>' }}
|
| 138 |
+
{%- else -%}
|
| 139 |
+
{%- for tr in message.content -%}
|
| 140 |
+
{{- '\n<response>' }}
|
| 141 |
+
{{- tr.output if tr.output is defined else (tr.text if tr.type == 'text' and tr.text is defined else tr) }}
|
| 142 |
+
{{- '\n</response>' }}
|
| 143 |
+
{%- endfor -%}
|
| 144 |
+
{%- endif -%}
|
| 145 |
+
{%- if loop.last or (conversation_messages[loop.index0 + 1].role != 'tool') -%}
|
| 146 |
+
{{- '[e~[\n' -}}
|
| 147 |
+
{%- endif -%}
|
| 148 |
+
|
| 149 |
+
{%- elif message.role == 'user' -%}
|
| 150 |
+
{{- ']~b]user' ~ '\n' }}
|
| 151 |
+
{{- visible_text(message.content) }}
|
| 152 |
+
{{- '[e~[' ~ '\n' }}
|
| 153 |
+
{%- endif -%}
|
| 154 |
+
{%- endfor -%}
|
| 155 |
+
|
| 156 |
+
{#- Generation prompt -#}
|
| 157 |
+
{%- if add_generation_prompt -%}
|
| 158 |
+
{{- ']~b]ai' ~ '\n' ~ '<think>' ~ '\n' }}
|
| 159 |
+
{%- endif -%}
|
config.json
ADDED
|
@@ -0,0 +1,606 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"architectures": [
|
| 3 |
+
"MiniMaxM2ForCausalLM"
|
| 4 |
+
],
|
| 5 |
+
"attn_type_list": [
|
| 6 |
+
1,
|
| 7 |
+
1,
|
| 8 |
+
1,
|
| 9 |
+
1,
|
| 10 |
+
1,
|
| 11 |
+
1,
|
| 12 |
+
1,
|
| 13 |
+
1,
|
| 14 |
+
1,
|
| 15 |
+
1,
|
| 16 |
+
1,
|
| 17 |
+
1,
|
| 18 |
+
1,
|
| 19 |
+
1,
|
| 20 |
+
1,
|
| 21 |
+
1,
|
| 22 |
+
1,
|
| 23 |
+
1,
|
| 24 |
+
1,
|
| 25 |
+
1,
|
| 26 |
+
1,
|
| 27 |
+
1,
|
| 28 |
+
1,
|
| 29 |
+
1,
|
| 30 |
+
1,
|
| 31 |
+
1,
|
| 32 |
+
1,
|
| 33 |
+
1,
|
| 34 |
+
1,
|
| 35 |
+
1,
|
| 36 |
+
1,
|
| 37 |
+
1,
|
| 38 |
+
1,
|
| 39 |
+
1,
|
| 40 |
+
1,
|
| 41 |
+
1,
|
| 42 |
+
1,
|
| 43 |
+
1,
|
| 44 |
+
1,
|
| 45 |
+
1,
|
| 46 |
+
1,
|
| 47 |
+
1,
|
| 48 |
+
1,
|
| 49 |
+
1,
|
| 50 |
+
1,
|
| 51 |
+
1,
|
| 52 |
+
1,
|
| 53 |
+
1,
|
| 54 |
+
1,
|
| 55 |
+
1,
|
| 56 |
+
1,
|
| 57 |
+
1,
|
| 58 |
+
1,
|
| 59 |
+
1,
|
| 60 |
+
1,
|
| 61 |
+
1,
|
| 62 |
+
1,
|
| 63 |
+
1,
|
| 64 |
+
1,
|
| 65 |
+
1,
|
| 66 |
+
1,
|
| 67 |
+
1
|
| 68 |
+
],
|
| 69 |
+
"auto_map": {
|
| 70 |
+
"AutoConfig": "configuration_minimax_m2.MiniMaxM2Config",
|
| 71 |
+
"AutoModelForCausalLM": "modeling_minimax_m2.MiniMaxM2ForCausalLM"
|
| 72 |
+
},
|
| 73 |
+
"eos_token_id": 200020,
|
| 74 |
+
"head_dim": 128,
|
| 75 |
+
"hidden_act": "silu",
|
| 76 |
+
"hidden_size": 3072,
|
| 77 |
+
"intermediate_size": 1536,
|
| 78 |
+
"max_position_embeddings": 196608,
|
| 79 |
+
"model_type": "minimax_m2",
|
| 80 |
+
"mtp_transformer_layers": 1,
|
| 81 |
+
"num_attention_heads": 48,
|
| 82 |
+
"num_experts_per_tok": 8,
|
| 83 |
+
"num_hidden_layers": 62,
|
| 84 |
+
"num_key_value_heads": 8,
|
| 85 |
+
"num_local_experts": 256,
|
| 86 |
+
"num_mtp_modules": 3,
|
| 87 |
+
"qk_norm_type": "per_layer",
|
| 88 |
+
"quantization": {
|
| 89 |
+
"group_size": 64,
|
| 90 |
+
"bits": 4,
|
| 91 |
+
"mode": "affine",
|
| 92 |
+
"model.layers.0.block_sparse_moe.gate": {
|
| 93 |
+
"group_size": 64,
|
| 94 |
+
"bits": 8
|
| 95 |
+
},
|
| 96 |
+
"model.layers.1.block_sparse_moe.gate": {
|
| 97 |
+
"group_size": 64,
|
| 98 |
+
"bits": 8
|
| 99 |
+
},
|
| 100 |
+
"model.layers.2.block_sparse_moe.gate": {
|
| 101 |
+
"group_size": 64,
|
| 102 |
+
"bits": 8
|
| 103 |
+
},
|
| 104 |
+
"model.layers.3.block_sparse_moe.gate": {
|
| 105 |
+
"group_size": 64,
|
| 106 |
+
"bits": 8
|
| 107 |
+
},
|
| 108 |
+
"model.layers.4.block_sparse_moe.gate": {
|
| 109 |
+
"group_size": 64,
|
| 110 |
+
"bits": 8
|
| 111 |
+
},
|
| 112 |
+
"model.layers.5.block_sparse_moe.gate": {
|
| 113 |
+
"group_size": 64,
|
| 114 |
+
"bits": 8
|
| 115 |
+
},
|
| 116 |
+
"model.layers.6.block_sparse_moe.gate": {
|
| 117 |
+
"group_size": 64,
|
| 118 |
+
"bits": 8
|
| 119 |
+
},
|
| 120 |
+
"model.layers.7.block_sparse_moe.gate": {
|
| 121 |
+
"group_size": 64,
|
| 122 |
+
"bits": 8
|
| 123 |
+
},
|
| 124 |
+
"model.layers.8.block_sparse_moe.gate": {
|
| 125 |
+
"group_size": 64,
|
| 126 |
+
"bits": 8
|
| 127 |
+
},
|
| 128 |
+
"model.layers.9.block_sparse_moe.gate": {
|
| 129 |
+
"group_size": 64,
|
| 130 |
+
"bits": 8
|
| 131 |
+
},
|
| 132 |
+
"model.layers.10.block_sparse_moe.gate": {
|
| 133 |
+
"group_size": 64,
|
| 134 |
+
"bits": 8
|
| 135 |
+
},
|
| 136 |
+
"model.layers.11.block_sparse_moe.gate": {
|
| 137 |
+
"group_size": 64,
|
| 138 |
+
"bits": 8
|
| 139 |
+
},
|
| 140 |
+
"model.layers.12.block_sparse_moe.gate": {
|
| 141 |
+
"group_size": 64,
|
| 142 |
+
"bits": 8
|
| 143 |
+
},
|
| 144 |
+
"model.layers.13.block_sparse_moe.gate": {
|
| 145 |
+
"group_size": 64,
|
| 146 |
+
"bits": 8
|
| 147 |
+
},
|
| 148 |
+
"model.layers.14.block_sparse_moe.gate": {
|
| 149 |
+
"group_size": 64,
|
| 150 |
+
"bits": 8
|
| 151 |
+
},
|
| 152 |
+
"model.layers.15.block_sparse_moe.gate": {
|
| 153 |
+
"group_size": 64,
|
| 154 |
+
"bits": 8
|
| 155 |
+
},
|
| 156 |
+
"model.layers.16.block_sparse_moe.gate": {
|
| 157 |
+
"group_size": 64,
|
| 158 |
+
"bits": 8
|
| 159 |
+
},
|
| 160 |
+
"model.layers.17.block_sparse_moe.gate": {
|
| 161 |
+
"group_size": 64,
|
| 162 |
+
"bits": 8
|
| 163 |
+
},
|
| 164 |
+
"model.layers.18.block_sparse_moe.gate": {
|
| 165 |
+
"group_size": 64,
|
| 166 |
+
"bits": 8
|
| 167 |
+
},
|
| 168 |
+
"model.layers.19.block_sparse_moe.gate": {
|
| 169 |
+
"group_size": 64,
|
| 170 |
+
"bits": 8
|
| 171 |
+
},
|
| 172 |
+
"model.layers.20.block_sparse_moe.gate": {
|
| 173 |
+
"group_size": 64,
|
| 174 |
+
"bits": 8
|
| 175 |
+
},
|
| 176 |
+
"model.layers.21.block_sparse_moe.gate": {
|
| 177 |
+
"group_size": 64,
|
| 178 |
+
"bits": 8
|
| 179 |
+
},
|
| 180 |
+
"model.layers.22.block_sparse_moe.gate": {
|
| 181 |
+
"group_size": 64,
|
| 182 |
+
"bits": 8
|
| 183 |
+
},
|
| 184 |
+
"model.layers.23.block_sparse_moe.gate": {
|
| 185 |
+
"group_size": 64,
|
| 186 |
+
"bits": 8
|
| 187 |
+
},
|
| 188 |
+
"model.layers.24.block_sparse_moe.gate": {
|
| 189 |
+
"group_size": 64,
|
| 190 |
+
"bits": 8
|
| 191 |
+
},
|
| 192 |
+
"model.layers.25.block_sparse_moe.gate": {
|
| 193 |
+
"group_size": 64,
|
| 194 |
+
"bits": 8
|
| 195 |
+
},
|
| 196 |
+
"model.layers.26.block_sparse_moe.gate": {
|
| 197 |
+
"group_size": 64,
|
| 198 |
+
"bits": 8
|
| 199 |
+
},
|
| 200 |
+
"model.layers.27.block_sparse_moe.gate": {
|
| 201 |
+
"group_size": 64,
|
| 202 |
+
"bits": 8
|
| 203 |
+
},
|
| 204 |
+
"model.layers.28.block_sparse_moe.gate": {
|
| 205 |
+
"group_size": 64,
|
| 206 |
+
"bits": 8
|
| 207 |
+
},
|
| 208 |
+
"model.layers.29.block_sparse_moe.gate": {
|
| 209 |
+
"group_size": 64,
|
| 210 |
+
"bits": 8
|
| 211 |
+
},
|
| 212 |
+
"model.layers.30.block_sparse_moe.gate": {
|
| 213 |
+
"group_size": 64,
|
| 214 |
+
"bits": 8
|
| 215 |
+
},
|
| 216 |
+
"model.layers.31.block_sparse_moe.gate": {
|
| 217 |
+
"group_size": 64,
|
| 218 |
+
"bits": 8
|
| 219 |
+
},
|
| 220 |
+
"model.layers.32.block_sparse_moe.gate": {
|
| 221 |
+
"group_size": 64,
|
| 222 |
+
"bits": 8
|
| 223 |
+
},
|
| 224 |
+
"model.layers.33.block_sparse_moe.gate": {
|
| 225 |
+
"group_size": 64,
|
| 226 |
+
"bits": 8
|
| 227 |
+
},
|
| 228 |
+
"model.layers.34.block_sparse_moe.gate": {
|
| 229 |
+
"group_size": 64,
|
| 230 |
+
"bits": 8
|
| 231 |
+
},
|
| 232 |
+
"model.layers.35.block_sparse_moe.gate": {
|
| 233 |
+
"group_size": 64,
|
| 234 |
+
"bits": 8
|
| 235 |
+
},
|
| 236 |
+
"model.layers.36.block_sparse_moe.gate": {
|
| 237 |
+
"group_size": 64,
|
| 238 |
+
"bits": 8
|
| 239 |
+
},
|
| 240 |
+
"model.layers.37.block_sparse_moe.gate": {
|
| 241 |
+
"group_size": 64,
|
| 242 |
+
"bits": 8
|
| 243 |
+
},
|
| 244 |
+
"model.layers.38.block_sparse_moe.gate": {
|
| 245 |
+
"group_size": 64,
|
| 246 |
+
"bits": 8
|
| 247 |
+
},
|
| 248 |
+
"model.layers.39.block_sparse_moe.gate": {
|
| 249 |
+
"group_size": 64,
|
| 250 |
+
"bits": 8
|
| 251 |
+
},
|
| 252 |
+
"model.layers.40.block_sparse_moe.gate": {
|
| 253 |
+
"group_size": 64,
|
| 254 |
+
"bits": 8
|
| 255 |
+
},
|
| 256 |
+
"model.layers.41.block_sparse_moe.gate": {
|
| 257 |
+
"group_size": 64,
|
| 258 |
+
"bits": 8
|
| 259 |
+
},
|
| 260 |
+
"model.layers.42.block_sparse_moe.gate": {
|
| 261 |
+
"group_size": 64,
|
| 262 |
+
"bits": 8
|
| 263 |
+
},
|
| 264 |
+
"model.layers.43.block_sparse_moe.gate": {
|
| 265 |
+
"group_size": 64,
|
| 266 |
+
"bits": 8
|
| 267 |
+
},
|
| 268 |
+
"model.layers.44.block_sparse_moe.gate": {
|
| 269 |
+
"group_size": 64,
|
| 270 |
+
"bits": 8
|
| 271 |
+
},
|
| 272 |
+
"model.layers.45.block_sparse_moe.gate": {
|
| 273 |
+
"group_size": 64,
|
| 274 |
+
"bits": 8
|
| 275 |
+
},
|
| 276 |
+
"model.layers.46.block_sparse_moe.gate": {
|
| 277 |
+
"group_size": 64,
|
| 278 |
+
"bits": 8
|
| 279 |
+
},
|
| 280 |
+
"model.layers.47.block_sparse_moe.gate": {
|
| 281 |
+
"group_size": 64,
|
| 282 |
+
"bits": 8
|
| 283 |
+
},
|
| 284 |
+
"model.layers.48.block_sparse_moe.gate": {
|
| 285 |
+
"group_size": 64,
|
| 286 |
+
"bits": 8
|
| 287 |
+
},
|
| 288 |
+
"model.layers.49.block_sparse_moe.gate": {
|
| 289 |
+
"group_size": 64,
|
| 290 |
+
"bits": 8
|
| 291 |
+
},
|
| 292 |
+
"model.layers.50.block_sparse_moe.gate": {
|
| 293 |
+
"group_size": 64,
|
| 294 |
+
"bits": 8
|
| 295 |
+
},
|
| 296 |
+
"model.layers.51.block_sparse_moe.gate": {
|
| 297 |
+
"group_size": 64,
|
| 298 |
+
"bits": 8
|
| 299 |
+
},
|
| 300 |
+
"model.layers.52.block_sparse_moe.gate": {
|
| 301 |
+
"group_size": 64,
|
| 302 |
+
"bits": 8
|
| 303 |
+
},
|
| 304 |
+
"model.layers.53.block_sparse_moe.gate": {
|
| 305 |
+
"group_size": 64,
|
| 306 |
+
"bits": 8
|
| 307 |
+
},
|
| 308 |
+
"model.layers.54.block_sparse_moe.gate": {
|
| 309 |
+
"group_size": 64,
|
| 310 |
+
"bits": 8
|
| 311 |
+
},
|
| 312 |
+
"model.layers.55.block_sparse_moe.gate": {
|
| 313 |
+
"group_size": 64,
|
| 314 |
+
"bits": 8
|
| 315 |
+
},
|
| 316 |
+
"model.layers.56.block_sparse_moe.gate": {
|
| 317 |
+
"group_size": 64,
|
| 318 |
+
"bits": 8
|
| 319 |
+
},
|
| 320 |
+
"model.layers.57.block_sparse_moe.gate": {
|
| 321 |
+
"group_size": 64,
|
| 322 |
+
"bits": 8
|
| 323 |
+
},
|
| 324 |
+
"model.layers.58.block_sparse_moe.gate": {
|
| 325 |
+
"group_size": 64,
|
| 326 |
+
"bits": 8
|
| 327 |
+
},
|
| 328 |
+
"model.layers.59.block_sparse_moe.gate": {
|
| 329 |
+
"group_size": 64,
|
| 330 |
+
"bits": 8
|
| 331 |
+
},
|
| 332 |
+
"model.layers.60.block_sparse_moe.gate": {
|
| 333 |
+
"group_size": 64,
|
| 334 |
+
"bits": 8
|
| 335 |
+
},
|
| 336 |
+
"model.layers.61.block_sparse_moe.gate": {
|
| 337 |
+
"group_size": 64,
|
| 338 |
+
"bits": 8
|
| 339 |
+
}
|
| 340 |
+
},
|
| 341 |
+
"quantization_config": {
|
| 342 |
+
"group_size": 64,
|
| 343 |
+
"bits": 4,
|
| 344 |
+
"mode": "affine",
|
| 345 |
+
"model.layers.0.block_sparse_moe.gate": {
|
| 346 |
+
"group_size": 64,
|
| 347 |
+
"bits": 8
|
| 348 |
+
},
|
| 349 |
+
"model.layers.1.block_sparse_moe.gate": {
|
| 350 |
+
"group_size": 64,
|
| 351 |
+
"bits": 8
|
| 352 |
+
},
|
| 353 |
+
"model.layers.2.block_sparse_moe.gate": {
|
| 354 |
+
"group_size": 64,
|
| 355 |
+
"bits": 8
|
| 356 |
+
},
|
| 357 |
+
"model.layers.3.block_sparse_moe.gate": {
|
| 358 |
+
"group_size": 64,
|
| 359 |
+
"bits": 8
|
| 360 |
+
},
|
| 361 |
+
"model.layers.4.block_sparse_moe.gate": {
|
| 362 |
+
"group_size": 64,
|
| 363 |
+
"bits": 8
|
| 364 |
+
},
|
| 365 |
+
"model.layers.5.block_sparse_moe.gate": {
|
| 366 |
+
"group_size": 64,
|
| 367 |
+
"bits": 8
|
| 368 |
+
},
|
| 369 |
+
"model.layers.6.block_sparse_moe.gate": {
|
| 370 |
+
"group_size": 64,
|
| 371 |
+
"bits": 8
|
| 372 |
+
},
|
| 373 |
+
"model.layers.7.block_sparse_moe.gate": {
|
| 374 |
+
"group_size": 64,
|
| 375 |
+
"bits": 8
|
| 376 |
+
},
|
| 377 |
+
"model.layers.8.block_sparse_moe.gate": {
|
| 378 |
+
"group_size": 64,
|
| 379 |
+
"bits": 8
|
| 380 |
+
},
|
| 381 |
+
"model.layers.9.block_sparse_moe.gate": {
|
| 382 |
+
"group_size": 64,
|
| 383 |
+
"bits": 8
|
| 384 |
+
},
|
| 385 |
+
"model.layers.10.block_sparse_moe.gate": {
|
| 386 |
+
"group_size": 64,
|
| 387 |
+
"bits": 8
|
| 388 |
+
},
|
| 389 |
+
"model.layers.11.block_sparse_moe.gate": {
|
| 390 |
+
"group_size": 64,
|
| 391 |
+
"bits": 8
|
| 392 |
+
},
|
| 393 |
+
"model.layers.12.block_sparse_moe.gate": {
|
| 394 |
+
"group_size": 64,
|
| 395 |
+
"bits": 8
|
| 396 |
+
},
|
| 397 |
+
"model.layers.13.block_sparse_moe.gate": {
|
| 398 |
+
"group_size": 64,
|
| 399 |
+
"bits": 8
|
| 400 |
+
},
|
| 401 |
+
"model.layers.14.block_sparse_moe.gate": {
|
| 402 |
+
"group_size": 64,
|
| 403 |
+
"bits": 8
|
| 404 |
+
},
|
| 405 |
+
"model.layers.15.block_sparse_moe.gate": {
|
| 406 |
+
"group_size": 64,
|
| 407 |
+
"bits": 8
|
| 408 |
+
},
|
| 409 |
+
"model.layers.16.block_sparse_moe.gate": {
|
| 410 |
+
"group_size": 64,
|
| 411 |
+
"bits": 8
|
| 412 |
+
},
|
| 413 |
+
"model.layers.17.block_sparse_moe.gate": {
|
| 414 |
+
"group_size": 64,
|
| 415 |
+
"bits": 8
|
| 416 |
+
},
|
| 417 |
+
"model.layers.18.block_sparse_moe.gate": {
|
| 418 |
+
"group_size": 64,
|
| 419 |
+
"bits": 8
|
| 420 |
+
},
|
| 421 |
+
"model.layers.19.block_sparse_moe.gate": {
|
| 422 |
+
"group_size": 64,
|
| 423 |
+
"bits": 8
|
| 424 |
+
},
|
| 425 |
+
"model.layers.20.block_sparse_moe.gate": {
|
| 426 |
+
"group_size": 64,
|
| 427 |
+
"bits": 8
|
| 428 |
+
},
|
| 429 |
+
"model.layers.21.block_sparse_moe.gate": {
|
| 430 |
+
"group_size": 64,
|
| 431 |
+
"bits": 8
|
| 432 |
+
},
|
| 433 |
+
"model.layers.22.block_sparse_moe.gate": {
|
| 434 |
+
"group_size": 64,
|
| 435 |
+
"bits": 8
|
| 436 |
+
},
|
| 437 |
+
"model.layers.23.block_sparse_moe.gate": {
|
| 438 |
+
"group_size": 64,
|
| 439 |
+
"bits": 8
|
| 440 |
+
},
|
| 441 |
+
"model.layers.24.block_sparse_moe.gate": {
|
| 442 |
+
"group_size": 64,
|
| 443 |
+
"bits": 8
|
| 444 |
+
},
|
| 445 |
+
"model.layers.25.block_sparse_moe.gate": {
|
| 446 |
+
"group_size": 64,
|
| 447 |
+
"bits": 8
|
| 448 |
+
},
|
| 449 |
+
"model.layers.26.block_sparse_moe.gate": {
|
| 450 |
+
"group_size": 64,
|
| 451 |
+
"bits": 8
|
| 452 |
+
},
|
| 453 |
+
"model.layers.27.block_sparse_moe.gate": {
|
| 454 |
+
"group_size": 64,
|
| 455 |
+
"bits": 8
|
| 456 |
+
},
|
| 457 |
+
"model.layers.28.block_sparse_moe.gate": {
|
| 458 |
+
"group_size": 64,
|
| 459 |
+
"bits": 8
|
| 460 |
+
},
|
| 461 |
+
"model.layers.29.block_sparse_moe.gate": {
|
| 462 |
+
"group_size": 64,
|
| 463 |
+
"bits": 8
|
| 464 |
+
},
|
| 465 |
+
"model.layers.30.block_sparse_moe.gate": {
|
| 466 |
+
"group_size": 64,
|
| 467 |
+
"bits": 8
|
| 468 |
+
},
|
| 469 |
+
"model.layers.31.block_sparse_moe.gate": {
|
| 470 |
+
"group_size": 64,
|
| 471 |
+
"bits": 8
|
| 472 |
+
},
|
| 473 |
+
"model.layers.32.block_sparse_moe.gate": {
|
| 474 |
+
"group_size": 64,
|
| 475 |
+
"bits": 8
|
| 476 |
+
},
|
| 477 |
+
"model.layers.33.block_sparse_moe.gate": {
|
| 478 |
+
"group_size": 64,
|
| 479 |
+
"bits": 8
|
| 480 |
+
},
|
| 481 |
+
"model.layers.34.block_sparse_moe.gate": {
|
| 482 |
+
"group_size": 64,
|
| 483 |
+
"bits": 8
|
| 484 |
+
},
|
| 485 |
+
"model.layers.35.block_sparse_moe.gate": {
|
| 486 |
+
"group_size": 64,
|
| 487 |
+
"bits": 8
|
| 488 |
+
},
|
| 489 |
+
"model.layers.36.block_sparse_moe.gate": {
|
| 490 |
+
"group_size": 64,
|
| 491 |
+
"bits": 8
|
| 492 |
+
},
|
| 493 |
+
"model.layers.37.block_sparse_moe.gate": {
|
| 494 |
+
"group_size": 64,
|
| 495 |
+
"bits": 8
|
| 496 |
+
},
|
| 497 |
+
"model.layers.38.block_sparse_moe.gate": {
|
| 498 |
+
"group_size": 64,
|
| 499 |
+
"bits": 8
|
| 500 |
+
},
|
| 501 |
+
"model.layers.39.block_sparse_moe.gate": {
|
| 502 |
+
"group_size": 64,
|
| 503 |
+
"bits": 8
|
| 504 |
+
},
|
| 505 |
+
"model.layers.40.block_sparse_moe.gate": {
|
| 506 |
+
"group_size": 64,
|
| 507 |
+
"bits": 8
|
| 508 |
+
},
|
| 509 |
+
"model.layers.41.block_sparse_moe.gate": {
|
| 510 |
+
"group_size": 64,
|
| 511 |
+
"bits": 8
|
| 512 |
+
},
|
| 513 |
+
"model.layers.42.block_sparse_moe.gate": {
|
| 514 |
+
"group_size": 64,
|
| 515 |
+
"bits": 8
|
| 516 |
+
},
|
| 517 |
+
"model.layers.43.block_sparse_moe.gate": {
|
| 518 |
+
"group_size": 64,
|
| 519 |
+
"bits": 8
|
| 520 |
+
},
|
| 521 |
+
"model.layers.44.block_sparse_moe.gate": {
|
| 522 |
+
"group_size": 64,
|
| 523 |
+
"bits": 8
|
| 524 |
+
},
|
| 525 |
+
"model.layers.45.block_sparse_moe.gate": {
|
| 526 |
+
"group_size": 64,
|
| 527 |
+
"bits": 8
|
| 528 |
+
},
|
| 529 |
+
"model.layers.46.block_sparse_moe.gate": {
|
| 530 |
+
"group_size": 64,
|
| 531 |
+
"bits": 8
|
| 532 |
+
},
|
| 533 |
+
"model.layers.47.block_sparse_moe.gate": {
|
| 534 |
+
"group_size": 64,
|
| 535 |
+
"bits": 8
|
| 536 |
+
},
|
| 537 |
+
"model.layers.48.block_sparse_moe.gate": {
|
| 538 |
+
"group_size": 64,
|
| 539 |
+
"bits": 8
|
| 540 |
+
},
|
| 541 |
+
"model.layers.49.block_sparse_moe.gate": {
|
| 542 |
+
"group_size": 64,
|
| 543 |
+
"bits": 8
|
| 544 |
+
},
|
| 545 |
+
"model.layers.50.block_sparse_moe.gate": {
|
| 546 |
+
"group_size": 64,
|
| 547 |
+
"bits": 8
|
| 548 |
+
},
|
| 549 |
+
"model.layers.51.block_sparse_moe.gate": {
|
| 550 |
+
"group_size": 64,
|
| 551 |
+
"bits": 8
|
| 552 |
+
},
|
| 553 |
+
"model.layers.52.block_sparse_moe.gate": {
|
| 554 |
+
"group_size": 64,
|
| 555 |
+
"bits": 8
|
| 556 |
+
},
|
| 557 |
+
"model.layers.53.block_sparse_moe.gate": {
|
| 558 |
+
"group_size": 64,
|
| 559 |
+
"bits": 8
|
| 560 |
+
},
|
| 561 |
+
"model.layers.54.block_sparse_moe.gate": {
|
| 562 |
+
"group_size": 64,
|
| 563 |
+
"bits": 8
|
| 564 |
+
},
|
| 565 |
+
"model.layers.55.block_sparse_moe.gate": {
|
| 566 |
+
"group_size": 64,
|
| 567 |
+
"bits": 8
|
| 568 |
+
},
|
| 569 |
+
"model.layers.56.block_sparse_moe.gate": {
|
| 570 |
+
"group_size": 64,
|
| 571 |
+
"bits": 8
|
| 572 |
+
},
|
| 573 |
+
"model.layers.57.block_sparse_moe.gate": {
|
| 574 |
+
"group_size": 64,
|
| 575 |
+
"bits": 8
|
| 576 |
+
},
|
| 577 |
+
"model.layers.58.block_sparse_moe.gate": {
|
| 578 |
+
"group_size": 64,
|
| 579 |
+
"bits": 8
|
| 580 |
+
},
|
| 581 |
+
"model.layers.59.block_sparse_moe.gate": {
|
| 582 |
+
"group_size": 64,
|
| 583 |
+
"bits": 8
|
| 584 |
+
},
|
| 585 |
+
"model.layers.60.block_sparse_moe.gate": {
|
| 586 |
+
"group_size": 64,
|
| 587 |
+
"bits": 8
|
| 588 |
+
},
|
| 589 |
+
"model.layers.61.block_sparse_moe.gate": {
|
| 590 |
+
"group_size": 64,
|
| 591 |
+
"bits": 8
|
| 592 |
+
}
|
| 593 |
+
},
|
| 594 |
+
"rms_norm_eps": 1e-06,
|
| 595 |
+
"rope_theta": 5000000,
|
| 596 |
+
"rotary_dim": 64,
|
| 597 |
+
"scoring_func": "sigmoid",
|
| 598 |
+
"shared_intermediate_size": 0,
|
| 599 |
+
"tie_word_embeddings": false,
|
| 600 |
+
"transformers_version": "4.46.1",
|
| 601 |
+
"use_cache": true,
|
| 602 |
+
"use_mtp": true,
|
| 603 |
+
"use_qk_norm": true,
|
| 604 |
+
"use_routing_bias": true,
|
| 605 |
+
"vocab_size": 200064
|
| 606 |
+
}
|
configuration_minimax_m2.py
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
|
| 2 |
+
# This file was automatically generated from src/transformers/models/minimax_m2/modular_minimax_m2.py.
|
| 3 |
+
# Do NOT edit this file manually as any edits will be overwritten by the generation of
|
| 4 |
+
# the file from the modular. If any change should be done, please apply the change to the
|
| 5 |
+
# modular_minimax_m2.py file directly. One of our CI enforces this.
|
| 6 |
+
# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
|
| 7 |
+
# coding=utf-8
|
| 8 |
+
# Copyright 2025 the HuggingFace Team. All rights reserved.
|
| 9 |
+
#
|
| 10 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 11 |
+
# you may not use this file except in compliance with the License.
|
| 12 |
+
# You may obtain a copy of the License at
|
| 13 |
+
#
|
| 14 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 15 |
+
#
|
| 16 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 17 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 18 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 19 |
+
# See the License for the specific language governing permissions and
|
| 20 |
+
# limitations under the License.
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
from transformers.configuration_utils import PretrainedConfig
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
class MiniMaxM2Config(PretrainedConfig):
|
| 27 |
+
r"""
|
| 28 |
+
This is the configuration class to store the configuration of a [`MiniMaxM2Model`]. It is used to instantiate an
|
| 29 |
+
MiniMaxM2 model according to the specified arguments, defining the model architecture. Instantiating a configuration
|
| 30 |
+
with the defaults will yield a similar configuration to that of the MiniMaxM2-7B-v0.1 or MiniMaxM2-7B-Instruct-v0.1.
|
| 31 |
+
|
| 32 |
+
[minimax_m2ai/MiniMaxM2-8x7B](https://huggingface.co/minimax_m2ai/MiniMaxM2-8x7B)
|
| 33 |
+
[minimax_m2ai/MiniMaxM2-7B-Instruct-v0.1](https://huggingface.co/minimax_m2ai/MiniMaxM2-7B-Instruct-v0.1)
|
| 34 |
+
|
| 35 |
+
Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the
|
| 36 |
+
documentation from [`PretrainedConfig`] for more information.
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
Args:
|
| 40 |
+
vocab_size (`int`, *optional*, defaults to 32000):
|
| 41 |
+
Vocabulary size of the MiniMaxM2 model. Defines the number of different tokens that can be represented by the
|
| 42 |
+
`inputs_ids` passed when calling [`MiniMaxM2Model`]
|
| 43 |
+
hidden_size (`int`, *optional*, defaults to 4096):
|
| 44 |
+
Dimension of the hidden representations.
|
| 45 |
+
intermediate_size (`int`, *optional*, defaults to 14336):
|
| 46 |
+
Dimension of the MLP representations.
|
| 47 |
+
num_hidden_layers (`int`, *optional*, defaults to 32):
|
| 48 |
+
Number of hidden layers in the Transformer encoder.
|
| 49 |
+
num_attention_heads (`int`, *optional*, defaults to 32):
|
| 50 |
+
Number of attention heads for each attention layer in the Transformer encoder.
|
| 51 |
+
num_key_value_heads (`int`, *optional*, defaults to 8):
|
| 52 |
+
This is the number of key_value heads that should be used to implement Grouped Query Attention. If
|
| 53 |
+
`num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if
|
| 54 |
+
`num_key_value_heads=1` the model will use Multi Query Attention (MQA) otherwise GQA is used. When
|
| 55 |
+
converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed
|
| 56 |
+
by meanpooling all the original heads within that group. For more details, check out [this
|
| 57 |
+
paper](https://huggingface.co/papers/2305.13245). If it is not specified, will default to `8`.
|
| 58 |
+
head_dim (`int`, *optional*, defaults to `hidden_size // num_attention_heads`):
|
| 59 |
+
The attention head dimension.
|
| 60 |
+
hidden_act (`str` or `function`, *optional*, defaults to `"silu"`):
|
| 61 |
+
The non-linear activation function (function or string) in the decoder.
|
| 62 |
+
max_position_embeddings (`int`, *optional*, defaults to `4096*32`):
|
| 63 |
+
The maximum sequence length that this model might ever be used with. MiniMaxM2's sliding window attention
|
| 64 |
+
allows sequence of up to 4096*32 tokens.
|
| 65 |
+
initializer_range (`float`, *optional*, defaults to 0.02):
|
| 66 |
+
The standard deviation of the truncated_normal_initializer for initializing all weight matrices.
|
| 67 |
+
rms_norm_eps (`float`, *optional*, defaults to 1e-05):
|
| 68 |
+
The epsilon used by the rms normalization layers.
|
| 69 |
+
use_cache (`bool`, *optional*, defaults to `True`):
|
| 70 |
+
Whether or not the model should return the last key/values attentions (not used by all models). Only
|
| 71 |
+
relevant if `config.is_decoder=True`.
|
| 72 |
+
pad_token_id (`int`, *optional*):
|
| 73 |
+
The id of the padding token.
|
| 74 |
+
bos_token_id (`int`, *optional*, defaults to 1):
|
| 75 |
+
The id of the "beginning-of-sequence" token.
|
| 76 |
+
eos_token_id (`int`, *optional*, defaults to 2):
|
| 77 |
+
The id of the "end-of-sequence" token.
|
| 78 |
+
tie_word_embeddings (`bool`, *optional*, defaults to `False`):
|
| 79 |
+
Whether the model's input and output word embeddings should be tied.
|
| 80 |
+
rope_theta (`float`, *optional*, defaults to 1000000.0):
|
| 81 |
+
The base period of the RoPE embeddings.
|
| 82 |
+
sliding_window (`int`, *optional*):
|
| 83 |
+
Sliding window attention window size. If not specified, will default to `4096`.
|
| 84 |
+
attention_dropout (`float`, *optional*, defaults to 0.0):
|
| 85 |
+
The dropout ratio for the attention probabilities.
|
| 86 |
+
num_experts_per_tok (`int`, *optional*, defaults to 2):
|
| 87 |
+
The number of experts to route per-token, can be also interpreted as the `top-k` routing
|
| 88 |
+
parameter
|
| 89 |
+
num_local_experts (`int`, *optional*, defaults to 8):
|
| 90 |
+
Number of experts per Sparse MLP layer.
|
| 91 |
+
output_router_logits (`bool`, *optional*, defaults to `False`):
|
| 92 |
+
Whether or not the router logits should be returned by the model. Enabling this will also
|
| 93 |
+
allow the model to output the auxiliary loss. See [here]() for more details
|
| 94 |
+
router_aux_loss_coef (`float`, *optional*, defaults to 0.001):
|
| 95 |
+
The aux loss factor for the total loss.
|
| 96 |
+
router_jitter_noise (`float`, *optional*, defaults to 0.0):
|
| 97 |
+
Amount of noise to add to the router.
|
| 98 |
+
|
| 99 |
+
```python
|
| 100 |
+
>>> from transformers import MiniMaxM2Model, MiniMaxM2Config
|
| 101 |
+
|
| 102 |
+
>>> # Initializing a MiniMaxM2 7B style configuration
|
| 103 |
+
>>> configuration = MiniMaxM2Config()
|
| 104 |
+
|
| 105 |
+
>>> # Initializing a model from the MiniMaxM2 7B style configuration
|
| 106 |
+
>>> model = MiniMaxM2Model(configuration)
|
| 107 |
+
|
| 108 |
+
>>> # Accessing the model configuration
|
| 109 |
+
>>> configuration = model.config
|
| 110 |
+
```"""
|
| 111 |
+
|
| 112 |
+
model_type = "minimax_m2"
|
| 113 |
+
keys_to_ignore_at_inference = ["past_key_values"]
|
| 114 |
+
base_model_tp_plan = {
|
| 115 |
+
"layers.*.self_attn.q_proj": "colwise",
|
| 116 |
+
"layers.*.self_attn.k_proj": "colwise",
|
| 117 |
+
"layers.*.self_attn.v_proj": "colwise",
|
| 118 |
+
"layers.*.self_attn.o_proj": "rowwise",
|
| 119 |
+
"layers.*.block_sparse_moe.gate": "colwise_rep", # we need to replicate here to correctly route experts
|
| 120 |
+
"layers.*.block_sparse_moe.experts.*.w1": "colwise",
|
| 121 |
+
"layers.*.block_sparse_moe.experts.*.w2": "rowwise",
|
| 122 |
+
"layers.*.block_sparse_moe.experts.*.w3": "colwise",
|
| 123 |
+
}
|
| 124 |
+
base_model_pp_plan = {
|
| 125 |
+
"embed_tokens": (["input_ids"], ["inputs_embeds"]),
|
| 126 |
+
"layers": (["hidden_states", "attention_mask"], ["hidden_states"]),
|
| 127 |
+
"norm": (["hidden_states"], ["hidden_states"]),
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
def __init__(
|
| 131 |
+
self,
|
| 132 |
+
vocab_size=32000,
|
| 133 |
+
hidden_size=4096,
|
| 134 |
+
intermediate_size=14336,
|
| 135 |
+
num_hidden_layers=32,
|
| 136 |
+
num_attention_heads=32,
|
| 137 |
+
num_key_value_heads=8,
|
| 138 |
+
head_dim=None,
|
| 139 |
+
hidden_act="silu",
|
| 140 |
+
max_position_embeddings=4096 * 32,
|
| 141 |
+
initializer_range=0.02,
|
| 142 |
+
rms_norm_eps=1e-5,
|
| 143 |
+
use_cache=True,
|
| 144 |
+
pad_token_id=None,
|
| 145 |
+
bos_token_id=1,
|
| 146 |
+
eos_token_id=2,
|
| 147 |
+
tie_word_embeddings=False,
|
| 148 |
+
rope_theta=1e6,
|
| 149 |
+
sliding_window=None,
|
| 150 |
+
attention_dropout=0.0,
|
| 151 |
+
num_experts_per_tok=2,
|
| 152 |
+
num_local_experts=8,
|
| 153 |
+
output_router_logits=False,
|
| 154 |
+
router_aux_loss_coef=0.001,
|
| 155 |
+
router_jitter_noise=0.0,
|
| 156 |
+
**kwargs,
|
| 157 |
+
):
|
| 158 |
+
self.vocab_size = vocab_size
|
| 159 |
+
self.max_position_embeddings = max_position_embeddings
|
| 160 |
+
self.hidden_size = hidden_size
|
| 161 |
+
self.intermediate_size = intermediate_size
|
| 162 |
+
self.num_hidden_layers = num_hidden_layers
|
| 163 |
+
self.num_attention_heads = num_attention_heads
|
| 164 |
+
self.sliding_window = sliding_window
|
| 165 |
+
|
| 166 |
+
# for backward compatibility
|
| 167 |
+
if num_key_value_heads is None:
|
| 168 |
+
num_key_value_heads = num_attention_heads
|
| 169 |
+
|
| 170 |
+
self.num_key_value_heads = num_key_value_heads
|
| 171 |
+
self.hidden_act = hidden_act
|
| 172 |
+
self.initializer_range = initializer_range
|
| 173 |
+
self.rms_norm_eps = rms_norm_eps
|
| 174 |
+
self.use_cache = use_cache
|
| 175 |
+
self.rope_theta = rope_theta
|
| 176 |
+
self.attention_dropout = attention_dropout
|
| 177 |
+
self.head_dim = head_dim
|
| 178 |
+
|
| 179 |
+
self.num_experts_per_tok = num_experts_per_tok
|
| 180 |
+
self.num_local_experts = num_local_experts
|
| 181 |
+
self.output_router_logits = output_router_logits
|
| 182 |
+
self.router_aux_loss_coef = router_aux_loss_coef
|
| 183 |
+
self.router_jitter_noise = router_jitter_noise
|
| 184 |
+
|
| 185 |
+
self.use_qk_norm = kwargs.pop("use_qk_norm", False)
|
| 186 |
+
self.rotary_dim = kwargs.pop("rotary_dim", self.head_dim)
|
| 187 |
+
self.partial_rotary_factor = kwargs.pop("partial_rotary_factor", 1)
|
| 188 |
+
if self.head_dim is not None:
|
| 189 |
+
self.partial_rotary_factor = self.rotary_dim / self.head_dim
|
| 190 |
+
|
| 191 |
+
super().__init__(
|
| 192 |
+
pad_token_id=pad_token_id,
|
| 193 |
+
bos_token_id=bos_token_id,
|
| 194 |
+
eos_token_id=eos_token_id,
|
| 195 |
+
tie_word_embeddings=tie_word_embeddings,
|
| 196 |
+
**kwargs,
|
| 197 |
+
)
|
| 198 |
+
|
| 199 |
+
|
| 200 |
+
__all__ = ["MiniMaxM2Config"]
|
generation_config.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"bos_token_id": 200019,
|
| 3 |
+
"do_sample": true,
|
| 4 |
+
"eos_token_id": 200020,
|
| 5 |
+
"temperature": 1.0,
|
| 6 |
+
"top_p": 0.95,
|
| 7 |
+
"top_k": 40,
|
| 8 |
+
"transformers_version": "4.46.1"
|
| 9 |
+
}
|
model-00001-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:20924b5d96fe9217a21c83ee523de657cf8edcdd6eda496b0bf47dd51f5255eb
|
| 3 |
+
size 5179102923
|
model-00002-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:106b46b953919ff71ff0e349f026850355c27cd7b3563f14b06c9f5243cb6afe
|
| 3 |
+
size 4807718362
|
model-00003-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1ee6b84927e24a395eac000eaa7e5bd9a56346a49b9c7461775a9be6d060382f
|
| 3 |
+
size 4833405645
|
model-00004-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f05deab676d747cd1bb47114dea01663a32863007fb27a4bf28b8e4101420163
|
| 3 |
+
size 4807718386
|
model-00005-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:cbad23e38e6fb1693653bc98f73350305f885bd6230759d2ddc14d325ac7859e
|
| 3 |
+
size 4807718436
|
model-00006-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:c203a4246029e47f1750bb5b83025902df7ba78a3bb781c086e042f44dfdb22a
|
| 3 |
+
size 4833405664
|
model-00007-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:332869c31a7b50f7ad1cb57910d5e0265a663f506d5624060bc19ed39317df80
|
| 3 |
+
size 4807718389
|
model-00008-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:534c4a9141d47c497373b8ae6180ca37a013d06a4a91867b9f3a964701b846c0
|
| 3 |
+
size 4807718441
|
model-00009-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:a90c1b94b70104ebbd720ceec0c6f953946caff478e649cb7927db4a22ef8cf3
|
| 3 |
+
size 4833405746
|
model-00010-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b66ba2653242817e0aafa6d49e2d2c882bb93f4a99484184715d60b0c4952d24
|
| 3 |
+
size 4807718429
|
model-00011-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:25c6a3e11cd9e0189c98a4678476cb7aad1df32b4e76105907b1d720d0a25db5
|
| 3 |
+
size 4807718457
|
model-00012-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:b1a1aaeb47728344ab2fd4cba3a5586e3919a1983114b331040d85cb80796cb7
|
| 3 |
+
size 4833405698
|
model-00013-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0231b334a38395d6f3e930409dcc1d80cda2553237cfe14ca8586a2bac659d0a
|
| 3 |
+
size 4807718425
|
model-00014-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:046bee6e695b3db5f5244e3116d9349c758508c77d9a0844d1b7fc55ab01b30d
|
| 3 |
+
size 4807718421
|
model-00015-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f335cadc930d37aea19b627ab1985da6666db8d3b119bbcf6f73c5c903ac3f25
|
| 3 |
+
size 4833405714
|
model-00016-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:ae762faa083dde35dc2adf1d743a8d5ae4942b92ac33b91b2de5ea9b5ae7b6a6
|
| 3 |
+
size 4807718437
|
model-00017-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:0aeb45293470496f1fbf12fe0d4a407923f203419c3f0f121eca7501b7f7e6d9
|
| 3 |
+
size 4807718457
|
model-00018-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2bf1edc1693b92837dd2314f41010983f57786570e034a5cf39c8c6bf74b8028
|
| 3 |
+
size 4833405688
|
model-00019-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2231b65ca805cb50536ab4747ae8428a46a1ff7e46dca4a96ed0c6d2278aaeb7
|
| 3 |
+
size 4807718439
|
model-00020-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:66a4e8160e8193604f263a10142239217f483a511b9fea06007402a485f76edd
|
| 3 |
+
size 4807718455
|
model-00021-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:47ead1bf635cec1ddfa3e4b8486c10398a78f82ec1633d635d27504788888a19
|
| 3 |
+
size 4833405688
|
model-00022-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2ebe1b1b131ac1d506afcf243b6e4f2e4a0bf3a0555bbed78beceba7e02a793c
|
| 3 |
+
size 4807718447
|
model-00023-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:f8e4c1ef0b712dafb20c55ce3daacbfc80e5948ad936b08d52fa1c228c7f6d07
|
| 3 |
+
size 4807718465
|
model-00024-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4cf13992bfe42aeb8f34468e686e5bac1742f7b0a4e3e52a086b3140b6e8116c
|
| 3 |
+
size 4833405698
|
model-00025-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7ea21ab54f917ea5a48e2c3928c609ebc23448ba45b1ea49a6343ac7f8f30aae
|
| 3 |
+
size 4807718423
|
model-00026-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:3410b631f78fca5af900773b30359bf9bbb70ece3ba056b94b51827cf78525b6
|
| 3 |
+
size 4807718431
|
model-00027-of-00027.safetensors
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:1158b0e3d05ba0f6c8af971c07b59f9282f2d2e3ad5cfbd76e5ab218def237dc
|
| 3 |
+
size 3089328862
|
model.safetensors.index.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
modeling_minimax_m2.py
ADDED
|
@@ -0,0 +1,706 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
|
| 2 |
+
# This file was automatically generated from src/transformers/models/minimax_m2/modular_minimax_m2.py.
|
| 3 |
+
# Do NOT edit this file manually as any edits will be overwritten by the generation of
|
| 4 |
+
# the file from the modular. If any change should be done, please apply the change to the
|
| 5 |
+
# modular_minimax_m2.py file directly. One of our CI enforces this.
|
| 6 |
+
# 🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨🚨
|
| 7 |
+
# coding=utf-8
|
| 8 |
+
# Copyright 2025 the HuggingFace Team. All rights reserved.
|
| 9 |
+
#
|
| 10 |
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
| 11 |
+
# you may not use this file except in compliance with the License.
|
| 12 |
+
# You may obtain a copy of the License at
|
| 13 |
+
#
|
| 14 |
+
# http://www.apache.org/licenses/LICENSE-2.0
|
| 15 |
+
#
|
| 16 |
+
# Unless required by applicable law or agreed to in writing, software
|
| 17 |
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
| 18 |
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| 19 |
+
# See the License for the specific language governing permissions and
|
| 20 |
+
# limitations under the License.
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
from collections.abc import Callable
|
| 24 |
+
from typing import Optional, Union, Unpack
|
| 25 |
+
|
| 26 |
+
import torch
|
| 27 |
+
from torch import nn
|
| 28 |
+
|
| 29 |
+
from transformers.activations import ACT2FN
|
| 30 |
+
from transformers.cache_utils import Cache, DynamicCache
|
| 31 |
+
from transformers.generation import GenerationMixin
|
| 32 |
+
from transformers.integrations import use_kernel_forward_from_hub
|
| 33 |
+
from transformers.masking_utils import create_causal_mask, create_sliding_window_causal_mask
|
| 34 |
+
from transformers.modeling_flash_attention_utils import FlashAttentionKwargs
|
| 35 |
+
from transformers.modeling_layers import (
|
| 36 |
+
GenericForQuestionAnswering,
|
| 37 |
+
GenericForSequenceClassification,
|
| 38 |
+
GenericForTokenClassification,
|
| 39 |
+
GradientCheckpointingLayer,
|
| 40 |
+
)
|
| 41 |
+
from transformers.modeling_outputs import MoeCausalLMOutputWithPast, MoeModelOutputWithPast
|
| 42 |
+
from transformers.modeling_rope_utils import ROPE_INIT_FUNCTIONS, dynamic_rope_update
|
| 43 |
+
from transformers.modeling_utils import ALL_ATTENTION_FUNCTIONS, PreTrainedModel
|
| 44 |
+
from transformers.utils import TransformersKwargs, auto_docstring, can_return_tuple
|
| 45 |
+
from transformers.utils.deprecation import deprecate_kwarg
|
| 46 |
+
from transformers.utils.generic import OutputRecorder, check_model_inputs
|
| 47 |
+
from .configuration_minimax_m2 import MiniMaxM2Config
|
| 48 |
+
|
| 49 |
+
|
| 50 |
+
class MiniMaxM2MLP(nn.Module):
|
| 51 |
+
def __init__(self, config: MiniMaxM2Config):
|
| 52 |
+
super().__init__()
|
| 53 |
+
self.ffn_dim = config.intermediate_size
|
| 54 |
+
self.hidden_dim = config.hidden_size
|
| 55 |
+
|
| 56 |
+
self.w1 = nn.Linear(self.hidden_dim, self.ffn_dim, bias=False)
|
| 57 |
+
self.w2 = nn.Linear(self.ffn_dim, self.hidden_dim, bias=False)
|
| 58 |
+
self.w3 = nn.Linear(self.hidden_dim, self.ffn_dim, bias=False)
|
| 59 |
+
|
| 60 |
+
self.act_fn = ACT2FN[config.hidden_act]
|
| 61 |
+
|
| 62 |
+
def forward(self, hidden_states):
|
| 63 |
+
current_hidden_states = self.act_fn(self.w1(hidden_states)) * self.w3(hidden_states)
|
| 64 |
+
current_hidden_states = self.w2(current_hidden_states)
|
| 65 |
+
return current_hidden_states
|
| 66 |
+
|
| 67 |
+
|
| 68 |
+
class MiniMaxM2Experts(nn.ModuleList):
|
| 69 |
+
"""
|
| 70 |
+
ModuleList of experts.
|
| 71 |
+
"""
|
| 72 |
+
|
| 73 |
+
def __init__(self, config: MiniMaxM2Config):
|
| 74 |
+
super().__init__()
|
| 75 |
+
self.top_k = config.num_experts_per_tok
|
| 76 |
+
self.num_experts = config.num_local_experts
|
| 77 |
+
for _ in range(self.num_experts):
|
| 78 |
+
self.append(MiniMaxM2MLP(config))
|
| 79 |
+
|
| 80 |
+
def forward(
|
| 81 |
+
self, hidden_states: torch.Tensor, top_k_index: torch.Tensor, top_k_weights: torch.Tensor
|
| 82 |
+
) -> torch.Tensor:
|
| 83 |
+
"""
|
| 84 |
+
Args:
|
| 85 |
+
hidden_states: (batch_size * sequence_length, hidden_dim)
|
| 86 |
+
selected_experts: (batch_size * sequence_length, top_k)
|
| 87 |
+
routing_weights: (batch_size * sequence_length, top_k)
|
| 88 |
+
Returns:
|
| 89 |
+
(batch_size * sequence_length, hidden_dim)
|
| 90 |
+
"""
|
| 91 |
+
final_hidden_states = torch.zeros_like(hidden_states)
|
| 92 |
+
expert_mask = torch.nn.functional.one_hot(top_k_index, num_classes=self.num_experts).permute(2, 1, 0)
|
| 93 |
+
|
| 94 |
+
expert_hit = torch.greater(expert_mask.sum(dim=(-1, -2)), 0).nonzero()
|
| 95 |
+
for expert_idx in expert_hit:
|
| 96 |
+
idx, top_x = torch.where(expert_mask[expert_idx].squeeze(0))
|
| 97 |
+
current_state = hidden_states[None, top_x].reshape(-1, hidden_states.shape[-1])
|
| 98 |
+
current_hidden_states = self[expert_idx](current_state) * top_k_weights[top_x, idx, None]
|
| 99 |
+
final_hidden_states.index_add_(0, top_x, current_hidden_states.to(hidden_states.dtype))
|
| 100 |
+
return final_hidden_states
|
| 101 |
+
|
| 102 |
+
|
| 103 |
+
class MiniMaxM2SparseMoeBlock(nn.Module):
|
| 104 |
+
def __init__(self, config):
|
| 105 |
+
super().__init__()
|
| 106 |
+
self.top_k = config.num_experts_per_tok
|
| 107 |
+
self.jitter_noise = config.router_jitter_noise
|
| 108 |
+
self.gate = nn.Linear(config.hidden_size, config.num_local_experts, bias=False)
|
| 109 |
+
self.experts = MiniMaxM2Experts(config)
|
| 110 |
+
self.register_buffer("e_score_correction_bias", torch.zeros(config.num_local_experts))
|
| 111 |
+
|
| 112 |
+
def route_tokens_to_experts(self, router_logits):
|
| 113 |
+
routing_weights = torch.nn.functional.sigmoid(router_logits.float())
|
| 114 |
+
scores_for_choice = routing_weights + self.e_score_correction_bias
|
| 115 |
+
_, top_k_index = torch.topk(scores_for_choice, self.top_k, dim=-1, sorted=False)
|
| 116 |
+
top_k_weights = routing_weights.gather(1, top_k_index)
|
| 117 |
+
top_k_weights /= top_k_weights.sum(dim=-1, keepdim=True)
|
| 118 |
+
return top_k_index, top_k_weights.to(router_logits.dtype)
|
| 119 |
+
|
| 120 |
+
def forward(self, hidden_states: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]:
|
| 121 |
+
batch_size, sequence_length, hidden_dim = hidden_states.shape
|
| 122 |
+
if self.training and self.jitter_noise > 0:
|
| 123 |
+
hidden_states *= torch.empty_like(hidden_states).uniform_(1.0 - self.jitter_noise, 1.0 + self.jitter_noise)
|
| 124 |
+
hidden_states = hidden_states.view(-1, hidden_states.shape[-1])
|
| 125 |
+
router_logits = self.gate(hidden_states)
|
| 126 |
+
top_k_index, top_k_weights = self.route_tokens_to_experts(router_logits)
|
| 127 |
+
hidden_states = self.experts(hidden_states, top_k_index, top_k_weights.to(hidden_states.dtype))
|
| 128 |
+
hidden_states = hidden_states.reshape(batch_size, sequence_length, hidden_dim)
|
| 129 |
+
return hidden_states, router_logits
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
@use_kernel_forward_from_hub("RMSNorm")
|
| 133 |
+
class MiniMaxM2RMSNorm(nn.Module):
|
| 134 |
+
def __init__(self, hidden_size, eps=1e-6):
|
| 135 |
+
"""
|
| 136 |
+
MiniMaxM2RMSNorm is equivalent to T5LayerNorm
|
| 137 |
+
"""
|
| 138 |
+
super().__init__()
|
| 139 |
+
self.weight = nn.Parameter(torch.ones(hidden_size))
|
| 140 |
+
self.variance_epsilon = eps
|
| 141 |
+
|
| 142 |
+
def forward(self, hidden_states):
|
| 143 |
+
input_dtype = hidden_states.dtype
|
| 144 |
+
hidden_states = hidden_states.to(torch.float32)
|
| 145 |
+
variance = hidden_states.pow(2).mean(-1, keepdim=True)
|
| 146 |
+
hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
|
| 147 |
+
return self.weight * hidden_states.to(input_dtype)
|
| 148 |
+
|
| 149 |
+
def extra_repr(self):
|
| 150 |
+
return f"{tuple(self.weight.shape)}, eps={self.variance_epsilon}"
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:
|
| 154 |
+
"""
|
| 155 |
+
This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch,
|
| 156 |
+
num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim)
|
| 157 |
+
"""
|
| 158 |
+
batch, num_key_value_heads, slen, head_dim = hidden_states.shape
|
| 159 |
+
if n_rep == 1:
|
| 160 |
+
return hidden_states
|
| 161 |
+
hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)
|
| 162 |
+
return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
def eager_attention_forward(
|
| 166 |
+
module: nn.Module,
|
| 167 |
+
query: torch.Tensor,
|
| 168 |
+
key: torch.Tensor,
|
| 169 |
+
value: torch.Tensor,
|
| 170 |
+
attention_mask: Optional[torch.Tensor],
|
| 171 |
+
scaling: float,
|
| 172 |
+
dropout: float = 0.0,
|
| 173 |
+
**kwargs: Unpack[TransformersKwargs],
|
| 174 |
+
):
|
| 175 |
+
key_states = repeat_kv(key, module.num_key_value_groups)
|
| 176 |
+
value_states = repeat_kv(value, module.num_key_value_groups)
|
| 177 |
+
|
| 178 |
+
attn_weights = torch.matmul(query, key_states.transpose(2, 3)) * scaling
|
| 179 |
+
if attention_mask is not None:
|
| 180 |
+
causal_mask = attention_mask[:, :, :, : key_states.shape[-2]]
|
| 181 |
+
attn_weights = attn_weights + causal_mask
|
| 182 |
+
|
| 183 |
+
attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query.dtype)
|
| 184 |
+
attn_weights = nn.functional.dropout(attn_weights, p=dropout, training=module.training)
|
| 185 |
+
attn_output = torch.matmul(attn_weights, value_states)
|
| 186 |
+
attn_output = attn_output.transpose(1, 2).contiguous()
|
| 187 |
+
|
| 188 |
+
return attn_output, attn_weights
|
| 189 |
+
|
| 190 |
+
|
| 191 |
+
def rotate_half(x):
|
| 192 |
+
"""Rotates half the hidden dims of the input."""
|
| 193 |
+
x1 = x[..., : x.shape[-1] // 2]
|
| 194 |
+
x2 = x[..., x.shape[-1] // 2 :]
|
| 195 |
+
return torch.cat((-x2, x1), dim=-1)
|
| 196 |
+
|
| 197 |
+
|
| 198 |
+
def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1):
|
| 199 |
+
"""Applies Rotary Position Embedding to the query and key tensors.
|
| 200 |
+
|
| 201 |
+
Args:
|
| 202 |
+
q (`torch.Tensor`): The query tensor.
|
| 203 |
+
k (`torch.Tensor`): The key tensor.
|
| 204 |
+
cos (`torch.Tensor`): The cosine part of the rotary embedding.
|
| 205 |
+
sin (`torch.Tensor`): The sine part of the rotary embedding.
|
| 206 |
+
position_ids (`torch.Tensor`, *optional*):
|
| 207 |
+
Deprecated and unused.
|
| 208 |
+
unsqueeze_dim (`int`, *optional*, defaults to 1):
|
| 209 |
+
The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and
|
| 210 |
+
sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note
|
| 211 |
+
that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and
|
| 212 |
+
k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes
|
| 213 |
+
cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have
|
| 214 |
+
the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2.
|
| 215 |
+
Returns:
|
| 216 |
+
`tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding.
|
| 217 |
+
"""
|
| 218 |
+
cos = cos.unsqueeze(unsqueeze_dim)
|
| 219 |
+
sin = sin.unsqueeze(unsqueeze_dim)
|
| 220 |
+
|
| 221 |
+
# Keep half or full tensor for later concatenation
|
| 222 |
+
rotary_dim = cos.shape[-1]
|
| 223 |
+
q_rot, q_pass = q[..., :rotary_dim], q[..., rotary_dim:]
|
| 224 |
+
k_rot, k_pass = k[..., :rotary_dim], k[..., rotary_dim:]
|
| 225 |
+
|
| 226 |
+
# Apply rotary embeddings on the first half or full tensor
|
| 227 |
+
q_embed = (q_rot * cos) + (rotate_half(q_rot) * sin)
|
| 228 |
+
k_embed = (k_rot * cos) + (rotate_half(k_rot) * sin)
|
| 229 |
+
|
| 230 |
+
# Concatenate back to full shape
|
| 231 |
+
q_embed = torch.cat([q_embed, q_pass], dim=-1)
|
| 232 |
+
k_embed = torch.cat([k_embed, k_pass], dim=-1)
|
| 233 |
+
return q_embed, k_embed
|
| 234 |
+
|
| 235 |
+
|
| 236 |
+
class MiniMaxM2Attention(nn.Module):
|
| 237 |
+
"""Multi-headed attention from 'Attention Is All You Need' paper"""
|
| 238 |
+
|
| 239 |
+
def __init__(self, config: MiniMaxM2Config, layer_idx: int):
|
| 240 |
+
super().__init__()
|
| 241 |
+
self.config = config
|
| 242 |
+
self.layer_idx = layer_idx
|
| 243 |
+
self.head_dim = getattr(config, "head_dim", None) or config.hidden_size // config.num_attention_heads
|
| 244 |
+
self.num_key_value_groups = config.num_attention_heads // config.num_key_value_heads
|
| 245 |
+
self.scaling = self.head_dim**-0.5
|
| 246 |
+
self.attention_dropout = config.attention_dropout
|
| 247 |
+
self.is_causal = True
|
| 248 |
+
self.q_proj = nn.Linear(config.hidden_size, config.num_attention_heads * self.head_dim, bias=False)
|
| 249 |
+
self.k_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=False)
|
| 250 |
+
self.v_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=False)
|
| 251 |
+
self.o_proj = nn.Linear(config.num_attention_heads * self.head_dim, config.hidden_size, bias=False)
|
| 252 |
+
|
| 253 |
+
self.use_qk_norm = config.use_qk_norm
|
| 254 |
+
if self.use_qk_norm:
|
| 255 |
+
self.q_norm = MiniMaxM2RMSNorm(self.head_dim * config.num_attention_heads, eps=config.rms_norm_eps)
|
| 256 |
+
self.k_norm = MiniMaxM2RMSNorm(self.head_dim * config.num_key_value_heads, eps=config.rms_norm_eps)
|
| 257 |
+
|
| 258 |
+
@deprecate_kwarg("past_key_value", new_name="past_key_values", version="4.58")
|
| 259 |
+
def forward(
|
| 260 |
+
self,
|
| 261 |
+
hidden_states: torch.Tensor,
|
| 262 |
+
position_embeddings: tuple[torch.Tensor, torch.Tensor],
|
| 263 |
+
attention_mask: Optional[torch.Tensor],
|
| 264 |
+
past_key_values: Optional[Cache] = None,
|
| 265 |
+
cache_position: Optional[torch.LongTensor] = None,
|
| 266 |
+
**kwargs: Unpack[FlashAttentionKwargs],
|
| 267 |
+
) -> tuple[torch.Tensor, Optional[torch.Tensor]]:
|
| 268 |
+
input_shape = hidden_states.shape[:-1]
|
| 269 |
+
hidden_shape = (*input_shape, -1, self.head_dim)
|
| 270 |
+
|
| 271 |
+
query_states = self.q_proj(hidden_states)
|
| 272 |
+
key_states = self.k_proj(hidden_states)
|
| 273 |
+
value_states = self.v_proj(hidden_states)
|
| 274 |
+
|
| 275 |
+
if self.use_qk_norm: # main diff from Llama
|
| 276 |
+
query_states = self.q_norm(query_states)
|
| 277 |
+
key_states = self.k_norm(key_states)
|
| 278 |
+
|
| 279 |
+
key_states = key_states.view(hidden_shape)
|
| 280 |
+
query_states = query_states.view(hidden_shape)
|
| 281 |
+
value_states = value_states.view(hidden_shape)
|
| 282 |
+
|
| 283 |
+
query_states = query_states.transpose(1, 2)
|
| 284 |
+
key_states = key_states.transpose(1, 2)
|
| 285 |
+
value_states = value_states.transpose(1, 2)
|
| 286 |
+
|
| 287 |
+
cos, sin = position_embeddings
|
| 288 |
+
query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin)
|
| 289 |
+
|
| 290 |
+
if past_key_values is not None:
|
| 291 |
+
# sin and cos are specific to RoPE models; position_ids needed for the static cache
|
| 292 |
+
cache_kwargs = {"sin": sin, "cos": cos, "cache_position": cache_position}
|
| 293 |
+
key_states, value_states = past_key_values.update(key_states, value_states, self.layer_idx, cache_kwargs)
|
| 294 |
+
|
| 295 |
+
attention_interface: Callable = eager_attention_forward
|
| 296 |
+
if self.config._attn_implementation != "eager":
|
| 297 |
+
attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation]
|
| 298 |
+
|
| 299 |
+
attn_output, attn_weights = attention_interface(
|
| 300 |
+
self,
|
| 301 |
+
query_states,
|
| 302 |
+
key_states,
|
| 303 |
+
value_states,
|
| 304 |
+
attention_mask,
|
| 305 |
+
dropout=0.0 if not self.training else self.attention_dropout,
|
| 306 |
+
scaling=self.scaling,
|
| 307 |
+
**kwargs,
|
| 308 |
+
)
|
| 309 |
+
|
| 310 |
+
attn_output = attn_output.reshape(*input_shape, -1).contiguous()
|
| 311 |
+
attn_output = self.o_proj(attn_output)
|
| 312 |
+
return attn_output, attn_weights
|
| 313 |
+
|
| 314 |
+
|
| 315 |
+
class MiniMaxM2DecoderLayer(GradientCheckpointingLayer):
|
| 316 |
+
def __init__(self, config: MiniMaxM2Config, layer_idx: int):
|
| 317 |
+
super().__init__()
|
| 318 |
+
self.hidden_size = config.hidden_size
|
| 319 |
+
|
| 320 |
+
self.self_attn = MiniMaxM2Attention(config, layer_idx)
|
| 321 |
+
|
| 322 |
+
self.block_sparse_moe = MiniMaxM2SparseMoeBlock(config)
|
| 323 |
+
self.input_layernorm = MiniMaxM2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
|
| 324 |
+
self.post_attention_layernorm = MiniMaxM2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
|
| 325 |
+
|
| 326 |
+
@deprecate_kwarg("past_key_value", new_name="past_key_values", version="4.58")
|
| 327 |
+
def forward(
|
| 328 |
+
self,
|
| 329 |
+
hidden_states: torch.Tensor,
|
| 330 |
+
position_embeddings: tuple[torch.Tensor, torch.Tensor],
|
| 331 |
+
attention_mask: Optional[torch.Tensor] = None,
|
| 332 |
+
position_ids: Optional[torch.LongTensor] = None,
|
| 333 |
+
past_key_values: Optional[Cache] = None,
|
| 334 |
+
cache_position: Optional[torch.LongTensor] = None,
|
| 335 |
+
**kwargs: Unpack[TransformersKwargs],
|
| 336 |
+
) -> torch.FloatTensor:
|
| 337 |
+
residual = hidden_states
|
| 338 |
+
|
| 339 |
+
hidden_states = self.input_layernorm(hidden_states)
|
| 340 |
+
|
| 341 |
+
# Self Attention
|
| 342 |
+
hidden_states, _ = self.self_attn(
|
| 343 |
+
hidden_states=hidden_states,
|
| 344 |
+
position_embeddings=position_embeddings,
|
| 345 |
+
attention_mask=attention_mask,
|
| 346 |
+
position_ids=position_ids,
|
| 347 |
+
past_key_values=past_key_values,
|
| 348 |
+
cache_position=cache_position,
|
| 349 |
+
**kwargs,
|
| 350 |
+
)
|
| 351 |
+
hidden_states = residual + hidden_states
|
| 352 |
+
|
| 353 |
+
# Fully Connected
|
| 354 |
+
residual = hidden_states
|
| 355 |
+
hidden_states = self.post_attention_layernorm(hidden_states)
|
| 356 |
+
hidden_states, _ = self.block_sparse_moe(hidden_states)
|
| 357 |
+
hidden_states = residual + hidden_states
|
| 358 |
+
|
| 359 |
+
return hidden_states
|
| 360 |
+
|
| 361 |
+
|
| 362 |
+
class MiniMaxM2RotaryEmbedding(nn.Module):
|
| 363 |
+
inv_freq: torch.Tensor # fix linting for `register_buffer`
|
| 364 |
+
|
| 365 |
+
def __init__(self, config: MiniMaxM2Config, device=None):
|
| 366 |
+
super().__init__()
|
| 367 |
+
# BC: "rope_type" was originally "type"
|
| 368 |
+
if hasattr(config, "rope_scaling") and isinstance(config.rope_scaling, dict):
|
| 369 |
+
self.rope_type = config.rope_scaling.get("rope_type", config.rope_scaling.get("type"))
|
| 370 |
+
else:
|
| 371 |
+
self.rope_type = "default"
|
| 372 |
+
self.max_seq_len_cached = config.max_position_embeddings
|
| 373 |
+
self.original_max_seq_len = config.max_position_embeddings
|
| 374 |
+
|
| 375 |
+
self.config = config
|
| 376 |
+
self.rope_init_fn = ROPE_INIT_FUNCTIONS[self.rope_type]
|
| 377 |
+
|
| 378 |
+
inv_freq, self.attention_scaling = self.rope_init_fn(self.config, device)
|
| 379 |
+
self.register_buffer("inv_freq", inv_freq, persistent=False)
|
| 380 |
+
self.original_inv_freq = self.inv_freq
|
| 381 |
+
|
| 382 |
+
@torch.no_grad()
|
| 383 |
+
@dynamic_rope_update # power user: used with advanced RoPE types (e.g. dynamic rope)
|
| 384 |
+
def forward(self, x, position_ids):
|
| 385 |
+
inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1).to(x.device)
|
| 386 |
+
position_ids_expanded = position_ids[:, None, :].float()
|
| 387 |
+
|
| 388 |
+
device_type = x.device.type if isinstance(x.device.type, str) and x.device.type != "mps" else "cpu"
|
| 389 |
+
with torch.autocast(device_type=device_type, enabled=False): # Force float32
|
| 390 |
+
freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)
|
| 391 |
+
emb = torch.cat((freqs, freqs), dim=-1)
|
| 392 |
+
cos = emb.cos() * self.attention_scaling
|
| 393 |
+
sin = emb.sin() * self.attention_scaling
|
| 394 |
+
|
| 395 |
+
return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype)
|
| 396 |
+
|
| 397 |
+
|
| 398 |
+
@auto_docstring
|
| 399 |
+
class MiniMaxM2PreTrainedModel(PreTrainedModel):
|
| 400 |
+
config: MiniMaxM2Config
|
| 401 |
+
base_model_prefix = "model"
|
| 402 |
+
supports_gradient_checkpointing = True
|
| 403 |
+
_no_split_modules = ["MiniMaxM2DecoderLayer"]
|
| 404 |
+
_skip_keys_device_placement = ["past_key_values"]
|
| 405 |
+
_supports_flash_attn = True
|
| 406 |
+
_supports_sdpa = True
|
| 407 |
+
_supports_flex_attn = True
|
| 408 |
+
_can_compile_fullgraph = False # MoE models don't work with torch.compile (`torch.where(condition)` not supported)
|
| 409 |
+
_supports_attention_backend = True
|
| 410 |
+
_can_record_outputs = {
|
| 411 |
+
"router_logits": OutputRecorder(MiniMaxM2SparseMoeBlock, index=1),
|
| 412 |
+
"hidden_states": MiniMaxM2DecoderLayer,
|
| 413 |
+
"attentions": MiniMaxM2Attention,
|
| 414 |
+
}
|
| 415 |
+
|
| 416 |
+
|
| 417 |
+
@auto_docstring
|
| 418 |
+
class MiniMaxM2Model(MiniMaxM2PreTrainedModel):
|
| 419 |
+
def __init__(self, config: MiniMaxM2Config):
|
| 420 |
+
super().__init__(config)
|
| 421 |
+
self.padding_idx = config.pad_token_id
|
| 422 |
+
self.vocab_size = config.vocab_size
|
| 423 |
+
|
| 424 |
+
self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
|
| 425 |
+
self.layers = nn.ModuleList(
|
| 426 |
+
[MiniMaxM2DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
|
| 427 |
+
)
|
| 428 |
+
self.norm = MiniMaxM2RMSNorm(config.hidden_size, eps=config.rms_norm_eps)
|
| 429 |
+
self.rotary_emb = MiniMaxM2RotaryEmbedding(config=config)
|
| 430 |
+
self.gradient_checkpointing = False
|
| 431 |
+
|
| 432 |
+
# Initialize weights and apply final processing
|
| 433 |
+
self.post_init()
|
| 434 |
+
|
| 435 |
+
@check_model_inputs
|
| 436 |
+
@auto_docstring
|
| 437 |
+
def forward(
|
| 438 |
+
self,
|
| 439 |
+
input_ids: Optional[torch.LongTensor] = None,
|
| 440 |
+
attention_mask: Optional[torch.Tensor] = None,
|
| 441 |
+
position_ids: Optional[torch.LongTensor] = None,
|
| 442 |
+
past_key_values: Optional[Cache] = None,
|
| 443 |
+
inputs_embeds: Optional[torch.FloatTensor] = None,
|
| 444 |
+
use_cache: Optional[bool] = None,
|
| 445 |
+
cache_position: Optional[torch.LongTensor] = None,
|
| 446 |
+
**kwargs: Unpack[TransformersKwargs],
|
| 447 |
+
) -> MoeModelOutputWithPast:
|
| 448 |
+
if (input_ids is None) ^ (inputs_embeds is not None):
|
| 449 |
+
raise ValueError("You must specify exactly one of input_ids or inputs_embeds")
|
| 450 |
+
|
| 451 |
+
if use_cache and past_key_values is None:
|
| 452 |
+
past_key_values = DynamicCache(config=self.config)
|
| 453 |
+
|
| 454 |
+
if inputs_embeds is None:
|
| 455 |
+
inputs_embeds = self.embed_tokens(input_ids)
|
| 456 |
+
|
| 457 |
+
if cache_position is None:
|
| 458 |
+
past_seen_tokens = past_key_values.get_seq_length() if past_key_values is not None else 0
|
| 459 |
+
cache_position = torch.arange(
|
| 460 |
+
past_seen_tokens, past_seen_tokens + inputs_embeds.shape[1], device=inputs_embeds.device
|
| 461 |
+
)
|
| 462 |
+
if position_ids is None:
|
| 463 |
+
position_ids = cache_position.unsqueeze(0)
|
| 464 |
+
|
| 465 |
+
mask_function = create_causal_mask if self.config.sliding_window is None else create_sliding_window_causal_mask
|
| 466 |
+
causal_mask = mask_function(
|
| 467 |
+
config=self.config,
|
| 468 |
+
input_embeds=inputs_embeds,
|
| 469 |
+
attention_mask=attention_mask,
|
| 470 |
+
cache_position=cache_position,
|
| 471 |
+
past_key_values=past_key_values,
|
| 472 |
+
position_ids=position_ids,
|
| 473 |
+
)
|
| 474 |
+
|
| 475 |
+
hidden_states = inputs_embeds
|
| 476 |
+
|
| 477 |
+
# create position embeddings to be shared across the decoder layers
|
| 478 |
+
position_embeddings = self.rotary_emb(hidden_states, position_ids)
|
| 479 |
+
|
| 480 |
+
for decoder_layer in self.layers[: self.config.num_hidden_layers]:
|
| 481 |
+
hidden_states = decoder_layer(
|
| 482 |
+
hidden_states,
|
| 483 |
+
position_embeddings=position_embeddings,
|
| 484 |
+
attention_mask=causal_mask,
|
| 485 |
+
position_ids=position_ids,
|
| 486 |
+
past_key_values=past_key_values,
|
| 487 |
+
use_cache=use_cache,
|
| 488 |
+
cache_position=cache_position,
|
| 489 |
+
**kwargs,
|
| 490 |
+
)
|
| 491 |
+
|
| 492 |
+
hidden_states = self.norm(hidden_states)
|
| 493 |
+
|
| 494 |
+
return MoeModelOutputWithPast( # only diff with Mistral is the output type, we need MoE
|
| 495 |
+
last_hidden_state=hidden_states,
|
| 496 |
+
past_key_values=past_key_values,
|
| 497 |
+
)
|
| 498 |
+
|
| 499 |
+
|
| 500 |
+
def load_balancing_loss_func(
|
| 501 |
+
gate_logits: Union[torch.Tensor, tuple[torch.Tensor], None],
|
| 502 |
+
num_experts: Optional[int] = None,
|
| 503 |
+
top_k=2,
|
| 504 |
+
attention_mask: Optional[torch.Tensor] = None,
|
| 505 |
+
) -> Union[torch.Tensor, int]:
|
| 506 |
+
r"""
|
| 507 |
+
Computes auxiliary load balancing loss as in Switch Transformer - implemented in Pytorch.
|
| 508 |
+
|
| 509 |
+
See Switch Transformer (https://huggingface.co/papers/2101.03961) for more details. This function implements the loss
|
| 510 |
+
function presented in equations (4) - (6) of the paper. It aims at penalizing cases where the routing between
|
| 511 |
+
experts is too unbalanced.
|
| 512 |
+
|
| 513 |
+
Args:
|
| 514 |
+
gate_logits:
|
| 515 |
+
Logits from the `gate`, should be a tuple of model.config.num_hidden_layers tensors of
|
| 516 |
+
shape [batch_size X sequence_length, num_experts].
|
| 517 |
+
num_experts:
|
| 518 |
+
Number of experts
|
| 519 |
+
top_k:
|
| 520 |
+
The number of experts to route per-token, can be also interpreted as the `top-k` routing
|
| 521 |
+
parameter.
|
| 522 |
+
attention_mask (`torch.Tensor`, *optional*):
|
| 523 |
+
The attention_mask used in forward function
|
| 524 |
+
shape [batch_size X sequence_length] if not None.
|
| 525 |
+
|
| 526 |
+
Returns:
|
| 527 |
+
The auxiliary loss.
|
| 528 |
+
"""
|
| 529 |
+
if gate_logits is None or not isinstance(gate_logits, tuple):
|
| 530 |
+
return 0
|
| 531 |
+
|
| 532 |
+
if isinstance(gate_logits, tuple):
|
| 533 |
+
compute_device = gate_logits[0].device
|
| 534 |
+
concatenated_gate_logits = torch.cat([layer_gate.to(compute_device) for layer_gate in gate_logits], dim=0)
|
| 535 |
+
|
| 536 |
+
routing_weights = torch.nn.functional.softmax(concatenated_gate_logits, dim=-1)
|
| 537 |
+
|
| 538 |
+
_, selected_experts = torch.topk(routing_weights, top_k, dim=-1)
|
| 539 |
+
|
| 540 |
+
expert_mask = torch.nn.functional.one_hot(selected_experts, num_experts)
|
| 541 |
+
|
| 542 |
+
if attention_mask is None:
|
| 543 |
+
# Compute the percentage of tokens routed to each experts
|
| 544 |
+
tokens_per_expert = torch.mean(expert_mask.float(), dim=0)
|
| 545 |
+
|
| 546 |
+
# Compute the average probability of routing to these experts
|
| 547 |
+
router_prob_per_expert = torch.mean(routing_weights, dim=0)
|
| 548 |
+
else:
|
| 549 |
+
batch_size, sequence_length = attention_mask.shape
|
| 550 |
+
num_hidden_layers = concatenated_gate_logits.shape[0] // (batch_size * sequence_length)
|
| 551 |
+
|
| 552 |
+
# Compute the mask that masks all padding tokens as 0 with the same shape of expert_mask
|
| 553 |
+
expert_attention_mask = (
|
| 554 |
+
attention_mask[None, :, :, None, None]
|
| 555 |
+
.expand((num_hidden_layers, batch_size, sequence_length, top_k, num_experts))
|
| 556 |
+
.reshape(-1, top_k, num_experts)
|
| 557 |
+
.to(compute_device)
|
| 558 |
+
)
|
| 559 |
+
|
| 560 |
+
# Compute the percentage of tokens routed to each experts
|
| 561 |
+
tokens_per_expert = torch.sum(expert_mask.float() * expert_attention_mask, dim=0) / torch.sum(
|
| 562 |
+
expert_attention_mask, dim=0
|
| 563 |
+
)
|
| 564 |
+
|
| 565 |
+
# Compute the mask that masks all padding tokens as 0 with the same shape of tokens_per_expert
|
| 566 |
+
router_per_expert_attention_mask = (
|
| 567 |
+
attention_mask[None, :, :, None]
|
| 568 |
+
.expand((num_hidden_layers, batch_size, sequence_length, num_experts))
|
| 569 |
+
.reshape(-1, num_experts)
|
| 570 |
+
.to(compute_device)
|
| 571 |
+
)
|
| 572 |
+
|
| 573 |
+
# Compute the average probability of routing to these experts
|
| 574 |
+
router_prob_per_expert = torch.sum(routing_weights * router_per_expert_attention_mask, dim=0) / torch.sum(
|
| 575 |
+
router_per_expert_attention_mask, dim=0
|
| 576 |
+
)
|
| 577 |
+
|
| 578 |
+
overall_loss = torch.sum(tokens_per_expert * router_prob_per_expert.unsqueeze(0))
|
| 579 |
+
return overall_loss * num_experts
|
| 580 |
+
|
| 581 |
+
|
| 582 |
+
@auto_docstring
|
| 583 |
+
class MiniMaxM2ForCausalLM(MiniMaxM2PreTrainedModel, GenerationMixin):
|
| 584 |
+
_tied_weights_keys = ["lm_head.weight"]
|
| 585 |
+
_tp_plan = {"lm_head": "colwise_rep"}
|
| 586 |
+
_pp_plan = {"lm_head": (["hidden_states"], ["logits"])}
|
| 587 |
+
|
| 588 |
+
def __init__(self, config):
|
| 589 |
+
super().__init__(config)
|
| 590 |
+
self.model = MiniMaxM2Model(config)
|
| 591 |
+
self.vocab_size = config.vocab_size
|
| 592 |
+
self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
|
| 593 |
+
self.router_aux_loss_coef = config.router_aux_loss_coef
|
| 594 |
+
self.num_experts = config.num_local_experts
|
| 595 |
+
self.num_experts_per_tok = config.num_experts_per_tok
|
| 596 |
+
|
| 597 |
+
# Initialize weights and apply final processing
|
| 598 |
+
self.post_init()
|
| 599 |
+
|
| 600 |
+
@can_return_tuple
|
| 601 |
+
@auto_docstring
|
| 602 |
+
def forward(
|
| 603 |
+
self,
|
| 604 |
+
input_ids: Optional[torch.LongTensor] = None,
|
| 605 |
+
attention_mask: Optional[torch.Tensor] = None,
|
| 606 |
+
position_ids: Optional[torch.LongTensor] = None,
|
| 607 |
+
past_key_values: Optional[Cache] = None,
|
| 608 |
+
inputs_embeds: Optional[torch.FloatTensor] = None,
|
| 609 |
+
labels: Optional[torch.LongTensor] = None,
|
| 610 |
+
use_cache: Optional[bool] = None,
|
| 611 |
+
output_router_logits: Optional[bool] = None,
|
| 612 |
+
cache_position: Optional[torch.LongTensor] = None,
|
| 613 |
+
logits_to_keep: Union[int, torch.Tensor] = 0,
|
| 614 |
+
**kwargs: Unpack[TransformersKwargs],
|
| 615 |
+
) -> MoeCausalLMOutputWithPast:
|
| 616 |
+
r"""
|
| 617 |
+
labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
|
| 618 |
+
Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
|
| 619 |
+
config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
|
| 620 |
+
(masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.
|
| 621 |
+
|
| 622 |
+
Example:
|
| 623 |
+
|
| 624 |
+
```python
|
| 625 |
+
>>> from transformers import AutoTokenizer, MiniMaxM2ForCausalLM
|
| 626 |
+
|
| 627 |
+
>>> model = MiniMaxM2ForCausalLM.from_pretrained("mistralai/MiniMaxM2-8x7B-v0.1")
|
| 628 |
+
>>> tokenizer = AutoTokenizer.from_pretrained("mistralai/MiniMaxM2-8x7B-v0.1")
|
| 629 |
+
|
| 630 |
+
>>> prompt = "Hey, are you conscious? Can you talk to me?"
|
| 631 |
+
>>> inputs = tokenizer(prompt, return_tensors="pt")
|
| 632 |
+
|
| 633 |
+
>>> # Generate
|
| 634 |
+
>>> generate_ids = model.generate(inputs.input_ids, max_length=30)
|
| 635 |
+
>>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
|
| 636 |
+
"Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."
|
| 637 |
+
```"""
|
| 638 |
+
|
| 639 |
+
output_router_logits = (
|
| 640 |
+
output_router_logits if output_router_logits is not None else self.config.output_router_logits
|
| 641 |
+
)
|
| 642 |
+
|
| 643 |
+
# decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn)
|
| 644 |
+
outputs: MoeModelOutputWithPast = self.model(
|
| 645 |
+
input_ids=input_ids,
|
| 646 |
+
attention_mask=attention_mask,
|
| 647 |
+
position_ids=position_ids,
|
| 648 |
+
past_key_values=past_key_values,
|
| 649 |
+
inputs_embeds=inputs_embeds,
|
| 650 |
+
use_cache=use_cache,
|
| 651 |
+
output_router_logits=output_router_logits,
|
| 652 |
+
cache_position=cache_position,
|
| 653 |
+
**kwargs,
|
| 654 |
+
)
|
| 655 |
+
|
| 656 |
+
hidden_states = outputs.last_hidden_state
|
| 657 |
+
# Only compute necessary logits, and do not upcast them to float if we are not computing the loss
|
| 658 |
+
slice_indices = slice(-logits_to_keep, None) if isinstance(logits_to_keep, int) else logits_to_keep
|
| 659 |
+
logits = self.lm_head(hidden_states[:, slice_indices, :])
|
| 660 |
+
|
| 661 |
+
loss = None
|
| 662 |
+
if labels is not None:
|
| 663 |
+
loss = self.loss_function(logits, labels, self.vocab_size, **kwargs)
|
| 664 |
+
|
| 665 |
+
aux_loss = None
|
| 666 |
+
if output_router_logits:
|
| 667 |
+
aux_loss = load_balancing_loss_func(
|
| 668 |
+
outputs.router_logits,
|
| 669 |
+
self.num_experts,
|
| 670 |
+
self.num_experts_per_tok,
|
| 671 |
+
attention_mask,
|
| 672 |
+
)
|
| 673 |
+
if labels is not None:
|
| 674 |
+
loss += self.router_aux_loss_coef * aux_loss.to(loss.device) # make sure to reside in the same device
|
| 675 |
+
|
| 676 |
+
return MoeCausalLMOutputWithPast(
|
| 677 |
+
loss=loss,
|
| 678 |
+
aux_loss=aux_loss,
|
| 679 |
+
logits=logits,
|
| 680 |
+
past_key_values=outputs.past_key_values,
|
| 681 |
+
hidden_states=outputs.hidden_states,
|
| 682 |
+
attentions=outputs.attentions,
|
| 683 |
+
router_logits=outputs.router_logits,
|
| 684 |
+
)
|
| 685 |
+
|
| 686 |
+
|
| 687 |
+
class MiniMaxM2ForSequenceClassification(GenericForSequenceClassification, MiniMaxM2PreTrainedModel):
|
| 688 |
+
pass
|
| 689 |
+
|
| 690 |
+
|
| 691 |
+
class MiniMaxM2ForTokenClassification(GenericForTokenClassification, MiniMaxM2PreTrainedModel):
|
| 692 |
+
pass
|
| 693 |
+
|
| 694 |
+
|
| 695 |
+
class MiniMaxM2ForQuestionAnswering(GenericForQuestionAnswering, MiniMaxM2PreTrainedModel):
|
| 696 |
+
pass
|
| 697 |
+
|
| 698 |
+
|
| 699 |
+
__all__ = [
|
| 700 |
+
"MiniMaxM2ForCausalLM",
|
| 701 |
+
"MiniMaxM2ForQuestionAnswering",
|
| 702 |
+
"MiniMaxM2Model",
|
| 703 |
+
"MiniMaxM2PreTrainedModel",
|
| 704 |
+
"MiniMaxM2ForSequenceClassification",
|
| 705 |
+
"MiniMaxM2ForTokenClassification",
|
| 706 |
+
]
|
tokenizer.json
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:7b81e5e5cba2b169e86a0771825a927e9d41b4c4484ded4a286410f41f702f17
|
| 3 |
+
size 15523144
|
tokenizer_config.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"add_prefix_space": false,
|
| 3 |
+
"backend": "tokenizers",
|
| 4 |
+
"bos_token": "]~!b[",
|
| 5 |
+
"clean_up_tokenization_spaces": false,
|
| 6 |
+
"eos_token": "[e~[",
|
| 7 |
+
"extra_special_tokens": [
|
| 8 |
+
"<code_interpreter>",
|
| 9 |
+
"<commit_after>",
|
| 10 |
+
"<commit_before>",
|
| 11 |
+
"<commit_msg>",
|
| 12 |
+
"<empty_output>",
|
| 13 |
+
"<filename>",
|
| 14 |
+
"<fim_middle>",
|
| 15 |
+
"<fim_pad>",
|
| 16 |
+
"<fim_prefix>",
|
| 17 |
+
"<fim_suffix>",
|
| 18 |
+
"<function_call>",
|
| 19 |
+
"<gh_stars>",
|
| 20 |
+
"]<]speech[>[",
|
| 21 |
+
"]<]image[>[",
|
| 22 |
+
"]<]video[>[",
|
| 23 |
+
"]<]start of speech[>[",
|
| 24 |
+
"]<]end of speech[>[",
|
| 25 |
+
"]<]start of image[>[",
|
| 26 |
+
"]<]end of image[>[",
|
| 27 |
+
"]<]start of video[>[",
|
| 28 |
+
"]<]end of video[>[",
|
| 29 |
+
"]<]vision pad[>[",
|
| 30 |
+
"]~!b[",
|
| 31 |
+
"<issue_closed>",
|
| 32 |
+
"<issue_comment>",
|
| 33 |
+
"<issue_start>",
|
| 34 |
+
"<jupyter_code>",
|
| 35 |
+
"<jupyter_output>",
|
| 36 |
+
"<jupyter_start>",
|
| 37 |
+
"<jupyter_text>",
|
| 38 |
+
"<reponame>",
|
| 39 |
+
"[e~[",
|
| 40 |
+
"]!d~[",
|
| 41 |
+
"]!p~[",
|
| 42 |
+
"]~b]",
|
| 43 |
+
"<jupyter_error>",
|
| 44 |
+
"<add_file>",
|
| 45 |
+
"<delete_file>",
|
| 46 |
+
"<rename_file>",
|
| 47 |
+
"<edit_file>",
|
| 48 |
+
"<commit_message>",
|
| 49 |
+
"<empty_source_file>",
|
| 50 |
+
"<repo_struct>",
|
| 51 |
+
"<code_context>",
|
| 52 |
+
"<file_content>",
|
| 53 |
+
"<source_files>",
|
| 54 |
+
"<pr_start>",
|
| 55 |
+
"<review_comment>",
|
| 56 |
+
"<filepath>",
|
| 57 |
+
"<file_sep>"
|
| 58 |
+
],
|
| 59 |
+
"is_local": true,
|
| 60 |
+
"model_max_length": 40960000,
|
| 61 |
+
"tokenizer_class": "TokenizersBackend",
|
| 62 |
+
"tool_parser_type": "minimax_m2",
|
| 63 |
+
"unk_token": "]!d~["
|
| 64 |
+
}
|