lakeFS와 Kubeflow 파이프라인 함께 사용하기
Kubeflow는 Kubernetes 위에서 ML 워크플로의 배포를 단순하고, 이식 가능하고, 확장 가능하게 만드는 데 전념하는 프로젝트예요. Kubeflow 파이프라인은 단계(steps)로 구성된 ML 워크플로의 이식 가능하고 확장 가능한 정의예요. 파이프라인의 각 단계는 ContainerOp의 인스턴스로 표현되는 컴포넌트의 인스턴스예요.
출처: 문서
본문
lakeFS 작업을 위한 파이프라인 단계 추가하기
lakeFS를 Kubeflow 파이프라인에 통합하려면 lakeFS 작업을 수행하는 Kubeflow 컴포넌트를 만들어야 해요. 현재 lakeFS ContainerOps를 만드는 방법은 두 가지예요:
-
lakeFS Python API를 사용해 lakeFS 작업을 호출하는 함수 기반 ContainerOp를 구현해요.
-
lakectlCLI docker 이미지를 사용해 lakeFS 작업을 호출하는 ContainerOp를 구현해요.
함수 기반 ContainerOps
lakeFS 작업을 호출하는 함수 기반 컴포넌트를 구현하려면 lakeFS가 제공하는 Python OpenAPI 클라이언트를 사용해야 해요. 클라이언트 패키지를 ContainerOp에서 사용할 수 있게 만드는 방법을 보여 주는 아래 예시를 참고하세요.
예시 작업
새 브랜치 만들기: example-repo의 main 브랜치를 기반으로 example-branch라는 브랜치를 만드는 함수 기반 ContainerOp예요.
from kfp import components
def create_branch(repo_name, branch_name, source_branch):
import lakefs
from lakefs.client import Client
client = Client(
host="https://lakefs.example.com",
username="«redacted:AKIA…»",
password="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
)
lakefs.repository(repo_name, client=client).branch(branch_name).create(source_reference=source_branch)
# Convert the function to a lakeFS pipeline step.
create_branch_op = components.func_to_container_op(
func=create_branch,
packages_to_install=['lakefs'])
lakeFS OpenAPI가 지원하는 어떤 lakeFS 작업이든 호출할 수 있어요. 예컨대 커밋과 머지를 수행하는 함수 기반 ContainerOps를 구현할 수도 있죠. Python 문서와 전체 API 레퍼런스를 참고하세요.
함수 기반이 아닌 ContainerOps
함수 기반이 아닌 ContainerOp를 구현하려면 treeverse/lakectl docker 이미지를 사용해야 해요. 이 이미지로 lakectl 명령을 실행해 원하는 lakeFS 작업을 수행할 수 있어요.
lakectl이 Kubeflow에서 동작하려면 다음 이름의 환경 변수로 lakeFS 설정을 넘겨야 해요:
-
LAKECTL_CREDENTIALS_ACCESS_KEY_ID: «redacted:AKIA…» -
LAKECTL_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -
LAKECTL_SERVER_ENDPOINT_URL: https://lakefs.example.com
예시 작업
- 브랜치에 변경 커밋:
example-repo의example-branch에 커밋되지 않은 변경을 커밋하는 ContainerOp예요.
from kubernetes.client.models import V1EnvVar
def commit_op():
return dsl.ContainerOp(
name='commit',
image='treeverse/lakectl',
arguments=['commit', 'lakefs://example-repo/example-branch', '-m', 'commit message']).add_env_variable(V1EnvVar(name='LAKECTL_CREDENTIALS_ACCESS_KEY_ID',value='«redacted:AKIA…»')).add_env_variable(V1EnvVar(name='LAKECTL_CREDENTIALS_SECRET_ACCESS_KEY',value='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY')).add_env_variable(V1EnvVar(name='LAKECTL_SERVER_ENDPOINT_URL',value='https://lakefs.example.com'))
- 두 lakeFS 브랜치 머지:
example-branch를example-repo의main브랜치로 머지하는 ContainerOp예요.
def merge_op():
return dsl.ContainerOp(
name='merge',
image='treeverse/lakectl',
arguments=['merge', 'lakefs://example-repo/example-branch', 'lakefs://example-repo/main']).add_env_variable(V1EnvVar(name='LAKECTL_CREDENTIALS_ACCESS_KEY_ID',value='«redacted:AKIA…»')).add_env_variable(V1EnvVar(name='LAKECTL_CREDENTIALS_SECRET_ACCESS_KEY',value='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY')).add_env_variable(V1EnvVar(name='LAKECTL_SERVER_ENDPOINT_URL',value='https://lakefs.example.com'))
ContainerOp로 구현하면 lakectl이 지원하는 어떤 lakeFS 작업이든 호출할 수 있어요. 지원되는 작업 목록은 전체 CLI 레퍼런스를 참고하세요.
참고
lakectl을 사용하는 lakeFS Kubeflow 연동은 lakeFS 버전 >= v0.43.0에서 지원돼요.
lakeFS 단계를 파이프라인에 추가하기
이전 단계에서 만든 단계들을, 컴파일하기 전에 파이프라인에 추가해요.
예시 파이프라인
브랜치 생성과 커밋 단계를 가진 간단한 ETL을 구현하는 파이프라인이에요.
def lakectl_pipeline():
create_branch_task = create_branch_op('example-repo', 'example-branch', 'main') # A function-based component
extract_task = example_extract_op()
commit_task = commit_op()
transform_task = example_transform_op()
commit_task = commit_op()
load_task = example_load_op()
정보
자격 증명은 Kubernetes secrets으로 저장하고, V1EnvVarSource를 사용해 환경 변수로 Kubeflow 작업에 전달하는 게 권돼요.
더 알아보기 (Learn more)
공식 문서: lakeFS Kubeflow 연동