* 프로그래머스의 마키나락스 MLOPS 강의를 참고하여 작성함
이번 포스팅에서는, 모델 실행 파일에 MinIO에 저장하는 내용을 반영하고 실행해 볼 예정이다.
MinIO로부터 데이터를 다운로드 및 로드하고 이를 활용해서 모델을 실행할 예정.
이전까지 업데이트된 train.py 코드는 아래 내용을 참고
반영할 부분
데이터를 다운로드하고, 로드하는 부분을 추가하도록 하겠다.
1. 데이터 다운로드
from minio import Minio
'''
'''
def download_data():
bucket_name = 'raw-data'
object_name = 'iris'
# minio 클라이언트
url = '0.0.0.0:9000'
access_key = 'ysminio'
secret_key = 'ysstorage*'
client = Minio(url, access_key=access_key, secret_key=secret_key, secure=False )
# 데이터 다운로드
object_stat = client.stat_object(bucket_name, object_name)
data_version_id = object_stat.version_id
client.fget_object(bucket_name, object_name, file_path='download_data.csv')
return data_version_id # 데이터 버전 아이디 반환
2. 데이터 로드
항상 최신 데이터를 얻을 수 있도록 데이터를 다운로드 받기
import pandas as pd
'''
'''
def load_data():
data_version_id = download_data()
df = pd.read_csv('download_data.csv')
X,y = df.drop(columns=['target']), df['target']
data_dict = {'data':X, 'target':y, 'version_id':data_version_id }
return data_dict
최종 코드
<optuna_train_best_minio.py 파일 내용>
import uuid
import mlflow
import optuna
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from minio import Minio
import pandas as pd
UNIQUE_PREFIX = str(uuid.uuid4())[:8]
BUCKET_NAME = 'raw-data'
OBJECT_NAME = 'iris'
def download_data():
# minio 클라이언트
url = '0.0.0.0:9000'
access_key = 'ysminio'
secret_key = 'ysstorage*'
client = Minio(url, access_key=access_key, secret_key=secret_key, secure=False )
# 데이터 다운로드
object_stat = client.stat_object(BUCKET_NAME, OBJECT_NAME)
data_version_id = object_stat.version_id
client.fget_object(BUCKET_NAME, OBJECT_NAME, file_path='download_data.csv')
return data_version_id
def load_data():
data_version_id = download_data()
df = pd.read_csv('download_data.csv')
X,y = df.drop(columns=['target']), df['target']
data_dict = {'data':X, 'target':y, 'version_id':data_version_id }
return data_dict
def objective(trial) :
# suggest new parameter
trial.suggest_int('n_estimators',100,1000, step=100)
trial.suggest_int('max_depth', 3,10)
run_name = f'{UNIQUE_PREFIX}-{trial.number}'
with mlflow.start_run(run_name=run_name):
# load data
data_dict = load_data()
mlflow.log_param('bucket_name', BUCKET_NAME)
mlflow.log_param('object_name', OBJECT_NAME)
mlflow.log_param('version_id', data_dict['version_id'])
X, y = data_dict['data'], data_dict['target']
X_train, X_valid, y_train, y_valid = train_test_split(X,y,test_size=0.3, random_state=2024)
# train model
clf = RandomForestClassifier(n_estimators=trial.params['n_estimators'], max_depth=trial.params['max_depth'], random_state=2024)
clf.fit(X_train, y_train)
# evaluate data
y_pred = clf.predict(X_valid)
acc_score = accuracy_score(y_valid, y_pred)
# log metrics
mlflow.log_metrics({'accuracy': acc_score})
return acc_score
def train_best_model(params) :
run_name = f'{UNIQUE_PREFIX}-best-model'
with mlflow.start_run(run_name=run_name): # logging
#log parameter
mlflow.log_params(params)
# load data
data_dict = load_data()
mlflow.log_param('bucket_name', BUCKET_NAME)
mlflow.log_param('object_name', OBJECT_NAME)
mlflow.log_param('version_id', data_dict['version_id'])
X, y = data_dict['data'], data_dict['target']
# train model
clf = RandomForestClassifier(n_estimators=params['n_estimators'], max_depth=params['max_depth'], random_state=2024)
clf.fit(X, y)
return clf
if __name__ == '__main__' :
# set mlflow
mlflow.set_tracking_uri('http://0.0.0.0:5001')
mlflow.set_experiment('hpo-tutorial')
# study
sampler = optuna.samplers.RandomSampler(seed=2024)
study = optuna.create_study(sampler=sampler, study_name = 'hpo-tutorial', direction='maximize')
# optimize
study.optimize(objective, n_trials=5)
best_params = study.best_params
best_clf = train_best_model(best_params)
MinIO 데이터 반영한 파일 MLflow로 로깅 하기
1. MLflow 실행하기
새 터미널을 실행하여 (MinIO 실행 유지) MLflow를 실행하기. MLflow 시작 방법은 아래 참고
나는 로컬에서 mlflow를 실행해주었다 .
그리고 나서 http://0.0.0.0:5000 주소로 들어가면 MLflow가 실행되는 것을 확인 가능하다
$ mlflow server --host 0.0.0.0
2. MinIO 실행하기
MinIO를 시작하는 방법은 아래 포스팅 참고
아래처럼 또 다른 새 터미널에서 MinIO를 실행해서 계정만들고 파일 업로드 하였다.
docker run -p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minio \
-e MINIO_ROOT_PASSWORD=storage \
minio/minio \
server /data/minio --console-address :9001
python3 upload_data.py
3. 파일 실행하기
$ python3 optuna_train_best_minio.py
hpo-tutorial에 로깅된 것을 확인 가능하다
'MLOps' 카테고리의 다른 글
[MLOps] 16. 모델 저장소 구축 방법 (feat. 도커 컴포즈) (0) | 2024.04.30 |
---|---|
[MLOps] 13. MinIO 사용하기 (구축, data 업로드&다운로드) (0) | 2024.04.30 |
[MLOps] 15. 모델 저장 개념 및 구조 (0) | 2024.04.29 |
[MLOps] 12. 데이터 관리 (feat.MinIO 소개) (0) | 2024.04.22 |
[MLOps] 11. 교차검증 (Cross-validation) (0) | 2024.04.22 |