Привет, Хабр! Контейнеризация — это подход к разработке программного обеспечения, при котором приложение или служба, их зависимости и конфигурация (абстрактные файлы манифеста развертывания) упаковываются вместе в образ контейнера. В этой статье рассмотрим создание docker-образа и его использование для запуска оболочки R, Python и много другого. Присоединяйтесь!
Контейнеризованное приложение может быть протестировано как модуль и развернуто в виде экземпляра контейнера в операционной системе (ОС) текущего узла. Docker — это проект с открытым исходным кодом для автоматизации развертывания приложений в виде переносимых, самодостаточных контейнеров, которые могут работать в облаке или локально. Дополнительную информацию см. здесь.
Microsoft Machine Learning Server — это гибкая корпоративная платформа для масштабируемого анализа данных, создания интеллектуальных приложений и поиска ценной для бизнеса информации с полной поддержкой языков Python и R. Термин «операционализация» означает развертывание моделей и кода на языках R и Python на Microsoft Machine Learning Server в виде веб-служб и последующее использование этих служб в клиентских приложениях для повышения эффективности работы компании.
В этой статье мы рассмотрим, как создать docker-образ, содержащий Machine Learning Server 9.3, с помощью файлов Docker, и как его использовать для выполнения следующих операций:
Любая виртуальная машина Linux c установленным ПО docker community edition (CE). При подготовке этой статьи я развернул Ubuntu 16.04 VM и установил docker CE.
Сначала мы создадим образ с названием mlserver с установленным Machine Learning Server 9.3 с помощью следующего docker-файла:
Используйте команду docker build, чтобы создать образ mlserver с помощью указанного выше docker-файла:
Проверьте, успешно ли завершилось создание образа mlserver, выполнив следующую команду:
Запуск приведенной выше команды дает ссылку, открыв которую в браузере, вы сможете использовать Jupyter Notebooks.
Microsoft Learning Server можно настроить после установки, чтобы использовать в качестве сервера развертывания и размещать на нем аналитические веб-службы для операционализации.
Создайте образ mlserver-onebox, используя указанный выше docker-файл:
Проверьте, успешно ли завершилось создание образа mlserver-onebox, выполнив следующую команду:
Запустите контейнер onebox с помощью команды:
Проверьте состояние контейнера с помощью:
Убедившись с помощью указанной выше команды, что диагностические тесты прошли успешно, вы можете использовать этот контейнер как one-box (данные журнала Docker должны содержать следующую строку: «All Diagnostic Tests have passed».).
Получите IP-адрес контейнера, выполнив команду:
И используйте его как one-box:
Мы можем также создать образ с предварительно настроенной веб-службой, чтобы он был готов к использованию, как только мы развернем контейнер. Вот пример создания образа с веб-службой R для моделирования Manual Transmission, предварительно настроенной внутри него.
Создайте образ rmanualtransmission, используя указанный выше docker-файл:
Проверьте, успешно ли завершилось создание образа rmanualtransmission, выполнив команду:
Запустите контейнер с помощью команды:
Проверьте состояние контейнера с помощью:
Убедившись, что диагностические тесты прошли успешно и веб-служба опубликована, можете приступать к ее использованию.
Получите IP-адрес контейнера, выполнив команду:
Вы можете использовать или получить файл swagger.json настройки веб-сервиса R для моделирования ручной передачи с помощью команд curl:
Файл swagger.json подходит для создания клиентской библиотеки на любом языке.
Ниже приведен пример создания образа с веб-службой Python для моделирования Manual Transmission, предварительно настроенной внутри него.
Создайте образ pymanualtransmission, используя указанный выше docker-файл:
Проверьте, успешно ли завершилось создание образа pymanualtransmission, выполнив команду:
Запустите контейнер с помощью команды:
Проверьте состояние контейнера с помощью:
Убедившись, что диагностические тесты прошли успешно и веб-служба опубликована, можете приступать к ее использованию.
Получите IP-адрес контейнера, выполнив команду:
Вы можете получить файл swagger.json настройки веб-сервиса Python для моделирования ручной передачи, используя команды curl:
Файл swagger.json подходит для создания клиентской библиотеки на любом языке.
ПРИМЕЧАНИЕ. Вы также можете изменить настройки веб-узла appsettings.json с помощью docker-файла magic и включить аутентификацию LDAP/AAD.
Созданные локальные docker-образы можно отправить в реестр контейнеров Azure (Azure Container Registry, ACR).
Создайте в Azure Kubernetes Service (AKS) с помощью образов из ACR кластер, который может автоматически масштабироваться в обе стороны посредством капсул автомасштабирования (Autoscale pods).
Контейнеризованное приложение может быть протестировано как модуль и развернуто в виде экземпляра контейнера в операционной системе (ОС) текущего узла. Docker — это проект с открытым исходным кодом для автоматизации развертывания приложений в виде переносимых, самодостаточных контейнеров, которые могут работать в облаке или локально. Дополнительную информацию см. здесь.
Microsoft Machine Learning Server — это гибкая корпоративная платформа для масштабируемого анализа данных, создания интеллектуальных приложений и поиска ценной для бизнеса информации с полной поддержкой языков Python и R. Термин «операционализация» означает развертывание моделей и кода на языках R и Python на Microsoft Machine Learning Server в виде веб-служб и последующее использование этих служб в клиентских приложениях для повышения эффективности работы компании.
В этой статье мы рассмотрим, как создать docker-образ, содержащий Machine Learning Server 9.3, с помощью файлов Docker, и как его использовать для выполнения следующих операций:
- Запуск оболочки R.
- Запуск оболочки Python.
- Запуск Jupyter Notebook.
- Запуск конфигурации OneBox.
- Запуск веб-службы R.
- Запуск веб-службы Python.
Необходимые компоненты
Любая виртуальная машина Linux c установленным ПО docker community edition (CE). При подготовке этой статьи я развернул Ubuntu 16.04 VM и установил docker CE.
Шаг 1
Сначала мы создадим образ с названием mlserver с установленным Machine Learning Server 9.3 с помощью следующего docker-файла:
FROM ubuntu:16.04
RUN apt-get -y update && apt-get install -y apt-transport-https wget && echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ xenial main" | tee /etc/apt/sources.list.d/azure-cli.list && wget https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O /tmp/prod.deb && dpkg -i /tmp/prod.deb && rm -f /tmp/prod.deb && apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893 && apt-get -y update && apt-get install -y microsoft-r-open-foreachiterators-3.4.3 && apt-get install -y microsoft-r-open-mkl-3.4.3 && apt-get install -y microsoft-r-open-mro-3.4.3 && apt-get install -y microsoft-mlserver-packages-r-9.3.0 && apt-get install -y microsoft-mlserver-python-9.3.0 && apt-get install -y microsoft-mlserver-packages-py-9.3.0 && apt-get install -y microsoft-mlserver-mml-r-9.3.0 && apt-get install -y microsoft-mlserver-mml-py-9.3.0 && apt-get install -y microsoft-mlserver-mlm-r-9.3.0 && apt-get install -y microsoft-mlserver-mlm-py-9.3.0 && apt-get install -y azure-cli=2.0.26-1~xenial && apt-get install -y dotnet-runtime-2.0.0 && apt-get install -y microsoft-mlserver-adminutil-9.3.0 && apt-get install -y microsoft-mlserver-config-rserve-9.3.0 && apt-get install -y microsoft-mlserver-computenode-9.3.0 && apt-get install -y microsoft-mlserver-webnode-9.3.0 && apt-get clean && /opt/microsoft/mlserver/9.3.0/bin/R/activate.sh
Используйте команду docker build, чтобы создать образ mlserver с помощью указанного выше docker-файла:
docker build -f mlserver-dockerfile -t mlserver.
Проверьте, успешно ли завершилось создание образа mlserver, выполнив следующую команду:
docker images
Запуск оболочки R
docker run -it mlserver R
Запуск оболочки Python
docker run -it mlserver mlserver-python
Запуск Jupyter Notebook
docker run -p 8888:8888 -it mlserver /opt/microsoft/mlserver/9.3.0/runtime/python/bin/jupyter notebook --no-browser --port=8888 --ip=0.0.0.0 --allow-root
Запуск приведенной выше команды дает ссылку, открыв которую в браузере, вы сможете использовать Jupyter Notebooks.
Запуск конфигурации OneBox
Microsoft Learning Server можно настроить после установки, чтобы использовать в качестве сервера развертывания и размещать на нем аналитические веб-службы для операционализации.
FROM ubuntu:16.04
RUN apt-get -y update && apt-get install -y apt-transport-https wget && echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ xenial main" | tee /etc/apt/sources.list.d/azure-cli.list && wget https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O /tmp/prod.deb && dpkg -i /tmp/prod.deb && rm -f /tmp/prod.deb && apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893 && apt-get -y update && apt-get install -y microsoft-r-open-foreachiterators-3.4.3 && apt-get install -y microsoft-r-open-mkl-3.4.3 && apt-get install -y microsoft-r-open-mro-3.4.3 && apt-get install -y microsoft-mlserver-packages-r-9.3.0 && apt-get install -y microsoft-mlserver-python-9.3.0 && apt-get install -y microsoft-mlserver-packages-py-9.3.0 && apt-get install -y microsoft-mlserver-mml-r-9.3.0 && apt-get install -y microsoft-mlserver-mml-py-9.3.0 && apt-get install -y microsoft-mlserver-mlm-r-9.3.0 && apt-get install -y microsoft-mlserver-mlm-py-9.3.0 && apt-get install -y azure-cli=2.0.26-1~xenial && apt-get install -y dotnet-runtime-2.0.0 && apt-get install -y microsoft-mlserver-adminutil-9.3.0 && apt-get install -y microsoft-mlserver-config-rserve-9.3.0 && apt-get install -y microsoft-mlserver-computenode-9.3.0 && apt-get install -y microsoft-mlserver-webnode-9.3.0 && apt-get clean && /opt/microsoft/mlserver/9.3.0/bin/R/activate.sh
RUN echo $'#!/bin/bash \n set -e \n az ml admin bootstrap --admin-password "Microsoft@2018" --confirm-password "Microsoft@2018" \n exec "$@"' > bootstrap.sh
RUN chmod +x bootstrap.sh
EXPOSE 12800
ENTRYPOINT ["/bootstrap.sh"]
CMD ["bash"]
Создайте образ mlserver-onebox, используя указанный выше docker-файл:
docker build -f mlserver-onebox-dockerfile -t mlserver-onebox.
Проверьте, успешно ли завершилось создание образа mlserver-onebox, выполнив следующую команду:
docker images
Запустите контейнер onebox с помощью команды:
docker run --name mlserver-onebox-container -dit mlserver-onebox
Проверьте состояние контейнера с помощью:
docker logs mlserver-onebox-container
Убедившись с помощью указанной выше команды, что диагностические тесты прошли успешно, вы можете использовать этот контейнер как one-box (данные журнала Docker должны содержать следующую строку: «All Diagnostic Tests have passed».).
Получите IP-адрес контейнера, выполнив команду:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mlserver-onebox-container
'172.17.0.3'
И используйте его как one-box:
az login --mls --mls-endpoint "http://172.17.0.3:12800" --username "admin" --password "Microsoft@2018"
az ml admin diagnostic run
Запуск веб-службы R
Мы можем также создать образ с предварительно настроенной веб-службой, чтобы он был готов к использованию, как только мы развернем контейнер. Вот пример создания образа с веб-службой R для моделирования Manual Transmission, предварительно настроенной внутри него.
FROM ubuntu:16.04
RUN apt-get -y update && apt-get install -y apt-transport-https wget && echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ xenial main" | tee /etc/apt/sources.list.d/azure-cli.list && wget https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O /tmp/prod.deb && dpkg -i /tmp/prod.deb && rm -f /tmp/prod.deb && apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893 && apt-get -y update && apt-get install -y microsoft-r-open-foreachiterators-3.4.3 && apt-get install -y microsoft-r-open-mkl-3.4.3 && apt-get install -y microsoft-r-open-mro-3.4.3 && apt-get install -y microsoft-mlserver-packages-r-9.3.0 && apt-get install -y microsoft-mlserver-python-9.3.0 && apt-get install -y microsoft-mlserver-packages-py-9.3.0 && apt-get install -y microsoft-mlserver-mml-r-9.3.0 && apt-get install -y microsoft-mlserver-mml-py-9.3.0 && apt-get install -y microsoft-mlserver-mlm-r-9.3.0 && apt-get install -y microsoft-mlserver-mlm-py-9.3.0 && apt-get install -y azure-cli=2.0.26-1~xenial && apt-get install -y dotnet-runtime-2.0.0 && apt-get install -y microsoft-mlserver-adminutil-9.3.0 && apt-get install -y microsoft-mlserver-config-rserve-9.3.0 && apt-get install -y microsoft-mlserver-computenode-9.3.0 && apt-get install -y microsoft-mlserver-webnode-9.3.0 && apt-get clean && /opt/microsoft/mlserver/9.3.0/bin/R/activate.sh
RUN echo $'library(mrsdeploy) \n carsModel <- glm(formula = am ~ hp + wt, data = mtcars, family = binomial) \n manualTransmission <- function(hp, wt) { \n newdata <- data.frame(hp = hp, wt = wt) \n predict(carsModel, newdata, type = "response") \n } \n remoteLogin("http://localhost:12800", username = "admin", password = "Microsoft@2018", session = FALSE) \n api <- publishService("ManualTransmissionService", code = manualTransmission, model = carsModel, inputs = list(hp = "numeric", wt = "numeric"), outputs = list(answer = "numeric"), v = "1.0.0") \n result <- api$manualTransmission(120, 2.8) \n print(result$output("answer")) \n remoteLogout()' > /tmp/ManualTransmission.R
RUN echo $'#!/bin/bash \n set -e \n az ml admin bootstrap --admin-password "Microsoft@2018" --confirm-password "Microsoft@2018" \n /usr/bin/Rscript --no-save --no-restore --verbose "/tmp/ManualTransmission.R" \n exec "$@"' > bootstrap.sh
RUN chmod +x bootstrap.sh
EXPOSE 12800
ENTRYPOINT ["/bootstrap.sh"]
CMD ["bash"]
Создайте образ rmanualtransmission, используя указанный выше docker-файл:
docker build -f r-manualtransmission-dockerfile -t rmanualtransmission.
Проверьте, успешно ли завершилось создание образа rmanualtransmission, выполнив команду:
docker images
Запустите контейнер с помощью команды:
docker run --name rmanualtransmission-container -dit rmanualtransmission
Проверьте состояние контейнера с помощью:
docker logs rmanualtransmission-container
Убедившись, что диагностические тесты прошли успешно и веб-служба опубликована, можете приступать к ее использованию.
Получите IP-адрес контейнера, выполнив команду:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' rmanualtransmission-container
'172.17.0.3'
Вы можете использовать или получить файл swagger.json настройки веб-сервиса R для моделирования ручной передачи с помощью команд curl:
apt-get -y install jq
curl -s --header "Content-Type: application/json" --request POST --data '{"username":"admin","password":"Microsoft@2018"}' http://172.17.0.3:12800/login | jq -r '.access_token'
<access token>
curl -s --header "Content-Type: application/json" --header "Authorization: Bearer <access token>" --request POST --data '{"hp":120,"wt":2.8}' http://172.17.0.3:12800/api/ManualTransmissionService/1.0.0
{"success":true,"errorMessage":"","outputParameters":{"answer":0.64181252840938208},"outputFiles":{},"consoleOutput":"","changedFiles":[]}
curl -s --header "Authorization: Bearer <access token>" --request GET http://172.17.0.3:12800/api/ManualTransmissionService/1.0.0/swagger.json -o swagger.json
Файл swagger.json подходит для создания клиентской библиотеки на любом языке.
Запуск веб-службы Python
Ниже приведен пример создания образа с веб-службой Python для моделирования Manual Transmission, предварительно настроенной внутри него.
FROM ubuntu:16.04
RUN apt-get -y update && apt-get install -y apt-transport-https wget && echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ xenial main" | tee /etc/apt/sources.list.d/azure-cli.list && wget https://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb -O /tmp/prod.deb && dpkg -i /tmp/prod.deb && rm -f /tmp/prod.deb && apt-key adv --keyserver packages.microsoft.com --recv-keys 52E16F86FEE04B979B07E28DB02C46DF417A0893 && apt-get -y update && apt-get install -y microsoft-r-open-foreachiterators-3.4.3 && apt-get install -y microsoft-r-open-mkl-3.4.3 && apt-get install -y microsoft-r-open-mro-3.4.3 && apt-get install -y microsoft-mlserver-packages-r-9.3.0 && apt-get install -y microsoft-mlserver-python-9.3.0 && apt-get install -y microsoft-mlserver-packages-py-9.3.0 && apt-get install -y microsoft-mlserver-mml-r-9.3.0 && apt-get install -y microsoft-mlserver-mml-py-9.3.0 && apt-get install -y microsoft-mlserver-mlm-r-9.3.0 && apt-get install -y microsoft-mlserver-mlm-py-9.3.0 && apt-get install -y azure-cli=2.0.26-1~xenial && apt-get install -y dotnet-runtime-2.0.0 && apt-get install -y microsoft-mlserver-adminutil-9.3.0 && apt-get install -y microsoft-mlserver-config-rserve-9.3.0 && apt-get install -y microsoft-mlserver-computenode-9.3.0 && apt-get install -y microsoft-mlserver-webnode-9.3.0 && apt-get clean && /opt/microsoft/mlserver/9.3.0/bin/R/activate.sh
RUN echo $'from microsoftml.datasets.datasets import DataSetMtCars \n import pandas as pd \n from revoscalepy import rx_lin_mod, rx_predict \n cars_model = rx_lin_mod(formula="am ~ hp + wt", data=DataSetMtCars().as_df()) \n mydata = pd.DataFrame({"hp":[120],"wt":[2.8]}) \n def manualTransmission(hp, wt): \n \timport pandas as pd \n \tfrom revoscalepy import rx_predict \n \tnewData = pd.DataFrame({"hp":[hp], "wt":[wt]}) \n \treturn rx_predict(cars_model, newData, type="response") \n \n from azureml.deploy import DeployClient \n from azureml.deploy.server import MLServer \n from azureml.common.configuration import Configuration \n \n HOST = "http://localhost:12800" \n context = ("admin", "Microsoft@2018") \n client = DeployClient(HOST, use=MLServer, auth=context) \n service_name = "ManualTransmissionService" \n service_version = "1.0.0" \n service = client.service(service_name).version(service_version).code_fn(manualTransmission).inputs(hp=float, wt=float).outputs(answer=pd.DataFrame).models(cars_model=cars_model).description("Man
ual Transmission Service").deploy() \n res = service.manualTransmission(120, 2.8) \n print(res.output("answer"))' > /tmp/ManualTransmission.py
RUN echo $'#!/bin/bash \n set -e \n az ml admin bootstrap --admin-password "Microsoft@2018" --confirm-password "Microsoft@2018" \n mlserver-python /tmp/ManualTransmission.py \n exec "$@"' > bootstrap.sh
RUN chmod +x bootstrap.sh
EXPOSE 12800
ENTRYPOINT ["/bootstrap.sh"]
CMD ["bash"]
Создайте образ pymanualtransmission, используя указанный выше docker-файл:
docker build -f py-manualtransmission-dockerfile -t pymanualtransmission.
Проверьте, успешно ли завершилось создание образа pymanualtransmission, выполнив команду:
docker images
Запустите контейнер с помощью команды:
docker run --name pymanualtransmission-container -dit pymanualtransmission
Проверьте состояние контейнера с помощью:
docker logs pymanualtransmission-container
Убедившись, что диагностические тесты прошли успешно и веб-служба опубликована, можете приступать к ее использованию.
Получите IP-адрес контейнера, выполнив команду:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pymanualtransmission-container
'172.17.0.3'
Вы можете получить файл swagger.json настройки веб-сервиса Python для моделирования ручной передачи, используя команды curl:
apt-get -y install jq
curl -s --header "Content-Type: application/json" --request POST --data '{"username":"admin","password":"Microsoft@2018"}' http://172.17.0.3:12800/login | jq -r '.access_token'
<access token>
curl -s --header "Content-Type: application/json" --header "Authorization: Bearer <access token>" --request POST --data '{"hp":120,"wt":2.8}' http://172.17.0.3:12800/api/ManualTransmissionService/1.0.0
{"success":true,"errorMessage":"","outputParameters":{"answer":0.64181252840938208},"outputFiles":{},"consoleOutput":"","changedFiles":[]}
curl -s --header "Authorization: Bearer <access token>" --request GET http://172.17.0.3:12800/api/ManualTransmissionService/1.0.0/swagger.json -o swagger.json
Файл swagger.json подходит для создания клиентской библиотеки на любом языке.
ПРИМЕЧАНИЕ. Вы также можете изменить настройки веб-узла appsettings.json с помощью docker-файла magic и включить аутентификацию LDAP/AAD.
Расширения
Созданные локальные docker-образы можно отправить в реестр контейнеров Azure (Azure Container Registry, ACR).
Создайте в Azure Kubernetes Service (AKS) с помощью образов из ACR кластер, который может автоматически масштабироваться в обе стороны посредством капсул автомасштабирования (Autoscale pods).
ССЫЛКИ:
- github.com/johnpaulada/microsoftmlserver-docker
- github.com/rcarmo/docker-ml-server
- success.docker.com/article/use-a-script-to-initialize-stateful-container-data
- docs.docker.com/v17.09/engine/userguide/eng-image/dockerfile_best-practices
- www.tothenew.com/blog/dockerizing-nginx-and-ssh-using-supervisord
- microsoft.github.io/deployr-api-docs
- docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/container-docker-introduction
Комментарии (2)
gecube
16.08.2018 19:30не раскрыта тема чем же лучше Machine Learning Server 9.3, чем стандартные образы с R (например, hub.docker.com/r/rocker), python (https://hub.docker.com/r/davidshen84/scikit-learn/ ?) и пр.
immaculate
apt-get install
можно несколько пакетов перечислить через запятую. Даже с переносом строк, получится читабельнее и пакеты будут скачиваться параллельно. Хотя дело вкуса, возможно.