waylong/hmellor-tiny-random-LlamaForCausalLM-NPU
模型介绍
文件和版本
Pull Requests
讨论
分析

hmellor/tiny-random-LlamaForCausalLM 在 Ascend NPU 上

微型随机 LlamaForCausalLM(llama,2 层,隐藏维度 16,词表 32000,约 1M 参数)适配 Huawei Ascend 910B npu:0,采用贪心解码。

模型信息

  • 模型:hmellor/tiny-random-LlamaForCausalLM
  • URL: https://huggingface.co/hmellor/tiny-random-LlamaForCausalLM
  • 架构:LlamaForCausalLM(model_type: llama)
  • 权重:2.03 MB(model.safetensors),fp32/bfloat16,AutoModelForCausalLM
  • 分词器:LlamaTokenizerFast(配合 AutoTokenizer)

复现

pip install -r requirements.txt
# Ensure weights are at /tmp/hmellor-tiny (auto-download fallback to HF mirror if missing)
python inference.py
python inference.py --mode validate
python inference.py --mode benchmark

默认运行 3 条固定 prompt,贪心 max_new_tokens=16、do_sample=False,校验 CPU 与 NPU 的 token ids 和 logits。

输入

  • 3 条真实 prompt(已使用 attention_mask 进行 tokenization):
    • Hello, my name is(6 tokens)
    • The capital of France is(6 tokens)
    • Once upon a time(5 tokens)
  • Tokenizer:add_bos_token=True,padding 回退使用 pad_token=<unk>

NPU 证据

  • torch.npu.is_available(): True(Ascend910_9362,device_count=2,目标 npu:0)
  • next(model.parameters()).device == npu:0
  • input_ids.device == npu:0,attention_mask.device == npu:0
  • logits.device == npu:0,且 generate 输出的 device == npu:0
  • 计时前后执行 torch.npu.synchronize(),首次运行单独包含编译

实际运行(npu:0,float32,贪心):

model device (next param): npu:0
input_ids device CPU: cpu -> NPU: npu:0
output device: npu:0 shape (1, 22) etc.
CPU token ids == NPU token ids: True (all 3 prompts)
logits max_diff: ~1e-07 (fp32) < 1e-3 threshold
NPU decoded example: "Hello, my name is sogonnes^iginomer banроз efficient ..." (random tiny model)

一致性

  • Token ids:所有提示词下,CPU 与 NPU 的贪心 Token ids 完全一致(确定性结果)。
  • Logits max_diff:~1.04e-07 - 1.49e-07(fp32)<< 1e-3。
  • Decoded text:CPU 与 NPU 解码文本完全相同。
  • 指标:text-generation(task-adaptation 路线)下的 token ids exact match。

性能(npu:0, fp32, 10 次运行, max_new_tokens=32, batch=1, 同步计时)

  • 3 次预热 + 10 次实测,每次 generate 前后调用 torch.npu.synchronize()。
  • 平均延迟:单次生成 94.83 ms(32 tokens)
  • 最小值:93.33 ms 最大值:102.80 ms p50:94.09 ms p90/p95:102.80 ms
  • 吞吐量:~337 tokens/s(320 tokens / 0.948s)
  • 加载后 NPU 可用 HBM:60.82 GiB / 61.27 GiB(微型模型开销可忽略)
  • 首次编译运行约 0.29s,稳定后约 0.026-0.09s(编译单独计时)

局限性

  • 随机微型模型(未经训练);输出无意义,但结果确定,便于校验。
  • 仅贪心解码;采样需要固定随机种子。
  • 仅单卡 npu:0;无需多卡(1M 参数)。

资源

  • 证据日志通过 xterm.js 渲染为 PNG(原始样式):
    • assets/agent_workflow.png – 工作流程 / 仓库结构
    • assets/npu_device_call.png – torch.npu.is_available() 及设备验证
    • assets/model_result.png – CPU 与 NPU Token ids 及性能

workflow npu call result

许可证

模型卡自动生成;继承上游许可证。