Korzystając z wygenerowanych przez siebie przykładowych danych historycznych, trenuje prosty model z rodziny ARIMA oraz przewiduje zachowanie szeregu czasowego wskazaną ilość dni do przodu. Umożliwia określenie horyzontu oraz podgląd wykresu na stronie internetowej.
W każdym podzie znajduje się pojedynczy kontener. Własne obrazy bazują na uv, które jest nowoczesnym systemem zarządzania zależnościami w Pythonie, jako system wykorzystuje Debian Trixie. Obrazy dostępne są na DockerHub.
Wykorzystuje bazę TimescaleDB, pochodną PostgreSQL zoptymalizowaną pod pracę z szeregami czasowymi. Deployment umożliwia konfigurację nazwy bazy, katalog danych, użytkownika oraz jego hasła. Skalowanie baz przez replikację raczej nie jest rekomendowane, aczkolwiek dane trafiają do wolumenu.
Endpoint serwujący model wykorzystuje FastAPI. Posiada /predict oraz /health. W tym kontenerze także tworzona jest tabela w bazie wraz z danymi. Specyfika obrazu TimescaleDB bardzo utrudniała przeniesienie tego kroku na stronę bazy. Skalowany domyślnie na 3 repliki.
Udostępnia stronę internetową do wysyłania zapytań oraz wyświetlania wykresu predykcji. Gradio pozwala szybko budować aplikacje oparte na danych, dzięki czemu nie ma potrzeby implementacji interfejsu od podstaw. Docker Compose nie oferuje domyślnie LoadBalancer'a, więc skalowanie możliwe jedynie w Kubernetes.
Wykonywałem testy jedynie na linuxie, nie posiadam Windowsa na prywatnych urządzenaich.
Należy przejść do katalogu docker i wykonać polecenie:
# aby nie zaciągnęło model i webapp z repozytorium
docker build
docker compose upPóźniej można usunąć z tego samego katalogu:
docker compose down
docker rmi fifthleaf/infra-sys:fastapi-model-1.0 \
fifthleaf/infra-sys:gradio-webapp-1.0 \
timescale/timescaledb:2.24.0-pg18Należy przejść do katalogu kubernetes lub wykorzystać flagę -f kubernetes:
kubectl apply -f .Następnie można usunąć w tożsami sposób:
kubectl delete -f .
docker rmi fifthleaf/infra-sys:fastapi-model-1.0 \
fifthleaf/infra-sys:gradio-webapp-1.0 \
timescale/timescaledb:2.24.0-pg18Strona internetowa domyślnie będzie dostępna pod adresem http://127.0.0.1:80/. W polu horyzont wybierz liczbę dni. Lepiej nie zbyt dużą, np. 5-30, gdyż to model autoregresywny. Po kliknięciu submit i odczekaniu paru chwil powinien pojawić się interaktywny wykres po prawej stronie.
Zdarzało się przy uruchamianiu na Kubernetes, że pody API potrzebowały restartu. Miało to miejsce, gdy pod bazy uruchamiał się dłużej, niż zwykle. Rozwiązałem problem implementując powtarzanie zapytań do bazy. W sytuacjach wyjątkowych zachowanie mogłoby się powtórzyć - wtedy po restarcie podów wraca do normalnej pacy.