StoryCode

MLflow.5.Model Registry

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

이번에는 MLflow의 Model Registry에 대해서 알아본다.


사전 준비

음 이제 매번 쓰기 귀찮다.
어차피 직전 글이랑 이어지므로, 이전 글을 통해 확인하자.


Model Registry

개념

Model Registry는 MLflow 프로젝트 실행을 통해 나온 결과물인 모델을 저장하는 중앙 집중식 모델 저장소다. MLflow로 모델을 기록했다면, 기록한 모델을 Model Registry에 등록할 수 있고, 등록된 모델은 어디서든 불러올 수 있다.

 

모델 등록하기

웹 UI로 등록하기

간단하게 모델을 등록해보자. 직전 글에서 사용한 실습을 그대로 이어간다.
웹 서버 (Tracking Server) 에 들어간 뒤, 실행했던 실행(Run)을 클릭하여 들어간다.

실행 상세페이지 하단에 Artifacts 블록이 있고 이 안에 Model Register 버튼이 있다.

버튼을 클릭하여 다음처럼 LinearRegression 이라는 이름으로 모델을 등록해주자.

이제 상단 메뉴 중에 Model 탭에 들어가보면 다음처럼 등록된 모델을 확인할 수 있다.
모델을 처음 등록하는 경우 Version 1 이 자동으로 추가된다.

등록된 모델 하나를 클릭하면 아래처럼 상세 페이지가 나온다.

모델 버전을 누르면 다음처럼 해당 버전의 상세 페이지로 들어갈 수 있다.

Stage 항목에서는 이 모델의 스테이지 상태를 Staging, Production, Archived 중 하나로 바꿀 수 있다. 아무것도 지정하지 않았을 시 기본 값은 None 이다.

 

코드에서 등록하기

위처럼 웹 UI가 아니라 코드에서 직접 등록하는 방법도 있다.
총 3가지 방법이 있는데 첫 번째 방법은 mlflow.sklearn.log_model()  registered_model_name 의 값을 주는 것이다.

이를 직접 확인하기 위해 이전에 실행했던 sklearn_logistic_regression 예제의 train.py 를 다음처럼 수정한다.

# sklearn_logistic_regression/train.py

import numpy as np
from sklearn.linear_model import LogisticRegression

import mlflow
import mlflow.sklearn

if __name__ == "__main__":
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])
    lr = LogisticRegression()
    lr.fit(X, y)
    score = lr.score(X, y)
    print("Score: %s" % score)
    mlflow.log_metric("score", score)
    # mlflow.sklearn.log_model(lr, "model")  # before
    mlflow.sklearn.log_model(lr, "model", registered_model_name="LinearRegression")  # after
    print("Model saved in run %s" % mlflow.active_run().info.run_uuid)

바뀐 부분은 딱 한 줄이다. mlflow.sklearn.log_model 함수에 registered_model_name="LinearRegression" 인자를 추가하였다. (이 함수에 자세한 내용은 여기서 확인할 수 있다.)

이제 다시 이 MLflow 프로젝트를 실행하자.

$ mlflow run sklearn_logistic_regression --no-conda

로그를 보면 LinearRegression 이 이미 등록된 모델이므로, 등록된 모델의 새 버전을 만든다고 하고 Version 2 를 만들었다고 한다. (만약 ``registered_model_name값으로 넘겨준 값이 등록된 모델이 아닌 경우, 모델을 먼저 등록하고Version 1` 을 부여한다.)

웹 UI에 가서 확인해보자.

위처럼 LinearRegression 모델의 Latest Version이 Version 2 가 된 것을 볼 수 있고, 등록된 모델 상세 페이지에 들어가보면 아래처럼 Version 2 가 추가된 것을 볼 수 있다.

다른 두 번째 방법으로는 mlflow.register_model() 를 사용하는 것이다. 이 함수에는 model_uri  name 인자 값을 넘겨줘야 하는데 예시를 보면 바로 알 수 있다.

result = mlflow.register_model(
    model_uri="runs:/4268cde08c2c4fd08c6257b148ed2977/model",
    name="LinearRegresion"
)

model_uri  run_id  artifacts 내에 model 이 저장된 경로다.
name 은 등록할 때 사용할 이름이다. 위에서 registered_model_name 와 같은 개념이다.
좀 더 자세한 사용법은 여기를 확인하자.

세 번째 방법은 MlflowClient.create_registered_model()  MlflowClient.create_model_version() 를 사용하는 것이다. 마찬가지로 예시를 바로 보자.

from mlflow.tracking import MlflowClient

# 모델을 등록한다. 아직 버전이 없기 때문에 비어있다.
client = MlflowClient()
client.create_registered_model("LinearRegression")

# 등록된 모델에 버전을 등록한다.
result = client.create_model_version(
    name="LinearRegression",
    source="artifacts/0/4268cde08c2c4fd08c6257b148ed2977/artifacts/model",
    run_id="4268cde08c2c4fd08c6257b148ed2977"
)

이 정도만 설명해도 어느정도 설명이 된다 생각한다. create_model_version() 에 대한 자세한 내용은 여기를 확인하자.

 

등록된 모델 불러오기

Model Registry에 등록된 모델은 어디서든 불러올 수 있다.
위에서 등록한 모델을 불러오는 실습을 해보자.

먼저 load_registered_model.py 를 만들고 다음 코드를 입력하자.

# load_registered_model.py

import mlflow.pyfunc
import numpy as np

# 가져올 등록된 모델 이름
model_name = "LinearRegression"

# 버전을 기준으로 가져오고 싶을 때
model_version = 2
model = mlflow.pyfunc.load_model(
    model_uri=f"models:/{model_name}/{model_version}"
)

# 단계(stage)를 기준으로 가져오고 싶을 때
# stage = 'Staging'
# model = mlflow.pyfunc.load_model(
#     model_uri=f"models:/{model_name}/{stage}"
# )

X = np.array([[1], [2], [3]])
Y = model.predict(X)    
print(Y)

이제 MLflow Tracking Server 설정 후, 위 코드를 실행하자

$ export MLFLOW_TRACKING_URI="http://[ip]:5000"
$ python load_registered_model.py

위 사진 처럼 잘 불러와서 실행하는 것을 볼 수 있다.

등록된 모델 서빙하기

Model Registry에 등록된 모델은 다음처럼 바로 서빙이 가능하다.

# Tracking Server를 설정한다.
$ export MLFLOW_TRACKING_URI="http://[ip]:5000"

# 등록된 LinearRegression 모델의 Version 1을 서빙하는 서버를 띄운다.
$ mlflow models serve -m "models:/LinearRegression/1" --port 5001 --no-conda --host "0.0.0.0"

잘 서빙하는지 요청을 날려보자.

$ curl \
-d '{"columns":["x"], "data":[[1], [-1]]}' \
-H 'Content-Type: application/json; format=pandas-split' \
-X POST localhost:5001/invocations

 

응답이 잘 오는 것을 볼 수 있다.

 

그 외 제공해주는 것들

필수적으로 알아야할 것들은 어느정도 설명한 것 같고... 이 외에 다음과 같은 기능들이 더 있다.

  • MLflow 모델 설명 추가 또는 업데이트
  • MLflow 모델 이름 바꾸기
  • MLflow 모델의 단계(Stage) 전환
  • MLflow 모델 나열 및 검색
  • MLflow 모델 보관
  • MLflow 모델 삭제
  • 저장된 모델 등록
  • 지원되지 않는 기계학습 모델 등록

특히 모델의 단계 전환, 나열 및 검색 등은 CT(Continous Training)를 구성할 때 추가적으로 활용하면 좋을 거 같다는 생각이 든다. 자세한 내용은 여기를 확인하자.


정리

  • Model Registry는 실험 및 실행에서 기록한 모델들을 등록하고 불러올 수 있는 저장소다.
  • Model Registry에 등록되는 모델들은 버전 혹은 단계(Stage)를 가진다.
  • Model Registry에 모델을 등록하는 방법은 크게 2가지 방법이 있다.
    • 웹 UI를 사용하거나
    • mlflow 라이브러리에서 다음 3가지 방법을 사용하거나
      • log_model()  registered_model_name 의 값을 함께 넘겨주며 사용한다.
      • register_model() 를 사용한다.
      • create_registered_model()  create_model_version() 를 사용한다.
  • Model Registry에 등록된 모델은 mlflow model serve 명령어로 바로 서빙이 가능하다.
  • mlflow 라이브러리는 등록된 모델과 관련된 여러 액션을 제공해준다. 이는 CT등 파이프라인 자동화에서 활용해볼 수 있다.
반응형

'인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow > MLFlow' 카테고리의 다른 글

MLFlow.6.MLflow Projects  (0) 2021.12.28
MLFlow.6.More about Models  (0) 2021.12.28
MLflow.4.Tracking Server  (0) 2021.12.27
MLflow.3.Experiments & Runs  (0) 2021.12.24
MLflow.2.Automatic logging  (0) 2021.12.24

MLflow.4.Tracking Server

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참조 : https://dailyheumsi.tistory.com/260?category=980484

 

이번에는 MLflow 의 Tracking Server에 대해 알아본다.


사전 준비

다음이 사전에 준비 되어 있어야 한다.

# 파이썬 버전 확인
$ python --version
Python 3.8.7

# mlflow 설치 & 버전 확인
$ pip install mlflow
$ mlflow --version
mlflow, version 1.16.0

# 예제 파일을 위한 mlflow repo clone
$ git clone https://github.com/mlflow/mlflow.git
$ cd mlflow/examples

 


Tracking Server

Tracking 이란?

이전의 글들을 통해 우리는 MLflow가 머신러닝 프로젝트에서 일종의 "기록" 역할을 하는 것임을 알았다.
여기서 머신러닝의 과정과 결과를 곳곳에서 기록한다는 의미로 "Tracking" 이라는 표현을 사용한다.

Tracking은 실험(Experiment)의 각 실행(Run)에서 일어나고, 구체적으로는 다음 내용들을 기록한다.

  • 코드 버전
    • MLflow 프로젝트에서 실행 된 경우, 실행에 사용 된 Git 커밋 해시
  • 시작 및 종료 시간
    • 실행 시작 및 종료 시간
  • 소스
  • 매개 변수
  • 메트릭
    • 값이 숫자 인 키-값 측정 항목
    • 각 측정 항목은 실행(run) 과정에서 업데이트 될 수 있으며 (예 : 모델의 손실 함수가 수렴되는 방식을 추적하기 위해) MLflow가 측정 항목의 전체 기록을 기록하고 시각화 할 수 있다.
  • 아티팩트
    • 모든 형식의 출력 파일.
    • 예를 들면
      • 이미지 (예 : PNG),
      • 모델 (예. picklize한 scikit-learn 모델)
      • 데이터 파일 (예 : Parquet 파일) 등

 

기록을 어디에 어떻게 저장하는가?

위에서 기록한 내용들은 실제로 어떻게 저장할까?
앞의 글들에서 보았듯이 ./mlruns 에 저장된다.

MLflow 는 별도의 설정 값을 주지 않으면 기본적으로 로컬 경로인 ./mlruns 에 이 기록물들을 저장한다.
기록물은 크게 2가지로 나뉜다.

  • Artifacts
    • 파일, 모델, 이미지 등이 여기에 포함된다.
    • 위에서 artifacts 라고 보면 된다.
  • MLflow 엔티티
    • 실행, 매개 변수, 메트릭, 태그, 메모, 메타 데이터 등이 여기에 포함된다.
    • 위에서 artifacts 를 제외한 나머지 (meta.yaml, metrics, params, tags) 라고 보면 된다.

위 기록물의 구체적인 내용을 잘 모른다면, 이전 글을 통해 확인해보자.

기본적으로 ./mlruns 이라는 로컬 경로에 이 두 가지를 동시에 저장하고 있다. 하지만 별도의 설정을 통해 이 둘을 별도로 저장할 수 있다. 그리고 이 저장을 위해 Tracking 서버가 필요하다.

 

Tracking Server

MLflow 는 Tracking 역할을 위한 별도의 서버를 제공한다. 이를 Tracking Server라고 부른다.
이전에는 mlflow.log_params, mlflow.log_metrics 등을 통해서 ./mlruns 에 바로 기록물을 저장했다면, 이제는 이 백엔드 서버를 통해서 저장하게 된다.

간단하게 바로 실습해보자.
다음 명령어로 Tracking Server를 띄운다.

# 먼저 별도의 디렉토리를 만들고 들어가자.
$ mkdir tracking-server
$ cd tracking-server

# 이후 Tracking Server를 띄우자.
# 참고로, mlflow ui 는 꺼야 한다.
$ mlflow server \
--backend-store-uri sqlite:///mlflow.db \
--default-artifact-root $(pwd)/artifacts

로그가 쭈욱 나오고, localhost:5000 에 서버가 떠있는 것을 알 수 있다.
--backend-store-uri, --default-artifact-root 라는 개념이 나오는데, 일단은 넘어가고 계속 실습을 진행해보자.

이제 MLflow 프로젝트를 실행시켜볼건데 그 전에 프로젝트가 이 백엔드 서버와 통신할 수 있게 설정해준다.

$ export MLFLOW_TRACKING_URI="http://localhost:5000"

이제 다시 mlflow/examples 경로로 가서 MLflow 프로젝트 예제인 sklearn_logistic_regression 를 다음처럼 실행시켜보자.

$ mlflow run sklearn_logistic_regression --no-conda

잘 실행되었다.
이제 tracking-server 디렉토리로 다시 가서 실행 결과물을 확인해보자.

artifacts/  mlflow.db 파일이 생긴 것을 볼 수 있다.
그리고 이러한 결과물을 트래킹 서버(localhost:5000)의 웹 페이지를 통해서도 확인할 수 있다.

위 실행(Run)을 클릭해서 들어가면 Tracking한 내용을 다음처럼 확인할 수 있다.


정리

  • 우리는 방금 MLflow 프로젝트를 실행시킬 때 localhost:5000 에 떠있는 Tracking Server를 사용했고,
  • Tracking Server 는 프로젝스 실행의 결과물들을 artifacts/  mlflow.db 에 저장했다.
    • Tracking Server를 사용하지 않았을 때는 ./mlruns 에 기록했었다.
    • Tracking Server를 사용하면 별도의 저장소에 기록한다
  • Tracking Server 가 사용하는 별도의 저장소는 두 가지 파라미터로 지정할 수 있다.
    • --backend-store-uri
      • Mlflow 엔티티가 기록되는 저장소다.
      • 파일 저장소 혹은 DB를 사용할 수 있으며 SQLAlchemy DB URI 형태로 넘겨주면 된다.
        • <dialect>+<driver>://<username>:<password>@<host>:<port>/<database>
      • 우리는 위에서 sqlite 를 사용하였다.
    • --default-artifact-root
      • Artifacts가 기록되는 저장소다.
      • 파일 시스템, 스토리지 등을 사용할 수 있다.
        • AWS S3나 GCS같은 등 외부 스토리지도 사용할 수 있다. 여기를 참고.
      • 우리는 위에서 파일 시스템을 사용하였다.

Tracking Server는 Server라는 이름에 맞게 어딘가에 항상 띄워두고 사용하면 될듯 싶다.
MLflow project 를 작성하는 실험자는 이 Tracking Server와 통신하도록 세팅해두고 Logging 하면 될듯하고.
이렇게 되면 실험에 대한 모든 기록은 Tracking Server의 웹 대시보드에서 한 눈에 볼 수 있게 된다.

반응형

MLflow.3.Experiments & Runs

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참조 : https://dailyheumsi.tistory.com/259?category=980484

 

이번에는 MLflow의 실험(experiments)과 실행(runs)에 대해 알아본다.


사전 준비

다음이 사전에 준비 되어 있어야 한다.

# 파이썬 버전 확인
$ python --version
Python 3.8.7

# mlflow 설치 & 버전 확인
$ pip install mlflow
$ mlflow --version
mlflow, version 1.16.0

# 예제 파일을 위한 mlflow repo clone
$ git clone https://github.com/mlflow/mlflow.git
$ cd mlflow/examples

 


Experiments & Runs

개념

MLflow에는 크게 실험(Experiment)와 실행(Run)이라는 개념이 있다. 실험은 하나의 주제를 가지는 일종의 '프로젝트'라고 보면 된다. 실행은 이 실험 속에서 진행되는 '시행'이라고 볼 수 있다. 하나의 실험은 여러 개의 실행을 가질 수 있다.

직접 눈으로 보며 이해해보자.
examples 에 있는 sklearn_elasticnet_wine MLflow 프로젝트를 실행해본다.

$ mlflow run sklearn_elasticnet_wine --no-conda

실행 결과로 ./mlruns 경로에 다음과 같은 파일들이 생긴다.

여기서 0 은 실험 ID이고, a853debd39fb4de4a61ce3aa6d247c8a 은 실행 ID다.
한번 더 동일한 프로젝트를 실행해보자. 이번에는 파라미터 값을 추가로 넘겨줘본다.

$ mlflow run sklearn_elasticnet_wine -P alpha=0.5 --no-conda

실행 결과로 mlruns 경로를 확인해보면 다음과 같다.

0 이라는 실행에 69c2f00c31044d339344f91ea03ed1f0 이라는 실행이 추가로 생성되었다.
이렇듯 매 실행은 하나의 실험에 속하여 들어간다. 위의 예시가 매우 직관적이라 실험과 실행의 관계와 활용 방안을 바로 알 수 있을 것이다.

 

Experiment 생성 및 조회

위에서 별도의 실험을 생성하지 않았기 때문에 ID가 0 인 실험을 자동으로 생성하고 이 실험에서 실행을 생성하였다.
이번에는 직접 실험을 생성해보자.

실험 생성 은 다음 CLI 명령어로 가능하다.

$ mlflow experiments create -n "실험 이름"

그리고 실험 목록은 다음 CLI 명령어로 가능하다.

$ mlflow experiments list

그 외 mlflow experiments 관련된 명령어는 다음의 것들이 있으니 참고하자.

CLI가 아닌 코드에서 experiments 및 run을 다루는 방법

다음처럼 mlflow.tracking.MlflowClient 를 사용하면 된다.

from mlflow.tracking import MlflowClient

# Create an experiment with a name that is unique and case sensitive.
client = MlflowClient()
experiment_id = client.create_experiment("Social NLP Experiments")
client.set_experiment_tag(experiment_id, "nlp.framework", "Spark NLP")

# Fetch experiment metadata information
experiment = client.get_experiment(experiment_id)
print("Name: {}".format(experiment.name))
print("Experiment_id: {}".format(experiment.experiment_id))
print("Artifact Location: {}".format(experiment.artifact_location))
print("Tags: {}".format(experiment.tags))
print("Lifecycle_stage: {}".format(experiment.lifecycle_stage))

자세한 내용은 공식 docs를 참고하자.

 

Run 생성 및 조회

위에서 실험을 생성했으므로 이번에는 실행을 생성해보자.
먼저 mlruns 내부를 확인해본다.

위에서 새로 만든 1, 2 실험에는 아직 아무런 실행이 없다.
다음 명령어로 실행을 생성한다.

$ mlflow run sklearn_elasticnet_wine -P alpha=0.5 --no-conda --experiment-id 2

끝에 --experiment-id 를 붙여주었다.
다음처럼 실험 이름으로 할 수도 있다.

$ mlflow run sklearn_elasticnet_wine -P alpha=0.25 --no-conda --experiment-name "experiments-2"

잘 실행된걸 확인했으므로, 이제 결과가 잘 나왔는지 ./mlruns 경로에서 확인하자.

2 번 실험에 위에서 생성한 실행들이 잘 생성된 것을 볼 수 있다.

다음처럼 환경 변수로 실험 ID를 잡아줄 수도 있다.

$ export MLFLOW_EXPERIMENT_ID = 2

정리

  • MLflow 에는 실험(Experiments)과 실행(Runs)이란 개념이 있다.
  • 하나의 ML 프로젝트는 하나의 실험으로 구성할 수 있다.
  • 하나의 실험은 여러 개의 실행으로 구성된다.
    • 각 실험마다 ML 모델의 하이퍼 파라미터 조정 등을 다르게 하여 수행할 수 있다.
  • CLI 혹은 코드에서 실험과 실행의 생성, 조회, 삭제 등의 명령을 할 수 있다.
반응형

MLflow.2.Automatic logging

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참조 : https://dailyheumsi.tistory.com/258?category=980484

 

 

저번 Quick 리뷰 글에 이어 계속해서 작성한다.
이번 글은 MLflow 에서 제공하는 Automatic Logging 기능 예제들을 살펴본다.

 


사전 준비

다음이 사전에 준비 되어 있어야 한다.

# 파이썬 버전 확인
$ python --version
Python 3.8.7

# mlflow 설치 & 버전 확인
$ pip install mlflow
$ mlflow --version
mlflow, version 1.16.0

# 예제 파일을 위한 mlflow repo clone
$ git clone https://github.com/mlflow/mlflow.git
$ cd mlflow/examples

 


예제 살펴보기

linear_regression.py

examples 내에 있는 많은 예제 중, skelarn_autolog 를 사용해보자.
먼저 sklearn 을 설치해준다.

# sklearn 설치 & 버전 확인
$ pip install sklearn
$ python -c "import sklearn; print(sklearn.__version__)"
0.24.2

skelarn_autolog/linear_regression.py 를 보면 다음처럼 생겼다.

# skelarn_autolog/linear_regression.py

from pprint import pprint

import numpy as np
from sklearn.linear_model import LinearRegression

import mlflow
from utils import fetch_logged_data


def main():
    # enable autologging
    mlflow.sklearn.autolog()

    # prepare training data
    X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
    y = np.dot(X, np.array([1, 2])) + 3

    # train a model
    model = LinearRegression()
    with mlflow.start_run() as run:
        model.fit(X, y)
        print("Logged data and model in run {}".format(run.info.run_id))

    # show logged data
    for key, data in fetch_logged_data(run.info.run_id).items():
        print("\n---------- logged {} - ---------".format(key))
        pprint(data)


if __name__ == "__main__":
    main()

소스코드가 아주 간결하고 잘 설명되어 있다. 내용은 Linear Regression을 사용하는 간단한 머신러닝 코드다.
여기서는 2가지 코드가 눈에 띈다.

  • mlflow.sklearn.autolog()
    • Automatic Logging 기능을 사용하는 설정이다.
    • 코드 앞부분에 들어가야 한다.
  • with mlflow.start_run() as run:
    • MLflow 의 실행(run) 의 시작을 알리는 컨텍스트 매니저 구문이다.
    • run 에는 실행과 관련된 내용이 들어간다.

이제 다음 명령어로 실행해보자.

$ python sklearn_autolog/linear_regression.py

실행하고 나면 위와같은 출력이 나온다.
warning 은 일단 무시하면 될듯하고.. 로그를 좀 살펴보면, run_id  8f93587bcd384c198daee5aaef6f5c4b 로 생성되었고, 다음 사항들이 자동으로 기록한 것을 알 수 있다.

  • params
    • 모델 생성(위에서는 LinearRegression)에 사용하는 params 를 기록한다.
    • 부연 설명하면... copy_X, fit_intercept 등의 파라미터는 LinearRegression  __init__ 파라미터다.
  • metrics
    • 모델 훈련 중에 평가하는 metrics를 기록한다.
    • 위의 경우, mae, mse, r2_score, rmse, score (이건 뭔지 모르겠다.) 를 모두 기록해주었다.
  • tags
    • 이 실행에 관련된 tag 를 기록한다.
    • 기본적으로 모델의 패키지와 클래스 이름을 기록한다.
  • artifacts
    • 실행에 대한 메타 정보와 모델 파일을 기록한다.

실제로 잘 생성되었는지 mlruns/ 에서 확인해보자.

$ tree mlruns/

8f93587bcd384c198daee5aaef6f5c4b 디렉토리에 각종 내용들이 로깅된 파일들이 있는 것을 볼 수 있다.
실제 어떤 값들이 들어가있는지 쉽게 보기위해 웹서버로 접속해서 봐보자.

$ mlflow ui
[2021-05-01 14:36:15 +0900] [87757] [INFO] Starting gunicorn 20.1.0
[2021-05-01 14:36:15 +0900] [87757] [INFO] Listening at: http://127.0.0.1:5000 (87757)
[2021-05-01 14:36:15 +0900] [87757] [INFO] Using worker: sync
[2021-05-01 14:36:15 +0900] [87759] [INFO] Booting worker with pid: 87759

params , metrics, tags 등을 좀 더 자세히 확인해보기 위해 sklearn 모델을 클릭하여 실행 상세 페이지에 들어가보자.

위에서 출력한 내용들이 모두 잘 들어가있는 것을 볼 수 있다.

 

pipeline.py

이번엔 skelarn_autolog/pipeline.py 예제를 살펴보자.
이 파일은 다음처럼 생겼다.

from pprint import pprint

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

import mlflow
from utils import fetch_logged_data


def main():
    # enable autologging
    mlflow.sklearn.autolog()

    # prepare training data
    X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
    y = np.dot(X, np.array([1, 2])) + 3

    # train a model
    pipe = Pipeline([("scaler", StandardScaler()), ("lr", LinearRegression())])
    with mlflow.start_run() as run:
        pipe.fit(X, y)
        print("Logged data and model in run: {}".format(run.info.run_id))

    # show logged data
    for key, data in fetch_logged_data(run.info.run_id).items():
        print("\n---------- logged {} ----------".format(key))
        pprint(data)


if __name__ == "__main__":
    main()

sklearn.pipeline.Pipeline 을 사용하는 간단한 머신러닝 코드다.
바로 실행해보자.

$ python sklearn_autolog/pipeline.py

logged_params 를 보면 Pipeline 에 들어가는 모든 파라미터를 기록하는 것을 볼 수 있다.
기록된 값 역시 mlruns/ 에 저장된다.

 

grid_search_cv.py

마지막으로, skelarn_autolog/grid_search_cv.py 예제를 살펴보자.
다음처럼 생겼다.

from pprint import pprint

import pandas as pd
from sklearn import svm, datasets
from sklearn.model_selection import GridSearchCV

import mlflow
from utils import fetch_logged_data


def main():
    mlflow.sklearn.autolog()

    iris = datasets.load_iris()
    parameters = {"kernel": ("linear", "rbf"), "C": [1, 10]}
    svc = svm.SVC()
    clf = GridSearchCV(svc, parameters)

    with mlflow.start_run() as run:
        clf.fit(iris.data, iris.target)

    # show data logged in the parent run
    print("========== parent run ==========")
    for key, data in fetch_logged_data(run.info.run_id).items():
        print("\n---------- logged {} ----------".format(key))
        pprint(data)

    # show data logged in the child runs
    filter_child_runs = "tags.mlflow.parentRunId = '{}'".format(run.info.run_id)
    runs = mlflow.search_runs(filter_string=filter_child_runs)
    param_cols = ["params.{}".format(p) for p in parameters.keys()]
    metric_cols = ["metrics.mean_test_score"]

    print("\n========== child runs ==========\n")
    pd.set_option("display.max_columns", None)  # prevent truncating columns
    print(runs[["run_id", *param_cols, *metric_cols]])


if __name__ == "__main__":
    main()

iris 데이터셋을 사용하고, svm 모델을 사용하는데, 이 때 GridSearchCV 를 사용하여 최적의 모델 파라미터를 찾는 머신러닝 코드다.
# show data logged in the parent run 아래 부분은 뭔가 양이 많은데, 그냥 로깅된 내용을 출력해주는 부분이므로, 여기서는 주의 깊게 봐지 않아도 된다.

아무튼 이 코드도 실행해보자.

$ python sklearn_autolog/grid_search_cv.py

출력된 내용을 보면 크게 parent run  child runs 으로 구성해볼 수 있다.
parent run 에서는 전체 파이프라인에 들어간 파라미터 값들을 기록하고, 또 이 GridSearch 를 통해 찾은 최적의 파라미터 값을 기록한다. (best_C, best_kernel ).
child runs 에서는 GridSearch 진행할 때 각각 파라미터 경우의 수대로 run 들을 실행하고 기록한 모습을 볼 수 있다. 이 때 child runs 들도 각각 하나의 run 이 되므로 run_id 를 가지게 된다. 즉 GridSearch 에서 파라미터 조합의 경우의 수가 많아지면, 그만큼의 실행(run) 이 생기게 된다.

실제 mlruns 를 확인해보면 이 child run 들이 생긴 것을 볼 수 있다.
(다만 parent run 과 별다른 디렉토리 구분은 없다. 즉 누가 child run 인지 디렉토리 구조로는 파악이 잘 안된다.)

그렇다면 웹서버에서는 어떻게 보여줄까?
웹서버에서도 child run 들을 parent run 들과 구분 없이 보여줄까?
이를 확인하기 위해 웹서버로 접속해서 확인해보자.

재밌게도 웹서버에서는 parent run 만 보인다.
grid_search_cv.py 가 있는 행에 + 버튼을 눌러보면 아래와 같이 child runs 가 나온다.

run 자체는 GridSearch 에 맞게 독립적으로 여러 개로 생성하되, run 간에 Parent, Child 관계를 가질 수 있는 것이다.
parent_run_id  mlruns 디렉토리를 검색해보면, 이러한 관계가 어떻게 구성될 수 있는지 알 수 있다.

mlruns 에서 child run 의 디렉토리 구조를 살펴보면 tags/mlflow.parentRunId 가 있는 것을 볼 수 있다.
그리고 이 파일에 위 사진처럼 부모 run_id 가 기록되어 있다. (b09de55d441e4a6ea0386f45c58dd96c  dc302019f7fb45ffa82165fcd679b84a  parent run 이다.)

그리고 child run  artifact 과 관련하여 어떤 것도 기록하지 않고, metrics, params, tags 만 기록한다. artifacts 는 최종적으로 최적화된 모델을 사용하는 parent run 에서만 기록한다.


정리

  • mlflow.sklearn.autolog() 기능으로 로깅 함수를 쓰지 않아도 자동 로깅을 사용할 수 있다.
    • autolog() 는 머신러닝 프레임워크별로 지원한다. 이에 대한 내용은 여기에서 확인하자.
    • artifacts ,params, metrics, tags 등을 모두 기록한다.
  • GridSearch 를 쓰는 경우 여러 개의 run 들을 만들어 실행하고 기록한다.
    • run  parent run  child run 으로 구성된다.
    • child run  GridSearch 에 사용되는 파라미터 별로 실행한다.
    • parent run  child run 중 가장 최적화된 파라미터를 가지고 실행한다.
    • parent run  artifacts 를 기록한다.
    • 웹서버에서도 parent - child 구조를 확인할 수 있다.

이전 글에서 모델러가 로깅을 위해 mlflow 를 알고 써야하는 의존성에 대해서 걱정했었는데, 자동 로깅 기능을 사용하면 이러한 걱정이 좀 많이 내려가지 않을까 싶다.

반응형

Centos, 센토스 server minimal 이후 추가 설치

Server 관리/Linux
반응형

# 참조 : https://seokk.tistory.com/46

 

 

설치 환경 : CentOS 7 minimal (최소설치)

 

VMware에 설치합니다.

 

 

운영체제 파일은 CentOS 다운로드 사이트에서 minimal.iso를 다운받습니다.

 

설치 시작 전 네트워크 설정을 VMware NAT로 설정하였고

 

 

다운로드한 CentOS 7 minimal.iso를 import 했습니다.

 

 

 

 

 

 

 

 

설치 과정 동안 한글로 번역되어 보이도록 하고 '계속진행'을 클릭합니다.

 

 

 

]

 

 

 

디스크 공간은 자동으로 설정해서 설치해도 되지만

 

조금이라도 권장사항에 따라 설치하기 위해

 

 

 

 

 

 

파티션 설정을 클릭해 완료버튼을 클릭합니다.

 

 

 

 

 

 

제타위키에서 리눅스 스왑메모리 크기 권고사항 에 따라

VMware의 RAM을 1G로 설정한 바

 

RAM이 2G 미만일 경우 swap공간은 RAM의 2배를 권장한다.

 

그러므로 swap 공간을 2G로 설정하고 그 외 /boot 500M 와 나머지 용량은 /(root)로 지정하였다.

 

 

 

 

 

 

완료를 클릭한다

 

 

 

 

 

 

설치 시작 전 네트워크를 VMware NAT로 설정해두었기 때문에

 

유선 연결을 키면 바로 IP가 자동할당된다

 

 

 

설치시작을 클릭한다

 

 

 

 

 

 

ROOT암호만 설정해도 되고, 둘다 설정해도 된다.

 

 

 

 

 

 

ROOT 암호를 설정하고 완료버튼을 클릭한 다음 설치가 완료되길 대기한다

 

 

 

설치가 완료되면 재부팅 버튼이 오른쪽 하단에 생기며

 

재부팅 버튼을 클릭한다

 

 

 

 

 

 

 

설치가 정상적으로 되어 부팅된 것을 볼 수 있다.

 

 

 

이제 몇가지 필요한 것을 설치해본다.

 

 

 

네트워크를 이용해 필요한 도구를 설치하므로

 

 

네트워크 설정을 하지 않은 경우

$vi /etc/sysconfig/network-scripts/ifcfg-enpXXX

 

위 경로의 파일을 열어 필요 부분을 수정한다.

기본적으로 DHCP 사용하도록 설정되어 있으므로 ONBOOT=NO 부분을 ONBOOT=YES로 수정하거나

DHCP를 사용하지 않고 고유한 IP사용할 경우 사용할 IP 직접 입력한다.

 

설정 후 반드시

# systemctl restart network

# systemctl restart NetworkManager

를 실행하도록 한다

 

 

다음 진행과정 동안은 root로 접근하여 설치 및 설정하도록 한다

 

 

CentOS7에서 'ifconfig'명령어는 기본 설치에서 제외되어 있으므로

 

 

'Ip addr' 명령어로 네트워크가 잘 설정되어 있는 지 확인 후 다음 과정을 진행하도록 한다.

 

 

 

Ifconfig 외 네트워크 도구를 사용할 테니 Net-tools를 설치하도록 한다.

 

 

 

 

 

net-tools 설치 완료

 

 

* nmtui 명령어를 사용해 host-name과 network 설정을 할 수 있다.

 

아직 난 호스트이름을 설정하지 않아 @뒤 localhost로 뜬다.

 

호스트이름은 따로 설정해두록 하자.

 

 - 호스트이름 설정 명령 : # hostnamectl set-hostname [호스트 이름]

 

 

 

 

외부에서 원격접속하여 들어가는 경우가 많으므로 ssh를 설치하도록 하자.

 

 

 

 

 

 

openssh-server 설치 완료

 

 

 

 

부팅 시 자동 서비스 시작을 위해 위와 같이 입력하여 설정해준다

 

 

또한,

 

 

위 경로의 파일에서

 

몇가지 주석과 설정을 하도록한다.

 

 

 

 

 

Port 22

AddressFamily inet

LoginGraceTime 2m

PermitRootLogin no

PermitEmptyPasswords no

X11Forwarding no

UseDNS no

 

위 목록을 찾아 주석과 설정을 수정하고 저장한다.

 

 

 

VMware에 설치했다면 open-vm-tools도 설치하여

community update, opensource version, host 시간 동기화를 지원 받도록 한다.

 

 

 

SELinux는 보안을 강화해주는 보안강화커널로 zero-day attack, buffer overflow 등

취약점으로 인한 해킹을 방지해주는 핵심 구성요소다

 

하지만 접근권한의 제한을 받거나 특정 서비스가 SELinux로 인해

동작하지 않은 경우가 발생한다

 

SELinux를 끄도록 한다.

 

* SELinux를 끄기보단 해당 서비스가 SELinux 하에서 잘 동작하도록 설정하는 것을 권장한다.

 

 

 

 

위 경로의 파일로 이동해 수정한다

 

 

 

 

 

SELINUX=enforcing 이라고 되어있는 부분을 SELINUX=disabled로 변경해준다.

 

 

 

firewalld(방화벽)에 의해 iptables룰이 생성됨으로 firewalld를 비활성화 및 중지하고

 iptables와 관련된 패키지를 설치하도록 한다.

 

 

 

firewalld 비활성화 및 중지

 

* stop - 중지   dismask - 서비스제거   disable - 부팅 시작시 비활성화

 

 

 

 

iptables 관련 패키지 설치

 

 

 

 

설치 완료

 

 

 

부팅시 시작하도록 iptables 생성 및 설정

 

 

 

타임존 확인 및 설정

 

 

 

타임존 확인은 위 명령어로 확인한다.

 

 

 

위와 같이 뜬다.

 

 

만약, timedatectl이 작동하지 않는다면 ntpd가 설치되어 있지 않은 것이다.

 

뜨지 않는 다면 다음과 과정을 수행하도록 한다

 

# yum install ntpd <-- 설치

# systemctl start ntpd

# systemctl enable ntpd

#timedatectl <-- 확인

 

 

 

추가로 타임존 위치를 변경하려면

 

그 변경가능한 리스트 확인은

 

# timedatectl list-timezones

 

위 명령으로 확인한다.

 

 

만약, 서울로 타임존을 설정한다면

 

 

변경가능한 리스트의 내용중에서 Seoul 검색

 

 

 

서울타임존 검색 됨

 

 

 

위 타임존으로 설정

 

 

 

timedatectl로 타임존이 변경된 걸 확인할 수 있다.

 

 

 

그 외 추가로 epel을 설치해주도록 하자

 

* epel(Extra Packages of enterprise Linux) : yum으로 설치되지 않는 패키지를 설치되도록 도와주는 리눅스 추가 패키지

 

 

 

 

* nmap :  포트를 스캔해주는 툴로 호스트나 네트워크 스캐닝시 사용하는 도구

 

 

설치 과정을 살펴보면 첫부분에서 epel을 불러와 yum으로 설치되지 않는 패키지를 설치하도록 도와주는 걸 볼 수 있습니다.

 

 

포트 확인은

 

# nmap localhost

반응형

Centos, 센토스 server minimal 이후 추가 설치

Server 관리/Linux
반응형

# 참조 : https://seokk.tistory.com/46

 

 

설치 환경 : CentOS 7 minimal (최소설치)

 

VMware에 설치합니다.

 

 

운영체제 파일은 CentOS 다운로드 사이트에서 minimal.iso를 다운받습니다.

 

설치 시작 전 네트워크 설정을 VMware NAT로 설정하였고

 

 

다운로드한 CentOS 7 minimal.iso를 import 했습니다.

 

 

 

 

 

 

 

 

설치 과정 동안 한글로 번역되어 보이도록 하고 '계속진행'을 클릭합니다.

 

 

 

]

 

 

 

디스크 공간은 자동으로 설정해서 설치해도 되지만

 

조금이라도 권장사항에 따라 설치하기 위해

 

 

 

 

 

 

파티션 설정을 클릭해 완료버튼을 클릭합니다.

 

 

 

 

 

 

제타위키에서 리눅스 스왑메모리 크기 권고사항 에 따라

VMware의 RAM을 1G로 설정한 바

 

RAM이 2G 미만일 경우 swap공간은 RAM의 2배를 권장한다.

 

그러므로 swap 공간을 2G로 설정하고 그 외 /boot 500M 와 나머지 용량은 /(root)로 지정하였다.

 

 

 

 

 

 

완료를 클릭한다

 

 

 

 

 

 

설치 시작 전 네트워크를 VMware NAT로 설정해두었기 때문에

 

유선 연결을 키면 바로 IP가 자동할당된다

 

 

 

설치시작을 클릭한다

 

 

 

 

 

 

ROOT암호만 설정해도 되고, 둘다 설정해도 된다.

 

 

 

 

 

 

ROOT 암호를 설정하고 완료버튼을 클릭한 다음 설치가 완료되길 대기한다

 

 

 

설치가 완료되면 재부팅 버튼이 오른쪽 하단에 생기며

 

재부팅 버튼을 클릭한다

 

 

 

 

 

 

 

설치가 정상적으로 되어 부팅된 것을 볼 수 있다.

 

 

 

이제 몇가지 필요한 것을 설치해본다.

 

 

 

네트워크를 이용해 필요한 도구를 설치하므로

 

 

네트워크 설정을 하지 않은 경우

$vi /etc/sysconfig/network-scripts/ifcfg-enpXXX

 

위 경로의 파일을 열어 필요 부분을 수정한다.

기본적으로 DHCP 사용하도록 설정되어 있으므로 ONBOOT=NO 부분을 ONBOOT=YES로 수정하거나

DHCP를 사용하지 않고 고유한 IP사용할 경우 사용할 IP 직접 입력한다.

 

설정 후 반드시

# systemctl restart network

# systemctl restart NetworkManager

를 실행하도록 한다

 

 

다음 진행과정 동안은 root로 접근하여 설치 및 설정하도록 한다

 

 

CentOS7에서 'ifconfig'명령어는 기본 설치에서 제외되어 있으므로

 

 

'Ip addr' 명령어로 네트워크가 잘 설정되어 있는 지 확인 후 다음 과정을 진행하도록 한다.

 

 

 

Ifconfig 외 네트워크 도구를 사용할 테니 Net-tools를 설치하도록 한다.

 

 

 

 

 

net-tools 설치 완료

 

 

* nmtui 명령어를 사용해 host-name과 network 설정을 할 수 있다.

 

아직 난 호스트이름을 설정하지 않아 @뒤 localhost로 뜬다.

 

호스트이름은 따로 설정해두록 하자.

 

 - 호스트이름 설정 명령 : # hostnamectl set-hostname [호스트 이름]

 

 

 

 

외부에서 원격접속하여 들어가는 경우가 많으므로 ssh를 설치하도록 하자.

 

 

 

 

 

 

openssh-server 설치 완료

 

 

 

 

부팅 시 자동 서비스 시작을 위해 위와 같이 입력하여 설정해준다

 

 

또한,

 

 

위 경로의 파일에서

 

몇가지 주석과 설정을 하도록한다.

 

 

 

 

 

Port 22

AddressFamily inet

LoginGraceTime 2m

PermitRootLogin no

PermitEmptyPasswords no

X11Forwarding no

UseDNS no

 

위 목록을 찾아 주석과 설정을 수정하고 저장한다.

 

 

 

VMware에 설치했다면 open-vm-tools도 설치하여

community update, opensource version, host 시간 동기화를 지원 받도록 한다.

 

 

 

SELinux는 보안을 강화해주는 보안강화커널로 zero-day attack, buffer overflow 등

취약점으로 인한 해킹을 방지해주는 핵심 구성요소다

 

하지만 접근권한의 제한을 받거나 특정 서비스가 SELinux로 인해

동작하지 않은 경우가 발생한다

 

SELinux를 끄도록 한다.

 

* SELinux를 끄기보단 해당 서비스가 SELinux 하에서 잘 동작하도록 설정하는 것을 권장한다.

 

 

 

 

위 경로의 파일로 이동해 수정한다

 

 

 

 

 

SELINUX=enforcing 이라고 되어있는 부분을 SELINUX=disabled로 변경해준다.

 

 

 

firewalld(방화벽)에 의해 iptables룰이 생성됨으로 firewalld를 비활성화 및 중지하고

 iptables와 관련된 패키지를 설치하도록 한다.

 

 

 

firewalld 비활성화 및 중지

 

* stop - 중지   dismask - 서비스제거   disable - 부팅 시작시 비활성화

 

 

 

 

iptables 관련 패키지 설치

 

 

 

 

설치 완료

 

 

 

부팅시 시작하도록 iptables 생성 및 설정

 

 

 

타임존 확인 및 설정

 

 

 

타임존 확인은 위 명령어로 확인한다.

 

 

 

위와 같이 뜬다.

 

 

만약, timedatectl이 작동하지 않는다면 ntpd가 설치되어 있지 않은 것이다.

 

뜨지 않는 다면 다음과 과정을 수행하도록 한다

 

# yum install ntpd <-- 설치

# systemctl start ntpd

# systemctl enable ntpd

#timedatectl <-- 확인

 

 

 

추가로 타임존 위치를 변경하려면

 

그 변경가능한 리스트 확인은

 

# timedatectl list-timezones

 

위 명령으로 확인한다.

 

 

만약, 서울로 타임존을 설정한다면

 

 

변경가능한 리스트의 내용중에서 Seoul 검색

 

 

 

서울타임존 검색 됨

 

 

 

위 타임존으로 설정

 

 

 

timedatectl로 타임존이 변경된 걸 확인할 수 있다.

 

 

 

그 외 추가로 epel을 설치해주도록 하자

 

* epel(Extra Packages of enterprise Linux) : yum으로 설치되지 않는 패키지를 설치되도록 도와주는 리눅스 추가 패키지

 

 

 

 

* nmap :  포트를 스캔해주는 툴로 호스트나 네트워크 스캐닝시 사용하는 도구

 

 

설치 과정을 살펴보면 첫부분에서 epel을 불러와 yum으로 설치되지 않는 패키지를 설치하도록 도와주는 걸 볼 수 있습니다.

 

 

포트 확인은

 

# nmap localhost

반응형

python 버전 관리

Python, 파이썬
반응형

1. which python

 

2. rm /usr/bin/python

 

3. ln -s /usr/bin/python3.8 /usr/bin/python

 

4. python -V

 

반응형

'Python, 파이썬' 카테고리의 다른 글

print.format.text.lpad.rpad  (0) 2022.12.18
Ubuntu.pip3 설치  (0) 2022.09.27
유튜브 업로드  (0) 2021.04.06
기차표 예매 (SRT)  (0) 2021.04.06
python.gmail.로그인.메일발송  (0) 2020.06.15

MLflow.1.Quick Review ( 오작동 일부 수정 )

인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow/MLFlow
반응형

# 참조 : https://dailyheumsi.tistory.com/257?category=980484

 

사전 준비

  • 파이썬 3.8.7과 가상환경
$ python --version
Python 3.8.7

Quick Start

설치

$ pip install mlflow
$ mlflow --version
mlflow, version 1.15.0

 

기본 동작 이해하기

예제 코드를 받기 위해 mlflow 공식 github 코드도 다운받자.
이후 examples/quickstart 경로로 들어가자

$ git clone https://github.com/mlflow/mlflow
$ cd mlflow/examples/quickstart
$ ls -al
total 8
drwxr-xr-x   5 heumsi  staff  160  4 24 14:20 .
drwxr-xr-x  31 heumsi  staff  992  4 24 14:18 ..
-rw-r--r--   1 heumsi  staff  494  4 24 14:18 mlflow_tracking.py

mlflow_tracking.py 라는 파일이 보이는데, 이 파일은 이렇게 생겼다.

# mlflow_tracking.py

import os
from random import random, randint

from mlflow import log_metric, log_param, log_artifacts

if __name__ == "__main__":
    print("Running mlflow_tracking.py")

    log_param("param1", randint(0, 100))

    log_metric("foo", random())
    log_metric("foo", random() + 1)
    log_metric("foo", random() + 2)

    if not os.path.exists("outputs"):
        os.makedirs("outputs")
    with open("outputs/test.txt", "w") as f:
        f.write("hello world!")

    log_artifacts("outputs")

mlflow 패키지로부터 다음 세 개를 가져와 사용하는 것을 알 수 있다.

  • log_param
  • log_metric
  • log_artifacts

log 라는 이름만 봐도 뭔가를 기록하는 동작을 하는구나하고 감이온다.

이제 이 파일을 파이썬으로 실행해보자.

$ python mlflow_tracking.py
Running mlflow_tracking.py

실행하고 나면 다음과 mlruns  outputs 디렉토리가 생겨있다.

$ ls -al
total 8
drwxr-xr-x   5 heumsi  staff  160  4 24 14:20 .
drwxr-xr-x  31 heumsi  staff  992  4 24 14:18 ..
-rw-r--r--   1 heumsi  staff  494  4 24 14:18 mlflow_tracking.py
drwxr-xr-x   4 heumsi  staff  128  4 24 14:20 mlruns
drwxr-xr-x   3 heumsi  staff   96  4 24 14:20 outputs

어떻게 생겨있는지 tree 로 확인해보면

디렉토리를 보면 다음 세 디렉토리가 눈에 띈다.

  • artifacts
  • metrics
  • params

음.. 아까 log_param 등의 함수로 기록했던게 여기 있을거 같다.
위 디렉토리들 내부에 있는 파일을 까서 확인해보자.,

역시 그렇다.
log_param, log_metric 함수로 넘겼던 값들이 위 파일들에 기록된다.
특히 metric 의 경우 (위에서 metrics/foo, 왼쪽에서 두 번째 파일) 타임스탬프가 같이 기록되는 것을 알 수 있다.

 

웹 대시보드

mlflow ui 명령어로 대시보드용 웹서버를 띄울 수 있다고 한다.

$ mlflow ui
# 주의 : "mlflow ui" 를 실행하는 디렉토리는 mlruns 가 생성되어 있는 곳이어야 한다.

[2021-04-24 15:57:58 +0900] [59547] [INFO] Starting gunicorn 20.1.0
[2021-04-24 15:57:58 +0900] [59547] [INFO] Listening at: http://127.0.0.1:5000 (59547)
[2021-04-24 15:57:58 +0900] [59547] [INFO] Using worker: sync
[2021-04-24 15:57:58 +0900] [59549] [INFO] Booting worker with pid: 59549

http://127.0.0.1:5000 로 들어가보면

방금 파일로 기록된 내용들이 대시보드에 등장하는 것을 알 수 있다.
Artifact Location 을 보면 웹 서버가 파일을 어느 디렉토리에 마운트해서 읽어오는지 알 수 있다.

 

MLflow 프로젝트

이번엔 실제 ML 모델에 mlflow 를 적용해보자.
mlflow/examples/ 에 예제가 꽤 많이 있는데, 여기서는 scikit-learn 모델을 사용해본다.

먼저 scikit-learn 을 설치한다.

$ pip install sklearn
$ python -c "import sklearn; print(sklearn.__version__)"
0.24.1

mlflow/examples 에 가보면 중간에 이렇게 sklearn 모델 예제들이 있다.

$ ls -al
...
drwxr-xr-x   5 heumsi  staff   160  4 24 14:18 sklearn_elasticnet_diabetes
drwxr-xr-x   7 heumsi  staff   224  4 24 14:18 sklearn_elasticnet_wine
drwxr-xr-x   5 heumsi  staff   160  4 24 14:18 sklearn_logistic_regression

이 중에서 우리는 sklearn_elasticnet_wine 을 사용해본다.

sklearn_elasticnet_wine 의 패키지 구조는 다음과 같다.

$ tree sklearn_elasticnet_wine
sklearn_elasticnet_wine
├── MLproject
├── conda.yaml
├── train.ipynb
├── train.py
└── wine-quality.cs

핵심이 되는 MLproject 를 먼저 확인해보면

# MLProject

name: tutorial

conda_env: conda.yaml

entry_points:
  main:
    parameters:
      alpha: {type: float, default: 0.5}
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py {alpha} {l1_ratio}"

MLProject  sklearn_elasticnet_wine 에 대한 전체적인 소개와 설정 값들을 담은 프로젝트 파일이라 볼 수 있다.

다음으로 train.py 를 확인해보면

# train.py

import os
import warnings
import sys

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
from urllib.parse import urlparse
import mlflow
import mlflow.sklearn

import logging

logging.basicConfig(level=logging.WARN)
logger = logging.getLogger(__name__)


def eval_metrics(actual, pred):
    rmse = np.sqrt(mean_squared_error(actual, pred))
    mae = mean_absolute_error(actual, pred)
    r2 = r2_score(actual, pred)
    return rmse, mae, r2


if __name__ == "__main__":
    warnings.filterwarnings("ignore")
    np.random.seed(40)

    # Read the wine-quality csv file from the URL
    csv_url = (
        "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
    )
    try:
        data = pd.read_csv(csv_url, sep=";")
    except Exception as e:
        logger.exception(
            "Unable to download training & test CSV, check your internet connection. Error: %s", e
        )

    # Split the data into training and test sets. (0.75, 0.25) split.
    train, test = train_test_split(data)

    # The predicted column is "quality" which is a scalar from [3, 9]
    train_x = train.drop(["quality"], axis=1)
    test_x = test.drop(["quality"], axis=1)
    train_y = train[["quality"]]
    test_y = test[["quality"]]

    alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5
    l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5

    with mlflow.start_run():
        lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
        lr.fit(train_x, train_y)

        predicted_qualities = lr.predict(test_x)

        (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)

        print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))
        print("  RMSE: %s" % rmse)
        print("  MAE: %s" % mae)
        print("  R2: %s" % r2)

        mlflow.log_param("alpha", alpha)
        mlflow.log_param("l1_ratio", l1_ratio)
        mlflow.log_metric("rmse", rmse)
        mlflow.log_metric("r2", r2)
        mlflow.log_metric("mae", mae)

        tracking_url_type_store = urlparse(mlflow.get_tracking_uri()).scheme

        # Model registry does not work with file store
        if tracking_url_type_store != "file":

            # Register the model
            # There are other ways to use the Model Registry, which depends on the use case,
            # please refer to the doc for more information:
            # https://mlflow.org/docs/latest/model-registry.html#api-workflow
            mlflow.sklearn.log_model(lr, "model", registered_model_name="ElasticnetWineModel")
        else:
            mlflow.sklearn.log_model(lr, "model")

전체적으로 머신러닝 모델을 학습하고 테스트하는 코드다. 다만 중간 중간에 다음 함수들이 눈에 띈다.

  • mlflow.log_param
  • mlflow.log_metric
  • mlflow.sklearn.log_model
  • mlflow 의 이 함수들을 사용하여 파라미터 값이나 결과 값을 기록하는 것을 알 수 있다.

이제 이 MLflow 프로젝트를 실행해보자.
mlflow run 명령어를 사용한다. (참고로 나는 conda 사용안할거기 때문에 --no-conda 옵션을 주었다)

$ mlflow run sklearn_elasticnet_wine -P alpha=0.5 --no-conda

2021/04/24 14:40:43 INFO mlflow.projects.utils: === Created directory /var/folders/nr/8lrr92zn1rbbsrtm7nnzfp800000gn/T/tmpbdfgejik for downloading remote URIs passed to arguments of type 'path' ===
2021/04/24 14:40:43 INFO mlflow.projects.backend.local: === Running command 'python train.py 0.5 0.1' in run with ID 'f2bec5126785418b9ba84a67a9a86d92' ===
Elasticnet model (alpha=0.500000, l1_ratio=0.100000):
  RMSE: 0.7460550348172179
  MAE: 0.576381895873763
  R2: 0.21136606570632266
2021/04/24 14:40:48 INFO mlflow.projects: === Run (ID 'f2bec5126785418b9ba84a67a9a86d92') succeeded ===

위 명령어를 실행하고 나면 동일 경로에 다음처럼 mlruns 디렉토리가 생기고, 다음처럼 생겼다.

$ ls -al
...
drwxr-xr-x   4 heumsi  staff   128  4 24 14:37 mlruns
...

$ tree mlruns -L 3
mlruns
└── 0
    ├── e36ebff4f2444161af4472b3a11d408b
    │   ├── artifacts
    │   ├── meta.yaml
    │   ├── metrics
    │   ├── params
    │   └── tags
    └── meta.yaml

전체적인 구성은 위에서 본 예제와 거의 같다.
다시 mlflow ui 명령어로 대시보드 웹서버를 실행시킨 뒤 접속해서 이를 확인해보자

$ mlflow ui
# 주의 : "mlflow ui" 를 실행하는 디렉토리는 mlruns 가 생성되어 있는 곳이어야 한다.

[2021-04-24 15:57:58 +0900] [59547] [INFO] Starting gunicorn 20.1.0
[2021-04-24 15:57:58 +0900] [59547] [INFO] Listening at: http://127.0.0.1:5000 (59547)
[2021-04-24 15:57:58 +0900] [59547] [INFO] Using worker: sync
[2021-04-24 15:57:58 +0900] [59549] [INFO] Booting worker with pid: 59549

방금 돌린 모델이 잘 들어가있는 것을 알 수 있다.

 

모델 서빙

이번엔 mlflow/examples 내에 있는 sklearn_logistic_regression MLflow 프로젝트를 살펴보자.
sklearn_logistic_regression 의 내부 구조는 이렇다.

$ tree sklearn_logistic_regression
sklearn_logistic_regression
├── MLproject
├── conda.yaml
└── train.py

train.py 는 이렇게 생겼다.

# train.py

import numpy as np
from sklearn.linear_model import LogisticRegression

import mlflow
import mlflow.sklearn

if __name__ == "__main__":
    X = np.array([-2, -1, 0, 1, 2, 1]).reshape(-1, 1)
    y = np.array([0, 0, 1, 1, 1, 0])
    lr = LogisticRegression()
    lr.fit(X, y)
    score = lr.score(X, y)
    print("Score: %s" % score)
    mlflow.log_metric("score", score)
    mlflow.sklearn.log_model(lr, "model")
    print("Model saved in run %s" % mlflow.active_run().info.run_uuid)

위 예제들과 별반 다른바 없는 코드다.
이제 이 파일을 파이썬으로 실행한다.

$ python sklearn_logistic_regression/train.py --no-conda
Score: 0.6666666666666666
Model saved in run 40cfabcdc6d2439fa97ca3d98bfe1ea1

결과물은 역시 ./mlruns 에 추가된다.
40cfabcdc6d2439fa97ca3d98bfe1ea1 라는 id 를 가지고 새로운 디렉토리가 추가되었음을 알 수 있다.

mlruns
└── 0
    ├── 40cfabcdc6d2439fa97ca3d98bfe1ea1
    │   ├── artifacts
    │   ├── meta.yaml
    │   ├── metrics
    │   ├── params
    │   └── tags
    ├── e36ebff4f2444161af4472b3a11d408b
    │   ├── artifacts
    │   ├── meta.yaml
    │   ├── metrics
    │   ├── params
    │   └── tags
    └── meta.yaml

웹 대시보드에도 역시 추가가 되어있는걸 확인할 수 있다.

이제 이 MLflow 프로젝트를 서빙하는 서버를 띄워보자.
mlflow models serve -m runs:/<RUN_ID>/model 명령어로 가능하다.
이 때 RUN_ID 는 위에서 확인한 40cfabcdc6d2439fa97ca3d98bfe1ea1 를 넣어주면 된다.

$ mlflow models serve -m runs:/40cfabcdc6d2439fa97ca3d98bfe1ea1/model --no-conda --port 5001 --host 0.0.0.0
...

2021/04/24 15:32:49 INFO mlflow.models.cli: Selected backend for flavor 'python_function'
2021/04/24 15:32:49 INFO mlflow.pyfunc.backend: === Running command 'gunicorn --timeout=60 -b 127.0.0.1:5001 -w 1 ${GUNICORN_CMD_ARGS} -- mlflow.pyfunc.scoring_server.wsgi:app'
[2021-04-24 15:32:49 +0900] [58843] [INFO] Starting gunicorn 20.1.0
[2021-04-24 15:32:49 +0900] [58843] [INFO] Listening at: http://127.0.0.1:5001 (58843)
[2021-04-24 15:32:49 +0900] [58843] [INFO] Using worker: sync
[2021-04-24 15:32:49 +0900] [58845] [INFO] Booting worker with pid: 58845
[2021-04-24 15:32:49 +0900] [58843] [INFO] Handling signal: winch

서버가 제대로 잘 동작 하는지 다음처럼 curl 로 요청을 날려보자. 엔드포인트는 /invocations 다.

https://www.mlflow.org/docs/latest/tutorials-and-examples/tutorial.html

Linux>
curl -X POST -H "Content-Type:application/json; format=pandas-split" --data '{"columns":["alcohol", "chlorides", "citric acid", "density", "fixed acidity", "free sulfur dioxide", "pH", "residual sugar", "sulphates", "total sulfur dioxide", "volatile acidity"],"data":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}' http://192.168.202.133:5001/invocations

Windows>
curl -X POST -H "Content-Type:application/json; format=pandas-split" --data "{\"columns\":[\"alcohol\", \"chlorides\", \"citric acid\", \"density\", \"fixed acidity\", \"free sulfur dioxide\", \"pH\", \"residual sugar\", \"sulphates\", \"total sulfur dioxide\", \"volatile acidity\"],\"data\":[[12.8, 0.029, 0.48, 0.98, 6.2, 29, 3.33, 1.2, 0.39, 75, 0.66]]}" http://192.168.202.133:5001/invocations

[4.132771301547059]

# 아래는 에러 나서 안됨.
# $ curl -d '{"columns":["x"], "data":[[1], [-1]]}' -H 'Content-Type: application/json; format=pandas-split' -X POST localhost:5001/invocations
# [1, 0]

응답이 잘 오는 것을 확인할 수 있다.

 

그 외

여기서 살펴보지 않았지만, CLI 커맨드만 보면 대략 어떤 기능들이 더 있는지 알 수 있다.

후기

  • MLflow는 머신러닝 모델을 train, test, validation 할 때마다 그 값들을 기록해주는 툴이다.
    • 웹 대시보드가 좀 이쁘네.
    • 아직 뭔가 컨텐츠가 많이는 없는거 같은데, 개발이 더 되거나 플러그인이 더 있지 않을까?
    • 일단 간단하게 시작할 때 써먹기 좋을듯 하다!
  • 다만 모델러가 MLflow를 알아야 하는 의존성이 생기긴 하네.
    • 모델러의 코드 파일에 MLflow 코드가 일부 들어갈텐데, 이는 감안해야 하는걸까?
  • 변수, 함수명, 프로젝트 패키지 등에서 네이밍이 아주 직관적이고 간단 명료해서 좋았다.
  • 서빙까지 지원해주는 것도 인상적이다. 내부적으로 어떻게 돌아가는 걸까?
반응형

'인공지능,AI,학습,ML,Tensorflow, Cafee2,MLFlow > MLFlow' 카테고리의 다른 글

MLflow.5.Model Registry  (0) 2021.12.27
MLflow.4.Tracking Server  (0) 2021.12.27
MLflow.3.Experiments & Runs  (0) 2021.12.24
MLflow.2.Automatic logging  (0) 2021.12.24
MLFlow.DB.확인방법  (0) 2021.08.31

(작성중) Git, Github

Git, Github
반응형

$ sudo apt update & apt upgrade

$ sudo apt-get update

$ sudo apt-get install git-core
$ sudo apt-get install update

$ sudo git --version

$ sudo git config --global user.name "my id"

$ sudo git config --global user.email "my email"

$ sudo git config --global color.ui "auto"

$ mkdir productdirectory

# 참조 : https://www.youtube.com/watch?v=RNlb-3isGpk 

# 참조 : https://www.youtube.com/watch?v=W9zTttHeoHk

# 현재 모든 소스 로컬 git 에 추가후 git hub 에 githubtoken 으로 push 하기

$ git init

$ git add .

$ git status

$ git commit -m "Initial commit"

$ git status

( 바로 아래줄 사용 ) $ git remote add origin https://github.com/mygithub/repo.git #  개별 git 에서 Code > HTTPS > URL

$ git remote set-url origin https://{id}:{token}@github.com/mygithub/repo.git # 토큰은 github > settings > 왼쪽메뉴 제일 아래 Developer settings > Personal access tokens > Tokens (classic) > Token 생성 (일반적인 권한 : repo/ workflow/ gist/ user/ )

$ git push origin master

 

 

반응형

'Git, Github' 카테고리의 다른 글

Github Action 사용법  (0) 2022.01.25

Fluent API, 빌더 패턴

IT 용어, 인터넷 활용 등등
반응형

Method Chaining ...

반응형

'IT 용어, 인터넷 활용 등등' 카테고리의 다른 글

Dell, Linux, Ubuntu, TouchScreen, Off  (0) 2022.01.28
MAU, MCU, DAU, ACU  (0) 2022.01.21
Template Meta Programming  (0) 2021.11.14
JWT ( JSON Web Token )  (0) 2021.08.19
Software.Architect.AA, TA, DA, QA, BA  (0) 2020.08.21