[Time Series] 시계열 파운데이션 모델을 진짜로 돌려봤다 — Chronos-2 제로샷
학습 없이 예측한다는 시계열 파운데이션 모델을 노트북 CPU에서 실제로 돌려 나이브 기준선과 비교했습니다. 어떤 데이터에서 이기고 어디서 지는지, 속도와 한계를 실측으로 정리합니다.
지난 글에서 시계열 파운데이션 모델을 다뤘는데, 확인한 것이라고는 논문 초록과 레포 별 수뿐이었습니다. “학습 없이 예측된다”를 개념으로만 쓴 셈입니다.
이번엔 실제로 돌려봤습니다. 노트북 CPU에서, 진짜 데이터로, 단순한 기준선과 나란히 놓고요.
격리해서 설치했습니다
기존 환경을 건드리지 않으려고 가상환경에 따로 깔았습니다. 다 쓰고 폴더째 지우면 끝입니다.
1
2
3
python -m venv chronos-env
./chronos-env/Scripts/python.exe -m pip install torch --index-url https://download.pytorch.org/whl/cpu
./chronos-env/Scripts/python.exe -m pip install chronos-forecasting pandas
torch 를 CPU 전용 인덱스에서 먼저 받는 게 요령입니다. 그냥 설치하면 CUDA 런타임이 딸려와 몇 배로 커집니다. GPU가 없으니 어차피 쓰지도 못하고요.
의존성 30개가 들어왔고, 가상환경 전체가 948MB 였습니다.
첫 예측까지
1
2
3
4
5
6
7
8
9
10
11
import torch
from chronos import BaseChronosPipeline
pipe = BaseChronosPipeline.from_pretrained("amazon/chronos-2", device_map="cpu")
q, mean = pipe.predict_quantiles(
inputs=[torch.tensor(history, dtype=torch.float32)],
prediction_length=12,
quantile_levels=[0.1, 0.5, 0.9],
)
lo, median, hi = (q[0][0, :, i].numpy() for i in range(3))
정말 이게 전부입니다. 학습 코드도, 하이퍼파라미터도, 검증 루프도 없습니다. 과거 값을 넣으면 미래 값이 나옵니다.
반환 형태만 한 번 짚고 가겠습니다. q[0] 의 모양은 [변량, 예측길이, 분위수] 입니다. 맨 앞 축이 변량인 것은 Chronos-2가 다변량을 지원하기 때문이고, 일변량이면 길이가 1입니다.
저는 여기서
median, lo, hi = ...로 잘못 풀어서 10% 분위수를 중앙값으로 알고 채점했습니다. 오류는 안 나고 MAE만 13.4에서 20.3으로 나빠집니다. 분위수 순서는quantile_levels에 준 순서 그대로입니다.
무엇과 비교했나
혼자 돌려서 “잘 맞네” 하는 것은 의미가 없습니다. 기준선을 셋 뒀습니다.
| 기준선 | 예측 방식 |
|---|---|
| 나이브 | 마지막 값을 그대로 반복 |
| 계절 나이브 | 한 주기 전 값을 그대로 가져옴 |
| 평균 | 전체 평균을 반복 |
지표는 MAE이고, 데이터는 셋입니다. 앞의 둘은 공개된 실제 데이터, 마지막 하나는 오늘 만든 난수입니다.
결과 1 — 추세와 계절성이 뚜렷하면
월별 항공 승객 수(1949~1960)의 마지막 12개월을 가렸습니다.
학습 없이 예측한 결과입니다. 점선이 예측, 실선이 실제값입니다
| 방법 | MAE |
|---|---|
| Chronos-2 (제로샷) | 13.45 |
| 계절 나이브 | 47.83 |
| 나이브 | 76.00 |
| 평균 | 213.67 |
계절 나이브 대비 오차가 72% 줄었습니다. 상승 추세와 매년 반복되는 성수기를 둘 다 잡아냈습니다.
이 데이터를 한 번도 학습하지 않았다는 전제 하에서는 인상적인 결과입니다. 그 전제가 성립하는지는 아래 한계 절에서 다시 보겠습니다.
결과 2 — 계절성만 있고 추세가 없으면
멜버른 일 최저기온(1981~1990)에서 마지막 30일을 가렸습니다.
| 방법 | MAE |
|---|---|
| 나이브 | 1.877 |
| Chronos-2 (제로샷) | 1.903 |
| 계절 나이브 | 2.550 |
| 평균 | 3.343 |
졌습니다. 근소하지만 마지막 값을 그대로 반복하는 나이브가 더 정확했습니다.
30일 앞을 보는데 기온은 연 단위로 움직이니, 이 구간에서는 “어제와 비슷하다”가 강한 예측입니다. 3,620개 점을 다 읽은 모델이 한 줄짜리 규칙을 못 이겼습니다.
결과 3 — 패턴이 없으면
난수로 만든 랜덤워크입니다. 학습에 포함됐을 가능성이 0인 유일한 데이터입니다.
처음엔 시드 하나로 돌리고 “졌다”고 쓸 뻔했는데, 시드를 여덟 개로 늘리니 그림이 달라졌습니다.
1
2
3
4
5
6
7
8
9
10
seed Chronos-2 naive winner
20260824 7.413 7.082 naive
20260825 1.633 1.565 naive
20260826 4.635 4.688 Chronos-2
20260827 2.652 2.571 naive
20260828 4.820 4.424 naive
20260829 6.466 6.736 Chronos-2
20260830 2.409 2.918 Chronos-2
20260831 2.297 1.913 naive
tally: Chronos-2 3 / naive 5
3승 5패. 정의상 예측 불가능한 계열이니 당연한 결과이고, 오히려 “패턴이 없으면 없다고 인정한다”는 뜻이라 나쁜 신호는 아닙니다.
문제는 다른 데 있었습니다. 80% 예측 구간이 실제값을 덮은 비율이 평균 66% 였습니다. 명목 80%보다 낮으니 구간을 실제보다 좁게 잡았다 — 즉 자기 확신을 과대평가했다는 뜻입니다.
| 데이터 | 80% 구간이 실제로 덮은 비율 |
|---|---|
| 항공 승객 | 92% (너무 넓음) |
| 기온 | 83% (거의 정확) |
| 랜덤워크 | 66% (너무 좁음) |
예측 구간을 의사결정에 쓸 생각이라면 자기 데이터로 이 값을 먼저 재보시길 권합니다.
속도와 크기
실무 판단에는 이쪽이 더 중요할 수 있습니다.
| 항목 | 실측 |
|---|---|
| 파라미터 | 119.5M |
| 모델 로드 | 첫 실행 10.8초 (내려받기 포함), 이후 1.7초 |
| 추론 — 132개 점 | 0.11초 |
| 추론 — 3,620개 점 | 0.26초 |
| 실행 환경 | CPU 8스레드, GPU 없음 |
GPU 없이 0.3초 안에 끝납니다. 같은 호출을 여섯 번 반복해도 MAE가 소수점 넷째 자리까지 동일했습니다 — 결정적입니다.
“파운데이션 모델이니 무겁겠지”라고 미루고 있었다면, 적어도 이 크기에서는 그 걱정이 근거가 없습니다.
이 결과를 어디까지 믿을 수 있나
여기부터가 중요합니다.
학습 데이터에 포함됐는지 확인할 수 없습니다. 모델 카드는 학습 코퍼스를 “Chronos Datasets의 부분집합”, “GIFT-Eval Pretrain의 부분집합”, “합성 데이터”라고만 밝히고 개별 데이터셋 목록은 주지 않습니다. 항공 승객 데이터는 세상에서 가장 유명한 시계열 중 하나이고, 기온 데이터도 교과서에 자주 나옵니다.
그래서 앞의 두 결과는 성능의 상한으로 읽는 편이 안전합니다. 확실히 처음 보는 데이터는 오늘 만든 랜덤워크뿐이고, 거기서는 나이브와 비등했습니다.
시드 하나로 판단하면 안 됩니다. 앞서 적었듯 첫 시드만 봤을 때 커버리지가 17%로 나와서 “구간을 심각하게 과신한다”고 쓸 뻔했습니다. 여덟 개 평균은 66%였습니다. 같은 실수를 피하시라고 남깁니다.
측정 범위가 좁습니다. 예측 구간 하나, 지표 하나(MAE), 일변량만 봤습니다. Chronos-2의 핵심 주장인 다변량·공변량 예측은 시험하지 않았습니다.
지난 글과 대조하면
지난 글에서 제3자 평가 하나를 인용했었습니다. 하천유량 예측에서 일변량 제로샷은 학습한 LSTM과 대등했지만 다변량은 못 미쳤다는 결과였습니다.
제 실측도 결이 같습니다. 구조가 뚜렷한 일변량에서는 크게 이기고, 구조가 약해지면 한 줄짜리 규칙과 비슷해집니다. “학습한 모델을 이긴다”가 아니라 “학습 없이 그 근처까지 온다” 는 표현이 여전히 맞습니다.
정리
써보고 나서 생각이 바뀐 지점은 진입 비용입니다.
설치 20분, 코드 다섯 줄, CPU에서 0.3초입니다. 정확도가 항상 좋다는 뜻은 전혀 아니지만, 시도해보는 비용이 거의 없습니다.
그래서 실무 순서로는 이게 합리적이라고 봅니다.
- 데이터를 모으고 모델을 학습시키기 전에 제로샷을 한 번 돌려 기준선을 잡는다
- 나이브·계절 나이브와 반드시 같이 놓는다. 혼자 보면 잘하는지 알 수 없다
- 예측 구간을 쓸 거라면 커버리지를 자기 데이터로 잰다
지난 글이 “무엇이 바뀌었나”였다면 이번 글의 답은 이렇습니다. 시도하는 비용이 바뀌었습니다.
참고
- amazon/chronos-2 모델 카드 — 120M 파라미터, Apache-2.0, 학습 데이터 구성 (2026-08-24 확인)
- Chronos-2: From Univariate to Universal Forecasting — Ansari 외, 2025-10-17. 그룹 어텐션과 인컨텍스트 학습
- amazon-science/chronos-forecasting — 이 글에서 쓴 패키지 (
chronos-forecasting2.3.1) - 시계열에도 파운데이션 모델이 왔다 — 개념 편. 이 글이 그 실측입니다
- venv를 활용한 파이썬 가상환경 사용법 — 격리해서 설치하는 법
- 데이터: airline-passengers, daily-min-temperatures (2026-08-24 내려받음)