weixin_55674987/chronos-2-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Chronos-2 昇腾 800I A2 NPU 推理性能优化

#+NPU 赛道二 · 模型调优(性能优化)

Amazon Chronos-2 时间序列预测模型在华为昇腾 800I A2 NPU 上的适配与性能调优,实现 +33.5% 吞吐提升(651 → 869 samples/sec),精度误差 < 0.001%(远低于 1% 阈值)。


性能对比

核心指标

指标优化前 (Baseline)优化后 (Final)提升幅度
samples/sec651.04868.94+33.5%
mean latency1966.1 ms1473.1 ms-25.1%
p50 latency1980.9 ms1467.6 ms-25.9%
p95 latency—1565.7 ms—
p99 latency2051.0 ms1581.9 ms-22.9%

测试配置:batch=1, context_length=512, prediction_length=64, num_samples=20

最优峰值(参考)

指标最优值
samples/sec901.39
mean latency1420.0 ms

注:官方基准测试(868.94)采用 5 次 warmup + 20 次测量,统计结果稳定可靠。峰值 901.39 为单次实验最优结果。


精度验证

指标测量值阈值结果
Encoder Relative MAE7.15e-07< 0.01PASS
Prediction Relative MAE0.0< 0.01PASS
Prediction MASE0.0< 0.01PASS
Overall—< 1%PASS

NPU 推理结果与 CPU 基准完全一致(greedy decoding 下相对误差为零),证明 NPU 适配未引入任何数值精度损失。


模型信息

属性值
模型名称Chronos-2 (chronos-t5-base)
架构T5ForConditionalGeneration
参数量~220M (d_model=768, d_ff=3072, 12层, 12头)
模型地址https://ai.gitcode.com/hf_mirrors/amazon/chronos-2
任务类型时间序列预测 (Time Series Forecasting)
TokenizerMeanScaleUniformBins (vocab=4096)
默认配置context_length=512, prediction_length=64, num_samples=20
目标硬件华为昇腾 800I A2 NPU
精度float32

优化技术

采用的优化

1. NPU 运行时环境变量调优(主要收益来源)

export TASK_QUEUE_ENABLE=2          # 异步任务队列调度
export CPU_AFFINITY_CONF=2          # CPU 核心亲和性绑定
export ACL_OP_TUNE_MODE=high_performance  # ACL 算子高性能调优
export ACC_OPS_RESULT=high_performance    # 累加算子高性能模式

2. KV Cache 优化

自定义 OptimizedChronosModel 类,通过 GenerationConfig(use_cache=True) 启用 HuggingFace 原生 KV Cache,在 model.generate() 中避免重复注意力计算。

关键代码:eval/final_benchmark.py

实验未采用

优化方向结果原因
torch.compile (max-autotune)698 s/s (-12%)NPU 编译兼容性问题,增加开销
float16 精度498 s/s (-23%)Chronos tokenizer 数值范围大,fp16 溢出严重
bfloat16 精度746 s/s (-6%)略有下降,无显著收益
torch.inference_mode621 s/s比 torch.no_grad() 更慢
Matmul precision 调优~798 s/s改善微弱,不稳定

复现指南

1. 环境准备

# 创建 conda 环境
conda create -n chronos-2-npu python=3.11 -y
conda activate chronos-2-npu

# 安装依赖
pip install torch==2.10.0 torch_npu==2.10.0 chronos-forecasting datasets evaluate numpy pandas

2. 模型下载

# 使用国内镜像
export HF_ENDPOINT=https://hf-mirror.com
python -c "from chronos import ChronosPipeline; ChronosPipeline.from_pretrained('amazon/chronos-t5-base')"

或使用 ModelScope:

python -c "from modelscope import snapshot_download; snapshot_download('AI-ModelScope/chronos-t5-base')"

3. 运行 Baseline

python eval/baseline_run.py --device npu --model /tmp/chronos-model

4. 运行优化版基准测试

python eval/final_benchmark.py --model /tmp/chronos-model --batch 1 --num_runs 20

5. 运行精度验证

python eval/accuracy_deterministic.py --model /tmp/chronos-model

6. 运行数据集验证(完整流水线)

python eval/validate_dataset.py --model /tmp/chronos-model --dataset sine
# 生成: results/dataset_validation.json, logs/dataset_validation.log,
#        screenshots/dataset_*.png

7. 运行全部实验(可选)

python eval/optimize_combined.py      # 组合优化对比
python eval/optimize_sampling.py      # KV Cache 实验
python eval/profile_inference.py      # 推理时间分解

文件结构

chronos-2/
├── README.md                           # 本文档
├── goal.md                             # 优化计划与约束定义
├── eval/                               # 评测脚本
│   ├── baseline_run.py                 # Baseline 性能评测
│   ├── final_benchmark.py              # 最终优化版基准测试 (20 runs)
│   ├── accuracy_deterministic.py       # 确定性精度对比 (NPU vs CPU)
│   ├── accuracy_validation.py          # 精度验证 (多 series)
│   ├── quick_accuracy.py               # 快速精度检查
│   ├── perf_eval.py                    # 通用性能评测框架
│   ├── profile_inference.py            # 推理时间分解分析
│   ├── optimize_npu_env.py             # NPU 环境变量实验
│   ├── optimize_torch_compile.py       # torch.compile 实验
│   ├── optimize_combined.py            # 组合优化实验
│   ├── optimize_sampling.py            # 采样循环 / KV Cache 实验
│   ├── optimize_encoder_cache.py       # Encoder 缓存实验
│   ├── optimize_matmul.py              # Matmul 精度实验
│   ├── optimize_advanced.py            # 多 NPU 设备测试
│   ├── optimize_final.py              # 最终参数扫描
│   ├── generate_training_samples.py   # 训练数据样例可视化
│   ├── generate_prediction_screenshots.py  # NPU 推理预测截图
│   └── validate_dataset.py            # 数据集完整验证 (精度+性能+截图)
├── results/                            # 实验结果 (JSON)
│   ├── baseline.json                   # Baseline 性能数据
│   ├── final_benchmark.json            # 官方最终基准 (20 runs)
│   ├── dataset_validation.json         # 数据集验证完整报告
│   ├── accuracy_validation.json        # 精度验证结果
│   ├── npu_env.json                    # NPU 环境变量实验
│   ├── torch_compile.json              # torch.compile 实验
│   ├── combined_experiments.json       # 组合实验
│   ├── sampling_optimization.json      # 采样 / KV Cache 实验
│   ├── advanced_npu.json              # 多设备测试
│   ├── final_optimization.json         # 最终优化实验
│   └── matmul_precision.json          # Matmul 精度实验
├── models/                             # 模型配置 (权重被 .gitignore)
│   └── chronos-t5-base/config.json
├── logs/                               # 运行日志
│   ├── final_benchmark_full.log        # 基准测试日志
│   ├── accuracy_validation_full.log    # 精度验证日志
│   ├── dataset_validation_full.log     # 数据集验证日志
│   └── dataset_validation.log          # 数据集验证摘要
├── screenshots/                        # 截图与可视化
│   ├── training_data_samples.png       # 训练数据样例 (5 个)
│   ├── sample_1_*.png ~ sample_5_*.png # 单独样本图
│   ├── prediction_1.png ~ prediction_5.png  # NPU 推理预测
│   ├── dataset_npu_prediction.png      # 数据集 NPU 预测
│   ├── dataset_cpu_vs_npu.png          # CPU vs NPU 对比
│   └── dataset_full_report.png         # 完整验证报告
└── deliverables/                       # 交付物

评测材料清单

材料路径状态
评测源代码eval/ (18 个脚本)✅
性能结果数据results/*.json (11 个文件)✅
精度验证数据results/accuracy_validation.json, results/dataset_validation.json✅
训练数据样例screenshots/training_data_samples.png + 5 张单独样本✅
NPU 推理截图screenshots/prediction_1~5.png, dataset_npu_prediction.png, dataset_cpu_vs_npu.png, dataset_full_report.png✅
运行日志logs/ (5 个日志文件)✅
复现指南本文档「复现指南」章节 + eval/validate_dataset.py✅

Git 提交记录

1027aae chore: commit all experiment scripts and results
6ac5dd4 feat: accuracy validation PASSED — NPU numerically identical to CPU
5f795b0 feat: Chronos-2 NPU optimization — 790 samples/sec (+21% over baseline)
f1cbba5 init: chronos-2 scaffold (conda=chronos-2-npu)