MLflow w chmurze

May 09 2023
W tym artykule opowiem o tym, jak hostować mlflow w chmurze (AWS i GCP), przeprowadzać eksperymenty uczenia maszynowego, rejestrować parametry, metryki i przechowywać model w rejestrze modeli Czym jest mlflow? mlflow to platforma typu open source, która zarządza kompleksowym cyklem życia uczenia maszynowego. Jego główne funkcje to: Możemy uruchamiać mlflow na lokalnych maszynach, ale hostowanie go w chmurze ma swoje zalety. W mlflow mamy następujące 3 główne komponenty: Powyższy schemat architektury pokazuje, jakie są wszystkie wymagane przez nas usługi AWS i jak wchodzą w interakcję aby hostować mlflow na AWS.

W tym artykule opowiem o tym, jak hostować mlflow w chmurze (AWS i GCP), przeprowadzać eksperymenty uczenia maszynowego, rejestrować parametry, metryki i przechowywać model w rejestrze modeli

Co to jest mlflow?

mlflow to platforma typu open source, która zarządza kompleksowym cyklem życia uczenia maszynowego. Jego główne funkcjonalności to:

  1. Śledzenie eksperymentów: utrzymuje wszystkie eksperymenty uczenia maszynowego i możliwość wysyłania do nich zapytań
  2. Powtarzalność: zawiera kod uczenia maszynowego i jest w stanie odtworzyć te wyniki na dowolnej platformie
  3. Wdrażanie: Możliwość wdrażania modeli ML w różnych środowiskach (np. AWS Sagemaker, GCP Cloud run itp.)
  4. Rejestr modelu: przechowywanie wielu wersji modelu w scentralizowanym repozytorium

Możemy uruchamiać mlflow na lokalnych maszynach, ale hosting w chmurze ma swoje zalety

  1. Możemy wykorzystać pamięć masową w chmurze, moc obliczeniową, bezpieczeństwo itp
  2. Scentralizowany widok wszystkich eksperymentów każdego członka zespołu

Mamy następujące 3 główne komponenty w mlflow:

  1. Pulpit nawigacyjny: To interfejs użytkownika, w którym możemy zobaczyć listę eksperymentów, parametry modelu, metryki itp. dla każdego eksperymentu
  2. Meta Store: Wykorzystuje wewnętrzną bazę danych (MySql) do przechowywania wszystkich eksperymentów, parametrów, metryk itp.
  3. Artifactory Store: Używa tego do dużych plików, takich jak serializowany model. Zasadniczo używamy rozproszonych systemów plików, takich jak Amazon S3 lub GCP Cloud Storage.
  1. Doker
  2. Baza danych MySql
  3. Rozproszony system plików
Architektura MLflow-AWS

Powyższy diagram architektury pokazuje, jakie są wszystkie usługi AWS, których potrzebowaliśmy i jak wchodzą w interakcje, aby hostować mlflow na AWS. Zamierzamy uruchomić mlflow przy użyciu AWS Fargate, który jest bezserwerowy.

Najpierw musimy utworzyć plik dokera, który spakuje mlflow i jego zależności. W pliku wymagania.txt definiujemy następujące zależności

Plik dokera do instalacji mlflow i uruchamiania serwera

Plik dokera zawiera wiadra i inne szczegóły połączenia z bazą danych jako zmienne, te wartości zostaną skonfigurowane jako zmienne środowiskowe w definicji zadania Fargate

Gdy mamy plik dokera, uruchom poniższe polecenie, aby zbudować obraz dokera

docker build -t mlflowtracker .

Utwórz repozytorium AWS ECR

Teraz musimy wypchnąć obraz dokera, który utworzyliśmy lokalnie, do rejestru kontenerów w AWS.

# Login 
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag

# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag

Następnie potrzebujemy MySql for mlflow do przechowywania metainformacji, dla których stworzymy instancję AWS RDS MySql

Aby dowiedzieć się, jak utworzyć MySql w AWS RDS, kliknij tutaj

Musimy utworzyć wiadro S3 dla mlflow do przechowywania artefaktów modelu. Przejdź do konsoli aws, wyszukaj s3, podaj nazwę zasobnika i upewnij się, że zablokowałeś cały dostęp publiczny, a następnie kliknij „Utwórz zasobnik”

Utwórz zasobnik S3

Następnie musimy utworzyć klaster AWS ECS, wybierając fargate jako obliczenia. Przejdź do konsoli aws i wyszukaj usługę elastycznego kontenera, a następnie kliknij „Utwórz klaster”. Na stronie tworzenia klastra podaj nazwę klastra, wybierz vpc i podsieć. Domyślnie wybrana byłaby opcja fargate.

Utwórz klaster ECS

W ECS zadanie jest jednostką na poziomie szczegółowym, która uruchamia obraz dokera, jest podobny do kapsuły w kubernetes. Musimy więc utworzyć definicję zadania, która będzie wykorzystywać obraz dockera, który wgraliśmy do ECR. Tutaj definiujemy wartości zmiennych środowiskowych. Aby utworzyć definicję zadania, przejdź do Amazon Elastic Container Service > Definicje zadań > Utwórz nową definicję zadania i podaj nazwę zadania, identyfikator uri obrazu przesłany do ECR, port kontenera i zmienne środowiskowe

Definicja zadania ECS

Podczas tworzenia definicji zadania wybierz rolę ecsTaskExecution , która jest tworzona automatycznie przez AWS, upewnij się, że dodałeś politykę dostępu s3, aby mogła czytać i zapisywać do kubełka s3

Po utworzeniu definicji zadania musimy utworzyć usługę, która korzysta z utworzonej powyżej definicji zadania. Podczas tworzenia usługi możemy wybrać minimalną i maksymalną liczbę zadań, których potrzebujemy (ja wybrałem tylko 1 zadanie), dzięki czemu może się ona automatycznie skalować. Na tym etapie mamy możliwość stworzenia load balancera.

Aby utworzyć usługę ECS, przejdź do Amazon Elastic Container Service >clusters >cluster_name> Utwórz i podaj nazwę usługi, wybierz definicję zadania i jego wersję, którą stworzyliśmy wcześniej, wprowadź minimalną i maksymalną liczbę zadań, wybierz vpc w sekcji sieci, wybierz aplikację równoważenia obciążenia w sekcji równoważenia obciążenia i podaj nazwę, port listera, nazwę grupy docelowej

Usługa ECS do orkiestracji zadań
Moduł równoważenia obciążenia usługi ECS

Po utworzeniu usługi uruchamia ona wymaganą liczbę zadań, możemy użyć adresu URL modułu równoważenia obciążenia, aby uruchomić pulpit nawigacyjny mlflow.

Uwaga: moduł równoważenia obciążenia korzysta z grupy zabezpieczeń, która definiuje reguły sieciowe ruchu przychodzącego i wychodzącego. Musisz zmodyfikować/dodać reguły, aby uzyskać dostęp do interfejsu mlflow.

Teraz, gdy hostowaliśmy mlflow w AWS, przeprowadźmy eksperyment uczenia maszynowego z naszego lokalnego, wskazując mlflow w chmurze

Po uruchomieniu eksperymentu możemy zobaczyć wszystkie parametry, metryki i model w mlflow, które zarejestrowaliśmy podczas eksperymentu

mlflow z wynikami eksperymentalnymi — AWS

MLflow w GCP

Architektura MLflow-GCP

Powyższy schemat architektury przedstawia usługi GCP, których potrzebowaliśmy, oraz ich interakcje w celu hostowania mlflow w GCP. Zamierzamy uruchomić mlflow przy użyciu GCP Cloudrun, który jest bezserwerowy.

Możemy użyć tego samego Dockerfile i requirements.txt (proszę odnieść się do sekcji MLflow w AWS), z wyjątkiem tego, że musimy zmienić boto3 na google-cloud-storage

Zmienne w pliku Dockerfile dla domyślnych artefaktów, szczegóły połączenia z bazą danych zostaną skonfigurowane jako zmienne środowiskowe w google cloudrun

Uruchom następujące polecenia, aby zbudować, otagować i przekazać obraz dokera do Google Container Registry (GCR)

# Build docker image
docker build -t mlflowtracker-gcp .

# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker

# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest

# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest

Tworzenie instancji GCP MySQL dla magazynu meta mlflow

Utworzyliśmy instancję DB, teraz musimy utworzyć bazę danych i użytkownika, aby mlflow mógł użyć tych szczegółów do połączenia się z bazą danych. Na stronie SQL kliknij Bazy danych i kliknij Utwórz bazę danych, podaj nazwę bazy danych. Podobnie kliknij łącze użytkowników i podaj nazwę użytkownika i hasło

Tworzenie bazy danych GCP MySQL
Tworzenie użytkownika bazy danych GCP MySQL

Musimy utworzyć zasobnik do przechowywania w chmurze dla mlflow do przechowywania artefaktów modelu. Aby utworzyć zasobnik do przechowywania w chmurze, wyszukaj miejsce do przechowywania w chmurze w konsoli GCP, kliknij przycisk „Utwórz”, podaj nazwę zasobnika, region i kliknij Utwórz

Zasobnik GCP dla artefaktów modelu mlflow

Zamierzamy stworzyć usługę cloudrun w gcp, która będzie korzystać z obrazu dokera, który przesłaliśmy do rejestru kontenerów. Aby utworzyć instancję cloud run, przejdź do strony cloud run kliknij utwórz usługę, wybierz obraz kontenera, który przesłaliśmy do GCR, podaj port kontenera, wartości procesora i pamięci, minimalne i maksymalne instancje do autoskalowania oraz zmienne środowiskowe.

GCP Cloudrun
Konfiguracja GCP Cloudrun

Uwaga: upewnij się, że konto usługi wybrane w usłudze cloudrun ma dostęp do pamięci masowej w chmurze, w przeciwnym razie przesyłanie artefaktów modelu nie powiedzie się

Teraz, gdy hostowaliśmy mlflow w GCP, przeprowadźmy eksperyment uczenia maszynowego z naszego lokalnego, wskazując mlflow w chmurze

Po uruchomieniu eksperymentu możemy zobaczyć wszystkie parametry, metryki i model w mlflow, które zarejestrowaliśmy podczas eksperymentu

mlflow z wynikami eksperymentalnymi — GCP

Uwaga: Wszystkie zasoby w chmurze stworzyliśmy ręcznie za pomocą konsoli, dobrą praktyką jest używanie infrastruktury jako kodu (Terraform lub CloudFormation)

Mam nadzieję, że bardzo dobrze rozumiesz, w jaki sposób możemy hostować mlflow na platformach chmurowych AWS i GCP oraz przeprowadzać eksperymenty uczenia maszynowego w chmurze

Miłej nauki!!