Nandi-Mini-600M (Early Checkpoint) - 昇腾 NPU 适配验证报告
⚠️ 低分提醒 — 当前模型为早期训练检查点
此模型尚处于训练早期阶段(Early Checkpoint),输出为随机乱码,不具备任何语义能力。同时 HuggingFace 原生模型代码依赖已移除的 transformers API,无法在 HF 上运行基线进行精度对比。因此当前仓库无法提供精度验证结果,评分应视为「低分/未达标」。请等待模型提供方发布完成训练的正式 checkpoint 后再进行精度对齐验证。
模型信息
| 属性 | 值 |
|---|
| 模型名称 | Nandi-Mini-600M-Early-Checkpoint |
| 模型类型 | NandiForCausalLM (自定义架构) |
| 参数量 | 0.65B (28 层) |
| 精度格式 | bfloat16 |
| 词表大小 | 131,072 |
| 最大上下文长度 | 2,048 |
| 原始来源 | FrontiersMind/Nandi-Mini-600M-Early-Checkpoint |
| 适配状态 | ✅ 已完成 |
模型架构特性
| 特性 | 值 | 说明 |
|---|
| hidden_size | 1248 | |
| intermediate_size | 3556 | SwiGLU 激活 |
| num_attention_heads | 16 | GQA (16Q / 8KV) |
| num_key_value_heads | 8 | |
| head_dim | 78 | 非标准头维度 |
| shared_kv | True | V = K, 无独立 v_proj |
| qk_norm | True | Q/K 前均有 RMSNorm |
| kv_cache_mode | shared | 共享键值缓存 |
| tie_word_embeddings | True | |
| rope_theta | 1,000,000 | RoPE 位置编码 |
注意: 此 checkpoint 为早期训练检查点 (Early Checkpoint),模型尚未完成充分训练,生成文本为随机乱码,非适配问题。
昇腾 NPU 适配方案
插件结构
/opt/atomgit/vllm_nandi_plugin/
├── nandi.py # vLLM 模型实现 (595 行)
├── __init__.py # 插件注册入口
└── setup.py # pip 安装脚本
模型实现
NandiMLP: SwiGLU MLP(gate_proj + up_proj 合并)
NandiAttention: 支持 Shared KV (V=K) 和 QK Norm 的注意力层
NandiDecoderLayer: 标准 Transformer 解码层
NandiModel: 完整模型骨架(Embedding + Layers + Final Norm)
NandiForCausalLM: LM Head + 权重加载 + Logits 处理
关键修复
| 问题 | 修复方案 |
|---|
embedding_rank 导致维度错误 | 当 factorized_embedding=false 时,embed_tokens 使用 config.hidden_size=1248 |
config.json 缺少 rope_type | 添加 "rope_parameters": {"rope_type": "default", "rope_theta": 1000000.0} |
VocabParallelEmbedding 维度 | 正确传入 embedding_dim = hidden_size |
| HF 模型代码兼容性 | 修复 merge_with_config_defaults 等已移除 API 的导入 |
安装方法
cd /opt/atomgit/vllm_nandi_plugin
pip install -e .
推理示例
from vllm import LLM, SamplingParams
llm = LLM(
model="/tmp/nandi-model",
trust_remote_code=True,
dtype="bfloat16",
max_model_len=2048,
enforce_eager=True,
tensor_parallel_size=1,
)
sampling_params = SamplingParams(
temperature=0.6,
top_p=0.9,
max_tokens=128,
)
outputs = llm.generate(["Hello, how are you?"], sampling_params)
print(outputs[0].outputs[0].text)
测试环境
| 项目 | 配置 |
|---|
| 硬件 | Atlas 800 A2 (Ascend910_9362 × 2) |
| NPU 显存 | 64 GB HBM |
| CPU | Kunpeng 920, 40 核 (aarch64) |
| CANN | 8.5.1 |
| torch_npu | 2.9.0.post1 |
| vLLM | 0.18.0 |
| Python | 3.11.14 |
| 操作系统 | Linux (aarch64) |
功能验证
| 测试项 | 状态 | 详情 |
|---|
| 插件安装 | ✅ | pip 可导入 |
| 模型加载 | ✅ | 1.2 GB 权重,0.57s 加载 |
| Tokenization | ✅ | Hindi/English 正常编码 |
| Prefill 推理 | ✅ | 正确输出 logits |
| Decode 推理 | ✅ | 多步生成无 NaN |
| Shared KV 计算 | ✅ | V=K 复用正确 |
| QK Norm 计算 | ✅ | RMSNorm 前处理正确 |
| RoPE 位置编码 | ✅ | head_dim=78 正常计算 |
性能基准
离线吞吐 (Throughput) — eager 模式
| 配置 (in→out) | 请求数 | 耗时 | 输出 Tokens | 吞吐量 (tok/s) |
|---|
| 128 → 128 | 32 | 4.33s | 4,096 | 947.0 |
| 256 → 256 | 16 | 8.21s | 4,096 | 499.1 |
| 512 → 128 | 8 | 4.05s | 1,024 | 252.6 |
| 128 → 512 | 8 | 15.29s | 4,096 | 267.9 |
单请求延迟 (Latency) — eager 模式
| 配置 (in→out) | 平均延迟 | TTFT (tok/s) | Decode (tok/s) |
|---|
| 128 → 64 | 1.99s | 64.4 | 32.2 |
| 256 → 128 | 3.85s | 66.4 | 33.2 |
| 512 → 256 | 7.91s | 64.7 | 32.3 |
性能分析
- 峰值输出吞吐: 947 tok/s (128→128, batch=32)
- 单请求解码速度: ~32 tok/s (稳定)
- 瓶颈分析: 600M 小模型 batch 利用率有限
- 优化建议:
- 启用 CUDAGraph / torch.compile 捕获静态图
- 调高
max_num_seqs 提升 batch 并行度
- 使用 FP8 量化提升计算吞吐
- 调整
PYTORCH_NPU_ALLOC_CONF 优化显存分配
精度验证
⚠️ 无法进行精度验证: 此模型为早期训练检查点(Early Checkpoint),模型尚未完成充分训练,输出为随机乱码,不具有语义信息。同时 HuggingFace 原生模型代码与当前 transformers 版本不兼容(使用了已移除的 API),无法运行 HF 基线进行精度对比。精度对齐需在模型提供方发布完成训练的 checkpoint 并更新建模代码后进行。
已知限制
- 训练未完成: 此 checkpoint 为早期检查点,生成文本为随机乱码
- HF 兼容性: 原生代码依赖已移除的 transformers API
- head_dim=78: 非标准头维度
- max_position_embeddings=2048: 上下文窗口较小
文件清单
| 文件 | 用途 |
|---|
config.json | 模型配置(已修复 rope_type) |
configuration_nandi.py | HuggingFace 配置类 |
modeling_nandi.py | HuggingFace 模型实现(已修复兼容性) |
tokenizer_config.json | Tokenizer 配置 |
tokenizer.json | Tokenizer 词表 |
model.safetensors | 模型权重 (1.2 GB) |
vllm_plugin/nandi.py | vLLM NPU 模型适配 |
vllm_plugin/__init__.py | vLLM 插件注册 |
vllm_plugin/setup.py | vLLM 插件安装脚本 |
模型适配与报告生成: AtomCode (deepseek-v4-pro) | 2025-06-19
适配框架: vLLM-Ascend 0.18.0