common.py 3个关键函数拆解:PatchTSMixer 时序预测如何在 NPU 上完成本地加载与确定性推理
【免费下载链接】test-patchtsmixer-npu用户可直接运行此项目在华为昇腾NPU上执行PatchTSMixer多变量时序预测,获取96步未来预测值(含位置logits与类别argmax),并验证模型精度与性能。项目包含完整迁移交付物(模型权重、推理脚本、输出校验),全程无CPU回退,实测单次前向仅需10.58毫秒。项目地址: https://ai.gitcode.com/atlasleong/test-patchtsmixer-npu
本文带你拆解test-patchtsmixer-npu项目的common.py,看懂其中3 个关键函数——本地加载模型、构造确定性输入、一次预测出双输出——如何协作让 IBM PatchTSMixer 多变量时序预测模型在华为昇腾 NPU 上全程无 CPU 回退运行,单次前向实测仅10.58 毫秒,稳定输出 96 步未来预测值。
项目一眼速览
这个项目是一个"开箱即跑"的昇腾 NPU 时序预测交付仓库,结构非常克制:
| 文件 | 职责 |
|---|---|
| inference.py | NPU 前向入口,打印设备标记与预测结果 |
| common.py | 自包含工具函数(本文主角) |
| model/ | 固定权重快照(config + safetensors) |
| requirements.txt | transformers 5.15.0、numpy、safetensors 等依赖 |
模型输入为(1, 512, 7)的多元时序上下文,输出 96 步 × 7 通道的连续预测值position_logits (1, 96, 7),以及每个预测位置取 argmax 得到的离散通道 idclass_ids (1, 96)。
关键函数 1:load_model——100% 本地加载模型权重
想避免"运行时偷偷联网下载模型",核心就是本地加载这两个字。common.py的做法值得抄作业:
- 把模型路径写成语义明确的字面量
MODEL_PATH = "./model","./"前缀让"这是本地路径"一目了然(见 common.py); - 用
_ensure_delivery_cwd()先把工作目录对齐到交付根目录,保证相对路径永远指向 model/ 快照; - 调用
PatchTSMixerForPrediction.from_pretrained("./model", local_files_only=True),local_files_only=True从机制上禁止任何网络访问(见 common.py)。
加载完成后执行model.eval()并to(device)放到npu:0。模型本身是标准 Transformers 架构(model_type=patchtsmixer,19.6 万参数、float32),无需自定义远程代码,配置可直接查看 model/config.json。
运行前可以先用npu-smi info确认昇腾设备在线,本项目实测环境为 Ascend 910B4-1 × 8:
关键函数 2:make_input——一行构造可复现的确定性输入
时序预测的验收最怕"这次和上次结果不一样"。make_input用固定随机种子彻底解决这个问题:
- 先调用 set_seed 同时锁死
torch、numpy、random三套随机数生成器(固定种子FIXED_SEED = 20260815); - 再用
torch.randn(batch_size, 512, 7)生成标准正态的多元时序上下文,形状(batch_size, context_length, num_input_channels)与模型的past_values契约完全一致; - 最后
.to(device)把张量直接送上 NPU,全程不经过 CPU 中转。
这就是"确定性输入"的全部秘密:同一颗种子 → 同一份字节级一致的输入,因此 CPU 基线与 NPU 推理可以逐值对比。实测 CPU 与 NPU 输出的max_abs_error仅约3.9e-05,离散 argmax 一致率 100%。
💡 换成真实数据时,只需按
(batch_size, 512, 7)语义构造past_values张量送入模型即可,输入契约不变。
关键函数 3:run_forward——一次前向,两份语义不同的输出
run_forward 是三者中最有"信息量"的函数:一次torch.no_grad()前向,同时产出两种语义的输出——
position_logits:模型预测头原生的连续值,形状(B, 96, 7),即未来 96 步、每步 7 个通道的预测值;class_ids:对position_logits在通道维做argmax得到的离散 id,形状(B, 96),int64。
把预测头"映射"成position_logits + class_ids的双角色契约,是时序模型接入标准 sequence-prediction 评测流程的常见技巧,新手理解这一点比背 API 更重要。
三个函数如何串成完整推理
入口脚本 inference.py 的编排非常直白:
设备检查(无 NPU 直接报错,拒绝 CPU 回退) → set_seed(20260815) → load_model(npu:0) → make_input(seed, batch_size=1, device=npu:0) → warmup 一次 + torch.npu.synchronize() → run_forward(model, past_values) # 被计时 → 落盘 outputs/*.npy 并 np.load 重载校验一次真实运行的终端验收输出如下(含INPUT_DEVICE=npu:0、CPU_FALLBACK=false、前 8 个真实预测值等机器契约标记):
以下是由 AI Agent 驱动的完整适配工作流截图,可以看到从模型审计、CPU 基线到 NPU 前向、精度对比、性能实测的完整证据链:
快速上手:自己动手跑一遍
依赖由昇腾 worker 镜像提供torch/torch_npu,业务侧只需安装 requirements.txt 中的 5 个包,然后执行:
python3 inference.py关注输出末尾这几行即可判断推理是否成功:
CPU_FALLBACK=false FORECAST_COUNT=672 ARGMAX_TOP_CLASS=1 INFERENCE_WALL_MS=10.580024 EXIT_CODE=0小结:3 个函数教给你的 3 个工程习惯
- 本地加载:路径字面量 +
local_files_only=True,让"不联网"可静态证明(common.py); - 确定性输入:一次性锁定 torch / numpy / random 三套种子,验收才有基准(common.py);
- 单一职责的前向封装:把"前向 + 输出契约"收敛到一个函数里,方便计时、落盘与校验复用(common.py)。
照这三步写,你自己的时序模型迁移到 NPU 时,也能拿到同样干净、可复现的推理结果。
【免费下载链接】test-patchtsmixer-npu用户可直接运行此项目在华为昇腾NPU上执行PatchTSMixer多变量时序预测,获取96步未来预测值(含位置logits与类别argmax),并验证模型精度与性能。项目包含完整迁移交付物(模型权重、推理脚本、输出校验),全程无CPU回退,实测单次前向仅需10.58毫秒。项目地址: https://ai.gitcode.com/atlasleong/test-patchtsmixer-npu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考