CPU 与 NPU 精度对比实战:Timer-S1 在昇腾上 max_abs_error 仅 0.0125
【免费下载链接】timer-s1-npu项目地址: https://ai.gitcode.com/atlasleong/timer-s1-npu
Timer-S1 是字节跳动开源的时间序列基础模型,采用 decoder-only 的 MoE Transformer 架构,总参数约 8.3B、每 token 仅激活 0.75B,可零样本输出 9 个分位的预测结果。在将 Timer-S1 迁移到昇腾 NPU 的实战中,我们通过 CPU 与 NPU 精度对比验证了推理数值的一致性:在固定输入下,max_abs_error 仅 0.0125,mean_abs_error 0.0031,离散分类输出完全一致。本文完整复盘这次 CPU 与 NPU 精度对比的评测方法、判定标准与复现步骤,帮你在昇腾 NPU 上快速建立大模型推理精度验证的完整流程。
认识 Timer-S1:用基础模型做时间序列预测 🚀
Timer-S1 是一个亿级参数的时间序列基础模型(Time Series Foundation Model),与 LLM 类似,它经过海量时序数据预训练,可以直接对未见过的数据集做零样本(zero-shot)预测,无需额外微调。它的核心特性包括:
- 架构:decoder-only MoE Transformer,24 个基础层 + 16 个 MTP 层
- 规模:总参数约 8.3B,激活参数约 0.75B,32 个专家、每 token 激活 2 个
- 输入:原始浮点时间序列
(batch, lookback),本项目固定为(1, 288) - 输出:分位数预测 logits,形状
(1, 9, 16),即 9 个分位(0.1~0.9)× 16 个预测步
在 model/README.md 中可以看到官方的 Quickstart 用法:加载模型后直接model.generate(seqs, max_new_tokens=256, revin=True)即可得到分位数预测。模型的定制实现代码位于 model/modeling_TimerS1.py、model/configuration_TimerS1.py 与 model/ts_generation_mixin.py。
为什么要做 CPU 与 NPU 精度对比?🎯
大模型在 CPU 上通常以 float32 精度计算,而昇腾 NPU 为了提升吞吐和显存效率,常以 bfloat16 精度进行前向推理。两种精度的浮点表示范围与舍入方式不同,迁移后输出数值可能产生微小偏差。对于时间序列预测这类对数值敏感的任务,需要回答一个问题:
同样的权重、同样的输入,NPU 算出来的结果和 CPU 参考结果差多少?还能不能信任?
这正是 CPU 与 NPU 精度对比的价值所在——它不是"能不能跑通"的冒烟测试,而是量化级的数值一致性验证。
CPU 与 NPU 精度对比的评测方法 📐
本项目的精度对比遵循严格的可复现流程,保证结果真实可信:
- 固定输入:固定随机种子 42,生成确定性输入序列
(1, 288),输入前 8 个值为1.9269, 1.4873, 0.9007, -2.1055, ...,确保每次运行完全一致 - 同一权重快照:CPU 与 NPU 使用同一份固定 revision 的模型权重(4 个 safetensors 分片,共约 16.6 GB)
- 对比对象:对
position_logits逐元素计算绝对误差,并对比离散派生输出class_ids - 判定指标:
max_abs_error:最大绝对误差mean_abs_error:平均绝对误差discrete_outputs_equal:离散分类输出是否一致
核心结果:max_abs_error 仅 0.0125 ✨
这是整个 CPU 与 NPU 精度对比中最亮眼的数据,全部来自真实测量(README.md 第 6.1 节):
| 指标 | 实测值 |
|---|---|
position_logits形状 | (1, 9, 16) |
max_abs_error | 0.012511014938354492(约 0.0125) |
mean_abs_error | 0.0031260023824870586 |
discrete_outputs_equal | true(CPU / NPU 的class_ids均为[8]) |
| NaN / Inf | 无 |
重复前向max_abs_diff | CPU / NPU 各自为0.0 |
也就是说,NPU 上 bf16 推理与 CPU 参考输出相比,最大单点误差只有 0.0125,平均误差仅 0.0031,且重复前向结果完全确定(0.0 差异),说明昇腾 NPU 上的推理结果稳定可靠。
为了让结论更扎实,项目还做了10 样本回归测试:10 个独立子进程、共 1440 个元素,max_abs_error为 0.0197,mean_abs_error为 0.0030,离散输出匹配 10/10。最终判定accepted=true(阈值:max_abs_error≤1.0、mean_abs_error≤0.1、discrete_agreement_min≥0.8),实测精度远超阈值要求。
NPU 推理结果实测证据 📸
下图是模型在昇腾 NPU 上最终适配验收的真实日志截图,可以看到完整的输出标记:输入序列特征、分位数预测FORECAST、离散分类PREDICTED_CLASS=8,以及INPUT_DEVICE=npu:0、CPU_FALLBACK=false、EXIT_CODE=0等关键状态:
日志中INFERENCE_WALL_MS=391.713642是单次同步前向的墙钟耗时;分位数预测的中位行均值FORECAST_MEAN=0.075945、标准差0.022661,与精度对比阶段的证据完全吻合。
昇腾 NPU 设备与运行环境 ⚙️
本次 CPU 与 NPU 精度对比运行在昇腾 910B4 上。下图为npu-smi设备快照,展示了 NPU 芯片的功耗、温度、HBM 内存占用以及推理进程状态:
| 组件 | 版本 |
|---|---|
| 硬件 | Ascend 910B4-1(逻辑npu:0) |
| 操作系统 | openEuler(aarch64) |
| CANN | 8.5.1 |
| torch / torch_npu | 2.9.0 |
| transformers | 4.57.6 |
| Python | 3.11.14 |
注意:交付脚本通过torch.npu.is_available()强校验 NPU 可用,不降级到 CPU(CPU_FALLBACK=false),保证了精度对比的双方确实是"NPU 真实计算"而非 CPU 回退。
端到端适配工作流 🔄
从模型下载、源码安全审计、CPU/NPU 精度对比,到性能评测与最终交付,整个过程被记录为可追溯的适配工作流。下图展示了各阶段的执行记录:
整个流程的关键结论:模型是纯 PyTorch 实现、无 CUDA 专属 API,通过torch_npu注册的 NPU 后端即可运行,无需打迁移补丁,这也是精度对比结果如此干净的前提之一。
如何复现 CPU 与 NPU 精度对比 🛠️
如果你想亲手复现这份精度对比结果,操作非常简单:
git clone https://gitcode.com/atlasleong/timer-s1-npu cd timer-s1-npu python inference.py仓库内的核心文件:
- inference.py:交付推理脚本,自包含、无外部依赖,执行权重完整性校验(
CHECK_WEIGHTS_OK=4/4)→ warmup 前向 → 计时前向 → 证据落盘校验(ASSETS_VERIFIED=true) - model/:完整模型快照,4 个 safetensors 分片 + 配置文件 + 定制建模代码
- assets/:推理证据数组与摘要(inference_summary.json 记录了
median_forecast、forecast_mean、inference_wall_ms等真实结果) - requirements.txt:交付运行依赖(torch / torch_npu 由昇腾 worker 镜像固定,不从 PyPI 安装)
复现完成后,你可以对比position_logits.npy与 CPU 参考输出,自行计算max_abs_error——预计你会得到与本文一致的结论:约 0.0125。
总结 ✅
通过这次 CPU 与 NPU 精度对比实战,我们可以确认:Timer-S1 在昇腾 NPU 上以 bf16 精度推理,与 CPU float32 参考结果的最大绝对误差仅 0.0125,平均误差 0.0031,离散分类输出完全一致,完全满足大模型推理的数值一致性要求。
这套"固定种子 + 同一权重 + 双端对比 + 阈值判定"的精度验证方法论,同样适用于其他大模型在昇腾 NPU 上的迁移验证。如果你正在做 NPU 推理适配,建议把max_abs_error作为每次发布的必查指标——数据会告诉你迁移是否真正"无损"。
【免费下载链接】timer-s1-npu项目地址: https://ai.gitcode.com/atlasleong/timer-s1-npu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考