这次我们不做图像生成,也不卷大语言模型的对话能力,来看一个专门解决“预测未来”的模型:Google Research 开源的 TimesFM。
一句话说清楚:TimesFM 是一个用 Transformer decoder-only 架构训练出来的时间序列基础模型(Time Series Foundation Model)。你把一段历史数据喂进去,它直接输出未来一段时间的预测值,而且不需要针对你的业务数据做微调。相比传统 ARIMA、Prophet 或者自己训练 LSTM 的流程,TimesFM 把时序预测做成了“拿来即用”的预训练模型服务。
这篇文章会带你走完整条链路:TimesFM 能做什么、硬件门槛大概在什么位置、怎么在本地把模型跑起来、怎么用官方 checkpoint 做单序列预测和批量预测、怎么用真实 CSV 数据验证效果,以及最后怎么把它封装成一个 HTTP API 接到自己的业务系统里。
适合的读者:做销量预测、流量预测、运维监控、能源负荷预测、金融量化特征工程的算法工程师;想在本地快速验证“预训练时序模型到底行不行”的技术负责人;以及所有关心大模型落地但不想只聊 GPT 的人。
1. TimesFM 核心能力速览
先把关键信息放在前面,方便你快速判断这个项目值不值得试。
| 能力项 | 说明 |
|---|---|
| 项目类型 | 时间序列预测基础模型(Time Series Foundation Model) |
| 开源来源 | Google Research,GitHub 仓库 google-research/timesfm |
| 主要功能 | 零样本(zero-shot)时间序列预测,输入历史序列输出未来预测值 |
| 模型架构 | Decoder-only Transformer,类似 LLM 的“下一个 token 预测”思路,但处理的是数值序列 |
| 模型参数规模 | 约 200M 参数级别,公开仓库提供不同版本 checkpoint,具体以官方模型卡片为准 |
| 推理框架 | PyTorch(官方同时维护 JAX 版本,不同版本的加载方式有差异) |
| 硬件要求 | CPU 可以推理,有 GPU 会明显更快;显存占用取决于 batch size、序列长度和模型版本 |
| 启动方式 | Python 环境加载 Hugging Face checkpoint,无独立 WebUI 或服务端,可自行封装 API |
| 是否支持批量任务 | 支持一次传入多个序列做批量预测 |
| 是否支持 API | 官方没有提供 HTTP API,但模型接口清晰,可以快速封装 FastAPI/Flask 服务 |
| 适合场景 | 单变量时序预测、多序列批量预测、长周期自回归预测、快速验证预测基线 |
| 不适合场景 | 多变量强耦合系统、极短序列、强非平稳数据(需先做预处理) |
需要特别说明,TimesFM 不是传统的“训练一个模型预测一条曲线”,它做了两件和 LLM 类似的事情:第一,在超大规模时间序列数据上做了预训练;第二,推理时直接利用预训练权重做零样本预测。这意味着你在自己的数据上不需要重新训练,直接把历史序列喂进去就能得到未来预测。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 适用场景与使用边界
2.1 适合谁
TimesFM 适合下面几类情况:
- 业务方没有充足历史数据去训练一个专用预测模型,想先用预训练模型快速出结果。
- 需要统一预测多条序列,不想为每条序列单独训练模型。
- 想建立一个“预训练时序模型 vs 传统统计模型”的基线对比,评估新方案的上限。
- 需要把预测能力封装成服务,批量提供给下游系统调用。
2.2 能解决什么问题
TimesFM 解决的核心问题是“零样本时序预测”。传统时序建模的痛点在于:每个数据集都需要重新做平稳性检验、差分、定阶、训练、调参,成本高,而且换一个业务场景又要重新来一遍。TimesFM 把大量跨领域时间序列的规律压缩进模型权重里,推理时直接根据历史窗口预测未来。
从公开资料看,TimesFM 在金融、能源、零售、交通、天气等跨领域数据上都有预训练覆盖。实际使用中,你可以直接输入小时级、日级、周级甚至月级数据,指定频率后就能得到预测结果。
2.3 不适合什么场景
- 多变量强耦合场景:TimesFM 更擅长单变量时间序列,或者把多变量拆成多条单变量序列分别预测。如果你需要显式建模多个变量之间的相互影响,需要自己扩展。
- 极短序列:如果只有十几个时间点,预训练模型很难提取有效规律。
- 强非平稳数据:存在明显的趋势突变、周期性剧烈变化,建议先做差分、分解或归一化,再输入模型。
- 低频高噪声数据:噪声占比过大时,任何模型的预测意义都有限。
2.4 数据合规与安全边界
TimesFM 是本地部署的模型,数据不需要上传到第三方平台,这一点对很多业务场景是加分项。但以下几点必须注意:
- 不要在不了解数据来源的情况下直接跑模型,尤其是涉及个人隐私、商业机密的序列数据。
- 批量预测涉及敏感业务数据时,建议先做脱敏或特征层面的模糊处理。
- 模型输出只是统计预测结果,不能作为唯一决策依据,金融、医疗等场景需要人工复核。
- 如果自行封装 API 服务,默认监听地址不要暴露到公网。
3. 本地部署环境准备
TimesFM 的部署复杂度不高,核心依赖是 PyTorch 和 Hugging Face 生态。
3.1 基础环境检查清单
建议按下面清单核对环境:
- 操作系统:Windows / Linux / macOS 均可,Linux 服务器部署最稳。
- Python 版本:建议 3.10 或更高版本,具体以官方 README 要求为准。
- PyTorch:2.0 以上版本,CPU 版或 CUDA 版均可。
- 依赖库:transformers、huggingface_hub、numpy、pandas、tqdm。
- 开发工具:Git。
- 磁盘空间:模型文件从数百 MB 到 1GB 级别,建议预留 5GB 以上。
- GPU:可选。有 NVIDIA 显卡建议安装 CUDA 版 PyTorch;没有 GPU 也能跑,只是速度慢。
3.2 验证 GPU 环境
如果你使用 NVIDIA 显卡,先确认驱动和 CUDA 可用:
bash复制nvidia-smi
然后确认 PyTorch 能识别 GPU:
python复制import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else "CPU mode")
没有 GPU 也没关系,TimesFM 的 200M 参数规模在 CPU 上也能完成推理,只是长序列和批量任务会比较慢。
4. 安装部署与启动方式
TimesFM 没有“一键启动 WebUI”这种交互模式,部署方式是通过 Python 安装官方包、加载 checkpoint、调用预测接口。下面是标准流程。
4.1 克隆官方仓库并安装依赖
bash复制git clone https://github.com/google-research/timesfm.git
cd timesfm
pip install -e .
pip install -r requirements.txt
如果你的环境里已有 PyTorch,建议先装好对应版本的 PyTorch 再执行上面命令,避免依赖冲突。
如果只需要模型运行,也可以直接在项目目录下安装最小依赖:
bash复制pip install torch transformers huggingface_hub numpy pandas
4.2 加载官方 checkpoint
TimesFM 官方通过 Hugging Face 发布 checkpoint。常见 repo id 格式为 google/timesfm-xxx-pytorch,具体版本以官方仓库 README 为准。
下面以通用流程给出加载代码:
python复制import timesfm
tfm = timesfm.TimesFm(
hparams=timesfm.TimesFmHparams(
per_core_batch_size=32,
horizon_len=128,
num_layers=20,
use_gpu=True,
),
checkpoint=timesfm.TimesFmCheckpoint(
huggingface_repo_id="google/timesfm-1.0-200m-pytorch",
),
)
tfm.load_from_checkpoint()
参数说明:
per_core_batch_size:每次前向推理的序列数量,显存不够就调小。horizon_len:单次预测长度,即模型一次输出多少个未来时间点,具体支持范围以官方 checkpoint 为准。use_gpu:True 使用 GPU,False 使用 CPU。
重要提醒:不同版本的 TimesFM 在参数名、模型结构、checkpoint 名称上可能略有差异。如果你用的版本不同,务必以官方仓库 README 和模型卡片中的示例代码为准。
4.3 准备输入数据格式
TimesFM 的输入是 numpy 数组的列表,每个元素是一条时间序列,每条序列的长度应尽量对齐模型要求的上下文窗口。
python复制import numpy as np
# 构造两条示例序列
seq1 = np.sin(np.linspace(0, 20, 100))
seq2 = np.cos(np.linspace(0, 20, 100)) * 3
# forecast_input 接收的是 list of numpy arrays
forecast_input = [seq1, seq2]
4.4 指定数据频率
TimesFM 要求为每条序列指定频率。频率参数是一个整数列表,和序列一一对应。不同版本对频率编号的映射可能不同,常见映射包括小时、日、周、月、年。
python复制freq = [0, 1] # 具体编号含义以官方文档为准
建议先查官方 README 中的频率说明,再设置对应频率,避免输出结果异常。
4.5 执行预测并查看结果
python复制point_forecast, quantile_forecast = tfm.forecast(forecast_input, freq=freq)
for i in range(len(point_forecast)):
print(f"Series {i} forecast:")
print(point_forecast[i])
point_forecast 是各序列的点预测结果,quantile_forecast 是分位数预测结果,可用于评估预测的不确定性范围。
如果 use_gpu=True 但没有可用 GPU,程序会报错或回退到 CPU,取决于具体实现。显存不足时,先降低 per_core_batch_size。
5. 功能测试与效果验证
环境跑通之后,接下来做几组功能测试,验证 TimesFM 在不同输入下的预测效果是否正常。
5.1 基础单序列预测测试
测试目标:确认模型能对一条简单序列输出正确长度的预测值。
操作步骤:
python复制import numpy as np
import matplotlib.pyplot as plt
# 构造一条带趋势和周期的时间序列
x = np.arange(200)
series = 10 * np.sin(x / 10) + 0.3 * x
# 前 150 个点作为历史,后 50 个点留作对比
history = series[:150]
ground_truth = series[150:200]
point_forecast, _ = tfm.forecast([history], freq=[1])
pred = point_forecast[0]
print("预测长度:", len(pred))
print("真实长度:", len(ground_truth))
判断标准:
- 预测数组长度与
horizon_len一致。 - 预测趋势与真实趋势方向一致。
- 如果预测结果出现大量 NaN 或恒定值,说明输入格式、频率设置或 checkpoint 加载有问题。
5.2 批量多序列预测测试
测试目标:确认一次传入多条序列能批量返回结果,这是生产环境最常用的能力。
操作步骤:
python复制import numpy as np
series_list = []
freq_list = []
for i in range(10):
t = np.arange(150)
series_list.append(3 * np.sin(t / 5 + i) + i * 0.1)
freq_list.append(1)
point_forecast, quantile_forecast = tfm.forecast(series_list, freq=freq_list)
print("批量预测序列数:", len(point_forecast))
判断标准:
- 返回的列表长度等于输入序列数。
- 每条序列的预测结果是独立的,互不干扰。
- 批量预测速度明显慢于单条预测,但不需要逐条循环调用。
常见问题:如果序列长度不一致,TimesFM 可能要求统一长度或自动截断。建议在输入前将序列对齐到固定长度,或参考官方文档确认长度要求。
5.3 自回归长周期预测测试
TimesFM 单次前向预测的 horizon 长度有限,如果要预测更远的未来,可以用自回归方式:先预测一段,再把预测结果拼接到历史序列末尾,继续预测下一段。
操作步骤:
python复制def autoregressive_forecast(model, history, freq, steps, chunk=128):
current = list(history)
forecasts = []
for _ in range(steps // chunk):
inputs = np.array(current[-256:]) # 取最近一段历史
point, _ = model.forecast([inputs], freq=[freq])
pred = point[0][:chunk]
forecasts.extend(pred)
current.extend(pred)
return np.array(forecasts)
history = np.array(series[:300])
long_pred = autoregressive_forecast(tfm, history, freq=1, steps=300, chunk=128)
判断标准:
- 自回归预测应与单次预测的衔接处保持平滑。
- 长周期预测的误差会累积,预测结果可能越来越趋近均值或趋势线。
- 如果发现预测发散,检查是否需要对每一步预测做归一化或限制。
5.4 真实 CSV 数据验证
用真实业务数据测试,是最能判断模型是否可用的方式。
输入 CSV 格式建议:第一列为时间戳,第二列为数值。例如:
csv复制timestamp,value
2024-01-01 00:00:00,12.3
2024-01-01 01:00:00,12.8
2024-01-01 02:00:00,13.1
操作步骤:
python复制import pandas as pd
import numpy as np
df = pd.read_csv("data/daily_sales.csv")
history = df["value"].values.astype(np.float32)
history = history[~np.isnan(history)] # 简单过滤 NaN
history = history[-512:] # 截取最近一段
# 检查历史数据是否有效
if len(history) < 100:
print("历史数据太短,建议至少 100 个时间点")
else:
point, quantile = tfm.forecast([history], freq=[1])
print("未来预测:", point[0])
# 保存预测结果
pd.DataFrame({"forecast": point[0]}).to_csv("output/forecast.csv", index=False)
判断标准:
- CSV 数据经过清洗后能正常传入模型。
- 预测结果量级与原始数据一致。
- 如果原始数据有缺失值,TimesFM 部分版本支持 NaN 输入,但建议先做插值,避免结果不稳定。
6. 将 TimesFM 封装为 HTTP API 服务
官方没有提供现成的 HTTP API,但封装一个 FastAPI 服务非常简单。封装后,可以用 curl 或 Python requests 调用,方便接入业务系统。
6.1 FastAPI 服务示例
python复制from fastapi import FastAPI
from pydantic import BaseModel
import numpy as np
import timesfm
import uvicorn
app = FastAPI()
tfm = timesfm.TimesFm(
hparams=timesfm.TimesFmHparams(
per_core_batch_size=8,
horizon_len=128,
num_layers=20,
use_gpu=False,
),
checkpoint=timesfm.TimesFmCheckpoint(
huggingface_repo_id="google/timesfm-1.0-200m-pytorch",
),
)
tfm.load_from_checkpoint()
class ForecastRequest(BaseModel):
series: list[list[float]] # 多条序列,每条一个列表
freq: list[int] # 与序列一一对应的频率
horizon: int = 128
class ForecastResponse(BaseModel):
point_forecast: list[list[float]]
quantile_forecast: list[list[list[float]]]
@app.post("/predict", response_model=ForecastResponse)
def predict(req: ForecastRequest):
series_list = [np.array(s, dtype=np.float32) for s in req.series]
point, quantile = tfm.forecast(series_list, freq=req.freq)
return ForecastResponse(
point_forecast=[p.tolist() for p in point],
quantile_forecast=[q.tolist() for q in quantile],
)
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000)
注意:上面的接口是演示用途,horizon 字段未实际生效,真正落地时需要根据业务需求对输入序列做截断或对预测结果做对齐处理。
6.2 启动服务
bash复制python api_server.py
启动后服务默认监听 127.0.0.1:8000,看到 Uvicorn running on http://127.0.0.1:8000 表示服务已就绪。
6.3 用 curl 调用接口
bash复制curl -X POST "http://127.0.0.1:8000/predict" \
-H "Content-Type: application/json" \
-d '{
"series": [[1.0, 1.2, 1.5, 1.8, 2.0, 2.3]],
"freq": [1]
}'
6.4 用 Python requests 调用接口
python复制import requests
url = "http://127.0.0.1:8000/predict"
payload = {
"series": [
[1.0, 1.2, 1.5, 1.8, 2.0, 2.3, 2.5, 2.7, 3.0, 3.2],
[5.0, 5.1, 5.2, 5.4, 5.6, 5.8, 6.0, 6.1, 6.3, 6.5]
],
"freq": [1, 1]
}
response = requests.post(url, json=payload, timeout=60)
data = response.json()
print(data["point_forecast"])
接口能跑通,后面就可以把它接入到定时任务、BI 系统或内部运维平台里。生产环境建议增加:身份校验、请求限流、模型预热、超时处理。
7. 资源占用与性能观察
TimesFM 部署时要关心的核心资源是:模型加载时间、推理显存/内存占用、批量请求的吞吐。
7.1 模型加载阶段
首次加载 checkpoint 时,会从 Hugging Face 下载模型文件。网络较好的情况下等待时间不长,但国内环境可能不稳定。如果下载失败,可以设置 Hugging Face 镜像后重试:
bash复制export HF_ENDPOINT=https://hf-mirror.com
或使用 huggingface_hub 的离线加载方式,先手动下载模型文件放到本地目录。
7.2 推理阶段资源观察
显存占用和以下因素直接相关:
- batch size:一次传入的序列越多,显存占用越高。
- 序列长度:context 越长,计算量越大。
- 模型版本:不同参数规模的 checkpoint 资源占用不同。
- 是否使用 GPU:CPU 模式下不占显存,但 CPU 占用率会明显升高。
观察显存占用:
bash复制nvidia-smi --query-gpu=memory.used --format=csv -l 1
观察进程 CPU 和内存:
bash复制ps aux | grep python
如果显存不足,优先做三件事:
- 把
per_core_batch_size从 32 降到 8 或 4。 - 缩短输入序列长度,优先用最近的数据窗口。
- 换用 CPU 推理,速度慢但能稳定跑通。
7.3 性能调优建议
- 单次预测耗时低于预期时,检查是否因为 Hugging Face 缓存目录权限问题导致反复解压。
- 批量预测时,不要一次性传入上千条序列,建议按 50 到 100 条一组分批推理,避免内存峰值过高。
- 如果服务需要常驻内存,建议启动时先预热一次预测请求,避免首个请求缓慢。
8. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 模型下载失败或超时 | 网络无法稳定访问 Hugging Face | 查看下载日志、检查网络连通性 | 配置镜像源 HF_ENDPOINT=https://hf-mirror.com 或手动下载模型到本地 |
| 加载 checkpoint 报错 | checkpoint 名称与当前代码版本不匹配 | 对照官方 README 中的 repo_id | 使用官方示例代码中的模型版本名称 |
| 预测结果全是 NaN | 输入序列包含 NaN 或数据格式错误 | 打印 history 前 50 个值检查 | 先清洗 NaN,再做归一化后输入模型 |
| CPU 推理非常慢 | 没有使用 GPU 或 GPU 未正确识别 | 运行 torch.cuda.is_available() |
安装 CUDA 版本 PyTorch,确认 use_gpu=True |
| 显存不足 OOM | batch size 或序列长度过大 | 查看 nvidia-smi 显存占用 | 调小 per_core_batch_size,缩短输入序列 |
| 频率设置错误导致结果异常 | 频率编号理解错误 | 查询官方文档中的频率映射表 | 按文档重新设置 freq 参数 |
| 预测长度不等于预期 | horizon_len 与 checkpoint 支持范围不一致 | 打印输出 shape | 修改 horizon_len,超过支持范围时用自回归方式扩展 |
| 服务端口被占用 | 端口已被其他进程监听 | 检查端口占用 | 更换端口或关闭占用进程 |
| 批量预测内存持续增长 | 批量请求量过大 | 观察 psutil 或系统监控 | 分批推理,限制并发请求数 |
| 输出质量明显偏差 | 数据未做预处理或序列过短 | 对比历史数据的量级和趋势 | 做归一化,补充历史数据长度,检查频率设置 |
9. 最佳实践与使用建议
如果要把 TimesFM 用在正式项目里,下面这些工程化建议值得直接照做。
9.1 数据预处理统一规范化
TimesFM 对输入数据的量级不敏感,但数据的稳定性能直接影响预测质量。建议建立统一的数据管线:
- 去除明显异常值。
- 对缺失值做插值,保留缺失数量记录。
- 如果数据是高度非平稳的,先做差分或标准化。
- 统一序列长度,避免模型处理过程中出现长度不一致问题。
9.2 先小参数验证再扩大规模
第一次跑通时不要直接上大批量。先用 few 条序列、短 context、CPU 推理,验证流程正确后,再切换到 GPU 和完整数据。
9.3 保留最小可运行配置
把下面内容固定为一个 config.py 或环境变量文件,方便新环境快速复用:
python复制MODEL_REPO_ID = "google/timesfm-1.0-200m-pytorch"
BATCH_SIZE = 32
HORIZON_LEN = 128
USE_GPU = False
INPUT_DIR = "./input"
OUTPUT_DIR = "./output"
9.4 模型文件、输入数据、输出结果分目录管理
建议目录结构:
code复制timesfm/
├── input/ # 原始 CSV 数据
├── output/ # 预测结果
├── models/ # 本地缓存模型文件
├── scripts/ # 预测脚本
└── logs/ # 运行日志
9.5 批量任务加日志和失败重试
批量预测时,为每条序列记录处理状态。单条失败不应该中断整个批次:
python复制failures = []
for idx, series in enumerate(series_list):
try:
point, _ = tfm.forecast([series], freq=[freq])
# 保存 result
except Exception as e:
failures.append({"index": idx, "error": str(e)})
continue
print("失败数量:", len(failures))
9.6 接口服务限制访问范围
封装 API 后,不要监听 0.0.0.0。默认绑定 127.0.0.1,需要跨机器访问时通过内网网关或 API 网关转发,并加入鉴权。
9.7 发布商用前做效果复核
预测模型最容易出现的问题是“看起来在动,实际没抓住业务规律”。在正式上线前,至少进行以下验证:
- 用最近一段真实数据做回测,计算 MAE、RMSE 或 MAPE。
- 与现有统计模型做基线对比。
- 人工抽检典型场景的预测曲线。
- 确认数据源合法,不涉及未授权的隐私数据。
10. 总结与下一步
TimesFM 值得尝试的核心点是“零样本时序预测”:不需要为每条业务序列单独训练模型,也不需要准备大量高质量标注数据,只要构造好历史序列,调用模型接口即可拿到预测结果。
如果你准备上手,建议按这个顺序验证:
- 先加载官方 checkpoint,跑通一条示例序列。
- 用你的真实 CSV 数据做一次预测,和现状对比。
- 测一下批量预测和自回归长周期预测,确认满足业务扩展需求。
- 把模型封装成 FastAPI 服务,接入内部系统。
最容易踩的坑有三个:第一是 checkpoint 版本与代码不匹配,启动时报错;第二是频率参数设置错误,导致预测结果明显偏离;第三是数据没做清洗,模型输出大量 NaN。这三类问题都能通过查看官方 README 和打印输入日志快速定位。
下一步可以考虑的方向:
- 把 TimesFM 作为预测基线,结合差分、季节分解等传统方法做混合模型。
- 尝试不同参数规模的 checkpoint,评估精度和资源消耗的平衡。
- 在批量任务中加入异常检测,把预测残差转换成告警信号。
- 将预测结果写入时序数据库,结合 BI 工具做可视化。
对于一款 200M 参数级别的时序基础模型,TimesFM 的性价比相当高。建议收藏备用,等需要做预测任务时,可以直接按这篇文章的流程跑一遍。
