尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

逐行读懂inference.py:moment-1-small-npu昇腾NPU时间序列推理的完整实现

逐行读懂inference.py:moment-1-small-npu昇腾NPU时间序列推理的完整实现 逐行读懂inference.pymoment-1-small-npu昇腾NPU时间序列推理的完整实现【免费下载链接】moment-1-small-npu用户可直接在昇腾 NPU 环境下运行 MOMENT-1-small 时间序列基础模型完成短程点预测任务输入 512 长度序列即可输出 8 步预测结果。项目已适配 torch_npu提供固定版本的模型快照、最小依赖和自包含推理脚本实现确定性前向及 CPU/NPU 精度对比验证。项目地址: https://ai.gitcode.com/atlasleong/moment-1-small-npumoment-1-small-npu让你可以直接在昇腾 NPU环境下运行 MOMENT-1-small 时间序列基础模型完成短程点预测输入 512 长度的序列输出 8 步预测结果。全文将带着你逐段读懂唯一的推理入口 inference.py看懂它是如何加载模型、锁定 NPU 设备并产出可审计的预测结果的。动手之前MOMENT-1-small 是什么MOMENT 是 AutonLab 开源的时间序列基础模型家族MOMENT-1-small 是其中的小规格成员属性值架构T5 纯编码器encoder-only约 3534 万参数上下文长度seq_len512patch 切分patch_len8预测视野forecast_horizon8一个 patch 的短程点预测输入形状x_encfloat32[batch2, channels1, 512]输出形状forecastfloat32[2, 1, 8]本仓库做了三件关键事适配torch_npu、固定模型快照版本、提供一个自包含的推理脚本——不访问网络、不信任远端代码、禁止 CPU 回退。下图是完整的适配与验证工作流实录可以看到从环境检查、模型审计到 NPU 验收的每一步仓库总览4 个部分就能跑起来仓库非常精简核心就 4 块inference.py—— 本文主角约 178 行的自包含推理脚本model/—— 固定 revision 的模型快照含config.json、model.safetensors、pytorch_model.binrequirements.txt—— 精确版本锁定的最小依赖torch/torch_npu 由昇腾 worker 镜像固定不在其中assets/—— 真实运行截图及来源证据下面进入正题按脚本的实际执行顺序逐段拆解。第一段路径解析与冻结参数第 28–51 行脚本开头做了一件容易被忽略但很重要的事——所有路径都相对inference.py自身解析DELIVERY_DIR os.path.dirname(os.path.abspath(__file__)) MODEL_DIR os.path.join(DELIVERY_DIR, model)这意味着把整个仓库拷贝到任意位置、在任意工作目录下运行python3 inference.py都不会找不到文件。紧接着是一组冻结的确定性配置SEED 13 SEQ_LEN 512 BATCH 2 FORECAST_HORIZON 8 DEVICE npu:0给新手的解读随机种子固定为 13、批大小 2、序列长度 512、预测视野 8 步——所有超参都写死保证任何一次运行的结果都可以逐字节复现。这也是可审计推理的基础。第二段用公式而非随机数生成输入第 54–85 行build_inputs()生成了本次推理的输入时间序列。它不调用任何随机数而是用固定公式为每个 batch 构造一段正弦 余弦波形wave ( amp * np.sin(2.0 * np.pi * f1 * t phase) 0.3 * np.cos(2.0 * np.pi * f2 * t) 0.05 * b )频率f1、f2、相位phase、幅值amp全部由种子和 batch 索引的取模运算推出。为什么不用np.random因为不同设备、不同平台的 RNG 实现可能产生不同序列而纯公式输入在任何 CPU/NPU 上得到的输入都完全一致后续才能做严格的精度对比。配套的build_input_mask()返回全 1 的 int64 掩码[2, 512]表示 512 个时间点全部有效、无缺失值。第三段从本地快照加载模型第 88–108 行load_model()只做三件事model MOMENTPipeline.from_pretrained( MODEL_DIR, local_files_onlyTrue, model_kwargs{ task_name: reconstruction, enable_gradient_checkpointing: False, }, ) model.eval()两个值得注意的细节local_files_onlyTrue只从本地model/目录读权重safetensors约 151 MBsha256 已固化全程零网络访问也不使用trust_remote_code。task_namereconstruction短程预测复用的是预训练的重建头而不是专门的 forecasting 头——这正是8 步短程点预测的实现方式。若传入设备参数模型会被整体搬到npu:0上。第四段NPU 硬校验CPU 回退被明令禁止第 111–134 行main()的第一动作是两道安检import torch_npu # 失败即抛 RuntimeError if not torch.npu.is_available(): raise RuntimeError(NPU device npu:0 unavailable; refusing CPU fallback)导入torch_npu失败或npu:0不可用脚本直接报错退出绝不悄悄退回 CPU。随后脚本固定双端随机种子torch.manual_seed(13)np.random.seed(13)加载模型并用断言确认assert str(next(model.parameters()).device) npu:0输入张量同样在转成 torch 后立刻搬上设备并断言设备正确。下图是验证阶段npu-smi抓到的真实设备快照可以看到 8 张 910B4-1 全部健康且第 4 号卡上有本任务的 python 推理进程第五段short_forecast 前向与输出标记第 148–174 行核心前向只有 5 行with torch.no_grad(): out model.short_forecast( x_encx_enc, input_maskinput_mask, forecast_horizonFORECAST_HORIZON, ) output out.forecast随后脚本做了几件审计级的事在.cpu()之前先打印OUTPUT_DEVICE证明主输出确实诞生在npu:0上而非 CPU拉回 CPU 后断言形状为(2, 1, 8)且无 NaN、无 Inf打印FORECAST16 个预测值语义输出行和EXIT_CODE0最后sys.stdout.flush()确保日志完整落盘。完整的输出标记包括INPUT_DEVICE、MODEL_DEVICE、INPUT_SEQUENCE、OUTPUT_DEVICE、CPU_FALLBACKfalse、FORECAST共六类。一次真实运行的输出结果如下例如预测序列前几个值约-0.1468, -0.1450, -0.1693, 0.3728, ...数值由该次 NPU 前向真实产生与 CPU 基线逐元素一致max_abs_diff0.0。验证CPU 与 NPU 精度对比结果由于输入、权重、种子全部冻结项目用同一份输入分别在 CPUFP32与 NPU 上前向并对比落盘数组指标阈值实测max_abs_error0.13.58e-07mean_abs_error0.011.30e-07两次前向一致性一致max_abs_diff0.0误差在 1e-07 量级且 10 个多样本子进程回归全部通过——这是NPU 上跑通了和NPU 上跑得对的区别。性能方面同步计时的 5 次前向中位数约15.28 ms波动极小。如何运行环境与步骤环境要求由昇腾 worker 镜像提供无需自行安装 torch/torch_npu组件版本操作系统openEuler昇腾 worker 镜像Python3.11CANN / npu-smi8.5.1 / 25.2.0torch / torch_npu2.9.0镜像固定transformers5.15.0两步跑起来git clone https://gitcode.com/atlasleong/moment-1-small-npu cd moment-1-small-npu python3 inference.py脚本不依赖当前工作目录安装依赖时按 requirements.txt 的精确版本执行pip install --ignore-installed --no-deps -r requirements.txt即可。常见问题FAQ❓ 没有 NPU 也能跑吗不行。脚本把CPU 回退视为失败而非降级——torch_npu缺失或npu:0不可用时直接抛出异常并以非零码退出。❓ 能做长程预测或概率预测吗当前审计前向是forecast_horizon8的短程点预测复用重建头不暴露分位数/概率头长程自回归预测不在本仓库范围内。❓ 为什么输入不是真实数据集公式生成的确定性序列是为了让每次运行可复现、CPU/NPU 可严格对拍。接入真实业务数据时只需把build_inputs()的返回值换成你的[batch, channels, 512]float32 数组即可。❓ 权重从哪里来、安全吗权重来自本地model/固定快照MIT 协议加载时local_files_onlyTrue不访问网络、不执行远端代码。总结用一张表带走全文要点环节实现关键点路径相对__file__解析任意位置可运行输入纯公式确定性序列[2,1,512]零 RNG 依赖可复现加载from_pretrainedlocal_files_only离线、免网络设备npu:0 双重断言禁止 CPU 回退前向short_forecast(horizon8)输出[2,1,8]float32验证六类输出标记 NaN/Inf 断言精度误差 3.58e-07读完这 178 行你就拥有了一个可以直接套用的昇腾 NPU 时间序列推理模板确定性输入、本地权重、设备硬校验、审计级输出标记——把它换成自己的模型与数据就能在 NPU 上跑出自己的时间序列预测。【免费下载链接】moment-1-small-npu用户可直接在昇腾 NPU 环境下运行 MOMENT-1-small 时间序列基础模型完成短程点预测任务输入 512 长度序列即可输出 8 步预测结果。项目已适配 torch_npu提供固定版本的模型快照、最小依赖和自包含推理脚本实现确定性前向及 CPU/NPU 精度对比验证。项目地址: https://ai.gitcode.com/atlasleong/moment-1-small-npu创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表