msModelSlim 插件开发指导
概述
msModelSlim 内置了 Qwen、LLaMA、GLM 等主流模型的量化支持。模型出新速度远大于主仓发版速度。每接一个模型就改主仓,会导致主仓难以维护。
插件解开了这个耦合。主仓只管理量化引擎和接口契约。插件在外部实现接口,通过 entry points 向框架注册。主仓无需修改,插件独立开发、独立发布。
graph LR
M[模型适配器<br/>模型结构] --> E[量化引擎]
P[量化策略 YAML<br/>量化方案] --> E
C[校准数据] --> E
E --> O[(量化产物)]
style M fill:#4A90D9,color:#fff
style P fill:#4A90D9,color:#fff
style C fill:#6B8E23,color:#fff
插件将多个扩展点打包在一起。每个扩展点通过 entry point 向框架注册,框架按需加载。当前已开放 extension point 的扩展点包括模型适配器、量化策略等。校准数据当前通过目录约定提供(calib_data/),独立扩展点规划中。适配器描述模型结构,YAML 描述量化方案,校准数据用于统计激活值 scale/zero_point。
mindmap
root((可扩展维度))
模型适配器
DeepSeek
Qwen
Kimi
MiniMax
量化策略
W8A8 / W4A8
MXFP4 / FP8
校准数据 规划中
文本
图片
视频
音频
导出格式 规划中
ascend_v1
custom
llm_compressor
量化算法 规划中
Processor
模型适配器和量化策略当前已开放扩展点。校准数据、导出格式和量化算法规划中。
量化方案开发工作流
将模型跑通量化需要五个步骤:
graph TB
A[模型适配] --> B[策略制定]
B --> C[数据校准]
C --> D[权重导出]
D --> E[精度测评]
E -->|精度不达标| B
E -->|适配器有缺陷| A
style A fill:#4A90D9,color:#fff
style B fill:#4A90D9,color:#fff
style C fill:#6B8E23,color:#fff
style D fill:#8B4513,color:#fff
style E fill:#E8850C,color:#fff
| 步骤 | 内容 | 产出 |
|---|---|---|
| 模型适配 | 实现 adapter,描述模型结构:层数、层名、前向路径 | model_adapter.py |
| 策略制定 | 编写 YAML 配置,指定量化方案:W8A8 或 W4A8、对称或非对称、是否启用异常值抑制 | practice_data/<pedigree>/*.yaml |
| 数据校准 | 准备代表真实分布的校准样本,引擎据此统计激活值的 scale/zero_point | calib_data/(可选) |
| 权重导出 | 将量化后权重保存为指定格式 | 量化产物目录 |
| 精度测评 | 对比量化前后的 logits 或下游指标,判断精度损失是否可接受 | 相似性报告 |
五步并非严格串行。策略不达标则回到第二步修改 YAML,适配器有缺陷则回到第一步修复代码。迭代直到精度满意。
插件定位
插件不是量化引擎,而是量化引擎的原料包。它封装了前三步的成果:
graph LR
subgraph 插件
ADAPTER[模型适配器] -->|描述模型结构| PEDIGREE[pedigree]
YAML[量化策略] -->|指定量化方案| CONFIG_ID[config_id]
CALIB[校准数据] -->|提供校准样本| CALIB_DIR[calib_data]
end
ADAPTER -.-> ENGINE
YAML -.-> ENGINE
CALIB -.-> ENGINE
ENGINE[量化引擎] --> EXPORT[权重导出]
EXPORT --> EVAL[精度测评]
style ADAPTER fill:#4A90D9,color:#fff
style YAML fill:#4A90D9,color:#fff
style CALIB fill:#6B8E23,color:#fff
style ENGINE fill:#E8850C,color:#fff
量化引擎负责后两步(导出 + 测评),插件负责前三步(适配 + 策略 + 数据)。一个模型对应一个插件,一个插件可包含多种量化方案(多个 YAML)。
插件系统的核心思想:主仓管流程,插件管配置。 量化引擎的逻辑在主仓迭代,每个模型的适配细节和量化方案由插件独立维护。
插件制作
流程一览
graph LR
START([开始]) --> CREATE[一、创建骨架]
CREATE --> FILL[二、填充内容]
FILL --> TEST[三、安装验证]
TEST --> PACK[四、打包分发]
style START fill:#E8850C,color:#fff
style PACK fill:#4A90D9,color:#fff
一、创建骨架
graph LR
START([开始]) --> CLONE[克隆仓库]
CLONE --> INSTALL[安装元包]
INSTALL --> CMD[执行 create 命令]
CMD --> STRUCT[生成骨架结构]
STRUCT --> DONE[骨架就绪]
style DONE fill:#4A90D9,color:#fff
安装工具
git clone https://gitcode.com/rookie_hongchuan/msmodelslim-plugins
cd msmodelslim-plugins
pip install -e .
msmodelslim-plugins --help
生成骨架
msmodelslim-plugins create Minimax-2.5 w8a8
create 将模型名和量化类型翻译为包结构、命名和配置入口。
plugins/modelslim-plugin-minimax-2.5-w8a8/
├── pyproject.toml
├── README.md
└── src/
└── msmodelslim_plugin_minimax_2_5_w8a8/
├── __init__.py
├── adapter/
│ ├── __init__.py
│ └── model_adapter.py # 待填充
├── practice/
│ └── __init__.py
├── calib_data/
│ └── .gitkeep
└── practice_data/
└── minimax-2.5/
└── minimax-2.5-w8a8.yaml # 待配置
命名转换规则:
graph LR
A["Minimax-2.5"] -->|pedigree| B["minimax-2.5"]
A -->|display_name| C["Minimax-2.5"]
B -->|+ w8a8| D["config_id: minimax-2.5-w8a8"]
B -->|包名| E["msmodelslim_plugin_minimax_2_5_w8a8"]
B -->|类名| F["Minimax25W8a8Adapter"]
pedigree 是核心概念:模型名小写化、特殊字符转短横线后的字符串。它出现在适配器的 get_model_pedigree()、策略目录名和 entry point 中,是插件的"主键"。config_id 是 pedigree 加量化类型的组合,标识一个具体策略。
骨架不只搭建目录结构,还填写了 entry points 和默认 W8A8 策略。
二、填充内容
骨架创建完成后,需要填充三类材料:
| 主题 | 对应材料 | 存放位置 |
|---|---|---|
| 1. 模型适配器 | adapter 源码 | adapter/model_adapter.py |
| 2. 最佳实践 | 量化策略 YAML | practice_data/<pedigree>/*.yaml |
| 3. 校准集 | 校准样本数据 | calib_data/(可选) |
1. 模型适配器
graph LR
subgraph 量化引擎视角
V[遍历模型各层] --> F[逐层前向]
F --> Q[逐层量化]
end
ADAPTER[model_adapter.py] -.->|描述模型结构| V
ADAPTER -.->|描述前向过程| F
style ADAPTER fill:#4A90D9,color:#fff
量化引擎对模型做两件事:遍历每一层、逐层前向拿到中间状态。不同模型的遍历方式不同——有的用 model.layers,有的用 transformer.blocks。适配器封装这层差异。
标准情况
如果 Minimax-2.5 是标准 HuggingFace DecoderLayer(与 Qwen、LLaMA 一致),骨架模板可直接使用:
from msmodelslim.model.common.transformers import TransformersModel
from msmodelslim.model.interface_hub import ModelSlimPipelineInterfaceV1
from msmodelslim.app.naive_quantization.model_info_interface import ModelInfoInterface
from msmodelslim.model.common.layer_wise_forward import (
generated_decoder_layer_visit_func,
transformers_generated_forward_func,
)
class Minimax25W8a8Adapter(TransformersModel, ModelSlimPipelineInterfaceV1, ModelInfoInterface):
def get_model_pedigree(self):
return "minimax-2.5"
def init_model(self, device):
return self._load_model(device)
def generate_model_visit(self, model):
yield from generated_decoder_layer_visit_func(model)
def generate_model_forward(self, model, inputs):
yield from transformers_generated_forward_func(model, inputs)
非标准情况
| 情况 | 原因 | 做法 |
|---|---|---|
层名不标准(如 transformer.blocks) |
visit 默认匹配 layers 关键词 |
改用 generated_decoder_layer_visit_func_with_keyword(model, keyword="block") |
| 结构完全不同(Mamba、多模态) | visit 和 forward 逻辑不适用 | 重写两个方法,手动 yield ProcessRequest |
| 需要自定义模型加载 | _load_model 不满足需求 |
重写 init_model |
| 多模态 SD/DiT | 接口不同 | 父类换 MultimodalSDPipelineInterface |
不确定属于哪种情况时,先在标准模板下执行 msmodelslim quant。报错信息会指示未匹配的模块。
适配器在 pyproject.toml 中通过 entry point 注册。骨架已自动生成注册信息:
[project.entry-points."msmodelslim.model_adapter.plugins"]
"Minimax-2.5" = "msmodelslim_plugin_minimax_2_5_w8a8.adapter.model_adapter:Minimax25W8a8Adapter"
含义:查询 Minimax-2.5 适配器时,从该模块路径加载对应类。
entry point 是插件系统的核心机制。每个扩展点对应一个 entry point 组:
| 组名 | 用途 | 适用 |
|---|---|---|
msmodelslim.model_adapter.plugins |
注册模型适配器 | 插件开发者 |
msmodelslim.naive_quantization.practice_dirs |
注册量化策略目录 | 插件开发者 |
msmodelslim.naive_quantization.quant_service |
注册量化服务 | 框架内置 |
三类扩展点彼此独立。一个插件可以注册其中一个或多个。后续新增扩展点也通过新增 entry point 组实现。
参考:
plugins/hunyuan-image3-w8a8-dynamic/msmodelslim/model/adapters/
2. 最佳实践
graph LR
subgraph "practice_data/<pedigree>/"
A[w8a8.yaml]
B[w4a8.yaml]
end
A --> ENGINE[量化引擎按 score 择优]
B --> ENGINE
ENGINE --> Q[msmodelslim quant]
同一模型可能适合不同场景:追求速度用 W8A8,精度敏感用 W4A8。插件支持在一个目录下放多个 YAML,引擎通过 score 字段自动选最优。用户也可用 --config_path 指定具体文件。
practice_data/
└── <pedigree>/
├── <config_id>-w8a8.yaml
├── <config_id>-w4a8.yaml
└── <config_id>-w8a8_dynamic.yaml
骨架已生成 minimax-2.5-w8a8.yaml。要增加 W4A8 方案,在同目录放置 minimax-2.5-w4a8.yaml 即可。
YAML 编写参考已有插件的 practice_data,或 lab_practice/ 下的官方示例。
最佳实践目录同样在 pyproject.toml 中注册:
[project.entry-points."msmodelslim.naive_quantization.practice_dirs"]
"minimax-2.5-w8a8" = "msmodelslim_plugin_minimax_2_5_w8a8.practice:get_practice_dir"
入口函数仅返回 practice_data/ 路径:
def get_practice_dir() -> Path:
return Path(__file__).resolve().parent.parent / "practice_data"
3. 校准集
校准集是量化引擎统计激活值 scale/zero_point 时使用的样本数据。当前通过目录约定存放(calib_data/),独立扩展点规划中。如果不需要静态量化校准,此步骤可跳过。
数据格式:
| 文件格式 | 说明 | 解析方式 |
|---|---|---|
*.jsonl |
每行一个 JSON,含 text 字段 |
读取每行,tokenize text |
*.txt |
纯文本,每行一段 | 读取每行直接 tokenize |
*.bin |
二进制 tokenized 数据 | 直接反序列化 |
校准数据放置在 calib_data/ 目录下。骨架已创建 calib_data/.gitkeep,直接替换为实际数据即可。
三、安装验证
graph LR
PLUGIN[插件目录] -->|pip install -e .| INSTALLED[已安装]
INSTALLED -->|msmodelslim quant| RUN[量化]
# 开发安装(源码模式,修改即时生效)
cd plugins/modelslim-plugin-minimax-2.5-w8a8
pip install -e .
# 确认框架可发现插件
msmodelslim-plugins list
# 列表中应包含 Minimax-2.5
# 执行量化
msmodelslim quant \
--model_path /path/to/model \
--save_path ./output \
--model_type "Minimax-2.5" \
--quant_type w8a8 \
--trust_remote_code True
四、打包分发
flowchart LR
subgraph 开发者
DEV(开发者)
end
subgraph GitCode
WHEEL[(.whl)]
RELEASE(Release)
ISSUE(Plugin Issue)
end
subgraph Marketplace
INDEX(插件索引)
end
subgraph 用户
USER(用户)
end
DEV -->|patch| WHEEL
WHEEL -->|上传| RELEASE
RELEASE -->|提交 Issue| ISSUE
ISSUE -->|更新索引| INDEX
USER -->|发现 + 下载| ISSUE
INDEX -->|msplugin install| USER
USER -->|pip install| Q(msmodelslim quant)
分发方式
| 方式 | 场景 | 用户操作 |
|---|---|---|
| 源码分享 | 小范围团队 | pip install -e . |
| Wheel 包 | 非公开分发 | pip install xxx.whl |
| Issue 发布 | 公开到社区 | 浏览 Issue → 下载 → pip install |
| Marketplace | 公开展示 | msplugin install |
打包
msmodelslim-plugins patch plugins/modelslim-plugin-minimax-2.5-w8a8/
产物在 dist/ 下。
发布
- 上传
.whl到 GitCode Release,获取公开下载链接。 - 在 Ascend/msmodelslim Issues 提交 Plugin Release Issue,填写链接、使用说明、精度数据。
- (可选)更新 marketplace 索引。
Issue 模板中下载链接是必填项。GitCode Issue 不支持附件上传,wheel 需先托管到 Release。
插件使用
插件使用面向终端用户,不涉及开发。已安装的插件可通过 msmodelslim quant 直接使用。
发现插件
# 列出已安装的插件
msplugin list
# 从 marketplace 搜索远程插件
msplugin search <关键词>
# 列出 marketplace 所有插件
msplugin list --remote
安装插件
# 从 marketplace 安装(推荐)
msplugin install <插件名>
# 从 wheel 文件安装
pip install <name>.whl
# 从源码安装(开发模式)
pip install -e <插件目录>
使用插件
安装后直接通过模型类型名调用:
msmodelslim quant \
--model_path /path/to/model \
--save_path ./output \
--model_type "Minimax-2.5" \
--quant_type w8a8 \
--trust_remote_code True
管理插件
# 卸载
msplugin remove <插件名>
# 查看 marketplace 配置
msplugin marketplace list
# 添加自定义 marketplace
msplugin marketplace add <名称> <索引 URL>
# 切换默认 marketplace
msplugin marketplace use <名称>