{"id":702,"date":"2026-09-09T18:34:37","date_gmt":"2026-09-09T21:34:37","guid":{"rendered":"https:\/\/yellowkode.com\/blog\/granite-patchtst-fm-r2-ibm-previsao-zero-shot\/"},"modified":"2026-09-09T18:34:37","modified_gmt":"2026-09-09T21:34:37","slug":"granite-patchtst-fm-r2-ibm-previsao-zero-shot","status":"publish","type":"post","link":"https:\/\/yellowkode.com\/blog\/granite-patchtst-fm-r2-ibm-previsao-zero-shot\/","title":{"rendered":"Granite Time Series PatchTST-FM-r2: como o novo modelo da IBM faz previs\u00e3o zero-shot com licen\u00e7a comercial"},"content":{"rendered":"<p>A IBM publicou no dia 9 de setembro de 2026 o <strong>Granite Time Series PatchTST-FM-r2<\/strong>, sucessor do PatchTST-FM-r1. O an\u00fancio foi feito no blog da Hugging Face pela equipe da IBM Research e o modelo j\u00e1 est\u00e1 dispon\u00edvel no Hub com pesos abertos, c\u00f3digo de infer\u00eancia e scripts para reproduzir os n\u00fameros do benchmark. \u00c9 um foundation model de s\u00e9ries temporais de aproximadamente 385 milh\u00f5es de par\u00e2metros, distribu\u00eddo sob dupla licen\u00e7a (Apache 2.0 e OpenMDW 1.0), o que permite uso comercial sem as restri\u00e7\u00f5es t\u00edpicas de licen\u00e7as de pesquisa.<\/p>\n<p>Segundo a pr\u00f3pria IBM, o modelo \u00e9 hoje o mais bem colocado, dentro da categoria de modelos zero-shot replic\u00e1veis com licen\u00e7a comercial permissiva, no <a href=\"https:\/\/github.com\/SalesforceAIResearch\/gift-eval\" target=\"_blank\" rel=\"noopener\">GIFT-Eval<\/a>. Ficou em segundo lugar geral entre modelos zero-shot replic\u00e1veis nessa mesma categoria. Vou explicar o que isso significa na pr\u00e1tica, como a arquitetura mudou em rela\u00e7\u00e3o ao r1, e mostrar como rodar previs\u00e3o nos seus pr\u00f3prios dados.<\/p>\n<h2>O que \u00e9 o GIFT-Eval e por que a categoria importa<\/h2>\n<p>Antes de falar do modelo, precisa entender contra o que ele foi medido. O GIFT-Eval \u00e9 um benchmark de forecasting geral que abrange 23 datasets, mais de 144 mil s\u00e9ries temporais e 177 milh\u00f5es de pontos, cobrindo sete dom\u00ednios, dez frequ\u00eancias, entradas multivariadas e horizontes de previs\u00e3o de curto a longo prazo. Combinando datasets, frequ\u00eancias e horizontes, o GIFT-Eval oferece 97 tarefas distintas de benchmarking.<\/p>\n<p>O ponto sutil, e que a IBM enfatiza, \u00e9 a distin\u00e7\u00e3o entre &#8220;zero-shot&#8221; e &#8220;pretrained&#8221;. No GIFT-Eval, alguns modelos s\u00e3o categorizados como pretrained porque podem ter inclu\u00eddo partes de treino dos datasets de avalia\u00e7\u00e3o no pr\u00f3prio corpus de pretreino. Isso vaza informa\u00e7\u00e3o e ajuda os n\u00fameros. Zero-shot significa que o modelo nunca viu aqueles datasets. \u00c9 a categoria mais honesta quando o objetivo \u00e9 medir generaliza\u00e7\u00e3o.<\/p>\n<p>Nas duas m\u00e9tricas principais (CRPS, que mede a qualidade da previs\u00e3o probabil\u00edstica, e MASE, que mede o erro escalado por uma baseline sazonal), o PatchTST-FM-r2 aparece em segundo lugar na categoria zero-shot replic\u00e1vel. A IBM reporta CRPS geom\u00e9trico m\u00e9dio de 0,467 e MASE geom\u00e9trico m\u00e9dio de 0,6846. Quando o comparativo \u00e9 ampliado para incluir modelos pretrained, ele ainda fica em terceiro para CRPS e quarto para MASE, superando Chronos-2, Timer-S1 e variantes do Toto.<\/p>\n<h3>Um detalhe honesto sobre esse ranking<\/h3>\n<p>Ranking em benchmark \u00e9 uma foto. O <a href=\"https:\/\/huggingface.co\/blog\/ibm-research\/ibm-releases-sota-granite-time-series\" target=\"_blank\" rel=\"noopener\">post da IBM<\/a> data de 9 de setembro de 2026 e o pr\u00f3prio GIFT-Eval recebe submiss\u00f5es novas continuamente. Quando voc\u00ea ler isso, a ordem pode ter mudado. O que importa mais \u00e9 entender o mecanismo, porque isso n\u00e3o muda.<\/p>\n<h2>Como a arquitetura mudou do r1 para o r2<\/h2>\n<p>O r2 mant\u00e9m a ideia central da fam\u00edlia PatchTST: quebrar a s\u00e9rie temporal em peda\u00e7os (patches) e tratar cada patch como um token, algo an\u00e1logo ao que o Vision Transformer faz com imagens. A mudan\u00e7a grande est\u00e1 no bloco interno.<\/p>\n<h3>Da camada transformer para a camada conformer<\/h3>\n<p>No r1, cada bloco era um transformer padr\u00e3o: multi-head self-attention seguido de uma feed-forward network. No r2, o bloco virou um conformer. O conformer \u00e9 uma arquitetura que veio do reconhecimento de fala. A ideia \u00e9 combinar o melhor dos dois mundos: features globais extra\u00eddas pelo transformer e features locais aprendidas pelo m\u00f3dulo de convolu\u00e7\u00e3o.<\/p>\n<p>Estruturalmente, o Conformer \u00e9 composto por duas camadas feed-forward em estilo macaron com conex\u00f5es residuais de meio passo, envolvendo os m\u00f3dulos de multi-head self-attention e de convolu\u00e7\u00e3o. Traduzindo: sandu\u00edche com meia FFN em cima, aten\u00e7\u00e3o no meio, convolu\u00e7\u00e3o depois, e meia FFN embaixo. Cada metade contribui com meio residual, por isso o nome macaron.<\/p>\n<p>Por que isso ajuda uma s\u00e9rie temporal? Aten\u00e7\u00e3o \u00e9 boa para rela\u00e7\u00f5es de longo alcance mas tem vi\u00e9s fraco para estrutura local. Convolu\u00e7\u00e3o \u00e9 o oposto. As camadas multi-head self-attention usam aten\u00e7\u00e3o com produto escalado para capturar varia\u00e7\u00f5es globais na sequ\u00eancia, e como a convolu\u00e7\u00e3o captura informa\u00e7\u00e3o local, aumentar as camadas de transformer com camadas de convolu\u00e7\u00e3o melhora o desempenho. Em s\u00e9ries temporais, voc\u00ea tem sazonalidade curta (o padr\u00e3o das \u00faltimas horas) e tend\u00eancia longa (o comportamento das \u00faltimas semanas). Cada mecanismo cobre um lado.<\/p>\n<p>A IBM inclusive mostra um gr\u00e1fico de padr\u00f5es de aten\u00e7\u00e3o no dataset ETTh1: no transformer puro, a aten\u00e7\u00e3o se concentra perto da diagonal (rela\u00e7\u00f5es locais). No conformer, a aten\u00e7\u00e3o espalha para longe da diagonal, porque a convolu\u00e7\u00e3o j\u00e1 cobre o curto alcance e libera a aten\u00e7\u00e3o para focar no longo. \u00c9 uma consequ\u00eancia arquitetural bem leg\u00edvel.<\/p>\n<h3>Outros detalhes que a IBM lista<\/h3>\n<ul>\n<li>Os blocos conformer no backbone alternam kernels de convolu\u00e7\u00e3o de tamanhos 3 e 5, em um padr\u00e3o repetitivo {5, 5, 3, 3}.<\/li>\n<li>Patches com 50% de sobreposi\u00e7\u00e3o, ponderados por uma janela de Hamming, e previs\u00e3o por overlap-and-add para suavizar as bordas entre patches. Isso ataca um problema conhecido de modelos de patches: descontinuidade entre os peda\u00e7os na hora de reconstruir a previs\u00e3o.<\/li>\n<li>Normaliza\u00e7\u00e3o adicional para estabilidade.<\/li>\n<li>Expans\u00e3o de 20 para 30 blocos.<\/li>\n<li>Aproximadamente 385M par\u00e2metros, contexto de at\u00e9 8.192 passos, e uma cabe\u00e7a de predi\u00e7\u00e3o que emite 99 quantis.<\/li>\n<\/ul>\n<p>Os 99 quantis s\u00e3o o que d\u00e1 a previs\u00e3o probabil\u00edstica. Em vez de cuspir um \u00fanico n\u00famero para cada passo futuro, o modelo estima a distribui\u00e7\u00e3o inteira, o que permite construir intervalos de confian\u00e7a sem hip\u00f3tese gaussiana.<\/p>\n<h2>Dados de treino e por que a licen\u00e7a importa<\/h2>\n<p>A IBM documenta o corpus de pretreino em quatro fontes: datasets selecionados do GiftEvalPretrain, dados sint\u00e9ticos baseados em KernelSynth com kernels peri\u00f3dicos modificados, um corpus TSMixup gerado pela abordagem do Chronos mas restrito a datasets fora do conjunto de avalia\u00e7\u00e3o do GIFT-Eval, e cerca de 500 mil sequ\u00eancias sint\u00e9ticas CauKer de comprimento 4.096.<\/p>\n<p>A parte importante \u00e9 a <em>aus\u00eancia<\/em> dos datasets de teste do GIFT-Eval no treino. Isso \u00e9 o que torna o resultado zero-shot leg\u00edtimo. Muitos foundation models de s\u00e9ries temporais falham nessa disciplina.<\/p>\n<p>Sobre licen\u00e7a: o modelo \u00e9 dual-licensed sob Apache 2.0 e OpenMDW 1.0. O usu\u00e1rio escolhe qual usar. A <a href=\"https:\/\/openmdw.ai\/\" target=\"_blank\" rel=\"noopener\">OpenMDW<\/a> \u00e9 uma licen\u00e7a da Linux Foundation projetada especificamente para modelos e materiais associados (pesos, c\u00f3digo, documenta\u00e7\u00e3o tratados como uma unidade). Para uso comercial, na pr\u00e1tica, Apache 2.0 j\u00e1 resolve. A OpenMDW \u00e9 \u00fatil quando voc\u00ea quer um \u00fanico framework legal cobrindo pesos, dados e c\u00f3digo juntos.<\/p>\n<h2>Rodando o modelo em Python<\/h2>\n<p>O caminho mais curto para testar. Instala o pacote:<\/p>\n<pre><code>pip install \"granite-tsfm&gt;=0.3.9\"<\/code><\/pre>\n<p>E carrega o modelo direto do Hub:<\/p>\n<pre><code>import pandas as pd\nfrom tsfm_public import PatchTSTFMForPrediction, TimeSeriesForecastingPipeline\n\n# Baixa os pesos\nmodel = PatchTSTFMForPrediction.from_pretrained(\n \"ibm-granite\/granite-timeseries-patchtst-fm-r2\"\n)\n\n# Dados de exemplo (ETTh1, um dataset padrao de referencia)\ndf = pd.read_csv(\n \"https:\/\/raw.githubusercontent.com\/zhouhaoyi\/ETDataset\/main\/ETT-small\/ETTh1.csv\",\n parse_dates=[\"date\"],\n)\n\n# Monta o pipeline: 512 passos de historico, 64 passos de previsao\npipe = TimeSeriesForecastingPipeline(\n model=model,\n id_columns=[],\n timestamp_column=\"date\",\n target_columns=[\"HUFL\"],\n max_context_length=model.config.context_length,\n context_length=512,\n prediction_length=64,\n impute_method=None,\n quantile_levels=[0.1, 0.5, 0.9],\n explode_forecasts=True,\n freq=\"1h\",\n)\n\n# Gera a previsao usando apenas os ultimos 512 pontos\nforecast = pipe(df.iloc[-512:])<\/code><\/pre>\n<p>Repare no que <em>n\u00e3o<\/em> tem aqui: nenhum treino, nenhum fine-tuning, nenhuma defini\u00e7\u00e3o de features. Voc\u00ea passa a s\u00e9rie, define quantos passos de hist\u00f3rico e quantos passos de previs\u00e3o, e o modelo devolve os quantis pedidos. Neste exemplo, os quantis 0,1, 0,5 e 0,9 d\u00e3o a banda de 80% de confian\u00e7a e a mediana.<\/p>\n<p>Para seus pr\u00f3prios dados, o formato m\u00ednimo \u00e9 uma coluna de timestamp e uma coluna alvo. Se a s\u00e9rie for multivariada, voc\u00ea lista as colunas em <code>target_columns<\/code>. O <code>freq=\"1h\"<\/code> indica frequ\u00eancia hor\u00e1ria. Ajuste conforme sua granularidade.<\/p>\n<h2>Onde isso quebra<\/h2>\n<p>Umas coisas que n\u00e3o est\u00e3o no marketing mas d\u00e1 para deduzir da documenta\u00e7\u00e3o e da experi\u00eancia geral com foundation models de s\u00e9ries temporais:<\/p>\n<ul>\n<li><strong>Custo de infer\u00eancia.<\/strong> 385M par\u00e2metros \u00e9 grande para forecasting. Se voc\u00ea tem milh\u00f5es de s\u00e9ries curtas para prever (varejo com SKU-loja, por exemplo), o custo por infer\u00eancia importa. Modelos menores da mesma fam\u00edlia Granite (TTM, TSPulse) provavelmente ser\u00e3o mais eficientes para esse cen\u00e1rio. A IBM n\u00e3o publicou benchmarks de lat\u00eancia no post de an\u00fancio.<\/li>\n<li><strong>Contexto de 8.192 passos.<\/strong> \u00c9 bastante, mas aten\u00e7\u00e3o tem custo quadr\u00e1tico. Contexto longo \u00e9 caro. Nem sempre voc\u00ea precisa de todo esse hist\u00f3rico, e alimentar contexto irrelevante pode inclusive piorar a previs\u00e3o.<\/li>\n<li><strong>Frequ\u00eancia regular.<\/strong> O modelo assume amostragem regular. S\u00e9ries com timestamps irregulares (eventos, cliques) precisam de reamostragem ou imputa\u00e7\u00e3o antes.<\/li>\n<li><strong>S\u00e9ries com regime shift.<\/strong> Zero-shot brilha quando a estrutura da s\u00e9rie se assemelha ao que existe no corpus de pretreino. S\u00e9ries com mudan\u00e7a de regime abrupta (novo lan\u00e7amento, pol\u00edtica nova, ruptura estrutural) continuam sendo casos dif\u00edceis. Nesses casos, fine-tuning ou modelos cl\u00e1ssicos com features de dom\u00ednio podem ganhar.<\/li>\n<li><strong>Um foundation model n\u00e3o substitui feature engineering em todos os casos.<\/strong> Se voc\u00ea tem covari\u00e1veis fortes (pre\u00e7o, promo\u00e7\u00e3o, feriado), um modelo que consuma essas covari\u00e1veis explicitamente pode superar zero-shot puro. O PatchTST-FM-r2 \u00e9 primariamente univariado no seu uso mais simples.<\/li>\n<\/ul>\n<h2>O que ainda n\u00e3o d\u00e1 para afirmar<\/h2>\n<p>Alguns pontos honestos que a documenta\u00e7\u00e3o p\u00fablica n\u00e3o fecha:<\/p>\n<ul>\n<li>A IBM n\u00e3o publicou benchmarks de lat\u00eancia e mem\u00f3ria em CPUs comuns. Para deploy fora de GPU, isso \u00e9 decisivo, e sem n\u00fameros independentes n\u00e3o d\u00e1 para dimensionar custo de produ\u00e7\u00e3o.<\/li>\n<li>A compara\u00e7\u00e3o com TimesFM-3 (primeiro colocado zero-shot no momento do an\u00fancio) precisa ser vista com contexto: modelos evoluem r\u00e1pido, e a ordem no leaderboard vai mudar. O relevante \u00e9 a ordem de grandeza, n\u00e3o o p\u00f3dio.<\/li>\n<li>Benchmarks independentes de terceiros fora do GIFT-Eval ainda n\u00e3o apareceram no volume que d\u00e1 confian\u00e7a estat\u00edstica.<\/li>\n<li>A integra\u00e7\u00e3o com Confluent Cloud via Apache Flink foi anunciada em programa de Early Access com modelos anteriores da fam\u00edlia (PatchTST-FM-r1, FlowState-r1.1, TTM-r3, TSPulse). O r2 ainda n\u00e3o aparece listado nesse programa na documenta\u00e7\u00e3o publicada at\u00e9 agora.<\/li>\n<\/ul>\n<h2>Como testar isso voc\u00ea mesmo<\/h2>\n<p>Um caminho pequeno para experimentar em algo que voc\u00ea entenda:<\/p>\n<ol>\n<li>Pega uma s\u00e9rie sua com pelo menos 1.000 pontos e frequ\u00eancia regular. Consumo de CPU de um servidor, tr\u00e1fego de um endpoint, temperatura de um sensor, o que for.<\/li>\n<li>Separa os \u00faltimos N pontos como valida\u00e7\u00e3o (por exemplo, os \u00faltimos 168 se for hor\u00e1ria: uma semana).<\/li>\n<li>Roda o pipeline acima usando o hist\u00f3rico anterior \u00e0 valida\u00e7\u00e3o como contexto e pede previs\u00e3o do mesmo tamanho da valida\u00e7\u00e3o.<\/li>\n<li>Compara a mediana (quantil 0,5) com o real usando MAE ou MAPE. Compara tamb\u00e9m a cobertura: dos pontos reais, quantos ca\u00edram dentro da banda 0,1 a 0,9? Se ca\u00edrem cerca de 80%, a calibra\u00e7\u00e3o probabil\u00edstica est\u00e1 boa.<\/li>\n<li>Como baseline, roda um <a href=\"https:\/\/facebook.github.io\/prophet\/\" target=\"_blank\" rel=\"noopener\">Prophet<\/a> ou um <code>SeasonalNaive<\/code> na mesma tarefa. Se o zero-shot n\u00e3o vencer as baselines, ou seu problema tem estrutura muito espec\u00edfica, ou voc\u00ea precisa alimentar mais contexto, ou \u00e9 hora de considerar fine-tuning.<\/li>\n<\/ol>\n<p>Esse ciclo curto responde a pergunta que interessa: no <em>seu<\/em> problema, um foundation model zero-shot j\u00e1 \u00e9 bom o suficiente para substituir o pipeline atual, ou \u00e9 s\u00f3 mais uma ferramenta na caixa? A resposta honesta quase sempre \u00e9 &#8220;depende do seu problema&#8221;, e agora existe um jeito barato de descobrir.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como funciona o Granite PatchTST-FM-r2 da IBM: arquitetura conformer, previs\u00e3o zero-shot no GIFT-Eval, licen\u00e7a Apache 2.0 e exemplo de uso em Python.<\/p>\n","protected":false},"author":2,"featured_media":701,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-702","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/comments?post=702"}],"version-history":[{"count":0,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/posts\/702\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media\/701"}],"wp:attachment":[{"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/media?parent=702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/categories?post=702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/yellowkode.com\/blog\/wp-json\/wp\/v2\/tags?post=702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}