Witam mieszkańców Chabrowska. Jak już pisaliśmy, w tym miesiącu OTUS uruchamia jednocześnie dwa kursy uczenia maszynowego, a mianowicie baza и zaawansowane. W związku z tym nadal udostępniamy przydatne materiały.
Celem tego artykułu jest omówienie naszych pierwszych doświadczeń z używaniem MLflow.
Rozpoczynamy recenzję MLflow z serwera śledzącego i rejestrować wszystkie iteracje badania. Następnie podzielimy się naszymi doświadczeniami z łączenia Sparka z MLflow za pomocą UDF.
Kontekst
Jesteśmy w Zdrowie alfa Wykorzystujemy uczenie maszynowe i sztuczną inteligencję, aby umożliwić ludziom przejęcie kontroli nad swoim zdrowiem i dobrym samopoczuciem. Właśnie dlatego modele uczenia maszynowego stanowią serce opracowywanych przez nas produktów do nauki danych i dlatego przyciągnęła nas MLflow, platforma typu open source, która obejmuje wszystkie aspekty cyklu życia uczenia maszynowego.
MLflow
Głównym celem MLflow jest zapewnienie dodatkowej warstwy poza uczeniem maszynowym, która umożliwiłaby badaczom danych pracę z niemal każdą biblioteką uczenia maszynowego (H2o, keras, mskok, płomień, szorować и tensorflow), przenosząc swoją pracę na wyższy poziom.
MLflow zapewnia trzy komponenty:
Śledzenie – rejestracja i prośby o eksperymenty: kod, dane, konfiguracja i wyniki. Bardzo ważne jest monitorowanie procesu tworzenia modelu.
Projekty – Format opakowania do uruchomienia na dowolnej platformie (np. SageMaker)
modele – wspólny format przesyłania modeli do różnych narzędzi wdrożeniowych.
MLflow (w wersji alfa w chwili pisania tego tekstu) to platforma typu open source, która umożliwia zarządzanie cyklem życia uczenia maszynowego, w tym eksperymentowaniem, ponownym wykorzystaniem i wdrażaniem.
Konfigurowanie MLflow
Aby skorzystać z MLflow musisz najpierw skonfigurować całe środowisko Pythona, do tego będziemy używać PyEnv (aby zainstalować Python na Macu, sprawdź tutaj). W ten sposób możemy stworzyć środowisko wirtualne, w którym zainstalujemy wszystkie biblioteki niezbędne do jego uruchomienia.
```
pyenv install 3.7.0
pyenv global 3.7.0 # Use Python 3.7
mkvirtualenv mlflow # Create a Virtual Env with Python 3.7
workon mlflow
```
Uwaga: używamy PyArrow do uruchamiania modeli takich jak UDF. Wersje PyArrow i Numpy wymagały naprawy, ponieważ te ostatnie wersje kolidowały ze sobą.
Uruchom interfejs śledzenia
MLflow Tracking pozwala nam rejestrować i wysyłać zapytania do eksperymentów przy użyciu języka Python i REST API. Ponadto można określić, gdzie mają być przechowywane artefakty modelu (localhost, Amazon S3, Magazyn obiektów Blob Azure, Google Cloud Storage lub Serwer SFTP). Ponieważ używamy AWS w Alpha Health, naszym miejscem do przechowywania artefaktów będzie S3.
# Running a Tracking Server
mlflow server
--file-store /tmp/mlflow/fileStore
--default-artifact-root s3://<bucket>/mlflow/artifacts/
--host localhost
--port 5000
MLflow zaleca używanie trwałego magazynu plików. Magazyn plików to miejsce, w którym serwer będzie przechowywać metadane przebiegu i eksperymentu. Uruchamiając serwer, upewnij się, że wskazuje on magazyn plików trwałych. Tutaj do eksperymentu po prostu użyjemy /tmp.
Pamiętaj, że jeśli chcemy wykorzystać serwer mlflow do przeprowadzenia starych eksperymentów, muszą one znajdować się w magazynie plików. Jednak nawet bez tego moglibyśmy ich użyć w UDF, ponieważ potrzebujemy jedynie ścieżki do modelu.
Uwaga: należy pamiętać, że interfejs śledzenia i klient modelu muszą mieć dostęp do lokalizacji artefaktu. Oznacza to, że niezależnie od faktu, że interfejs śledzenia znajduje się w instancji EC2, podczas lokalnego uruchamiania MLflow maszyna musi mieć bezpośredni dostęp do S3, aby móc zapisywać modele artefaktów.
Śledzący interfejs użytkownika przechowuje artefakty w zasobniku S3
Modele biegowe
Gdy tylko serwer śledzenia zostanie uruchomiony, możesz rozpocząć trenowanie modeli.
Jako przykład wykorzystamy modyfikację wina z przykładu MLflow w Wyczyść.
Jak już wspomnieliśmy, MLflow umożliwia rejestrowanie parametrów modelu, metryk i artefaktów, dzięki czemu można śledzić ich ewolucję w iteracjach. Ta funkcja jest niezwykle przydatna, ponieważ w ten sposób możemy odtworzyć najlepszy model, kontaktując się z serwerem śledzącym lub sprawdzając, który kod wykonał wymaganą iterację, korzystając z dzienników skrótów zatwierdzeń git.
Serwer śledzący MLflow, uruchamiany za pomocą polecenia „mlflow server”, posiada API REST umożliwiające śledzenie przebiegów i zapisywanie danych do lokalnego systemu plików. Możesz określić adres serwera śledzącego za pomocą zmiennej środowiskowej „MLFLOW_TRACKING_URI”, a interfejs API śledzenia MLflow automatycznie skontaktuje się z serwerem śledzącym pod tym adresem w celu utworzenia/odbioru informacji o uruchomieniu, metryk dziennika itp.
Aby zapewnić modelowi serwer, potrzebujemy działającego serwera śledzącego (patrz interfejs uruchamiania) i identyfikatora uruchomienia modelu.
Uruchom identyfikator
# Serve a sklearn model through 127.0.0.0:5005
MLFLOW_TRACKING_URI=http://0.0.0.0:5000 mlflow sklearn serve
--port 5005
--run_id 0f8691808e914d1087cf097a08730f17
--model-path model
Aby udostępniać modele za pomocą funkcji obsługi MLflow, będziemy potrzebować dostępu do interfejsu użytkownika śledzenia, aby otrzymywać informacje o modelu po prostu poprzez określenie --run_id.
Gdy model skontaktuje się z serwerem śledzenia, możemy uzyskać nowy punkt końcowy modelu.
Pomimo tego, że serwer Tracking jest na tyle wydajny, aby obsługiwać modele w czasie rzeczywistym, szkolić je i korzystać z funkcjonalności serwera (źródło: mlflow // docs // modele # lokalne), wykorzystanie Sparka (wsadowo lub strumieniowo) jest jeszcze potężniejszym rozwiązaniem ze względu na dystrybucję.
Wyobraź sobie, że po prostu przeprowadziłeś szkolenie w trybie offline, a następnie zastosowałeś model wyjściowy do wszystkich swoich danych. To tutaj błyszczą Spark i MLflow.
Po zdefiniowaniu notebook-dir, możemy przechowywać nasze notesy w wybranym folderze.
Uruchamianie Jupytera z PySpark
Ponieważ udało nam się skonfigurować Jupitera jako sterownik PySpark, możemy teraz uruchomić notatnik Jupyter w kontekście PySpark.
(mlflow) afranzi:~$ pyspark
[I 19:05:01.572 NotebookApp] sparkmagic extension enabled!
[I 19:05:01.573 NotebookApp] Serving notebooks from local directory: /Users/afranzi/Projects/notebooks
[I 19:05:01.573 NotebookApp] The Jupyter Notebook is running at:
[I 19:05:01.573 NotebookApp] http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745
[I 19:05:01.573 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 19:05:01.574 NotebookApp]
Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745
Jak wspomniano powyżej, MLflow udostępnia funkcję rejestrowania artefaktów modelu w S3. Gdy tylko wybrany model trafi w nasze ręce, mamy możliwość zaimportowania go w formacie UDF za pomocą modułu mlflow.pyfunc.
Do tego momentu mówiliśmy o tym, jak używać PySpark z MLflow, uruchamiając prognozy jakości wina dla całego zbioru danych wina. Ale co, jeśli potrzebujesz użyć modułów Python MLflow od Scala Spark?
To również przetestowaliśmy, dzieląc kontekst Sparka między Scalę i Python. Oznacza to, że zarejestrowaliśmy MLflow UDF w Pythonie i użyliśmy go ze Scali (tak, może nie jest to najlepsze rozwiązanie, ale jakie mamy).
Scala Spark + MLflow
W tym przykładzie dodamy Jądro Toree do istniejącego Jowisza.
Zainstaluj Spark + Toree + Jupyter
pip install toree
jupyter toree install --spark_home=${SPARK_HOME} --sys-prefix
jupyter kernelspec list
```
```
Available kernels:
apache_toree_scala /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/apache_toree_scala
python3 /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/python3
```
Jak widać z dołączonego notatnika, UDF jest współdzielony pomiędzy Spark i PySpark. Mamy nadzieję, że ta część będzie przydatna dla tych, którzy kochają Scalę i chcą wdrożyć modele uczenia maszynowego w środowisku produkcyjnym.
Mimo że w chwili pisania tego tekstu MLflow jest w wersji Alpha, wygląda całkiem obiecująco. Sama możliwość uruchamiania wielu platform uczenia maszynowego i korzystania z nich z jednego punktu końcowego przenosi systemy rekomendacyjne na wyższy poziom.
Ponadto MLflow zbliża do siebie inżynierów danych i specjalistów Data Science, tworząc między nimi wspólną warstwę.
Po tej eksploracji MLflow jesteśmy pewni, że pójdziemy dalej i wykorzystamy go w naszych potokach Spark i systemach rekomendacyjnych.
Byłoby miło zsynchronizować przechowywanie plików z bazą danych zamiast z systemem plików. To powinno dać nam wiele punktów końcowych, które mogą korzystać z tego samego miejsca na pliki. Na przykład użyj wielu instancji presto и Athena z tym samym metastorem Glue.
Podsumowując, chciałbym podziękować społeczności MLFlow za uczynienie naszej pracy z danymi bardziej interesującą.
Jeśli bawisz się MLflow, nie wahaj się do nas napisać i powiedzieć, jak go używasz, a tym bardziej, jeśli używasz go w produkcji.