Skip to content

认识 Granite PatchTST-FM-r2:榜单第一不让商用,能商用的它排第二

先说个让人血压升高的事实。

2026 年 9 月,你去 GIFT-Eval(目前最全的零样本时序预测榜单)看排行榜,第一名是 Google 的 TimesFM-3

然后你兴冲冲去翻许可证——非商用。研究了半小时,最后发现这玩意儿不能往公司系统里塞。这种"看得见吃不着"的憋屈,做过技术选型的都懂。

同一时间榜单隔壁:第二名那个,Apache 2.0,随便商用,随便改,没人找你收钱。它是 IBM Research 的 Granite Time Series PatchTST-FM-r2。

基础模型圈的荒诞之处在于:决定你能不能用它的,往往不是准确率,而是许可证那几行字。

这篇就聊聊这个"能落地的第二名"。

什么是 PatchTST-FM-r2

一句话:它是一个预训练好的时间序列基础模型——你喂一段历史数字给它,它直接吐出未来的数字,外加一条不确定性区间,全程不需要你训练任何东西。

名字拆开看:

  • Granite:IBM 的开源模型家族代号;
  • Time Series Foundation Model(TSFM):IBM 做时序基础模型的整个产品线,除了 PatchTST-FM 还有 TTM、TSPulse、FlowState 这几条线;
  • PatchTST:原始论文《A Time Series is Worth 64 Words》提出的高效时序 Transformer,作者当时正是 IBM Research 的实习生。它把连续时间点切成一段段 patch 再当 token 喂给注意力,这个"切块"的思路是整条线的起点;
  • FM:Foundation Model,预训练过的、能零样本泛化的版本;
  • r2:第二代预训练权重,第一代是 r1。

r1 到 r2 具体改了什么? IBM 这次没光是说"我们更强了",而是把改动一项项摊开了:

  • 骨干层从 20 层加到 30 层,为了吃下更大的预训练语料;
  • 传统的 Transformer block 全部换成 Conformer block
  • patch 改成 50% 重叠(长度 16、步长 8),训练时用 Hamming 窗加权损失,推理时用 overlap-and-add 把相邻预测片拼起来,解决"patch 接缝处不连续"的老毛病;
  • 加了一层 pre-head layer norm,纯粹为了让训练更稳;
  • 补上了 缺失值填补能力。

发布时间上有个小坑,值得说清楚:模型卡写的榜单基准日是 2026 年 8 月 31 日,官方博客和媒体报道集中在 9 月 8—9 日。所以你看到不同地方写着 8 月还是 9 月,都不是笔误,只是口径不同。

它有什么特点

  • 榜单位置很硬:截至 2026 年 9 月 8 日,在 GIFT-Eval「可复现 + 严格零样本」这一类里,CRPS 几何均值 0.467、MASE 几何均值 0.6846,两个指标都是第二,仅次于 TimesFM-3。而在「宽松可商用许可」这一栏里,它是第一名
  • 连"开卷考试"的对手都没输:榜单上还有一类模型允许把评测集的训练部分塞进预训练语料。把这些也算进来,r2 依然排到 CRPS 第三、MASE 第四,并且打赢了参数量大得多的 Chronos-2、Timer-S1 和 Toto 系列。这一点比"零样本第一"更有说服力。
  • 约 3.85 亿参数,真·小而美:hidden dimension 1024、patch length 16、上下文最长 8192 个时间步。跟动辄几百 B 的大模型比,这个体量基本上是个玩具——但时序预测要的就是这个体量。单张消费级显卡就能跑。
  • Conformer 是这次的灵魂改动:一个 block 的结构是「半个 FFN → 多头自注意力 → 时间卷积 → 半个 FFN」,卷积插在两片 FFN 中间。这么绕一圈图什么?

    注意力负责看远的(跨 patch 的长期关系),卷积负责看近的(patch 内部的局部形态)。两件事分给两个人干,就不会互相打架。 这个结构最早是在语音识别里火起来的。IBM 把它借过来,还把卷积核大小按 {5, 5, 3, 3} 的规律交替排列。

  • 99 个分位数,不是一个孤零零的数字:预测头输出 99 个分位点,既能给点预测,也能给完整的概率分布。备货的人最怕的不是预测偏了,是不知道自己可能偏多少——这个不确定性视图比那个单点值值钱。
  • 缺数据也能跑:原生支持缺失值填补。现实里的监控数据和业务数据从来没有完整的,这个能力看着平平无奇,实际上决定了你能不能直接上生产。
  • 训练语料是能审计的四个来源,IBM 直接公开了配方,而不是一句"海量数据"糊弄:
    1. GiftEvalPretrain 的一个子集;
    2. 基于 KernelSynth 生成的合成数据(改了周期性核函数);
    3. 按 Chronos 配方做的 TSMixup 语料,明确排除了所有 GIFT-Eval 评测集——这条很重要,等于主动避嫌,防止数据泄漏刷榜;
    4. CauKer 方法生成的约 50 万条、长度 4096 的合成序列。
  • 向后兼容 r1 的 checkpoint:你原来 pipeline 里的东西不用推倒重来。
  • Apache 2.0 / OpenMDW 1.0 双许可,二选一。OpenMDW 1.0 是 Linux Foundation 专门给 AI 模型做的许可框架。选哪个都行,重点是:没有"仅限研究用途"那句要命的话

它能用在哪

1. 零售、能耗、交通、遥测——所有"等间隔的连续曲线"

IBM 自己列的适用对象是:需求、价格、能耗负载、交通流量、设备遥测。这些都是规则的、按固定频率采样的序列,也正是基础模型最容易泛化的地方。

举个最典型的:你有 300 个 SKU 要预测销量。传统做法是 300 个 LightGBM 或者 300 套 Prophet,每个都要单独调、单独管、单独监控漂移。换成零样本基础模型之后,是一份权重复盖所有 SKU,你要维护的东西从 300 个模型变成一个服务。

基础模型对工程团队真正的吸引力,从来不是那几个点的准确率,而是"别再让我维护三百个模型了"。

2. 已经跑在 Flink 上的流式预测——这是目前最硬的落地证据

IBM 和 Confluent 合作,把一批 Granite Time Series 模型以 Early Access 的形式放进了 Confluent Cloud 上的 Apache Flink。Early Access 名单里目前有 PatchTST-FM-r1、FlowState-r1.1、TTM-r3、TSPulse,r2 是最新的那个

意义在哪?以前你要做流式异常检测和实时预测,得在 Kafka/Flink 之外再搭一套独立的机器学习服务,数据在两套系统之间倒腾。现在模型推理直接跑在 Flink SQL 里,预测结果从实时流上直接长出来,不用另起炉灶。

对已经在用 Kafka 或者 Flink 的团队,路线其实很清楚:想完全掌控推理和许可就自己拿开源权重评估;更看重流式集成和运维省事,就去评估 Confluent 那条托管路径。两条路不冲突。

3. 需要"量化风险"而不是"给个数"的场合

99 个分位数输出的真正用法在这里。你说"下周三这个机房大概会用到 3200 kW",和你说"下周三有 90% 的概率不超过 3500 kW"——后者才是能让人拍板扩容的信息。给区间的预测,比给数字的预测更容易被业务方信任,这在会议上差别很大。

说句实在话:目前没查到公开具名的外部企业落地案例和它们自己的误差降幅,GIFT-Eval 上的成绩也都是 IBM 自己提交的(r2 的结果还是挂在待合并的 PR 上)。所以别把榜单当结论——拿你自己那几条最刁钻的序列跑一遍,跟你现在的基线比,差多少才是数。

初体验

装包,PyPI 上的包名是 granite-tsfm,要求版本 ≥ 0.3.9:

bash
pip install "granite-tsfm>=0.3.9"

官方给的零样本预测示例,用的是经典的 ETTh1 电力变压器数据集:

python
import pandas as pd
from tsfm_public import PatchTSTFMForPrediction, TimeSeriesForecastingPipeline

# 1. 加载模型权重
model = PatchTSTFMForPrediction.from_pretrained(
    "ibm-granite/granite-timeseries-patchtst-fm-r2"
)

# 2. 读一段数据
df = pd.read_csv(
    "https://raw.githubusercontent.com/zhouhaoyi/ETDataset/main/ETT-small/ETTh1.csv",
    parse_dates=["date"],
)

# 3. 组装 pipeline
pipe = TimeSeriesForecastingPipeline(
    model=model,
    id_columns=[],
    timestamp_column="date",
    target_columns=["HUFL"],
    max_context_length=model.config.context_length,  # 模型上限 8192
    context_length=512,        # 这次只看最近 512 步
    prediction_length=64,      # 预测未来 64 步
    impute_method=None,        # 有缺失值就填上一个策略,比如 "mean"
    quantile_levels=[0.1, 0.5, 0.9],
    explode_forecasts=True,
    freq="1h",
)

# 4. 跑预测
forecast = pipe(df.iloc[-512:])

几个参数的意思,值得花三十秒记住:

参数含义
context_length喂进去多长的历史窗口(≤ 8192)
prediction_length要预测多少步,长度是灵活的
quantile_levels想要哪几个分位数,比如 [0.1, 0.5, 0.9]
impute_method缺失值怎么补,None 表示不处理
explode_forecasts是否把预测结果摊平成方便画图的长表

四条提醒,都是能省你半天时间的那种:

  1. Hugging Face 上的 ID 是 ibm-granite/granite-timeseries-patchtst-fm-r2,别少了后面的 -fm-r2。相关代码和 notebook 在 GitHub 的 IBM/tsfm(Granite-TSFM)仓库里。

  2. 这次没有许可坑,但别高兴得忘了过一遍内部的合规流程。权重是 Apache 2.0 / OpenMDW 1.0,可商用、可修改、可分发;但"许可友好"不等于"免于法务审查"。IBM 自己也强调这是一个开放的研究项目,不是有 SLA 的企业产品——生产事故没人给你兜底,工单体验请降低预期。

  3. 零样本不等于万能。预训练语料偏向需求、能耗、流量这类规则序列;如果你的数据是亚秒级高频、抖动极大的 IoT 噪声流,或者你要塞几十个外部回归变量进去建模交互效应,专门为你这个领域训的模型大概率还是会赢。

  4. context_length 不是越大越好。8192 是模型的能力上限,不代表你的业务序列需要喂满 8192 步。先用接近自身周期长度(比如几个季节循环)的窗口做基线,再往上加,别一上来就把显存打满。

进阶

到这里,你已经知道 PatchTST-FM-r2 是什么、凭什么宣称可商用、怎么把第一条预测线跑出来了——对新手来说,"知道"比"精通"重要得多,剩下的交给好奇心就行。

真想往下挖,建议这个顺序:先用上面那段 demo 把链路跑通,然后把 context_lengthprediction_lengthquantile_levels 三个参数逐个调一遍,看懂 99 个分位数画出来的那条扇形区间到底怎么读;接着换成你自己的业务数据,跟你现在在用的 ARIMA / Prophet / LightGBM 做同窗口对比;有余力再去想 fine-tuning 和 Confluent 那条流式路径。别第一天就想着让它替换公司跑了三年的预测系统——那不是入门,那是渡劫。

顺带一提,如果你对「CRPS 0.467 这个数到底是怎么跑出来的」感兴趣,IBM 把复现榜单成绩的推理代码也一并开放了,这是它比很多闭源对手厚道的地方。

更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。

遇码MeetCoding 开源技术社区