MobileLLM-125M 是 Facebook/Meta 推出的轻量级大语言模型,参数量 125M,基于优化的标准 Transformer 架构设计,适用于资源受限场景下的文本生成任务。
本仓库提供该模型在 华为昇腾 NPU 上使用 vLLM-Ascend 的适配部署方案及功能验证。
| 属性 | 值 |
|---|---|
| 模型名称 | MobileLLM-125M |
| 开发者 | Facebook/Meta |
| 参数量 | 125M |
| 架构 | MobileLLMForCausalLM (Llama-like) |
| 隐藏层大小 | 576 |
| 注意力头数 | 9 (KV头: 3) |
| 层数 | 30 |
| 词表大小 | 32,000 |
| 最大上下文长度 | 2048 |
| 权重精度 | float16 |
| 原始权重来源 | HuggingFace |
# 从 HuggingFace 下载原始权重(约 0.23 GB)
git lfs install
git clone https://huggingface.co/facebook/MobileLLM-125M
# 或使用 HuggingFace CLI
pip install huggingface-hub
huggingface-cli download facebook/MobileLLM-125M --local-dir ./MobileLLM-125M注意:本仓库不包含模型权重,需自行从 HuggingFace 下载。
| 组件 | 推荐版本 |
|---|---|
| NPU | 华为昇腾 Atlas 800 A2/A3 |
| CANN | 8.5.1+ |
| Python | 3.11+ |
| vLLM | vLLM-Ascend 适配版 (main 分支) |
# 克隆 vLLM-Ascend
git clone https://github.com/vllm-project/vllm-ascend.git
cd vllm-ascend
# 根据 MobileLLM 架构进行适配(参见下文昇腾适配说明)
# ...
# 安装
pip install -e .from vllm import LLM, SamplingParams
llm = LLM(
model='./MobileLLM-125M',
trust_remote_code=True,
max_model_len=512,
tokenizer_mode='slow', # 必须:MobileLLM 仅有 slow tokenizer
dtype='float16',
)
output = llm.generate('Hello, my name is')
print(output[0].outputs[0].text)本仓库已同时提供 CPU 贪心解码基线 和 NPU 采样解码输出,用于精度对比。
⚠️ 重要前提:下表中的 CPU 与 NPU 使用不同的解码策略
CPU 基线使用 贪心解码 (temperature=0),输出完全确定、可复现。 NPU 输出使用 随机采样 (temperature=0.7, top_p=0.9),每次运行结果不同。
因此 表中 CPU 与 NPU 的文本差异是解码策略不同导致的,而非 NPU 精度问题。 如需有意义的精度对比,请使用
get_baseline.py --greedy在您的 GPU/CPU 上生成基线后,再与同样使用贪心解码运行的 NPU 输出进行对比。
| 对比维度 | 状态 | 说明 |
|---|---|---|
| NPU 功能可用性 | ✅ 已验证 | 模型加载、推理正常,输出语义合理 |
| NPU vs GPU 精度误差 | ❌ 未验证 | 缺少 GPU 基线环境,无法计算 |
| NPU vs CPU 精度误差(贪心解码) | ⚠️ 部分验证 | CPU 贪心基线可用,NPU 贪心输出待补充 |
| NPU vs CPU 精度误差(采样解码) | ❌ 不适用 | 采样输出具有随机性,单次对比无意义 |
使用原始 Transformers 在 CPU 上运行 贪心解码 (temperature=0) 的结果:
| 测试 | Prompt | CPU 输出 |
|---|---|---|
| 基础生成 | "Hello, my name is" | Diana. I am a 20-year-old woman from the United States. I am a single mother. |
| 简短问答 | "The capital of France is" | Paris, which is the capital of France.\nThe capital of France is Paris |
| 问候 | "Hello, how are you?" | I'm fine. I'm fine.\nI'm fine. I'm fine.\nI'm fine. I'm fine |
| 测试 | Prompt | NPU 输出 |
|---|---|---|
| 基础生成 | "Hello, my name is" | Adonis, and I am a 10-year-old girl.\nMy parents have been in this business for a very long time. |
| 简短问答 | "The capital of France is" | Paris, the city which has its own name.\nFrance is a nation of |
| 问候 | "Hello, how are you?" | I'm glad you are feeling well. What are you doing? I don't know, I'm not sure. I'm very busy. |
以下数据记录了 CPU 上输入 "Hello, my name is" 后首个预测 token 的概率分布 Top-10。NPU 端可在 vLLM 中设置 logprobs=10 获取类似数据进行端到端精度验证:
| 排名 | Token ID | Token | 概率 |
|---|---|---|---|
| 1 | 360 | ▁D | 1.27% |
| 2 | 341 | ▁M | 1.15% |
| 3 | 2259 | ▁John | 1.10% |
| 4 | 476 | ▁K | 1.07% |
| 5 | 435 | ▁J | 1.06% |
| 6 | 365 | ▁L | 0.97% |
| 7 | 323 | ▁T | 0.93% |
| 8 | 4699 | ▁David | 0.87% |
| 9 | 1383 | ▁Sh | 0.87% |
| 10 | 317 | ▁S | 0.87% |
完整 logits 数据见 cpu_baseline_logits.json。
本仓库提供完整的基线生成脚本和 NPU 参考输出,您可以在自己的 GPU/CPU 机器上运行:
步骤 1:在您的 GPU/CPU 机器上生成基线输出
# 安装依赖
pip install transformers torch
# 运行基线生成脚本(会自动下载原始 MobileLLM-125M 权重)
python3 get_baseline.py该脚本将使用与 NPU 测试 完全相同的 Prompt、max_tokens、temperature、top_p 在 GPU/CPU 上运行推理,输出参考结果。
步骤 2:对比 NPU 参考输出
将 GPU/CPU 基线输出与本仓库 validation_results.json 中的 NPU 输出进行对比:
| 测试 | Prompt | NPU 输出(供对比) |
|---|---|---|
| 基础生成 | "Hello, my name is" | Adonis, and I am a 10-year-old girl. |
| 简短问答 | "The capital of France is" | Paris, the city which has its own name. |
| 问候 | "Hello, how are you?" | I'm glad you are feeling well. |
建议精度对比方法:
temperature 设为 0(贪心解码)后对比 NPU 与 GPU/CPU 的确定输出在华为昇腾 NPU 上使用 vLLM-Ascend 对 MobileLLM-125M 进行推理测试,性能结果如下:
| 测试 | 输入 | 生成 Token 数 | 耗时 | 吞吐量 |
|---|---|---|---|---|
| 基础生成 | "Hello, my name is" | 32 | 4.71s | 6.8 tok/s |
| 简短问答 | "The capital of France is" | 16 | 0.44s | 36.5 tok/s |
| 问候 | "Hello, how are you?" | 32 | 0.88s | 36.3 tok/s |
验证状态:
本仓库提供 validate_accuracy.py 自动化脚本,可在昇腾 NPU 上快速验证:
python3 validate_accuracy.py --model-path ./MobileLLM-125M脚本将执行上述三个测试用例,输出结果并保存到 validation_results.json。
精度对齐提示:
validation_results.json中记录了 NPU 的推理输出文本。如需进行精度对齐验证,请:
- 在 GPU/CPU 上使用 相同的 Prompt、
max_tokens、temperature、top_p运行推理- 将 GPU/CPU 输出与本仓库的
validation_results.json中的 NPU 输出进行对比- 计算余弦相似度、绝对误差等精度指标
MobileLLM-125M 为标准 Llama 架构变体,适配昇腾 NPU 需对 vLLM-Ascend 源码做两处改动:
文件:vllm/vllm/model_executor/models/registry.py
# 在 _TEXT_GENERATION_MODELS 字典中添加
"MobileLLMForCausalLM": ("llama", "LlamaForCausalLM"),MobileLLM 的架构与 Llama 高度一致,可直接路由到 vLLM 的 LlamaForCausalLM 实现。
文件:vllm/vllm/config/model.py
# 在 ConfiguredModel.__init__ 中添加
if (
hasattr(hf_config, "share_embedding")
and hf_config.share_embedding
and not getattr(hf_config, "tie_word_embeddings", False)
):
hf_config.tie_word_embeddings = TrueMobileLLM 使用 share_embedding 字段控制 embedding 共享,而 vLLM 的 Llama 实现期望 tie_word_embeddings 字段。
MobileLLM-125M 仅包含 tokenizer.model(SentencePiece),缺少 tokenizer.json(HuggingFace fast tokenizer),因此必须使用 slow tokenizer 模式:
llm = LLM(..., tokenizer_mode='slow')如果在不指定 tokenizer_mode='slow' 的情况下加载,会触发 fast→slow 的自动降级,可能因 bool 类型不匹配而报错。
📌 临时验证方案:如果不想修改 vLLM 源码,可将模型 config.json 中
architectures字段临时替换为LlamaForCausalLM,同时设置tie_word_embeddings=True,使 vLLM 可直接加载。但正式部署仍需完成上述源码注册。
| 改动 | 文件 | 说明 |
|---|---|---|
| 模型注册 | vllm/vllm/model_executor/models/registry.py | 将 MobileLLMForCausalLM 路由到 LlamaForCausalLM |
| 字段映射 | vllm/vllm/config/model.py | 将 share_embedding 映射到 tie_word_embeddings |
| 分词器 | 调用时指定 | 使用 tokenizer_mode='slow' |
详细适配流程见 README_ASCEND.md。
本仓库仅包含模型部署适配方案,不包含模型权重。模型权重版权归 Facebook/Meta 所有,遵循原模型许可协议。