贪心还是采样?Kronos-small NPU 确定性解码的取舍与temperature/top-p概率预测启用方法
贪心还是采样?Kronos-small NPU 确定性解码的取舍与temperature/top-p概率预测启用方法
【免费下载链接】kronos-small-npu用户可直接在华为昇腾 NPU 上运行 Kronos-small 模型,用于金融 K 线(OHLCV)时间序列的预测与趋势方向判断。项目提供自包含交付仓,支持 NPU 端到端推理,确保 CPU 与 NPU 逐位一致,并内置精度校验与确定性输出。项目地址: https://ai.gitcode.com/atlasleong/kronos-small-npu
想在华为昇腾 NPU 上跑 Kronos-small K 线(OHLCV)预测?本文解析本项目中确定性贪心解码与temperature / top-p 采样预测的取舍:为什么交付版选择 argmax 贪心解码以保证 CPU 与 NPU 逐位一致,以及如何在自己的脚本里启用 temperature / top-p 概率预测。
Kronos-small 预测原理:从 OHLCV 到离散 token 的两级解码
Kronos-small 是首个开源的金融 K 线基础模型(MIT 许可),核心是decoder-only 自回归 Transformer,预测分两级完成:
- 量化:
KronosTokenizer(VQ-VAE + 球面二值量化)把连续 OHLCV 窗口编码为分层离散 token——s1/s2 各 1024 类(model/config.json 中s1_bits=10、s2_bits=10); - 自回归预测:模型逐位置先预测 s1 token,再预测 s2 token,最后经
tokenizer.decode反归一化还原为连续的 8×6 预测值(open/high/low/close/volume/amount)。
正因为"每步预测一个 token 类别",解码策略(贪心 or 采样)就决定了输出的确定性与多样性——这正是本文的主题。
为什么选贪心解码?NPU 逐位一致的 3 个理由
本项目交付的推理路径 inference.py 使用了确定性贪心解码。关键改动在 runner_lib.py:forecast_once镜像了官方KronosPredictor.predict,但把随机的 multinomial 采样替换为torch.argmax:
- s1:
sample_pre = torch.argmax(s1_logits, dim=-1)(L177) - s2:
sample_post = torch.argmax(s2_logits, dim=-1)(L181)
配合固定种子(FIXED_SEED=42,每次前向前重新set_seed),得到三个硬好处:
| 收益 | 说明 |
|---|---|
| ✅CPU/NPU 逐位一致 | 贪心输出是离散索引,跨设备无随机差异。实测 10 个样本 480 个元素,max_abs_error=0.0、BITWISE_EQUAL=True |
| ✅完全可复现 | 相同输入必然得到相同FORECAST=输出,便于回归测试与审计 |
| ✅精度校验闭环 | inference.py 从磁盘重载数组后硬断言max_abs_error <= 0.01,超阈值即失败 |
⚠️ 若启用采样,随机性会让 CPU 与 NPU 结果不再逐位可比,跨设备一致性校验(本项目的验收红线)也就无从谈起。详见 README.md 的局限性说明。
实测:确定性贪心解码的 NPU 输出长什么样
运行python3 inference.py(入口在 inference.py),日志会打印完整的机器契约标记。以真实交付日志为例:
INPUT_DEVICE=npu:0 MODEL_DEVICE=npu:0 OUTPUT_DEVICE=npu:0 CPU_FALLBACK=false FORECAST_SHAPE=[8, 6] FORECAST=[[102.1837..., 102.5727..., ...], ...] # 8 步 × 6 列 OHLCV DIAGNOSTIC_DIRECTION=[1, 1, 1, 1, 1, 1, 1] # close 价逐步涨跌(1=涨) CPU_NPU_MAX_ABS_ERROR=0.000000000 CPU_NPU_BITWISE_EQUAL=True NPU_TIMING_MEDIAN_MS=542.671882 EXIT_CODE=0几个要点:
CPU_FALLBACK=false:主推理只跑在 npu:0,CPU 前向仅作数值参考;DIAGNOSTIC_DIRECTION是由forecasts确定性推导的诊断输出(close 价方向),不是模型直接预测的主输出;- 单卡
npu:0上自回归 8 步 + tokenizer 编/解码的中位耗时约543 ms。
原始预测数组以.npy形式落盘:assets/forecasts_npu.npy(NPU 主输出)与 assets/forecasts_cpu.npy(CPU 参考),二者逐位一致。
如何启用 temperature / top-p 概率预测
贪心解码只给"最可能的单一路径"。若你想做概率预测 / 不确定性量化(例如输出 20 条候选路径取均值),可以使用官方KronosPredictor.predict内置的采样接口(参数说明见 model/README.md):
pred_df = predictor.predict( df=x_df, # 历史 K 线(open/high/low/close/volume/amount) x_timestamp=x_timestamp, y_timestamp=y_timestamp, pred_len=pred_len, T=1.0, # temperature:越大分布越平坦、越"大胆" top_p=0.9, # 核采样:只保留累计概率达 0.9 的最小 token 集合 sample_count=1 # 生成并平均的预测路径数,增大可做集成预测 )参数速查:
| 参数 | 作用 | 调参建议 |
|---|---|---|
T(temperature) | 缩放 logits 后再归一化 | T<1更保守贴近贪心;T>1更发散 |
top_p | 核采样截断阈值 | 0.9 常用;越接近 1 候选集越大 |
sample_count | 多条随机路径平均 | 10~20 条可平滑单路径噪声,用于不确定性估计 |
💡注意:本交付仓的 runner_lib.py 是特意把采样换成 argmax 的。若在自己的业务脚本中启用采样,请直接用kronos_src中的KronosPredictor.predict(不要改forecast_once),并接受两点后果:
- 输出不再逐位可复现(即使固定随机种子,采样路径跨设备也不保证一致);
- 本项目"CPU vs NPU 逐位一致"的校验逻辑不再适用,需改用区间/统计一致性验收。
贪心 vs 采样:金融场景选型建议
| 场景 | 推荐策略 | 理由 |
|---|---|---|
| 跨设备一致性验收、回归测试 | ✅ 贪心(argmax) | 逐位可比、结果可审计 |
| 生产环境点预测、方向判断 | ✅ 贪心或低 T 采样 | 输出稳定,方向诊断(DIAGNOSTIC_DIRECTION)可靠 |
| 不确定性量化、波动率估计 | ⚠️ 采样(T=1.0, top_p=0.9, sample_count≥10) | 多条路径的分布宽度即不确定性 |
| 集成预测、平滑单路径噪声 | ⚠️ 采样 + sample_count 平均 | 官方推荐用法 |
一句话总结:要"确定性"选贪心,要"概率分布"选采样;本项目交付版选了前者,就是为了在昇腾 NPU 上守住"CPU 与 NPU 逐位一致"这条验收线。
昇腾 NPU 运行环境与文件导航
本项目是自包含交付仓,端到端推理固定跑在npu:0(Ascend 910B4、CANN 8.5.1、torch_npu 2.9.0)。下图为真实npu-smi设备调用快照:
核心文件导航:
- inference.py —— 交付入口:NPU 推理、warmup + 同步计时、CPU/NPU 精度校验
- runner_lib.py —— 确定性贪心预测实现(argmax 替换采样)
- model/config.json —— 模型结构参数(8 层 / d_model 512 / 词表 1024)
- model/README.md —— 上游 Kronos 模型卡(含 predict 采样参数文档)
- requirements.txt —— 21 个精确 pin 的依赖闭包
- README.md —— 精度对比与性能实测数据
小结:Kronos-small 在昇腾 NPU 上的确定性解码策略,本质是在"逐位一致的可验收性"与"概率预测的灵活性"之间做的工程取舍——默认贪心,按需切采样,两条路都已在本文给出。
【免费下载链接】kronos-small-npu用户可直接在华为昇腾 NPU 上运行 Kronos-small 模型,用于金融 K 线(OHLCV)时间序列的预测与趋势方向判断。项目提供自包含交付仓,支持 NPU 端到端推理,确保 CPU 与 NPU 逐位一致,并内置精度校验与确定性输出。项目地址: https://ai.gitcode.com/atlasleong/kronos-small-npu
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
