본문 바로가기
WIKI 기술 지식 베이스

lakeFS와 Kubeflow 파이프라인 함께 사용하기

원문 보기 위키 갱신

Kubeflow는 Kubernetes 위에서 ML 워크플로의 배포를 단순하고, 이식 가능하고, 확장 가능하게 만드는 데 전념하는 프로젝트예요. Kubeflow 파이프라인은 단계(steps)로 구성된 ML 워크플로의 이식 가능하고 확장 가능한 정의예요. 파이프라인의 각 단계는 ContainerOp의 인스턴스로 표현되는 컴포넌트의 인스턴스예요.

출처: 문서

본문

lakeFS 작업을 위한 파이프라인 단계 추가하기

lakeFS를 Kubeflow 파이프라인에 통합하려면 lakeFS 작업을 수행하는 Kubeflow 컴포넌트를 만들어야 해요. 현재 lakeFS ContainerOps를 만드는 방법은 두 가지예요:

  • lakeFS Python API를 사용해 lakeFS 작업을 호출하는 함수 기반 ContainerOp를 구현해요.

  • lakectl CLI 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 연동