MinIO에 트리 구조의 디렉터리, 파일 업로드 하기

2022. 9. 20. 20:15[개발] 지식/Kubeflow

Kubeflow Jupyter 노트북에서 Kubeflow Pipeline SDK를 활용해 코드를 작성하다 보면, 모델을 MinIO로 업로드 할 필요가 생긴다. 물론 pipeline에서 제공해주는 OutputPath를 사용하면 지정된 경로에 임시로 파일을 쓰고 읽으면서 파라미터 전달을 해주지만, MinIO에 바이너리가 아닌 모델 파일 자체를 업로드 할 필요가 있었다.

일단 MinIO 문서를 보면 파일을 업로드 할 수 있는 API는 put_objectfput_object를 제공한다.

  • put_object : object를 MinIO로 업로드
  • fput_object : file을 MinIO로 업로드

모델 학습은 텐서플로우(Tensorflow) 예제로 테스트를 하고 있는데, 예제에서 생성되는 모델은 단일 파일이 아니라 트리 구조의 디렉터리와 파일 구조이다. 또한 모델 파일 생성 자체를 텐서플로우 자체에서 알아서 해주기 때문에, 일단 파일을 생성하고 fput_object를 사용해 MinIO에 업로드해야 했다. 하지만 fput_object 는 단일 파일만 업로드 할 수 있다는 문제가 있었다.

그래서 아래와 같이 재귀 호출을 통해 파일을 업로드 하는 함수를 작성하고 호출했다. 아래 소스의 출처인 스택오버플로우 게시물은 레퍼런스에 적어두었다.

How to upload a directory to Minio using Python

import os
import glob
from datetime import datetime

def upload_local_directory_to_minio(local_path, bucket_name, minio_path):

        # local_path가 디렉터리가 아니면 에러
    assert os.path.isdir(local_path)

        # glob은 경로 문자열에 해당하는 모든 파일과 디렉터리를 list로 가져온다
    for local_file in glob.glob(local_path + '/**'):
                # Windows 환경인 경우 \를 /로 치환한다(해당사항 없으므로 주석처리).
        # local_file = local_file.replace(os.sep, "/") # Replace \ with / on Windows
        if not os.path.isfile(local_file):
            upload_local_directory_to_minio(
                local_file, bucket_name, minio_path + "/" + os.path.basename(local_file))
        else:
                        # 로컬 경로에서 파일명만 남기고, MinIO 경로와 합친다.
            remote_path = os.path.join(minio_path, local_file[1 + len(local_path):])
                        # Windows 환경인 경우 \를 /로 치환한다(해당사항 없으므로 주석처리).
            # remote_path = remote_path.replace(os.sep, "/")
            client.fput_object(bucket_name, remote_path, local_file)

# 버전 관리를 위해 호출시마다 datetime 디렉터리를 만들어 그 안에 업로드
now = datetime.now()
today_datetime = now.strftime('%Y%m%d%H%M%S')
upload_local_directory_to_minio('tmp/model', 'dev', f'models/{today_datetime}')

이렇게 하면 파라미터로 주어진 로컬 디렉터리를 탐색하면서 파일과 디렉터리 구조를 그대로 업로드 해준다.

※ 더 좋은 방법이나 API가 존재한다면 공유해주시면 감사하겠습니다.

Reference

kubeflow 아티팩트 저장소 minio, s3 자유자재로 변경해서 사용하기

Python 과 MINIO : minio 라이브러리 - IRIS 3.2.3 documentation

How to upload a directory to Minio using Python

<