如何把真实数据喂给test-patchtsmixer-npu:past_values(512×7)输入构造指南
【免费下载链接】test-patchtsmixer-npu用户可直接运行此项目在华为昇腾NPU上执行PatchTSMixer多变量时序预测,获取96步未来预测值(含位置logits与类别argmax),并验证模型精度与性能。项目包含完整迁移交付物(模型权重、推理脚本、输出校验),全程无CPU回退,实测单次前向仅需10.58毫秒。项目地址: https://ai.gitcode.com/atlasleong/test-patchtsmixer-npu
test-patchtsmixer-npu 是一个可以直接在华为昇腾 NPU 上运行的 PatchTSMixer 多变量时序预测项目:给它一份past_values(512 步 × 7 通道)的历史输入,它就能在 NPU 上完成一次完整前向,输出96 步未来预测值(含位置 logits 与每位置的通道 argmax)。本指南带你从零理解这个输入契约,并把真实业务数据一步步构造、喂进模型,全程无需 CPU 回退。
先看懂输入契约:past_values 到底是什么
一句话:模型只认形状为 (1, 512, 7) 的 float32 张量,即batch=1 × 512 个历史时间点 × 7 个变量通道。
这些数字不是拍脑袋定的,全部固化在 model/config.json 里:
| 参数 | 值 | 含义 |
|---|---|---|
context_length | 512 | 历史上下文窗口长度(时间步数) |
num_input_channels | 7 | 变量(通道)数,沿袭 ETTh1 预训练的 7 变量 |
prediction_length | 96 | 一次前向输出 96 步未来预测 |
patch_length/patch_stride | 16 / 16 | 512 点会被切成 32 个 patch 送入混合网络 |
scaling | true | 模型按“已标准化”的数据训练,输入建议 z-score |
翻译成人话就是三条硬规则:
- 512:必须给满最近 512 个点,且按时间顺序排列(旧 → 新,最新在尾部)
- 7:7 个变量通道,顺序与上游预训练(
ibm/patchtsmixer-etth1-pretrain)保持一致 - 输出:
position_logits (1, 96, 7)连续预测 +class_ids (1, 96)每个预测位置在通道维上的 argmax,逻辑见 common.py 的run_forward()
快速核对昇腾 NPU 环境
喂数据之前,先用npu-smi info确认设备在线。推理脚本 inference.py 在检测不到 NPU 时会直接抛出RuntimeError,设计上就没有 CPU 回退路径,所以环境这一步不能省:
运行依赖见 requirements.txt(transformers==5.15.0 等 5 个 pin,torch / torch_npu 2.9.0 与 CANN 8.5.1 由昇腾 worker 镜像提供)。模型权重快照在本地 model/model.safetensors(fp32,196,144 参数,36 个张量),以local_files_only=True加载,运行时不访问网络。尚未拉取项目的同学先执行:
git clone https://gitcode.com/atlasleong/test-patchtsmixer-npu四步构造真实数据 past_values(512×7)
第一步:截取最近 512 个历史点
从你的数据集中取最后 512 行,保持时间顺序、最新点放在末尾——模型是从最后一个点往后继续预测的,顺序放反等于把“未来”喂成了“过去”。
第二步:对齐 7 个通道顺序
7 列变量必须与预训练时一致(上游为 ETTh1 的 7 个变量,如 Hu、Hl、LH、Ll、VL、VQ、PV 等)。换成自己的业务变量时,按模型预期的通道顺序填列,不要随意重排。
第三步:标准化(最容易被忽略的关键步)
config.json中scaling=true,且项目内置的合成输入是标准正态随机数(均值 ≈ 0、std ≈ 1,见 common.py 的make_input())。因此真实数据应先做z-score 标准化:(x - mean) / std,统计量用这 512 点窗口或全量历史计算。跳过这步,输出分布会整体漂移。
第四步:构造张量并放到 NPU
import numpy as np import torch window = my_data[-512:, :7] # 真实数据 (512, 7) window = (window - window.mean(axis=0)) / window.std(axis=0) # 标准化 past_values = ( torch.from_numpy(window.astype("float32")) # 必须是 float32 .unsqueeze(0) # 加 batch 维 → (1, 512, 7) .to("npu:0") )⚠️ 注意:Ascend 910B 不支持 fp64,全程保持 float32 即可,无需改 dtype。
喂给模型并验证输出
默认情况下 inference.py 用固定种子(20260815)生成的确定性合成输入做验收前向;换成真实数据时,把main()中past_values = common.make_input(...)这一行替换为你自己构造的张量即可,其余加载与前向逻辑都不用动:
with torch.no_grad(): out = model(past_values=past_values) position_logits = out.prediction_outputs.float() # (1, 96, 7),96 步预测运行后重点看终端输出的这几个标记:
INPUT_SEQUENCE=(1, 512, 7);mean=...—— 确认模型实际吃到的输入形状与均值(换成真实数据后,mean 会不再是合成输入的 -0.021139,这是正常的)FORECAST=/FORECAST_COUNT=672—— 前 8 个真实预测值与总预测元素数(96×7)INFERENCE_WALL_MS=—— 单次前向同步墙钟实测约10.58 毫秒
常见坑位清单
- 形状不是 (1, 512, 7):给了 511 或 513 个点、只有 6 个通道,都会直接被模型拒绝
- 时间顺序反了:最新点放开头,预测结果会整体错位
- 用了 fp64:NPU 不支持,统一 float32
- 忘记标准化:原始数据量级大(几十、几百)时输出分布漂移
- 没有 NPU 却想跑:脚本会抛
RuntimeError拒绝回退,这是设计意图而非 bug
交付流水线如何校验你的输入
项目的完整流水线从模型审计 → CPU 基线 → NPU 前向 → CPU/NPU 精度对比(max_abs_error < 0.01)→ 多样本回归 → 性能实测,全部标记都由真实张量运行时计算得出(非写死)。你换入真实数据后的输出,可以对照 README.md 中记录的 21 行机器契约标记逐条核对:
小结
past_values=(1, 512, 7)float32:最近 512 点按时间序、7 个变量按预训练通道顺序- 先 z-score 标准化到均值 0、std 1,再
.to("npu:0") - 用终端的
INPUT_SEQUENCE=与FORECAST=标记确认输入生效、输出合理 - 单次前向约 10.58 ms,一次输出 96 步未来预测 + 每位置通道 argmax
【免费下载链接】test-patchtsmixer-npu用户可直接运行此项目在华为昇腾NPU上执行PatchTSMixer多变量时序预测,获取96步未来预测值(含位置logits与类别argmax),并验证模型精度与性能。项目包含完整迁移交付物(模型权重、推理脚本、输出校验),全程无CPU回退,实测单次前向仅需10.58毫秒。项目地址: https://ai.gitcode.com/atlasleong/test-patchtsmixer-npu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考