Здравейте, жители на Хабровск. Както вече писахме, този месец OTUS стартира два курса за машинно обучение наведнъж, а именно база и напреднал. В тази връзка продължаваме да споделяме полезни материали.
Целта на тази статия е да говорим за нашия първи опит с използването MLflow.
Ще започнем прегледа MLflow от неговия сървър за проследяване и регистрирайте всички повторения на изследването. След това ще споделим нашия опит от свързването на Spark с MLflow с помощта на UDF.
контекст
Вътре сме Алфа Здраве Използваме машинно обучение и изкуствен интелект, за да дадем възможност на хората да поемат отговорност за своето здраве и благополучие. Ето защо моделите за машинно обучение са в основата на продуктите за наука за данни, които разработваме, и затова бяхме привлечени от MLflow, платформа с отворен код, която обхваща всички аспекти на жизнения цикъл на машинното обучение.
MLflow
Основната цел на MLflow е да осигури допълнителен слой върху машинното обучение, което би позволило на специалистите по данни да работят с почти всяка библиотека за машинно обучение (h2o, keras, скок, питорка, sklearn и tensorflow), извеждайки нейната работа на следващото ниво.
MLflow предоставя три компонента:
Проследяване – запис и заявки за експерименти: код, данни, конфигурация и резултати. Наблюдението на процеса на създаване на модел е много важно.
Проекти – Опаковъчен формат за изпълнение на всяка платформа (напр. SageMaker)
Модели – общ формат за подаване на модели към различни инструменти за внедряване.
MLflow (в алфа версия към момента на писане) е платформа с отворен код, която ви позволява да управлявате жизнения цикъл на машинното обучение, включително експериментиране, повторно използване и внедряване.
Настройване на 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 трябваше да бъдат коригирани, тъй като последните бяха в конфликт помежду си.
Стартирайте потребителския интерфейс за проследяване
Проследяването на MLflow ни позволява да регистрираме и правим заявки за експерименти с помощта на Python и ПОЧИВКА API. Освен това можете да определите къде да съхранявате артефактите на модела (localhost, Amazon S3, Azure Blob съхранение, Google Cloud Storage или SFTP сървър). Тъй като използваме AWS в Alpha Health, нашето хранилище за артефакти ще бъде 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 за стартиране на стари експерименти, те трябва да присъстват във файловото хранилище. Но и без това бихме могли да ги използваме в СДС, тъй като ни трябва само пътят до модела.
Забележка: Имайте предвид, че потребителският интерфейс за проследяване и клиентът на модела трябва да имат достъп до местоположението на артефакта. Тоест, независимо от факта, че потребителският интерфейс за проследяване се намира в екземпляр на EC2, когато се изпълнява локално MLflow, машината трябва да има директен достъп до S3, за да напише модели на артефакти.
Потребителският интерфейс за проследяване съхранява артефакти в кофа S3
Бягащи модели
Веднага щом сървърът за проследяване стартира, можете да започнете да обучавате моделите.
Като пример ще използваме модификацията на wine от примера на MLflow в Sklearn.
Както вече обсъдихме, MLflow ви позволява да регистрирате параметри, показатели и артефакти на модела, така че да можете да проследите как се развиват през итерациите. Тази функция е изключително полезна, защото по този начин можем да възпроизведем най-добрия модел, като се свържем със сървъра за проследяване или разберем кой код е изпълнил необходимата итерация, използвайки git хеш регистрационните файлове на ангажиментите.
Сървърът за проследяване MLflow, стартиран с помощта на командата „mlflow server“, има REST API за проследяване на стартирания и запис на данни в локалната файлова система. Можете да посочите адреса на сървъра за проследяване, като използвате променливата на средата „MLFLOW_TRACKING_URI“ и API за проследяване на MLflow автоматично ще се свърже със сървъра за проследяване на този адрес, за да създаде/получи информация за стартиране, регистрационни показатели и т.н.
За да предоставим на модела сървър, имаме нужда от работещ сървър за проследяване (вижте интерфейса за стартиране) и 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, ще ни е необходим достъп до потребителския интерфейс за проследяване, за да получим информация за модела, просто като посочим --run_id.
След като моделът се свърже със сървъра за проследяване, можем да получим нова крайна точка на модела.
Въпреки факта, че сървърът за проследяване е достатъчно мощен, за да обслужва модели в реално време, обучете ги и използвайте функционалността на сървъра (източник: mlflow // документи // модели # местни), използването на Spark (партида или стрийминг) е още по-мощно решение поради разпространението.
Представете си, че просто сте извършили обучението офлайн и след това сте приложили изходния модел към всичките си данни. Това е мястото, където Spark и MLflow блестят.
Като определи notebook-dir, можем да съхраняваме тетрадките си в желаната папка.
Стартиране на Jupyter от PySpark
Тъй като успяхме да конфигурираме Jupiter като драйвер на PySpark, сега можем да стартираме преносим компютър Jupyter в контекста на 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 - Извежда прогнози за качеството на виното
До този момент говорихме как да използваме PySpark с MLflow, изпълнявайки прогнози за качеството на виното върху целия набор от данни за вино. Но какво ще стане, ако трябва да използвате модули Python MLflow от Scala Spark?
Тествахме и това, като разделихме контекста на Spark между Scala и Python. Тоест регистрирахме MLflow UDF в Python и го използвахме от Scala (да, може би не най-доброто решение, но това, което имаме).
Scala Spark + MLflow
За този пример ще добавим Ядрото на Тори в съществуващия Юпитер.
Инсталирайте 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
```
Както можете да видите от прикачения бележник, UDF се споделя между Spark и PySpark. Надяваме се, че тази част ще бъде полезна за тези, които обичат Scala и искат да разположат модели за машинно обучение в производството.
Въпреки че MLflow е в алфа версия към момента на писане, изглежда доста обещаващо. Само способността да се изпълняват множество рамки за машинно обучение и да се използват от една крайна точка извежда препоръчителните системи на следващото ниво.
Освен това MLflow сближава инженерите по данни и специалистите по наука за данни, поставяйки общ слой между тях.
След това изследване на MLflow сме уверени, че ще продължим напред и ще го използваме за нашите тръбопроводи и препоръчителни системи на Spark.
Би било хубаво да синхронизирате файловото хранилище с базата данни, вместо с файловата система. Това трябва да ни даде множество крайни точки, които могат да използват едно и също файлово хранилище. Например, използвайте няколко екземпляра Престо и Атина със същия Glue metastore.
За да обобщя, бих искал да благодаря на общността на MLFlow, че направи работата ни с данни по-интересна.
Ако си играете с MLflow, не се колебайте да ни пишете и да ни кажете как го използвате и още повече, ако го използвате в производството.