Lineage ML w AWS: jak zbudować pełne śledzenie modeli w jeden dzień (i nie stracić danych po drodze)
Firma z sektora finansowego w Polsce musiała zapłacić 200 tys. zł kary za brak dokumentacji pochodzenia danych w modelu scoringowym. Audytorzy nie mogli odtw…
# Lineage ML w AWS: jak zbudować pełne śledzenie modeli w jeden dzień (i nie stracić danych po drodze) Firma z sektora finansowego w Polsce musiała zapłacić 200 tys. zł kary za brak dokumentacji pochodzenia danych w modelu scoringowym. Audytorzy nie mogli odtworzyć, skąd wzięły się dane treningowe sprzed roku – a model nadal działał w produkcji. To nie przypadek: 70% projektów ML w AWS nie ma pełnego lineage, co kosztuje średnio 14,1 mln dolarów rocznie przez problemy z zgodnością i debugowaniem [1], [4]. Pokażemy, jak skonfigurować DVC, SageMaker i MLflow, żeby śledzić każdy krok – od surowych danych po predykcje w produkcji. Z gotowymi notebookami do wdrożenia u siebie. ## Dlaczego 70% projektów ML w AWS nie ma pełnego lineage – i jak to naprawić w jeden dzień? ### Jak brak lineage kosztował firmę 200 tys. zł na audycie W 2023 roku polski bank dostał karę za model, który nie spełniał wymogów GDPR. Problem? Nie mogli udowodnić, skąd pochodziły dane użyte do trenowania modelu scoringowego. Audytorzy zażądali pełnej dokumentacji lineage – a jej brak oznaczał automatyczną karę [4]. Podobne przypadki zdarzają się w sektorze medycznym, gdzie regulacje wymagają śledzenia każdego rekordu użytego w modelach diagnostycznych. Lineage w ML to nie tylko "skąd wzięły się dane". To pełna mapa zależności: - **Dataset-level**: śledzenie całych zbiorów danych (np. "ten model używa datasetu z S3 z 12.03.2024"). - **Record-level**: śledzenie pojedynczych rekordów (np. "ta predykcja bazuje na rekordzie #4567 z tabeli klientów"). W AWS możesz wdrożyć oba poziomy w jeden dzień – ale tylko jeśli unikniesz typowych pułapek integracji DVC, SageMaker i MLflow. ### Dwa poziomy lineage w AWS: który wybrać? **Dataset-level** sprawdza się w 80% przypadków. Pozwala odtworzyć: - Jakie dane użyto do trenowania modelu? - Które wersje datasetów były używane w eksperymentach? - Jakie transformacje przechodziły dane przed wejściem do modelu? **Record-level** jest niezbędny, gdy: - Musisz spełnić regulacje (GDPR, BCBS 239) wymagające śledzenia pojedynczych rekordów [4]. - Twój model podejmuje decyzje o wysokim ryzyku (np. medyczne, finansowe). - Potrzebujesz debugować konkretne predykcje (np. "dlaczego model odrzucił wniosek klienta X?"). Problem? Wdrożenie record-level lineage zwiększa koszty przechowywania metadanych o 30-50% [1]. W małych projektach często wystarczy dataset-level. ### Dlaczego DVC + SageMaker + MLflow to trio, którego brakuje w twoim stacku Większość zespołów używa tylko jednego narzędzia do lineage: - **DVC** do wersjonowania danych. - **MLflow** do trackingu eksperymentów. - **SageMaker** do trenowania modeli. Ale dopiero integracja wszystkich trzech daje pełny obraz: 1. **DVC** śledzi lineage datasetów (od S3 do modelu). 2. **MLflow** loguje parametry, metryki i artefakty eksperymentów. 3. **SageMaker** automatyzuje pipeline’y i deploy modeli. AWS udostępnia gotowe notebooki do uruchomienia tego setupu w swoim koncie [1]. Pokażemy, jak je skonfigurować – i gdzie najczęściej się psuje. ## Jak skonfigurować DVC z Amazon SageMaker, żeby nie stracić danych po pierwszym deploy? ### Krok 1: Inicjalizacja repozytorium DVC w AWS CodeCommit Zaczynamy od stworzenia repozytorium w CodeCommit i inicjalizacji DVC:
git clone https://git-codecommit.eu-central-1.amazonaws.com/v1/repos/ml-lineage-repo
cd ml-lineage-repo
dvc init
git add .dvc
git commit -m "Initialize DVC"
**Pułapka #1**: Domyślnie DVC nie śledzi plików większych niż 10 MB. Jeśli twój dataset przekracza ten rozmiar, musisz dodać go ręcznie:
dvc add data/raw/dataset.csv
**Pułapka #2**: AWS CodeCommit wymaga konfiguracji IAM. Upewnij się, że masz uprawnienia `codecommit:GitPull` i `codecommit:GitPush`. Bez tego DVC nie zsynchronizuje zmian. ### Krok 2: Integracja z Amazon S3 jako remote storage DVC potrzebuje remote storage do przechowywania danych. W AWS najlepiej sprawdza się S3:
dvc remote add -d myremote s3://twoj-bucket-name/dvc-store
dvc push
**Pułapka #3**: Koszty przechowywania w S3 rosną z każdą wersją datasetu. Dla datasetu o rozmiarze 10 GB, po 10 wersjach zapłacisz ~2,50 PLN miesięcznie (przy cenie 0,023 USD/GB w regionie eu-central-1). Ale jeśli nie usuniesz starych wersji, koszt może wzrosnąć do 25 PLN/miesiąc [1]. **Best practice**: Ustaw lifecycle policy w S3, żeby automatycznie usuwać wersje starsze niż 30 dni:
{
"Rules": [
{
"ID": "DeleteOldDVCVersions",
"Status": "Enabled",
"Filter": { "Prefix": "dvc-store/" },
"Expiration": { "Days": 30 }
}
]
}
### Krok 3: Automatyzacja pipeline’ów z SageMaker Pipelines
SageMaker Pipelines pozwala zautomatyzować workflow ML – od przygotowania danych po deploy modelu. Integracja z DVC wymaga kilku kroków:
1. **Stwórz pipeline w SageMaker**:
```python
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.steps import TrainingStep
pipeline = Pipeline(
name="DVC-SageMaker-Pipeline",
steps=[training_step],
parameters=[]
)
pipeline.upsert(role_arn="arn:aws:iam::123456789012:role/SageMakerRole")
```
2. **Dodaj DVC do pipeline’u**:
SageMaker nie ma wbudowanej integracji z DVC, więc musisz użyć customowego kontenera lub skryptu bash:
```bash
# Przykładowy skrypt do uruchomienia w pipeline
dvc pull
python train.py
dvc push
```
**Pułapka #4**: SageMaker Pipelines domyślnie nie czeka na zakończenie `dvc pull`. Jeśli pipeline ruszy przed pobraniem danych, dostaniesz błąd `FileNotFoundError`. Rozwiązanie: użyj `StepDependencies` w SageMaker:
from sagemaker.workflow.step_collections import StepDependencies
training_step = TrainingStep(
name="TrainModel",
step_dependencies=[StepDependencies(depends_on=["DVCPullStep"])]
)
## MLflow w SageMaker: jak uruchomić tracking eksperymentów bez ręcznego logowania?
### Dlaczego MLflow Apps w SageMaker to game-changer dla lineage?
MLflow Apps to gotowe obrazy Dockerowe z MLflow, które można uruchomić w SageMaker z jednym kliknięciem. Dzięki temu:
- Nie musisz konfigurować własnego serwera MLflow.
- Wszystkie eksperymenty są automatycznie logowane do S3.
- Możesz śledzić lineage eksperymentów bezpośrednio w MLflow UI.
**Ograniczenie**: MLflow Apps w SageMaker nie wspiera jeszcze record-level lineage. Jeśli potrzebujesz śledzić pojedyncze rekordy, musisz użyć customowego rozwiązania z SageMaker Feature Store [1].
### Konfiguracja MLflow Tracking Server w AWS – minimalny setup w 30 minut
1. **Uruchom MLflow Tracking Server w SageMaker**:
- Przejdź do AWS Marketplace i wyszukaj "MLflow on SageMaker".
- Wybierz obraz MLflow 2.11.0 (najnowsza wersja wspierana przez AWS).
- Uruchom instancję z typem `ml.t3.medium` (koszt: ~0,05 USD/godzinę).
2. **Skonfiguruj backend store i artifact store**:
- Backend store: użyj Amazon RDS (PostgreSQL) lub DynamoDB.
- Artifact store: S3 bucket (np. `s3://twoj-bucket-name/mlflow-artifacts`).
Przykładowa konfiguracja w `mlflow server`:
```bash
mlflow server \
--backend-store-uri postgresql://user:password@rds-endpoint:5432/mlflow \
--default-artifact-root s3://twoj-bucket-name/mlflow-artifacts \
--host 0.0.0.0
```
3. **Zintegruj z SageMaker Training Jobs**:
Dodaj MLflow do swojego skryptu treningowego:
```python
import mlflow
mlflow.set_tracking_uri("http://mlflow-server:5000")
mlflow.set_experiment("eksperyment-1")
with mlflow.start_run():
mlflow.log_param("learning_rate", 0.01)
mlflow.log_metric("accuracy", 0.95)
mlflow.log_artifact("model.pkl")
```
**Pułapka #5**: MLflow domyślnie nie loguje lineage datasetów. Aby to naprawić, musisz ręcznie dodać tagi DVC:
mlflow.set_tag("dvc_repo", "https://git-codecommit.eu-central-1.amazonaws.com/v1/repos/ml-lineage-repo")
mlflow.set_tag("dvc_commit", "a1b2c3d4")
### Jak zautomatyzować logowanie parametrów, metryk i artefaktów? SageMaker Training Jobs może automatycznie logować dane do MLflow. Wystarczy dodać `MLFLOW_TRACKING_URI` do environment variables w jobie:
from sagemaker.estimator import Estimator
estimator = Estimator(
image_uri="763104351884.dkr.ecr.eu-central-1.amazonaws.com/pytorch-training:1.12.0-gpu-py38-cu113-ubuntu20.04",
role="arn:aws:iam::123456789012:role/SageMakerRole",
instance_count=1,
instance_type="ml.g4dn.xlarge",
environment={
"MLFLOW_TRACKING_URI": "http://mlflow-server:5000",
"MLFLOW_EXPERIMENT_NAME": "eksperyment-1"
}
)
estimator.fit({"train": "s3://twoj-bucket-name/data/train/"})
**Ograniczenie**: Automatyczne logowanie działa tylko dla parametrów i metryk zdefiniowanych w skrypcie treningowym. Jeśli używasz customowych metryk (np. z biblioteki `sklearn`), musisz je ręcznie zarejestrować w MLflow. ## Dataset-level lineage: jak śledzić pochodzenie danych od S3 do modelu? ### Implementacja lineage na poziomie datasetów z użyciem DVC DVC automatycznie generuje graf zależności między datasetami, skryptami i modelami. Aby go zobaczyć, użyj:
dvc dag
Przykładowy output:
data/raw/dataset.csv.dvc
*
*
src/preprocess.py
*
*
data/processed/train.csv.dvc
*
*
src/train.py
*
*
models/model.pkl.dvc
**Krok po kroku**:
1. **Dodaj dataset do DVC**:
```bash
dvc add data/raw/dataset.csv
git add data/raw/dataset.csv.dvc .gitignore
git commit -m "Add raw dataset"
```
2. **Stwórz skrypt preprocessingowy i dodaj go do DVC**:
```python
# src/preprocess.py
import pandas as pd
df = pd.read_csv("data/raw/dataset.csv")
df_processed = df.dropna()
df_processed.to_csv("data/processed/train.csv", index=False)
```
```bash
dvc run -n preprocess \
-d data/raw/dataset.csv \
-o data/processed/train.csv \
python src/preprocess.py
```
3. **Stwórz pipeline treningowy**:
```bash
dvc run -n train \
-d data/processed/train.csv \
-o models/model.pkl \
python src/train.py
```
4. **Wygeneruj graf lineage**:
```bash
dvc dag --dot | dot -Tpng > lineage.png
```
**Pułapka #6**: DVC nie śledzi zmian w kodzie skryptów. Jeśli zmienisz `src/preprocess.py`, ale nie zaktualizujesz `dvc.yaml`, lineage będzie niekompletny. Rozwiązanie: użyj `dvc repro` do automatycznego odtwarzania pipeline’u.
### Jak zmapować zależności między datasetami, feature stores i modelami?
W projektach z feature store (np. SageMaker Feature Store) musisz ręcznie dodać zależności do DVC:
dvc run -n create_features \
-d data/processed/train.csv \
-o feature_store/ \
python src/create_features.py
Następnie zaktualizuj pipeline treningowy:
dvc run -n train \
-d feature_store/ \
-o models/model.pkl \
python src/train.py