본문 바로가기

취업/프로젝트

MLflow와 MinIO를 활용한 GCN 모델 예제 / 25.02.08

728x90

1. MLflow를 활용한 GCN 모델 예제

https://cow-kite24.tistory.com/344

 

MLflow를 활용한 GCN 모델 예제 / 25.02.04

MLflow를 설치했으니 간단한 예제 코드로 사용법을 익혀보자.석사 기간 동안 GNN에 대해 많이 다루어봤기 때문에 사용할 모델은 GCN으로 선택했다. 먼저, 사용할 예제 코드이다.해당 코드는 Cora data

cow-kite24.tistory.com

 

2. Minio Client 설치 및 데이터 업로드

https://cow-kite24.tistory.com/345

 

MinIO Client 설치 및 데이터 업로드 / 25.02.05

MinIO의 공식 CLI 툴인 MinIO Client (mc)를 설치해보자.설치 방법은 아래 페이지에서 확인할 수 있다. https://min.io/docs/minio/linux/reference/minio-mc.html MinIO Client — MinIO Object Storage for LinuxThe following commands ad

cow-kite24.tistory.com

 

위 두 개의 포스팅에 이어서, Minio에서 데이터를 불러와 GCN 모델을 학습하고, 학습 과정을 mlflow로 기록하는 실습을 해보자.

두 번째 포스팅인 "Minio Client 설치 및 데이터업로드"에서 미리 Cora dataset을 minio의 raw-data 버킷에 업로드했다.

 


▶ 변수 설정

데이터를 다운로드 받기에 앞서 먼저 minio 정보를 변수로 선언해야한다.

MinIO에 업로드한 데이터 디렉토리에서 사용할 데이터 파일은 OBJECT_NAME 변수로 선언했다.

모델을 학습할 때 사용하는 데이터는 Cora/Processed/data.pt 파일이다.

MINIO_URL = "0.0.0.0:9000"
ACCESS_KEY = "minioadmin"
SECRET_KEY = "minioadmin"
BUCKET_NAME = "raw-data"
FORDER_NAME = "Cora"
OBJECT_NAME = "Cora/processed/data.pt"

▶ 데이터 다운로드

Minio의 raw-data 버킷에 업로드한 Cora 디렉토리의 모든 파일을 다운로드 받는 코드이다.

사실 data.pt만 다운로드 받아도 모델 학습에는 문제가 없다.

 

앞서 설정한 변수들로 MinIO Client를 선언하고 데이터를 다운로드 한다.

def download_data():
    client = Minio(MINIO_URL, access_key=ACCESS_KEY, secret_key=SECRET_KEY, secure=False)
	
    # 버킷의 모든 object 다운로드
    objects = client.list_objects(BUCKET_NAME, prefix=FORDER_NAME, recursive=True)
    for obj in objects:
        local_file_path = os.path.join("./", obj.object_name)
        os.makedirs(os.path.dirname(local_file_path), exist_ok=True)

        client.fget_object(BUCKET_NAME, obj.object_name, local_file_path)
        print(f"Downloaded: {obj.object_name} -> {local_file_path}")

▶ 다운받은 데이터 로드

다운로드 받은 object들 중 학습에 사용할 data.pt파일을 load하고 모델 학습에 사용할 수 있게 Data 객체로 전처리한다.

def load_data():
    data_path = "./Cora/processed/data.pt"

    if not os.path.exists(data_path):
        raise FileNotFoundError(f"Data does not exists: {data_path}")
    
    data = torch.load(data_path, weights_only=True)
    print(f"Loaded data type: {type(data)}")
    
    if isinstance(data, tuple):
        data = data[0]

    if isinstance(data, dict):
        data = Data(**data)

    print('Data load complete')
    return data

▶ 데이터 정보 기록

train하는 함수에서 데이터의 정보 (bucket, object name)을 기록한다.

minio의 버저닝 기능을 사용하면 데이터의 버전도 기록할 수 있지만, 일단 이름만 기록한다. 

def train_node_classifier(model, graph, optimizer, criterion, n_epochs=200):
    with mlflow.start_run(run_name=RUN_NAME, nested=True):
        mlflow.log_param("bucket_name", BUCKET_NAME)
        mlflow.log_param("object_name", OBJECT_NAME)

        mlflow.log_param("epochs", n_epochs)
        mlflow.log_param("learning_rate", optimizer.param_groups[0]['lr'])
        mlflow.log_param("weight_decay", optimizer.param_groups[0]['weight_decay'])

▶ 모델 학습 정보 확인

minio를 모델 학습에 사용하기 위해 크게 변화된 부분은 위에 수정한 부분들이다.

이 외에도 자잘하게 변화된 코드들이 있는데, 전체 코드는 아래 github에서 확인할 수 있다.

https://github.com/Cow-Kite/MLOps_Practice/blob/main/Study/minio_gcn.py

 

MLOps_Practice/Study/minio_gcn.py at main · Cow-Kite/MLOps_Practice

Contribute to Cow-Kite/MLOps_Practice development by creating an account on GitHub.

github.com

코드를 실행하고, mlflow web에서 기록을 확인해보면 minio에서 다운로드 받고 로드한 데이터로 모델 학습을 수행한 것을 확인할 수 있다.

728x90