Bingggooo/AutonLab-MOMENT-1-large-NPU
模型介绍
文件和版本
Pull Requests
讨论
分析

MOMENT-1-large NPU 适配 #NPU

AutonLab/MOMENT-1-large 运行于 Ascend 910B npu:0,是一款时间序列基础模型(T5-large 骨干,seq_len 512,patch 8,d_model 1024,24 层 / 16 头 / d_ff 2816 / gated-gelu,共 223 个参数组),用于重构、异常检测与零样本预测。

  • 模型权重 URL:https://huggingface.co/AutonLab/MOMENT-1-large
  • 架构:MOMENTPipeline + T5EncoderModel(google/flan-t5-large,24 层,16 头,d_ff 2816,gated-gelu)、RevIN、Patching(8/8)、PatchEmbedding(1024)、T5 编码器、PretrainHead/ForecastingHead
  • 任务:时间序列重构(预训练)与预测(预测跨度 96);同时支持分类/嵌入;表格数据按单变量窗口处理
  • 版本:快照 2026-08-20,配置为 seq_len 512、patch_len 8、patch_stride 8、transformer_type encoder_only、transformer_backbone google/flan-t5-large
  • 许可证:mit
  • 精度:FP32,在 NPU 上 FP16/BF16 也保持稳定
  • 最大上下文:512(经 patch 后为 64 个 token),预测跨度 96(预测头)

数据约定

  • 输入来源:合成单变量序列,seed 123,batch 1,n_channels 1,seq_len 512,5 分钟频率合成数据。生成内容的 SHA256 由 seed 确定;不含个人数据。
  • 轴顺序:严格为 [batch, n_channels, seq_len];模型 tokenizer 期望 [B, C, T],然后 patch 为 [B*C, n_patches, d_model]。输入不是 [B,T,C]。Channel=1 表示单变量;多变量则使用 n_channels>1,布局相同。
  • 时间约定:时间戳升序,无重复时间戳,无缺失步长,缺口必须在输入前完成插补;频率信息仅作说明。
  • 预处理:原始 float32,不做外部缩放;模型内部按序列应用 RevIN 进行标准化/反标准化(在 masked positions 上计算均值/标准差,affine False)。torch.nan_to_num 用于拦截 NaN/inf。
  • 目标:重构:输出 [1,1,512],与输入形状相同(预训练头 Linear 1024->8 后 flatten)。预测:[1,1,96],预测跨度 96。嵌入:[batch, d_model] 或 [batch, n_patches, d_model],reduction 采用 mean。
  • 数据划分:单窗口合成数据;无训练/测试泄漏;seed 固定为 123 以便对比;预测头随机但固定 seed 42,用于确定性的 CPU-NPU 对比。
  • Schema 校验:inference.py 会检查形状 [B,C,T]、T==512、数值有限,并拒绝不匹配。
  • 隐私:仅记录合成统计信息与 schema;不提交原始数据。

环境

  • NPU: Ascend910_9362,2 个设备,已在 npu:0 上测试,HBM 65536 MB,SOC 910_9391,CANN 8.5.1,驱动 25.5.5,npu-smi 正常,温度 44C
  • Python: 3.11.14,Torch 2.9.0+cpu,torch_npu 2.9.0.post1+gitee7ba04,Transformers 4.40.1,Numpy 1.26.4,huggingface_hub 0.36.2,safetensors,momentfm 0.1.5(从 github 内置引入)
  • HF 缓存: snapshot_download local_dir_use_symlinks False,trust_remote_code false(MOMENT 纯 Python)
  • 设备校验: torch.npu.is_available()==True,device_count==2,get_device_name(0)==Ascend910_9362,全部 223 个参数组均位于 npu:0,无 CPU 回退(ArgSort 在 AI CPU 上运行,属预期行为;模型算子无回退)

安装

pip install -r requirements.txt
# requires CANN toolkit at /usr/local/Ascend/cann-8.5.1 and torch_npu
# momentfm is vendored: pip install git+https://github.com/moment-timeseries-foundation-model/moment.git

NPU 推理

python inference.py
# defaults: --task reconstruction --seq-len 512 --seed 123 --device npu:0
python inference.py --task forecasting
python inference.py --task embedding
python inference.py --benchmark   # warmup 3 + test 10
  • 加载:先调用 MOMENTPipeline.from_pretrained(local_path, model_kwargs={task_name}),再执行 .init(),然后执行 .to("npu:0"),校验 next(param).device==npu:0,并打印 dtype 与 device
  • 计算:直接调用 model(x_enc, input_mask) 执行重建/预测,调用 model.embed(...) 提取嵌入;计时前后均调用 torch.npu.synchronize(),内部包含 RevIN。
  • 输出:统计量、样本、中位数、耗时、SUCCESS,成功时 exit 0,否则非零。预测头警告属于预期(随机头——固定 seed 42 可确保确定性)。
  • 边界情况:NPU 上的 ArgSort 警告属于预期(AiCpu 上的 int 算子),并非回退失败;不存在其他 CPU 回退。

实际结果(NPU)

  • 输入:batch 为 1,n_channels 为 1,seq_len 为 512,均值为 -0.0153,标准差为 1.0007,预览为 [0.3373, -0.1777, -0.3035, -0.5880, 0.3486]
  • 重建(预训练头、npu:0、seed 123):形状为 [1,1,512],均值为 0.0105,标准差为 0.2669,预览为 [0.0513, -0.1031, -0.0686, 0.04, 0.1368],首次运行耗时 0.2306s(含编译),第二次稳定耗时 0.0233s
  • 设备证据:First param device: npu:0、NPU device name: Ascend910_9362、Input device: npu:0、Output device: npu:0,223/223 个参数位于 NPU,已使用 torch.npu.synchronize()
  • HBM 基线:空闲时 3172 MB,加载后约 4500 MB,模型约 2.7GB 权重(safetensors+bin 重复)+ encoder 常驻,均在 64GB 以内

一致性

  • CPU 与 NPU 对比(相同权重、seed 42 模型初始化、seed 123 数据、重建):已保存 cpu_output.npy/npu_output.npy,形状为 [1,1,512],float32
  • 结果:max_abs_error 1.66e-06, mean_abs_error 2.89e-07,均为有限值,形状一致
  • 命令:python .opencode/skills/npu-adapt-skills/scripts/compare_outputs.py --cpu working_moment_large/cpu_output.npy --npu working_moment_large/npu_output.npy --task forecasting --atol 1e-4 --rtol 1e-3 → PASSED(forecasting 任务标志用于通用浮点比较)
  • 阈值依据:FP32 下 atol 1e-4、rtol 1e-3 是时间序列的标准阈值;观测到 1e-6 远小于阈值,证明没有回退且具有确定性。
  • 可复现性:相同预处理(RevIN 内置)、dtype float32、评估模式、固定随机种子、同步计时。ArgSort AiCpu 警告不影响正确性。

性能

  • 方法:在每次前向计算前后调用 torch.npu.synchronize();预热 3 次,测试 10 次
  • 编译/首次运行:预热 1(编译)耗时 0.2304 秒,稳定耗时 0.0225 秒(编译开销已摊销)。缓存后首次全新加载耗时 0.0231 秒
  • 稳定状态:平均 0.0213 秒,最小 0.0209 秒,最大 0.0223 秒,p50 0.0213 秒,p90 0.0215 秒,p95 0.0219 秒,吞吐量 46.92 窗口/秒(batch1,512->512 重建,FP32)
  • HBM 峰值:加载后约 4500 MB,远低于 65536 MB
  • 预处理:未包含在内(合成数据约 0.001 秒);计时仅覆盖模型前向 + 输出头(已同步)
  • 指标:时间序列按窗口/秒统计(seq_len 512、patches 64);若按行/秒计算为 512/0.0213=24037 行/秒,但报告中以窗口计

证据图像

三张 PNG 均由 scripts/render_xterm_evidence.mjs --style raw 从真实日志生成(xterm.js 为深灰背景白色前景,命令行提示符 atomgit@pod-a94f8701860f4700b161b00e290de466:~$ 仅作展示)。

  • Agent 工作流 —— 检查、环境、下载、CPU 基线、NPU 推理、对比、基准测试、验证。
  • NPU 设备调用 —— npu-smi、check_npu、设备名称、参数 dtype/device、输入/输出设备。
  • 模型结果 —— python inference.py 完整输出、schema、预测/重建、计时、SUCCESS。

assets/ 中恰好包含由 manifest 从 logs/workflow.log、logs/device.log、logs/inference.log 生成的上述三个文件。

局限性

  • 预训练头仅支持重建;预测/分类头在微调前为随机初始化——零样本预测值不满足生产环境要求,但一致性仍通过固定随机种子验证。
  • 聚焦单变量;支持多变量 n_channels>1,但未进行充分基准测试。
  • Seq_len 512,固定 patch 8;其他长度未进行性能测试。
  • 训练(fit)未迁移——仅支持推理;已启用梯度检查点,但未在 NPU 训练上测试。
  • 需要 torch_npu 和 CANN 8.5.1;ArgSort 整数算子按设计在 AiCpu 上运行(不视为回退)。
  • 仅使用单 NPU npu:0;多 NPU 未进行基准测试。

仓库结构

.
├── inference.py
├── readme.md
├── requirements.txt
└── assets/
    ├── agent_workflow.png
    ├── npu_device_call.png
    └── model_result.png