News
Praktyczne zastosowaniaChatGPT przyspiesza pracę marketingową — jak to zrobić w Twojej firmie?Praktyczne zastosowaniaJak firmy native AI automatyzują procesy biznesowe — trzy case’y, które można powtórzyć w PolscePraktyczne zastosowaniaKontrola agentów AI: kiedy Twoja firma traci wpływ nad działaniami automatyzacjiPraktyczne zastosowaniaFSM runtime vs. LLM: dlaczego polskie firmy płacą za błędne mutacje stanuNews & analizyGoogle Search się zmienił — co to znaczy dla Twojej witryny?Tutoriale how-toCSV do raportu dla zarządu w 30 minut — bez Excela, bez bólu głowyTutoriale how-toJak zbudować własny pipeline grafów wiedzy z tekstu w 6 krokach (i kiedy to nie warto)Praktyczne zastosowaniaWspółdzielona pamięć dla agentów AI: jak 21 węzłów zmieniło koszty debugowania w 7 domenach
Lineage ML w AWS: jak zbudować pełne śledzenie modeli w jeden dzień (i nie stracić danych po drodze)
Tutoriale how-to

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…

AN
Andrzej Niemiec
18 sierpnia 2026 · 9 min czytania · 1851 słów
Reviewed by Andrzej Niemiec
# 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

AN
O autorze
Andrzej Niemiec

Fanatyk nowych technologii i specjalista w zakresie sztucznej inteligencji.