Search
Duplicate

MLflow와 Google Cloud Platform 연동(3) - 연동

태그
MLflow
Google Cloud Platform
Docker
<Table of Contents>
본 포스팅은 앞선 포스팅에서 설명한 코드를 바탕으로, GCP와 MLflow를 연동하는 시간을 가지도록 하겠습니다.
제가 실제로 연동하는 과정에서 실패한 경우에 대한 원인과 그에 대한 해결책도 함께 포함하고 있어요.
그래서 저도 나중에 제 글을 읽으면서 도움이 많이 될 것 같다고 생각합니다

1차 Deploy 시도

모든 코드에 대한 설명이 끝났습니다.
그럼 바로 make deploy command를 통해 VM 인스턴스를 생성하고 실행하는 과정을 수행해봅시다!
jihoahn9303@DESKTOP-THFN71S:~/mlflow-with-gcp$ make deploy IMAGE_TAG=v1
Bash
복사
VM 인스턴스가 생성되고 실행되는 것까지는 확인했습니다.
But, curl 명령어를 통해 도커 공식 이미지를 다운로드 받는 것에 실패하고 말았습니다
무엇이 문제였을까요?

Cloud NAT

VM 인스턴스가 처음 생성된 순간에는, 인스턴스 외부와 통신할 수 있는 수단이 없습니다.
따라서, VM 인스턴스에서 통신 수단을 마련하기 위하여 GCP에서는 Cloud NAT API를 제공하고 있습니다.
1.
GCP Console에서 Cloud NAT를 검색하여 선택합니다.
2.
우측의 시작하기 버튼을 클릭합니다. (이전에 게이트웨이를 생성한 적이 있다면, 좌측 상단에 Cloud NAT 게이트웨이 만들기 버튼을 클릭하세요.)
3.
게이트웨이의 이름은 원하는 대로 입력하시면 됩니다.
4.
Cloud Router의 네트워크는 default 로 선택합니다. VM 인스턴스 생성 시, 특별한 설정을 하지 않았다면 기본 네트워크로서 default를 채택합니다.
5.
리전의 경우 자신의 위치에 알맞게 선택해주세요.
6.
Cloud Router를 생성해주세요. 이때, 이름은 원하시는 것으로 하셔도 됩니다.
7.
나머지 설정은 아래 그림과 같이 진행해주시고, 만들기 버튼을 클릭해주세요.

2차 Deploy 시도

Cloud NAT까지 설정하여, VM 인스턴스에서 도커 홈페이지에서 공식 이미지를 받을 수 있도록 수행하였습니다.
이에 따라, make deploy command를 다시 실행한 후, VM 인스턴스의 직렬 포트 로그를 확인하였습니다.
도커가 정상적으로 설치되었고, 이에 따라 Artifact Registry에서 사전에 push한 도커 이미지를 pull하는 모습을 보실 수 있습니다.
마지막에는, gunicorn을 통해 MLflow 서버가 HTTP 연결을 listening하고 있는 모습을 확인할 수 있습니다.
이제 브라우저에서 http://localhost:6100 로의 연결을 수행하겠습니다.
Oh.. my…. 이게 어떻게 된 것일까요?
우리는 분명히 run-server.sh 스크립트에서 MLflow 서버 구동시에 모든 호스트(0.0.0.0)에 대해 연결 가능하도록 명시하였습니다..
무엇이 문제일까요…?

터널링

혹시 create-server.sh 스크립트에서 설명 드린 내용 중 기억나는 내용이 있을까요?
gcloud compute instances create 명령어를 통해 VM 인스턴스를 생성할 당시에, —no-address 키워드를 명시하였습니다. 이를 통해 VM 인스턴스의 External IP를 별도로 지정하지 않았습니다.
따라서, VM 인스턴스 외부에서 VM 인스턴스 내부로 접근할 수 없는 것입니다.
해당 상황을 도식화하면 아래 그림과 같습니다.
현재 MLflow Tracking Server는 VM 인스턴스 내부에 있는 도커 컨테이너 위에서 구동중입니다.
6100번 포트
클라이언트는 VM 인스턴스로 트래픽을 보내지만, VM 인스턴스는 모든 접근에 대하여 Blocking 상태입니다.
이에 따라, 클라이언트는 VM 인스턴스 내부로 접속할 수 없습니다.
결론적으로 클라이언트에서 MLflow server에 직접 접근할 수 있는 방법이 없는 상태입니다.
해당 문제를 해결하기 위해서는 터널링을 통해 클라이언트의 트래픽을 HTTP 커넥션에 전송해야합니다. 이를 바탕으로, 클라이언트가 VM 인스턴스의 특정 포트(port)에 접근 가능하도록 설정하는 것입니다.
GCP에서는 gcloud compute ssh 명령어를 바탕으로 VM 인스턴스의 특정 포트에 대하여 터널링을 수행하는 것이 가능합니다. 한 번 명령어를 실행해봅시다.
# gcloud compute ssh <VM-instance name> --zone <zone name> --tunnel-through-iap -- -N -L <External port number>:<VM-instance IP>:<VM-instance IP port number> $ gcloud compute ssh e2eml-jiho-mlflow \ --zone asia-northeast3-c \ --tunnel-through-iap \ -- -N -L 6100:localhost:6100
Bash
복사
지정한 VM 인스턴스에 대하여 터널링을 수행합니다.
클라이언트의 6100번 포트VM 인스턴스의 6100번 포트와 연결합니다.
따라서, 클라이언트에서 6100번 포트를 통해 VM 인스턴스의 6100번 포트에 접속할 수 있습니다.
VM 인스턴스의 6100 포트에서는 MLflow server에 대한 도커 컨테이너가 구동중입니다.
결과적으로, 클라이언트 브라우저에서 http://localhost:6100에 접속할 경우, MLflow Server UI를 확인할 수 있습니다.

3차 Deploy 시도

이제 이론적으로 브라우저에서 MLflow Tracking Server에 접속할 수 있게 되었습니다.
실제로 이를 실행해봅시다.
짜잔
이처럼, MLflow Tracking Server의 초기 화면을 확인하실 수 있습니다.
또한, Artifact Location으로 사전에 지정한 Cloud Storage의 버킷 주소가 지정된 것이 보이네요

샘플 데이터 로깅

마지막으로 로컬을 통해 MLflow - GCP 간 연동이 확실하게 되었는 지 확인해보도록 하겠습니다.
# ./examples/connecting-to-tracking-server.py from pathlib import Path from random import random import mlflow def main(): mlflow.set_tracking_uri("http://localhost:6100") experiment_name = "playground" try: mlflow.create_experiment(experiment_name) except mlflow.exceptions.RestException: # type: ignore pass mlflow.set_experiment(experiment_name) with mlflow.start_run() as run: mlflow.log_param("test", 13) mlflow.log_metric("foo", random()) tmp_txt_path = "tmp.txt" Path(tmp_txt_path).write_text("Everything is working!") mlflow.log_artifact(tmp_txt_path) Path(tmp_txt_path).unlink() if __name__ == "__main__": main()
Python
복사
MLflow Tracking Server에 메타데이터(파라미터, 메트릭)와 아티팩트(tmp.txt)를 로깅하는 코드입니다.
다음 명령어를 통해 해당 코드를 수행해봅시다!
$ poetry run python examples/connecting-to-tracking-server.py
Bash
복사
먼저, tracking server에는 다음과 같이 메타데이터와 아티팩트 정보를 확인할 수 있습니다.
그렇다면, GCP에 위치한 Artifact store(Cloud Storage bucket)에 아티팩트가 정상적으로 저장 되었을까요?
그림에서 나온 바와 같이 tmp.txt 파일이 정상적으로 저장된 것을 확인하실 수 있습니다

정리

이번 포스팅에서는 실제로 MLflow-GCP 간 연동을 실행하였고, 그 과정에서 마주한 몇 가지 문제점에 대해 고찰해보는 시간을 가졌습니다.
다음 포스팅에서는 ML 실험을 실행하여 나온 결과물을 MLflow Tracking 서버에 기록하고, 관련 Artifact를 GCP에서 확인하도록 하겠습니다!
그럼 안녕히 가세요
위로 올라가기
뒤로 가기
Reference