ML 파이프라인 구축¶
이 튜토리얼에서 무엇을 배우나요?¶
이 튜토리얼은 Runway 위에서 ML 파이프라인을 처음부터 실행해보는 실습입니다.
풍력 터빈 데이터로 발전량을 예측하는 모델을 예제로 사용하지만, 모델 자체보다 파이프라인이 어떻게 돌아가는지가 핵심입니다.
튜토리얼을 마치면 아래 경험을 직접 해볼 수 있습니다:
- Gitea에 코드를 올리면 Airflow가 자동으로 인식하는 구조
- Airflow DAG가 무엇인지, 코드로 어떻게 구성하는지
- DAG의 각 Task가 단계별로 실행되며 학습이 진행되는 흐름
- MLflow에 학습 결과를 기록하는 코드 구성 방식
- 학습된 모델을 Endpoint로 배포하고 추론 요청을 보내는 과정
시작 전 확인 — 이런 경험이 있어야 합니다
- Python 기초: 함수, 클래스, 라이브러리 import 수준의 코드를 읽고 수정할 수 있어야 합니다.
- Git 기본 사용:
git add,git commit,git push명령을 직접 실행할 수 있어야 합니다. - 머신러닝 기초 개념: 학습/검증 데이터 분리, 모델 학습, 평가 지표(RMSE 등)의 개념을 알고 있어야 합니다.
- 터미널 사용: 명령줄에서 기본 명령을 실행할 수 있어야 합니다.
위 항목이 낯설다면 입문 수준의 Python 및 Git 학습 후 진행하는 것을 권장합니다.
용어 알아보기
- Gitea: 오픈소스 Git 저장소 서비스. GitHub과 유사하며, 이 튜토리얼에서는 DAG 코드를 저장하고 Airflow와 연동하는 용도로 사용합니다.
- Airflow: 워크플로우 스케줄링 도구. DAG 파일을 읽어 Task를 순서대로 실행하고 상태를 모니터링합니다.
- DAG (Directed Acyclic Graph): 방향이 있고 순환이 없는 그래프 구조. Airflow에서는 데이터 파이프라인의 전체 흐름을 DAG로 정의하며, 각 단계를 Task로 표현합니다.
- Task: DAG를 구성하는 개별 실행 단위. 데이터 로드, 모델 학습, 결과 저장 등 각 단계가 하나의 Task로 정의됩니다.
- MLflow: 머신러닝 실험 추적 및 모델 관리 도구. 학습 파라미터, 메트릭, 모델 파일을 기록하고 버전을 관리합니다.
- Argo CD: GitOps 기반 배포 자동화 도구. Runway에서 Inference Endpoint 배포 상태 관리에 사용됩니다.
- PVC (Persistent Volume Claim): Kubernetes에서 영구 저장소를 요청하는 단위. 컨테이너가 재시작되어도 데이터가 유지됩니다.
- S3: 오브젝트 스토리지 서비스 규격. Runway에서는 MLflow 모델 아티팩트 저장에 S3 호환 스토리지를 사용합니다.
이 튜토리얼에서 사용하는 도구¶
Runway는 ML 워크플로우에 필요한 오픈소스 도구들을 플랫폼 안에서 통합 제공합니다. 각 도구가 어떤 역할을 하는지, 사용자가 실제로 접하는 화면은 무엇인지 미리 파악해두세요.
플랫폼 앱 — Runway 워크스페이스 > 플랫폼 앱 메뉴에서 제공되는 오픈소스 애플리케이션입니다.
| 플랫폼 앱 | 사용자 접근 방식 | 이 튜토리얼에서의 역할 |
|---|---|---|
| Gitea | Code-server에서 git push | DAG 코드 저장 및 Airflow 연동 |
| Airflow | Airflow UI | 모델 학습 워크플로우 실행 |
| MLflow | MLflow UI | 학습 결과 및 모델 버전 확인 |
| Argo CD | Argo CD UI (간접 사용) | Inference Endpoint 배포 상태 확인 |
Runway 기본 기능 — 별도 설치 없이 Runway에 내장되어 있습니다.
| 기능 | 사용자 접근 방식 | 이 튜토리얼에서의 역할 |
|---|---|---|
| 스토리지 (S3 / PVC) | Runway 메뉴에서 생성 · 코드에서 연동 | 모델 파일 저장 |
| Inference Endpoint | Runway 메뉴 / REST API | 배포된 모델에 예측 요청 |
Runway에서 ML 파이프라인이 동작하는 방식¶
Runway는 ML 워크플로우에 필요한 오픈소스 도구들을 하나의 플랫폼 안에서 연결해서 제공합니다. 이 튜토리얼에서 사용하는 도구의 흐름은 아래와 같습니다.
flowchart LR
subgraph runway["Runway 플랫폼"]
subgraph dev["개발 환경 (프로젝트)"]
CS["Code-server\n코드 작성"]
end
subgraph platform["플랫폼 앱 (워크스페이스 공용)"]
GT["Gitea\nDAG 코드 저장소"]
AF["Airflow\n파이프라인 실행"]
ML["MLflow\n실험 기록 & 모델 등록"]
S3["S3\n모델 파일 저장"]
end
end
CS -->|"git push"| GT
GT -->|"자동 동기화"| AF
AF -->|"Task 순차 실행"| ML
AF -->|"모델 파일 저장"| S3
ML -.->|"아티팩트 경로 참조"| S3
왜 이렇게 연결되어 있나요?¶
각 도구가 연결된 이유를 하나씩 짚어봅니다.
Gitea → Airflow: 코드를 올리면 파이프라인이 준비된다
Runway에서 각 프로젝트는 생성될 때 Airflow 전용 Gitea 레포지토리(airflow-dag)를 자동으로 받습니다. Airflow는 이 레포지토리를 지속적으로 바라보고 있어서, 코드를 push하면 별도 설정 없이 Airflow가 DAG를 인식합니다.
코드 수정 → git push → Gitea → (자동 동기화) → Airflow에 DAG 반영
Airflow Task: 각 단계는 독립된 실행 단위다
Airflow의 파이프라인(DAG)은 여러 Task로 구성됩니다. 중요한 점은 각 Task가 독립적으로 실행된다는 것입니다. 한 Task가 끝나면 그 안에서 만든 임시 데이터는 기본적으로 사라집니다.
Task 1 실행·종료 → Task 2 실행·종료 → Task 3 실행·종료
[데이터 로드] [모델 학습] [결과 평가]
│ ↑
└── /tmp 경로로 전달 ───┘
그래서 Task 간에 데이터를 전달할 때는 임시 경로(/tmp)를 사용하고, 파이프라인이 끝난 뒤에도 남겨야 하는 결과물(학습된 모델 등)은 반드시 외부 저장소에 저장해야 합니다.
복잡해 보이지만, 직접 설정할 건 많지 않습니다
Gitea와 Airflow의 연결, MLflow와 S3의 연동은 Runway가 이미 구성해두었습니다. 이 튜토리얼에서 직접 해야 할 일은 코드에 인증 정보를 입력하고 Gitea에 push하는 것이 전부입니다.
MLflow + S3: 결과를 남기는 두 가지 저장소
학습 결과는 성격에 따라 두 곳에 나눠 저장합니다.
| 저장소 | 저장되는 것 | 역할 |
|---|---|---|
| MLflow | 하이퍼파라미터, 메트릭(RMSE 등), 모델 버전 정보 | 실험 기록장 — 어떤 조건으로 학습했고 성능이 어떤지 비교 |
| S3 | 실제 모델 파일 | 파일 보관함 — 모델을 나중에 꺼내 쓸 수 있도록 보존 |
MLflow에서 모델을 등록하면 실제 파일은 S3에 저장되고, MLflow는 그 위치를 기록해둡니다.
전체 흐름¶
flowchart TD
A["시작 전 준비 (공통)\nWorkspace · Project ID 확인 · 액세스 키 발급"]
B["1 단계. 환경 준비\n스토리지 생성 · Code-server 배포 · Gitea 연결"]
C["2 단계. 코드 준비\nDAG 파일 설정 · Gitea에 push"]
D["3 단계. 파이프라인 실행\nAirflow DAG 트리거 · 실행 상태 확인"]
E["4 단계. 결과 확인\nMLflow 실험 결과 · 모델 등록 확인"]
F["5 단계. 모델 배포 & 추론\nEndpoint 생성 · 모델 배포 · 추론 요청"]
A --> B --> C --> D --> E --> F