Прывітанне, хабраўчане. Як мы ўжо пісалі, у гэтым месяцы OTUS запускае адразу два курсы па машынным навучанні, а менавіта базавы и прасунуты. У сувязі з гэтым працягваем дзяліцца карысным матэрыялам.
Мэта гэтага артыкула – расказаць пра наш першы досвед выкарыстання MLflow.
Мы пачнем агляд MLflow з яго tracking-сервера і пралагуем ўсе ітэрацыі даследаванні. Затым падзелімся досведам злучэння Spark з MLflow з дапамогай UDF.
Кантэкст
мы ў Alpha Health выкарыстоўваем машыннае навучанне і штучны інтэлект, каб даць людзям магчымасць клапаціцца аб сваім здароўі і дабрабыце. Таму мадэлі машыннага навучання ляжаць у аснове распрацоўваных намі прадуктаў апрацоўкі дадзеных, і менавіта таму нашу ўвагу прыцягнула MLflow - платформа з адкрытым зыходным кодам, якая ахоплівае ўсе аспекты жыццёвага цыкла машыннага навучання.
MLflow
Асноўная мэта MLflow – забяспечыць дадатковы пласт па-над машынным навучаннем, які дазволіў бы спецыялістам па data science працаваць практычна з любой бібліятэкай машыннага навучання (h2o, керас, mleap, піторх, склерн и tensorflow), выводзячы яе працу на новы ўзровень.
MLflow забяспечвае тры кампаненты:
Адсочванне – запіс і запыты да эксперыментаў: код, даныя, канфігурацыя і вынікі. Сачыць за працэсам стварэння мадэлі вельмі важна.
праектаў – Фармат упакоўкі для запуску на любой платформе (напрыклад, SageMaker)
мадэлі - Агульны фармат адпраўкі мадэляў у розныя прылады разгортвання.
MLflow (на момант напісання артыкула ў alpha-версіі) - платформа з адкрытым зыходным кодам, якая дазваляе кіраваць жыццёвым цыклам машыннага навучання, у тым ліку эксперыментамі, перавыкарыстаннем і разгортваннем.
Настройка MLflow
Для выкарыстання MLflow трэба спачатку наладзіць усё асяроддзе Python, для гэтага мы скарыстаемся PyEnv (каб усталяваць Python на Mac, зазірніце сюды). Так мы зможам стварыць віртуальнае асяроддзе, куды ўсталюем усе неабходныя для запуску бібліятэкі.
```
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
```
Заўвага: мы выкарыстоўваем PyArrow для запуску такіх мадэляў, як UDF. Версіі PyArrow і Numpy трэба было выправіць, паколькі апошнія версіі канфліктавалі паміж сабой.
Запускаем Tracking UI
MLflow Tracking дазваляе нам лагіраваць і рабіць запыты да эксперыментаў з дапамогай Python і REST API. Апроч гэтага, можна вызначыць, дзе захоўваць артэфакты мадэлі (localhost, Amazon S3, Azure Blob Storage, Google Cloud Storage або SFTP-сервер). Паколькі ў Alpha Health мы карыстаемся AWS, у якасці сховішчы артэфактаў будзе S3.
# Running a Tracking Server
mlflow server
--file-store /tmp/mlflow/fileStore
--default-artifact-root s3://<bucket>/mlflow/artifacts/
--host localhost
--port 5000
MLflow рэкамендуе выкарыстоўваць сталае файлавае сховішча. Файлавае сховішча - гэта месца, дзе сервер будзе захоўваць метададзеныя запускаў і эксперыментаў. Пры запуску сервера пераканайцеся, што ён паказвае на сталае файлавае сховішча. Тут для эксперыменту мы проста скарыстаемся /tmp.
Памятайце аб тым, што, калі мы хочам выкарыстоўваць сервер mlflow для запуску старых эксперыментаў, яны павінны прысутнічаць у файлавым сховішчы. Аднак і без гэтага мы б змаглі іх выкарыстоўваць у UDF, паколькі нам патрэбен толькі шлях да мадэлі.
Заўвага: Майце на ўвазе, што Tracking UI і кліент мадэлі павінны мець доступ да месцазнаходжання артэфакта. Гэта значыць па-за залежнасцю ад таго, што Tracking UI размяшчаецца ў асобніку EC2, пры лакальным запуску MLflow у машыны павінен быць прамы доступ да S3 для запісу мадэляў артэфактаў.
Tracking UI захоўвае артэфакты ў бакеце S3
Запуск мадэляў
Як толькі будзе працаваць Tracking-сервер, можна пачынаць навучаць мадэлі.
У якасці прыкладу мы скарыстаемся мадыфікацыяй wine з прыкладу MLflow у Склеарн.
Як мы ўжо казалі, MLflow дазваляе лагіраваць параметры, метрыкі і артэфакты мадэляў, каб можна было адсочваць, як яны развіваюцца па меры ітэрацый. Гэтая функцыя вельмі карысная, паколькі так мы зможам прайграць лепшую мадэль, звярнуўшыся ў Tracking-серверу ці зразумеўшы, які код выканаў патрэбную ітэрацыю, скарыстаўшыся логамі git hash комітаў.
Tracking-сервер MLflow, запушчаны з дапамогай каманды "mlflow server", мае REST API для адсочвання запускаў і запісы дадзеных у лакальную файлавую сістэму. Вы можаце пазначыць адрас tracking-сервера з дапамогай пераменнага асяроддзя «MLFLOW_TRACKING_URI» і tracking API MLflow аўтаматычна звяжацца з tracking-серверам па гэтым адрасе, каб стварыць/атрымаць інфармацыю аб запуску, метрыкі логаў і г.д.
Каб забяспечыць мадэль серверам нам спатрэбіцца запушчаны tracking-сервер (гл. інтэрфейс запуску) і Run ID мадэлі.
Run ID
# 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
Для абслугоўвання мадэляў з дапамогай функцыяналу MLflow serve, нам спатрэбіцца доступ да Tracking UI, каб атрымліваць інфармацыю аб мадэлі проста паказаўшы --run_id.
Як толькі мадэль звязваецца з Tracking-серверам, мы можам атрымаць новую канчатковую кропку мадэлі.
Нягледзячы на тое, што Tracking-сервер досыць магутны для абслугоўвання мадэляў у рэжыме рэальнага часу, іх навучання і выкарыстанні функцыяналуserve (крыніца: mlflow // docs // models # local), прымяненне Spark (batch або streaming) - яшчэ больш магутнае рашэнне за кошт размеркаванасці.
Уявіце, што вы проста правялі навучанне ў афлайне, а потым ужылі выходную мадэль да ўсіх вашых дадзеных. Менавіта тут Spark і MLflow пакажуць сябе з лепшага боку.
вызначыўшы notebook-dir, мы зможам захоўваць нашы notebook-і ў жаданай тэчцы.
Запускаем Jupyter з PySpark
Паколькі мы змаглі наладзіць Jupiter у якасці драйвера PySpark, зараз мы можам запускаць Jupyter notebook у кантэксце 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
Як было сказана вышэй, MLflow падае функцыю лагавання артэфактаў мадэлі ў S3. Як толькі ў нас у руках з'яўляецца абраная мадэль, мы маем магчымасць імпартаваць яе як UDF з дапамогай модуля mlflow.pyfunc.
Да гэтага моманту мы казалі аб тым, як выкарыстоўваць PySpark з MLflow, запускаючы прагназаванне якасці віна на ўсім наборы дадзеных wine. Але што рабіць, калі трэба выкарыстоўваць модулі Python MLflow са Scala Spark?
Мы пратэставалі і гэта, падзяліўшы кантэкст Spark паміж Scala і Python. Гэта значыць, мы зарэгістравалі MLflow UDF у Python, і выкарыстоўвалі яго з Scala (так, магчыма, не лепшае рашэнне, але што маем).
Scala Spark + MLflow
Для гэтага прыкладу мы дадамо Toree Kernel у існуючы Jupiter.
Усталёўваны 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
```
Як відаць з прымацаванага notebook-а, UDF выкарыстоўваецца сумесна Spark і PySpark. Мы спадзяемся, што гэтая частка будзе карысная тым, хто кахае Scala і жадае разгарнуць мадэлі машыннага навучання на прадакшэне.
Нягледзячы на тое, што на момант напісання артыкула MLflow знаходзіцца ў Alpha-версіі, яна выглядае даволі шматабяцальна. Адна толькі магчымасць запускаць некалькі фрэймворкаў машыннага навучання і выкарыстоўваць іх з адной канчатковай кропкі выводзіць рэкамендацыйныя сістэмы на новы ўзровень.
Да таго ж, MLflow збліжае Data-інжынераў і адмыслоўцаў па Data Science, пракладваючы паміж імі агульны пласт.
Пасля гэтага даследавання MLflow, мы ўпэўненыя, што пойдзем далей і будзем выкарыстоўваць яе для нашых пайплайнаў Spark і ў рэкамендацыйных сістэмах.
Было б нядрэнна сінхранізаваць файлавае сховішча з базай дадзеных, замест файлавай сістэмы. Так мы павінны атрымаць некалькі канчатковых кропак, якія могуць выкарыстоўваць адно і тое ж файлавае сховішча. Напрыклад, выкарыстоўваць некалькі экзэмпляраў Престо и Афіна з адным і тым жа Glue metastore.
Падводзячы вынікі, жадаецца сказаць дзякуй супольнасці MLFlow за тое, што робіце нашу працу з дадзенымі цікавей.
Калі вы гуляецеся з MLflow, не саромейцеся пісаць нам і распавядаць, як вы яго карыстаецеся, і тым больш, калі карыстаецеся яго на прадакшэне.