Metaflow는 ML 워크플로를 생성하고 실행하기 위해 Netflix에서 만든 프레임워크입니다.
이 통합 기능을 사용하면 Metaflow steps 및 flows에 데코레이터를 적용하여 매개변수와 아티팩트를 W&B에 자동으로 로깅할 수 있습니다.
- step에 데코레이터를 적용하면 해당 step 내 특정 유형에 대한 로깅을 켜거나 끌 수 있습니다.
- flow에 데코레이터를 적용하면 flow의 모든 step에 대한 로깅을 켜거나 끌 수 있습니다.
API key는 사용 중인 머신을 W&B에 인증하는 데 사용됩니다. 사용자 프로필에서 API key를 생성할 수 있습니다.
보다 간편하게 설정하려면 User Settings로 바로 이동해 API key를 생성하세요. 새로 생성된 API key는 즉시 복사하여 비밀번호 관리자와 같은 안전한 위치에 저장하세요.
- 오른쪽 상단에서 사용자 프로필 아이콘을 클릭합니다.
- User Settings를 선택한 다음, 아래로 스크롤하여 API Keys 섹션으로 이동합니다.
로컬 환경에 wandb 라이브러리를 설치하고 로그인하려면 다음 단계를 따르세요.
wandb 버전 0.19.8 이하를 사용하는 경우, plum-dispatch 대신 fastcore 1.8.0 이하 버전(fastcore<1.8.0)을 설치하세요.
-
WANDB_API_KEY 환경 변수를 API key 값으로 설정합니다.
export WANDB_API_KEY=<your_api_key>
-
wandb 라이브러리를 설치하고 로그인합니다.
pip install -Uqqq metaflow "plum-dispatch<3.0.0" wandb
wandb login
pip install -Uqqq metaflow "plum-dispatch<3.0.0" wandb
import wandb
wandb.login()
!pip install -Uqqq metaflow "plum-dispatch<3.0.0" wandb
import wandb
wandb.login()
스텝에 데코레이터를 적용하면 해당 스텝 내에서 특정 타입에 대한 로깅을 켜거나 끌 수 있습니다.이 예제에서는 start 안의 모든 데이터셋과 모델이 로깅됩니다.from wandb.integration.metaflow import wandb_log
class WandbExampleFlow(FlowSpec):
@wandb_log(datasets=True, models=True, settings=wandb.Settings(...))
@step
def start(self):
self.raw_df = pd.read_csv(...). # pd.DataFrame -> 데이터셋으로 업로드
self.model_file = torch.load(...) # nn.Module -> 모델로 업로드
self.next(self.transform)
플로우에 데코레이터를 적용하는 것은, 구성하는 모든 스텝에 기본값을 설정하는 것과 같습니다.이 경우, WandbExampleFlow의 모든 스텝은 기본적으로 데이터셋과 모델을 로깅하며, 이는 각 스텝에 @wandb_log(datasets=True, models=True)를 적용하는 것과 동일합니다.from wandb.integration.metaflow import wandb_log
@wandb_log(datasets=True, models=True) # 모든 @step에 데코레이터 적용
class WandbExampleFlow(FlowSpec):
@step
def start(self):
self.raw_df = pd.read_csv(...). # pd.DataFrame -> 데이터셋으로 업로드
self.model_file = torch.load(...) # nn.Module -> 모델로 업로드
self.next(self.transform)
플로우에 데코레이터를 적용하는 것은 기본값으로 모든 스텝에 데코레이터를 적용하는 것과 같습니다. 따라서 이후에 특정 스텝에 다른 @wandb_log를 적용하면, 플로우 단위 데코레이션보다 그 스텝의 설정이 우선합니다.이 예제에서:
start와 mid는 데이터셋과 모델을 모두 로깅합니다.
end는 데이터셋과 모델을 모두 로깅하지 않습니다.
from wandb.integration.metaflow import wandb_log
@wandb_log(datasets=True, models=True) # start와 mid를 데코레이팅하는 것과 동일
class WandbExampleFlow(FlowSpec):
# 이 스텝은 데이터셋과 모델을 로깅합니다.
@step
def start(self):
self.raw_df = pd.read_csv(...). # pd.DataFrame -> 데이터셋으로 업로드
self.model_file = torch.load(...) # nn.Module -> 모델로 업로드
self.next(self.mid)
# 이 스텝 역시 데이터셋과 모델을 로깅합니다.
@step
def mid(self):
self.raw_df = pd.read_csv(...). # pd.DataFrame -> 데이터셋으로 업로드
self.model_file = torch.load(...) # nn.Module -> 모델로 업로드
self.next(self.end)
# 이 스텝은 설정이 덮어써져 데이터셋과 모델을 로깅하지 않습니다.
@wandb_log(datasets=False, models=False)
@step
def end(self):
self.raw_df = pd.read_csv(...).
self.model_file = torch.load(...)
수집된 정보에 액세스하는 방법은 세 가지입니다. 로깅 중인 원본 Python 프로세스 안에서 wandb 클라이언트 라이브러리를 사용하거나, 웹 앱 UI를 사용하거나, 프로그래밍 방식으로 Public API를 사용할 수 있습니다. Parameter는 W&B의 config에 저장되며 Overview 탭에서 확인할 수 있습니다. datasets, models, others는 W&B 아티팩트에 저장되며 Artifacts 탭에서 확인할 수 있습니다. 기본 Python 타입은 W&B의 summary dict에 저장되며 Overview 탭에서 확인할 수 있습니다. API를 사용해 원본 프로세스 외부에서 이 정보를 프로그래밍 방식으로 가져오는 방법에 대해서는 Public API 가이드를 참고하세요.
| 데이터 | 클라이언트 라이브러리 | UI |
|---|
Parameter(...) | wandb.Run.config | Overview 탭, Config |
datasets, models, others | wandb.Run.use_artifact("{var_name}:latest") | Artifacts 탭 |
기본 Python 타입 (dict, list, str 등) | wandb.Run.summary | Overview 탭, Summary |
| kwarg | Options |
|---|
datasets | True: 데이터셋인 인스턴스 변수를 로그합니다False
|
models | True: 모델인 인스턴스 변수를 로그합니다False
|
others | True: pickle로 직렬화할 수 있는 기타 모든 항목을 로그합니다False
|
settings | wandb.Settings(…): 이 step 또는 flow에 사용할 사용자 정의 wandb 설정을 지정합니다None: wandb.Settings()를 전달하는 것과 동일합니다
기본적으로, 다음과 같은 경우: settings.run_group이 None이면 {flow_name}/{run_id}로 설정됩니다settings.run_job_type이 None이면 {run_job_type}/{step_name}로 설정됩니다
|
정확히 무엇을 기록하나요? 인스턴스 변수와 로컬 변수를 모두 기록하나요?
wandb_log는 인스턴스 변수만 기록합니다. 로컬 변수는 절대 기록되지 않습니다. 이는 불필요한 데이터가 기록되는 것을 방지하는 데 유용합니다.
현재 다음 타입을 지원합니다:
| Logging 설정 | 타입 |
|---|
| default (always on) | dict, list, set, str, int, float, bool
|
datasets | |
models | nn.Modulesklearn.base.BaseEstimator
|
others | |
| 변수 종류 | 동작 방식 | 예시 | 데이터 타입 |
|---|
| 인스턴스 변수 | 자동으로 로깅됨 | self.accuracy | float |
| 인스턴스 변수 | datasets=True일 때 로깅됨 | self.df | pd.DataFrame |
| 인스턴스 변수 | datasets=False일 때는 로깅되지 않음 | self.df | pd.DataFrame |
| 지역 변수 | 로깅되지 않음 | accuracy | float |
| 지역 변수 | 로깅되지 않음 | df | pd.DataFrame |
아티팩트 계보(artifact lineage)가 추적되나요?
네. 스텝 A의 출력이자 스텝 B의 입력인 아티팩트가 있는 경우, 계보 DAG가 자동으로 생성됩니다.
이 동작의 예는 이 노트북과 이에 대응하는 W&B 아티팩트 페이지를 참고하세요.