IT_Study/Ops

[MLOps] Kubeflow 내 Tensorboard 활용 방법 및 MinIO 사용 방법 (webconsole, linux shell, python code 활용)

__Vivacé__ 2023. 11. 3. 16:38

Tensorboard

Model의 학습 결과 또는 pipeline의 결과를 시각화하는 도구

 

Tensorboard에서 사용할 로그를 Object Storage 또는 Persistant Volume을 저장하여 읽어올 수 있음

 

Tensorboard 생성 시 설정 화면

 

Tensorboard 사용 시, Tensorboard의 이름을 정해 주고, log가 저장된 storage를 선택한 다음, 저장된 mount path의 값을 입력해주면 데이터를 읽어와 시각화를 해준다.

 

! 파일 권한 문제 때문에 진행이 안 될 수 있으니, 기본 계정으로 진행하기를 권장


Tensorflow path 설정

진행 상황을 바탕으로 응용해도 된다.

CNN model 학습 과정 일부

 

먼저 위와 같이 temsorflow callback을 정하고, traning을 진행할 시 해당 경로에 history가 저장된다.

 

이후 Tensorboard 탭에서, Tensorboard 생성 시 다음과 같이 설정을 해주면, tensorboard에 대한 정보를 확인할 수 있다.

데이터를 저장한 PV의 뒷 경로를 붙여주면 된다


MinIO

MinIO는 kubeflow 설치 시 함께 deploy되는 object storage로, 사진이나 비디오, 음성파일, 로그파일 등을 저장할 수가 있음

또한 파이프라인 구동 시 데이터 저장이나 model serving 시 model을 저장하는 용도로 쓰임

 

S3 API와 호환되어 데이터 저장 시에 키를 생성한 후 object를 업로드할 수 있음

 

MinIO에 데이터를 저장하기 위해서는 Web console에 접속하는 방법과 client를 이용하는 방법, 그리고 python을 이용하는 방법이 있다.

 

1. Web console 접속 및 파일 업로드

# minIO 서비스를 장착하고 있는 것 확인
$ kubectl get svc -n kubeflow minio-service

# minIO 웹 콘솔로 실행
$ kubectl port-forward --address="0.0.0.0" svc/minio-service -n kubeflow 9000:9000

 

MinIO 초기 화면 / 초기 id는 minio고, 비밀번호는 minio123

 

접속하면, 다음과 같은 화면을 볼 수 있다.

기본적으로 제공되고 있는 mlpipeline이라는 bucker을 볼 수 있다

 

password는 오른쪽 줄 3개를 클릭 후, [Change Password] 를 통해 변경할 수 있다.

 

아래 +버튼을 누르고 [Create bucket] 을 눌러서 "test-webconsole" 이라는 이름의 버킷을 생성하면 다음 화면을 볼 수 있고,

 

이후 파일 업로드 시에는 우하의 upload file을 눌러서 업로드를 진행하면 된다. 업로드 성공시에는 다음 창을 볼 수 있다.

 

이후 오른쪽 점 3개를 눌러, 파일 공유 및 삭제를 진행할 수도 있다.

공유 화면 - expiration date도 정할 수 있다.

 

또한 좌측의 그림을 누르면, 다음 화면을 볼 수도 있다.

우상의 옵션을 통해 삭제 / 다운로드도 가능

 

 

2. Client 설치 후 접속

minIO client는 minIO github에서 받을 수 있다.

 

GitHub - minio/mc: Simple | Fast tool to manage MinIO clusters :cloud:

Simple | Fast tool to manage MinIO clusters :cloud: - GitHub - minio/mc: Simple | Fast tool to manage MinIO clusters :cloud:

github.com

이 링크를 통해 아래를 보면, 다운로드 받는 코드가 나와있다.

Jupyter Notebook에서 진행해보자.

$ wget https://dl.min.io/client/mc/release/linux-amd64/mc
$ chmod +x mc

# 각 명령어 확인 가능
$ ./mc --help

terminal에서 해당 명령어 실행 시 나타나는 화면

 

이제 minIO client를 이용해서 host에 접속해보자

$ mc config host ls

기본적인 host들이 나열되는 것을 확인 가능

 - gcs : google에서 제공하는 storage service

 - local : local에 직접 설정한 minIO service를 의미

 - play : minIO op에서 제공하는 minIO storage service를 의미

 - s3 : AWS에서 제공하는  S3 service를 의미

 

 각 서비스에 접속하기 위해서는, AccessKey와 SecrecKey를 입력해주어야 한다.

 

minIO config로 host 추가하기

호스트 추가를 위해서, minIO의 IP address를 알아야 한다

$ kubectl get svc -n kubeflow minio-service

해당 명령어로 cluster-IP를 확인할 수 있다.

 

k8s에서는 실행중인 서비스에 domain name을 할당해주기 때문에, IP 주소를 활용해 domain name을 확인해보자

$ sudo apt-get install dnsutils
$ nslookup {minio cluster-IP}

해당 명령어 실행 시 domain name 확인 가능

 

이제 mc config를 이용해 host를 추가하면 된다

# 작성 양식 : accessKey는 id, secretKey는 pw를 의미
$ mc config host add kubeflow {minIO domain name}:{port} {accessKey} {secretKey}

# 이후 다음 명령어를 통해 kubeflow가 추가된 걸 확인하면 됨
$ mc config host ls

# 이전에 생성한 bucket을 확인 가능
$ mc ls kubeflow

minIO에 kubeflow가 잘 추가된 모습

 

minIO bucket 생성

# 0. Bucket 생성
$ mc mb kubeflow/test-mc

# 1. Bucket 내로 파일 복사하기 - 새 파일 생성 후 minIO bucket 내로 복제
$ touch file-mc.txt
$ mc cp file-mc.txt kubeflow/test-mc/

# 복사가 잘 되었는 지 확인 - 웹 콘솔에서도 확인 가능
$ mc ls kubeflow/test-mc

#. 2. Bucket 내로 디렉토리 복사하기
$ mkdir dir1
$ touch dir1/file1.txt

# -r 옵션을 줘야 디렉토리 하위까지 복사가 된다.
$ mc cp -r dir1 /kubeflow/test-mc/

 


3. Python으로 접속

다음 과정을 진행하면 된다.

# minIO SDK 설치
!pip install minio
import minio
from minio import Minio

# minIO 객체 생성
minioClient = Minio('minio-service.kubeflow.svc.cluster.local:9000',
                     access_key='minio',
                     secret_key='minio123',
                     secure=False)
                     
# mlpipeline이라는 bucket이 존재하는 지 확인
bucket_name = "mlpipeline"

if minioClient.bucket_exists(bucket_name):
    print(f"{bucket_name} exists")
else:
    print(f"{bucket_name} does not exist")

노트북 출력 내용

 

이번엔 Class 생성 후 Bucket을 만들고, 파일을 업로드하고, 디렉토리를 업로드하는 코드를 만들어본다

# MinIO 객체 생성 코드
class MinioClient():
    def __init__(self):
        self.client = Minio(
            "minio-service.kubeflow:9000",
            access_key="minio",
            secret_key="minio123",
            secure=False
        )
	
    # Bucket이 존재하는 지 확인 후, 존재하지 않으면 Bucket을 만듦
    def create_bucket(self,bucket_name):
        if self.client.bucket_exists(bucket_name):
            print(f"{bucket_name} exists")
        else:
            self.client.make_bucket(bucket_name)        
            print(f"{bucket_name} created")

    # fput_object 함수를 활용해 업로드
    def upload_file(self, bucket, minio_path, local_path):
        self.client.fput_object(bucket, minio_path, local_path)

    # 디렉토리 업로드 방법
    # Object를 반복적으로 Upload하는 방식을 취하고 있다.
    # os.path로 디렉토리 내용 확인 후, 파일이면 업로드하고 디렉토리면 재귀함수 호출하는 방식
    def upload_directory(self, bucket, minio_path, local_path):
        if os.path.isdir(local_path):
            items = os.listdir(local_path)
            items.sort()
            for item in items:
                item_local_path = os.path.join(local_path, item)
                item_minio_path = os.path.join(minio_path, item)
                if os.path.isfile(item_local_path):
                    self.upload_file(bucket, item_minio_path, item_local_path)
                elif os.path.isdir(item_local_path):
                    self.upload_directory(bucket, item_minio_path, item_local_path)
# 객체 생성
mc_sdk = MinioClient()

# Bucket 생성
mc_sdk.create_bucket("test-sdk")

# 파일 및 디렉토리 업로드
mc_sdk.upload_file("test-sdk", "file-mc.txt", "file-mc.txt")

코드 실행 후 웹콘솔에서 결과를 확인할 수 있다.