You are currently viewing Timestral từ Mistral AI: dự báo chuỗi thời gian đa biến chạy được trên CPU

Timestral từ Mistral AI: dự báo chuỗi thời gian đa biến chạy được trên CPU

Cái tên Mistral AI thường gắn với LLM, nhưng repo mistralai/timestral lại là chuyện khác: một họ foundation model cho time series. Cụ thể hơn, nó làm multivariate probabilistic forecasting, tức là dự báo đồng thời nhiều biến của một chuỗi, kèm phân phối xác suất chứ không chỉ một con số point forecast.

Repo này cung cấp standalone inference cho các model Timestral. Nó chỉ cần PyTorch, NumPy, safetensors và huggingface_hub. Chạy được trên CPU hoặc GPU. Không phải kéo theo nguyên một framework dự báo cồng kềnh.

Nó giải quyết bài toán gì

Bài toán muốn dự báo chuỗi thời gian thường gặp hai kiểu đau đầu. Một là phải train riêng một model cho từng dataset, tốn thời gian và không tận dụng được gì từ dữ liệu khác. Hai là multi-series thì dễ, nhưng multi-variate (nhiều biến trong cùng một series, có ràng buộc với nhau) thì khó, đặc biệt khi muốn đầu ra dạng quantile.

Timestral nhắm vào cả hai. Đây là model zero-shot, nghĩa là bạn load weights về và forecast luôn, không cần fine-tune. Nó hỗ trợ ba loại covariates: past-only (chỉ biết trong quá khứ), known-future (biết cả tương lai, ví dụ lịch, ngày lễ) và categorical. Covariates là các hàng conditioning, chúng truyền thông tin cho target nhưng không đọc ngược lại target. Chỉ covariate known-future mới nhìn thấy horizon dự báo.

Về kiến trúc: causal patch-based transformer, train bằng Decoupled Horizon Forecasting (DHF), forecast sinh ra từ các prediction token riêng đọc phần context đã encode causal. Quantile head xuất 21 quantile không giao nhau mỗi time step. Context tối đa 32.768 bước. Với horizon dài hơn một decode block (32 patch = 1024 bước), nó forecast theo từng block, lấy median của block trước làm context cho block sau.

Vì sao đáng để ý

Repo mới tạo ngày 2026-10-15 và đã có 539 sao. Với một repo chỉ có code inference, không có demo app, không có topics, con số đó đến khá nhanh. Một phần vì tên tuổi Mistral. Phần còn lại vì kết quả benchmark.

Ở thời điểm launch, Timestral-209M đứng đầu trong nhóm pretrained và zero-shot trên ba benchmark forecasting công khai: GIFT-Eval (hạng 1, 97 config), TIME (hạng 1, 98 task) và fev-bench (hạng 1, 100 task). Cả bốn kích thước 5M, 28M, 123M, 209M đều nằm trên Pareto front của accuracy so với model size. Chi tiết đầy đủ nằm trong blog post và model card trên Hugging Face, còn trong README chỉ tóm tắt.

Điểm khác biệt thực dụng nhất với tôi là chuyện CPU. Model 209M với weights fp32 nặng 837 MB, chạy inference không cần GPU. Điều này quan trọng với ai làm production mà hạ tầng chỉ có CPU node, hoặc đang prototype trên máy cá nhân.

Cài và chạy thử

Cài trực tiếp từ GitHub, yêu cầu Python >= 3.10 và torch >= 2.4:

pip install git+https://github.com/mistralai/timestral.git

Hoặc clone rồi dùng uv với version pin trong uv.lock:

git clone https://github.com/mistralai/timestral.git && cd timestral
uv sync --frozen
source .venv/bin/activate

Weights nằm trên Hugging Face Hub trong org Mistral AI, bốn mức: Timestral-5M (21 MB), 28M (111 MB), 123M (490 MB), 209M (837 MB). Đoạn code dưới đây lấy nguyên từ README:

import numpy as np
from timestral import TimestralForecaster

forecaster = TimestralForecaster.from_pretrained("mistralai/Timestral-209M") # device="cuda" for a GPU

context = np.random.randn(2, 1, 2000).cumsum(-1) # (series, variates, time); NaN = missing
forecast = forecaster.forecast(context, prediction_length=96)

forecast.quantiles.shape # (2, 1, 96, 21): series, variates, horizon, quantile levels
forecast.quantile_levels # (0.01, 0.05, 0.1, ..., 0.9, 0.95, 0.99)
forecast.median # (2, 1, 96)
forecast.quantile(0.9) # (2, 1, 96)

Chú ý vài chi tiết trong API. context nhận ba dạng shape: (B, V, T), (B, T) hoặc (T,), dạng NumPy array hay torch tensor đều được. NaN đánh dấu giá trị thiếu, và có thêm observation_mask cùng shape với quy ước False = missing. Context bị cắt ở độ dài đã train (32768 bước), giữ lại các bước gần nhất.

Muốn dùng covariates thì truyền thêm hai tham số. past_covariates có shape (B, C_past, T), chỉ biết trong context. known_covariates có shape (B, C_known, T + 96), biết cả context lẫn horizon. Hàng covariate toàn giá trị 0 hoặc 1 được coi là indicator. Với categorical covariates, truyền numeric code (ví dụ từ pandas.factorize), NaN là missing hoặc padding. Với target univariate, mỗi hàng categorical được target-encode theo từng series; hàm timestral.covariate_encoding.target_encode được expose nếu bạn muốn tự làm bước này.

Ai nên dùng, dùng vào việc gì

Hợp nhất với người cần baseline nhanh cho bài toán dự báo mà chưa muốn đầu tư train model riêng. Ví dụ dự báo demand nhiều SKU, dự báo doanh thu theo nhiều kênh, hay monitoring metric hệ thống có tính chu kỳ. Có sẵn covariate known-future thì càng tốt, kiểu lịch khuyến mãi hoặc ngày lễ đã biết trước.

Cũng hợp với ai cần phân phối dự báo chứ không chỉ điểm. 21 quantile mỗi bước đủ để dựng interval cho inventory planning hoặc risk sizing. Và quan trọng: nếu hạ tầng chỉ có CPU, đây là lựa chọn đáng thử trước khi tính chuyện thuê GPU.

Không hợp với ai cần model nhỏ dưới vài chục MB mà vẫn multivariate phức tạp, hoặc cần fine-tune trên dữ liệu riêng ngay bây giờ. Repo chỉ có inference, không có script training.

Mấy điểm cần cân nhắc

License hơi tách đôi, đọc kỹ trước khi đưa vào sản phẩm. Code trong repo là Apache 2.0. Nhưng weights Timestral phát hành riêng trên Hugging Face Hub dưới Modified MIT license. Hai thứ khác nhau, đừng gộp.

Repo không nhận pull request. Chỉ nhận bug report và câu hỏi qua GitHub issues, trả lời theo best-effort. Nghĩa là bạn không đóng góp code được, và cũng đừng kỳ vọng ai đó vá lỗi cho use case riêng của bạn.

README khá gọn nhưng không có topics, không có mô tả repo, tài liệu chủ yếu nằm trong README và model card. API surface nhỏ nên cũng không phải vấn đề lớn. Tuy nhiên đây là repo mới tạo, chưa có lịch sử issue dài để biết các cạm bẫy thực tế. Tôi sẽ thử trên vài dataset của mình trước khi tin kết quả benchmark áp dụng cho domain cụ thể.

Một chi tiết nữa: benchmark được chạy zero-shot với context tối đa 32768 bước. Nếu dữ liệu của bạn ngắn hơn nhiều, hoặc chuỗi có pattern khác biệt hẳn so với benchmark, con số hạng 1 kia không đảm bảo gì. Cứ đo lại.

Repo có 539 sao, bốn model từ 5M đến 209M, và một dòng pip install là chạy được. Với ai đang cần một baseline time series tử tế mà không muốn đụng GPU, đây là thứ đáng bỏ 15 phút thử. Link: mistralai/timestral.

Đăng ngày 20/10/2026
Giang Na
Về tác giả: Giang Na
Người lập ra blog từ 2015 với những bài về Blogspot. Giờ tập trung vào cách đưa AI vào việc thường ngày, theo hướng thực dụng và dễ làm theo.

Giang Na

Người lập ra blog từ 2015 với những bài về Blogspot. Giờ tập trung vào cách đưa AI vào việc thường ngày, theo hướng thực dụng và dễ làm theo.