模型标签:
NPUAscend昇腾时间序列预测Zero-ShotTransformersPyTorch模型类型: 时间序列预测 适配硬件: 昇腾 910
本仓库包含适用于华为昇腾 910 NPU 的 Amazon Chronos-2 时间序列基础模型的 NPU 适配评估脚本。
amazon/chronos-2(基于 T5 的编码器,约 456MB,分位数预测)torch_npu(CANN 8.5.1)autogluon/chronos_datasets 的 25 个零样本时间序列数据集(GIFT-Eval 代理)import torch_npu 必须在任何 NPU 操作之前导入。from_pretrained() 中移除 device_map="auto"(在 NPU 上会触发 CUDA 路径)。改为:
pipeline = BaseChronosPipeline.from_pretrained(model_id, torch_dtype=dtype)
pipeline.model = pipeline.model.to("npu:0")torch.npu.synchronize()。datasets>=4.8,设置 HF_DATASETS_TRUST_REMOTE_CODE=1。移除 ETTm/ETTh 数据集(autogluon/chronos_datasets_extra),这些数据集与较新版本的 datasets 不兼容。HF_ENDPOINT=https://hf-mirror.com 进行数据集下载。.
├── requirements.txt # Python dependencies
├── scripts/evaluation/
│ ├── evaluate_npu.py # Main NPU evaluation script
│ ├── evaluate_cpu.py # CPU baseline script
│ ├── compare_results.py # Accuracy comparison tool
│ └── configs/
│ ├── zero-shot-npu.yaml # 25-dataset NPU config
│ └── zero-shot-cpu-subset.yaml # 3-dataset CPU subset for accuracy check
└── results/ # Evaluation outputs (CSV + JSON)pip install -r requirements.txt关键依赖项:
torch>=2.2torch_npu>=2.9.0chronos-forecasting>=2.2.2transformers>=4.41datasets>=4.8gluonts>=0.15export HF_DATASETS_TRUST_REMOTE_CODE=1
export HF_ENDPOINT=https://hf-mirror.com # For China networkpython -c "from modelscope import snapshot_download; snapshot_download('amazon/chronos-2', cache_dir='/opt/atomgit/models')"python scripts/evaluation/evaluate_npu.py \
scripts/evaluation/configs/zero-shot-npu.yaml \
results/zero-shot-npu-fp32-b128.csv \
--model-id /path/to/chronos-2 \
--device-id 0 \
--torch-dtype float32 \
--batch-size 128python scripts/evaluation/evaluate_npu.py \
scripts/evaluation/configs/zero-shot-npu.yaml \
results/zero-shot-npu-fp16-b128.csv \
--model-id /path/to/chronos-2 \
--device-id 0 \
--torch-dtype float16 \
--batch-size 128python scripts/evaluation/evaluate_cpu.py \
scripts/evaluation/configs/zero-shot-cpu-subset.yaml \
results/zero-shot-cpu-fp32-subset.csv \
--model-id /path/to/chronos-2 \
--batch-size 64python scripts/evaluation/compare_results.py \
results/zero-shot-cpu-fp32-subset.csv \
results/zero-shot-npu-fp32-b128.csv后台评估完成后将填充结果。
以下是为 NPU 性能验证设定的目标:
| 目标指标 | CPU 基准值 | NPU 目标值 | 实际 NPU FP32 值 | 状态 |
|---|---|---|---|---|
| 平均时间/序列 | ~2,380 毫秒 | < 10 毫秒 | 0.95 毫秒 | ✅ 已超越 |
| 吞吐量 | ~0.4 序列/秒 | > 500 序列/秒 | 1,052.2 序列/秒 | ✅ 已超越 |
| 相对 CPU 加速比 | 1.00 倍 | > 100 倍 | ~380 倍(抽查) | ✅ 已超越 |
| 总推理时间(25 个数据集) | > 100 小时 | < 300 秒 | 181.17 秒 | ✅ 已超越 |
注意:CPU 基准值对于完整的 25 个数据集评估而言速度过慢(估计超过 100 小时)。在
ercot(8 个序列)上的抽查显示,CPU 约为 2,380 毫秒/序列,而 NPU 约为 6.3 毫秒/序列,证实已达成 >100 倍的加速目标。
| 配置 | 批大小 | 总推理时间 | 平均时间/序列 |
|---|---|---|---|
| NPU FP32 | 128 | 181.17秒 | 0.95毫秒 |
| NPU FP16 | 128 | 160.87秒 | 0.84毫秒 |
| CPU FP32(抽查) | 64 | 19.04秒(8 个序列) | ~2380毫秒 |
NPU FP32 加速比:~380 倍(与相同 ercot 数据集上的 CPU 相比,仅推理部分)。
完整的 25 个数据集 CPU 基准测试速度过慢(估计超过 100 小时)。使用
ercot(8 个序列)上的抽查进行准确性验证。
在 ercot 数据集上的抽查:
| 指标 | CPU 值 | NPU FP32 值 | 差异 | 状态 |
|---|---|---|---|---|
| MASE | 0.831766 | 0.831766 | < 1e-7 | 通过 |
| WQL | 0.025958 | 0.025958 | < 1e-8 | 通过 |
跨数据集 NPU FP32 与 FP16 MASE 比较:平均差异 < 0.005(0.2%),证实预测一致性。
| 数据集 | 时间序列数 | 推理时间 | 占比 |
|---|---|---|---|
| dominick | 100,014 | 62.60秒 | 34.5% |
| m5 | ~40,000 | 61.99秒 | 34.2% |
| monash_weather | ~3,000 | 23.07秒 | 12.7% |
| m4_quarterly | 24,000 | 11.32秒 | 6.2% |
| m4_yearly | 23,000 | 10.93秒 | 6.0% |
| monash_traffic | 862 | 6.20秒 | 3.4% |
NPU FP16 相比 FP32 实现了约 11% 的速度提升,但由于指标计算分母下溢,在 25 个数据集中的 12 个上产生了 inf WQL 值。FP32 是获得经过验证结果的推荐精度。 FP32 和 FP16 之间的 MASE 值几乎相同(差异 <0.01%),证实模型预测是一致的。
| 优化阶段 | 总推理时间 | 平均序列耗时 | 吞吐量 (series/s) | 加速比 |
|---|---|---|---|---|
| NPU FP32 基线 | 181.17 s | 0.95 ms | 1052.2 | 1.00x |
| NPU FP16 优化 | 160.87 s | 0.84 ms | 1184.9 | 1.13x |
注:FP16 带来约 13% 吞吐提升,但在 12/25 数据集上产生
infWQL(指标计算分母下溢)。推荐生产环境使用 FP32 获取稳定指标,FP16 可作为加速备选方案。
transformers 中的 device_map 参数自动调度会触发特定于 CUDA 的代码路径,该路径在 NPU 上会失败。需要手动使用 .to("npu:0")。BaseChronosPipeline 没有 .to() 方法;模型迁移通过 pipeline.model.to(device) 完成。torch.npu.synchronize() 对于 NPU 操作的准确挂钟时间测量至关重要。本项目遵循与上游 chronos-forecasting 仓库相同的许可证。