본문으로 건너뛰기

Kubeflow를 이용한 Jupyter Notebook 환경 구성

카카오클라우드 쿠버네티스 환경에서 Kubeflow 서비스를 사용하여 Jupyter Notebook을 구성하는 과정을 설명합니다.

기본 정보

시나리오 소개

카카오클라우드 Kubernetes Engine 서비스와 Kubeflow 서비스를 활용하면 효율적인 MLOps 환경을 구축할 수 있습니다. 이 시나리오에서는 카카오클라우드 콘솔에서 Kubeflow를 생성하고, 대시보드에 접속한 뒤, Jupyter Notebook 인스턴스를 생성하여 데이터 분석과 모델 학습을 수행하는 과정을 단계별로 안내합니다.

주요 내용은 아래와 같습니다.

  • 쿠버네티스 클러스터 및 File Storage 환경 설정
  • 데이터 분석과 모델 학습을 위한 Jupyter Notebook 생성

시작하기 전에

Kubeflow 환경을 구축하기 위한 사전 작업으로 쿠버네티스 클러스터와 파일 스토리지를 생성하고 설정합니다.

1. 쿠버네티스 클러스터 생성

Kubeflow 환경을 위한 기본적인 쿠버네티스 클러스터를 구성합니다. 이 클러스터는 Kubeflow의 다양한 컴포넌트들이 배포될 기반입니다.

  1. 카카오클라우드 콘솔 > Container Pack > Kubernetes Engine 메뉴에서 [클러스터 생성]을 클릭합니다. 이 문서에서 사용하는 클러스터 설정을 참고하여 클러스터를 생성합니다.

    클러스터 설정
    항목내용
    클러스터 이름kc-handson
    kubernetes 버전1.28
    클러스터 네트워크 설정  생성된 VPC와 서브넷 항목에서 외부 통신이 가능한 IP 대역의 네트워크 선택
    안내

    클러스터의 네트워크가 프라이빗 서브넷일 경우, 프라이빗 서브넷의 노드는 인터넷 통신이 불가합니다. 프라이빗 서브넷의 노드가 인터넷을 통해 외부 CR과 통신하기 위해서는 NAT 통신이 필요합니다.
    NAT 통신은 NAT Instance를 사용할 수 있으며, 자세한 내용은 NAT 인스턴스 사용을 참고하시기 바랍니다.

    노드 풀 설정
    이름개수노드 풀 사양 정보
    pool-ingress 1- 노드 풀 유형 : Virtual Machine
    - 인스턴스 유형 : m2a.large
    - 볼륨 유형/크기 : 50GB
    - 노드 수 : 1대
    - 오토 스케일 설정 : 미사용
    pool-worker6  - 노드 풀 유형 : Virtual Machine
    - 인스턴스 유형 : m2a.xlarge
    - 볼륨 유형/크기 : 100GB
    - 노드 수 : 6대
    - 오토 스케일 설정 : 사용 안 함
    pool-gpu1- 노드 풀 유형 : GPU
    - 인스턴스 유형 : p2i.6xlarge
    - 볼륨 유형/크기 : 100GB
    - 오토 스케일 설정 : 미사용
  2. 생성된 노드 풀의 상태가 Running으로 변경된 것을 확인합니다.

  3. kubectl 제어 설정에 따라, 클러스터의 kubectl 파일을 설정합니다.

2. 파일 스토리지 생성

Kubeflow의 데이터 저장 및 관리를 위해 필요한 파일 스토리지를 생성합니다. 이 스토리지는 노트북 인스턴스의 영구 볼륨(Persistent Volume)으로 사용되어, 데이터와 모델을 안전하게 보관할 수 있습니다. Kubeflow 구성 시 사용할 파일 스토리지 인스턴스는 선택한 클러스터와 동일한 네트워크 및 서브넷으로 설정합니다.

  1. 카카오클라우드 콘솔 > Beyond Storage Service > File Storage 메뉴에서 [인스턴스 생성]를 클릭합니다. 아래 표의 파일 스토리지 인스턴스 구성을 참고하여 인스턴스를 생성합니다.
항목설명
인스턴스kc-handson-fs
볼륨 크기 설정1TB
네트워크 설정사용할 쿠버네티스 클러스터와 동일
서브넷 설정사용할 쿠버네티스 클러스터와 동일
접근 제어 설정설정된 네트워크 내 모든 프라이빗 IP에서의 접근을 허용
마운트 정보 설정 handson
  1. 생성한 인스턴스 상태가 Active로 변경된 것을 확인합니다.

시작하기

본격적인 Jupyter 노트북 환경을 구성하는 작업은 다음과 같습니다.

Step 1. Kubeflow 만들기

준비된 쿠버네티스 클러스터 위에 Kubeflow를 구성하고 배포합니다. 이 과정에서는 Kubeflow의 다양한 기능을 활용할 수 있도록 기본 설정을 진행합니다.

  1. 카카오클라우드 콘솔 AI Service > Kubeflow 메뉴에서 [Kubeflow 만들기]를 클릭합니다. 아래 표의 설정값을 참고하여 Kubeflow를 생성합니다.

    Kubeflow 정보
    항목내용
    Kubeflow 이름kc-handson
    Kubeflow 버전1.8
    Kubeflow 서비스 유형 Essential+HPT+ServingAPI

    클러스터 정보
    항목내용
    클러스터 연결kc-handson
    Ingress 노드 풀pool-ingress
    Worker 노드 풀pool-worker
    CPU 노드 풀pool-worker
    GPU 노드 풀pool-gpu
    GPU MIG1g.10gb - 7개
    디폴트 파일 스토리지kc-handson-fs

    사용자 및 워크로드의 인증 정보 입력
    분류항목내용
    Object Storage 설정Object Storage 유형Object Storage 또는 MinIO
    Kubeflow 소유자 설정소유자 이메일 계정${ADMIN_EMAIL} (example@kakaocloud.com)
    네임스페이스 이름kubeflow-tutorial
    네임스페이스 파일 스토리지kc-handson-fs
    DB 설정DB 유형Kubeflow Internal DB
    포트3306
    비밀번호${DB_PASSWORD}
    비밀번호 확인${DB_PASSWORD}
    도메인 연결 (선택)유효한 형식의 도메인 입력
  2. 생성한 Kubeflow 상태가 Active로 변경된 것을 확인합니다.

Step 2. Dashboard 접속하기

배포된 Kubeflow 환경에 접속하기 위하여 대시보드에 접속합니다. 사용자는 대시보드를 통해 Kubeflow의 다양한 리소스를 관리하고, Jupyter Notebook 환경을 구성할 수 있습니다.

Kubeflow 대시보드에 접속하는 방법은 크게 두 가지입니다. 로드 밸런서 퍼블릭 IP를 이용하는 방법과 kubectl 포트 포워딩을 이용하는 방법입니다.

  1. 카카오클라우드 콘솔에서 Load Balancing > Load Balancer 메뉴를 선택합니다.
  2. Kubeflow의 Ingress를 위해 생성된 kube_service_{프로젝트 ID}_{IKE 클러스터명}_ingress-nginx_ingress-nginx-controller 이름의 로드 밸런서를 찾아 퍼블릭 IP를 확인합니다. 퍼블릭 IP가 없는 경우, 더 보기 메뉴에서 퍼블릭 IP를 새로 할당합니다.

퍼블릭 IP 할당

  1. 브라우저에서 로드 밸런서에 할당된 퍼블릭 IP 80포트로 접속합니다.

    open http://{LB_PUBLIC_IP}
  1. 대시보드에 접속한 후에는 Kubeflow 생성 단계에서 입력한 소유자 이메일 계정과 소유자 이메일로 전송된 초기 패스워드를 사용하여 로그인합니다.

Step 3. Jupyter Notebook 생성하기

대시보드를 통해 사용자는 Jupyter Notebook 인스턴스를 생성할 수 있습니다. 이 단계에서는 노트북의 스펙을 선택하고, 필요한 설정을 진행합니다.

  1. Kubeflow 대시보드의 좌측 탭에서 Notebooks를 클릭합니다.

    주피터 노트북 생성

  2. Notebooks 페이지로 이동하여, 우측 상단에 위치한 [+ New Notebook] 버튼을 클릭합니다. 아래 정보를 참고하여 확인하여 새로운 노트북을 생성합니다.

  1. GPU 이미지 기반의 노트북을 생성하기 위해 참고할 정보는 다음과 같습니다.

    항목구분설명
    NameNameKubeflow 대시보드에서 노트북 인스턴스 식별에 사용
    Namespace노트북 인스턴스를 생성할 Kubernetes 네임스페이스
    Docker ImageImageDocker 이미지 지정
    CPU / RAMMinimum CPUCPU 코어의 수이며, 노트북 인스턴스가 사용할 CPU 리소스의 양 지정
    Minimum Memory Gi메모리 리소스의 단위(GiB)이며 노트북 인스턴스가 사용할 메모리 리소스의 양 지정
    GPUsNumber of GPUs노트북 인스턴스에서 사용할 GPU 자원
    GPU Vendor고유한 GPU 드라이버 및 소프트웨어 툴킷 선택
    Affinity / TolerationsAffinity Config노트북이 생성될 GPU 노드 풀 선택
    - 노트북 인스턴스 실행할 노드 지정
    Tolerations Group특정 노드의 테인트(taint) 허용 설정
  2. 생성할 노트북의 정보를 입력합니다. 아래 표를 참고하여 예제로 입력할 값을 작성합니다.

    항목내용
    이름 (Name)handson
    이미지 (Image)kc-kubeflow/jupyter-pyspark-pytorch-cuda:v1.8.0.py311.1a
    요청 CPUs (Minimum CPU)2
    요청 메모리 (Minimum Memory Gi)12
    GPU 개수 (Number of GPUs)4
    공급 GPU (GPU Vendor)NVIDIA MIG - 1g.10gb
    Affinity Configpool-gpu
  1. [LAUNCH] 버튼을 클릭하여 노트북을 생성합니다.

Step 4. Jupyter Notebook 접속하기

생성된 Jupyter Notebook 인스턴스에 접속하여, 실제 머신러닝 프로젝트를 진행할 수 있습니다.

  1. 생성된 노트북 인스턴스에 대한 [CONNECT] 버튼을 클릭하여 접속합니다.

    Connect 버튼 클릭

  2. Notebook에서 Python3 커널을 선택합니다.

    Python3 버튼 클릭

  3. 아래와 같은 예제 코드를 입력합니다. 코드 입력 후 출력되는 메시지를 확인하면 실행 결과를 확인할 수 있습니다.

    import torch

    def check_gpu_available():
    if torch.cuda.is_available():
    print("현재 시스템에서 GPU를 사용할 수 있습니다.")
    else:
    print("현재 시스템에서 GPU를 사용할 수 없습니다.")

    check_gpu_available()
    기본 정보

    본 튜토리얼과 달리 단일 GPU Instance를 사용하는 경우, 환경변수 CUDA_VISIBLE_DEVICES를 0으로 설정해 주셔야 합니다.

    import torch
    import os

    def set_cuda_devices():
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"

    def check_gpu_available():
    if torch.cuda.is_available():
    print("현재 시스템에서 GPU를 사용할 수 있습니다.")
    else:
    print("현재 시스템에서 GPU를 사용할 수 없습니다.")

    set_cuda_devices()
    check_gpu_available()
  4. GPU 사용 노트북의 경우, Notebook에서 Terminal로 접속하여 nvidia-smi 명령어를 통해 nvidia 장치를 확인합니다.

    nvidia 장치 확인