ML Lineage: ML 데이터 흐름 추적¶
참고
ML Lineage는 snowflake-ml-python 패키지 버전 1.6.0 이상에서 사용 가능합니다.
ML Lineage는 머신 러닝 파이프라인을 통해 흐르는 데이터에 대한 포괄적인 추적을 제공합니다. 이 기능을 사용하면 원본 테이블/뷰/스테이지, 특성 뷰, 데이터 세트, 등록된 모델, 배포된 모델 서비스 등 다양한 데이터 아티팩트 간의 계보를 추적할 수 있습니다. 또한 ML Lineage는 복제본 아티팩트와 유사한 유형의 아티팩트 간의 관계를 캡처하여 데이터 파이프라인 내에서 데이터 변환 및 종속성에 대한 완벽한 뷰를 보장합니다. 가능한 파이프라인은 아래와 같습니다.
 
파이프라인의 노드 유형 간에 추적할 수 있는 계보 관계는 아래 표에 요약되어 있습니다. 각 행은 종속성의 원본을 나타내고 각 열은 대상을 나타냅니다. 행 또는 열의 교차점에는 해당 관계가 ML Lineage에 의해 캡처되었는지 여부를 나타내는 아이콘이 있습니다.
| 테이블/뷰/스테이지 | 특성 뷰 | Datasets | 모델 | 배포된 모델 서비스 | |
|---|---|---|---|---|---|
| 테이블/뷰/스테이지 | ✔ | ✔ | ✔ | ✔ | - | 
| 특성 뷰 | ✔ (테이블에만 해당) | ✔ | ✔ | - | - | 
| Datasets | ✔ | - | ✔ | ✔ | - | 
| 모델 | ❌ | - | - | ✔ | ✔ | 
| 배포된 모델 서비스 | ❌ | - | - | - | - | 
- ✔: 이 관계는 ML Lineage에서 캡처한 것입니다. 
- ❌: 이 관계는 아직 ML Lineage에 포착되지 않았지만 로드맵에 포함되어 있습니다. 
- -: 이 오브젝트 조합은 관계를 나타내지 않습니다. 
ML Lineage를 사용하면 머신 러닝 아티팩트가 서로 어떻게 연관되어 있는지 이해하고 다음과 같은 질문에 답할 수 있습니다.
- 모델 학습을 위한 데이터의 출처는 어디인가요? 
- 내 데이터 세트는 어떤 특성 뷰에 종속되어 있나요? 
- 내 데이터 세트의 데이터로 어떤 모델이 학습되었나요? 
- 어떤 서비스가 내 모델을 사용하나요? 
빠른 시작 노트북 에서 ML Lineage API 사용 방법을 확인하십시오. Feature Store와 Model Registry를 포함한 ML Lineage를 전체 ML 워크플로에 통합한 보다 완벽한 엔드 투 엔드 ML 빠른 시작 을 후속으로 제공합니다.
제한 사항¶
- 모델 예측에서 생성된 테이블 및 뷰는 현재 모델에 대한 계보 관계를 다시 캡처하지 않습니다. 
- 현재 계보 정보는 복제되지 않습니다. 
Snowflake는 향후 릴리스(ML Lineage)에서 이러한 제한 사항을 해결하고자 합니다.
필수 권한¶
사용자는 Python API에서 계보를 탐색하려면 VIEW LINEAGE 권한이 필요합니다. 이 권한은 ACCOUNTADMIN 역할에 자동으로 부여되며, 이 역할은 계정 수준에서 다른 역할에 권한을 부여할 수 있습니다. 예:
USE ROLE ACCOUNTADMIN;
GRANT VIEW LINEAGE ON ACCOUNT TO ROLE test_role;
ML Lineage 만들기¶
일반적으로 Snowflake는 오브젝트가 생성될 때 계보 정보를 기록합니다. 모델에 대한 계보는 모델이 Model Registry에 로그될 때 캡처됩니다. Snowpark ML 을 사용하여 모델을 학습하면 모델이 Snowpark DataFrame 에서 학습된 경우 계보 기록이 자동으로 생성됩니다.
아래 목록과 같은 다른 시나리오에서도 약간의 추가 노력으로 계보 기록을 생성할 수 있습니다.
- Snowpark MLfrom 나 다른 종류의 데이터 원본(예: pandas DataFrame)을 사용하여 모델을 학습시키기. 
- Snowpark ML 또는 Snowpark DataFrame 을 사용하지 않고 모델 학습시키기. 
- Snowflake 외부에서 모델 학습시키기. 
이러한 시나리오에서도 아래와 같이 원본 데이터 오브젝트를 sample_data 로 뒷받침하는 Snowpark DataFrame 을 Model Registry의 log_model 메서드에 전달하여 원본 데이터 오브젝트와 학습된 모델을 연결할 수 있습니다.
registry.log_model(...,
          sample_input_data=df_backed_by_source_table)
참고
계정에서 ML Lineage 기능을 활성화한 후에 생성된 오브젝트에만 계보 정보가 포함됩니다.
ML Lineage 쿼리하기¶
ML 아티팩트의 계보를 여러 가지 방법으로 쿼리할 수 있습니다.
Snowsight UI¶
모든 아티팩트의 랜딩 페이지에는 Lineage 탭이 있습니다. 기본 뷰는 선택한 오브젝트에서 한 단계 떨어진 업스트림 및 다운스트림 오브젝트를 표시합니다. Snowsight UI 내의 계보에 대한 자세한 내용은 데이터 계보 섹션을 참조하십시오.
계보 데이터의 Snowsight 뷰 샘플은 아래와 같습니다.
 
Snowpark ML 라이브러리¶
Snowpark ML 라이브러리(snowflake-ml-python 패키지)는 모든 Snowflake ML 아티팩트 오브젝트에 대해 사용자 친화적인 API 를 제공하여 업스트림 및 다운스트림 방향 모두에서 계보를 탐색할 수 있습니다. 연결된 아티팩트 오브젝트를 반환하며 API 호출을 연결하여 원하는 방향으로 더 탐색할 수 있습니다. 이 API 는 Snowflake ML Python 오브젝트와 직접 작동합니다. 자세한 내용은 Snowpark ML lineage API 섹션을 참조하십시오.
Snowpark Python 라이브러리¶
Snowpark 라이브러리는 유연한 API 를 제공하여 원하는 방향으로 데이터를 탐색하고 지원되는 Snowflake 아티팩트의 ML 계보를 더 깊이 있게 살펴볼 수 있습니다. 도메인 및 정규화된 이름을 허용하여 연결된 아티팩트에 대한 세부 정보가 포함된 DataFrame 을 반환합니다. 자세한 내용은 Snowpark Python API Reference의 snowflake.snowpark.lineage.Lineage.trace 를 참조하십시오.
Snowflake SQL¶
SQL 함수 SNOWFLAKE.CORE.GET_LINEAGE 를 사용하면 Snowpark 라이브러리와 유사한 계보 정보를 쿼리할 수 있습니다. 자세한 내용은 GET_LINEAGE (SNOWFLAKE.CORE) 섹션을 참조하십시오.
Snowpark ML lineage API¶
FeatureView, ModelVersion 및 Dataset 오브젝트에서 사용 가능한 lineage 메서드는 현재 오브젝트의 계보 관계를 검색하므로 Snowflake Feature Store 또는 Model Registry에서 검색된 데이터 오브젝트의 계보를 추적할 수 있습니다.
지원되는 모든 오브젝트에 대해 lineage 메서드는 다음 인자를 사용할 수 있습니다.
- direction으로,- UPSTREAM또는- DOWNSTREAM입니다.- DOWNSTREAM이 기본값입니다.
- domain_filter는 계보를 검색할 대상 오브젝트 유형의 목록입니다. 기본값은 모든 계보 관계를 반환하는 것입니다. 사용 가능한 도메인은- "feature_view",- "dataset",- "model",- "table",- "view"입니다.
이 메서드는 연결된 계보 노드 목록을 반환합니다. 이러한 클래스를 Python 세션으로 가져온 경우 이러한 노드는 Dataset, FeatureView 또는 ModelVersion 의 인스턴스일 수 있습니다. 그렇지 않으면 각 노드는 일반 LineageNode 인스턴스로 표시됩니다.
예¶
다음 예는 Snowpark ML lineage API 를 사용하여 일반적인 질문에 답하는 방법을 보여줍니다.
- 모델 버전이 주어졌을 때, 그 학습 데이터의 출처는 어디일까요? - model_version.lineage(direction="upstream") 
- 특정 데이터 세트는 어떤 특성 뷰에 종속되어 있나요? - my_dataset.lineage(direction="upstream", domain_filter=["feature_view"]) 
- 주어진 데이터 세트의 데이터에 대해 어떤 모델이 학습되었나요? - my_dataset.lineage(direction="downstream", domain_filter=["model"]) 
더 자세한 예시는 다음 리소스 섹션을 참조하십시오.