MLflow w chmurze
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:
- Śledzenie eksperymentów: utrzymuje wszystkie eksperymenty uczenia maszynowego i możliwość wysyłania do nich zapytań
- Powtarzalność: zawiera kod uczenia maszynowego i jest w stanie odtworzyć te wyniki na dowolnej platformie
- Wdrażanie: Możliwość wdrażania modeli ML w różnych środowiskach (np. AWS Sagemaker, GCP Cloud run itp.)
- Rejestr modelu: przechowywanie wielu wersji modelu w scentralizowanym repozytorium
Możemy uruchamiać mlflow na lokalnych maszynach, ale hosting w chmurze ma swoje zalety
- Możemy wykorzystać pamięć masową w chmurze, moc obliczeniową, bezpieczeństwo itp
- Scentralizowany widok wszystkich eksperymentów każdego członka zespołu
Mamy następujące 3 główne komponenty w mlflow:
- Pulpit nawigacyjny: To interfejs użytkownika, w którym możemy zobaczyć listę eksperymentów, parametry modelu, metryki itp. dla każdego eksperymentu
- Meta Store: Wykorzystuje wewnętrzną bazę danych (MySql) do przechowywania wszystkich eksperymentów, parametrów, metryk itp.
- 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.
- Doker
- Baza danych MySql
- Rozproszony system plików
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 .
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”
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.
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
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
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 w 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
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
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
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.
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
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!!