Servicios web de acoplamiento en R y Python

Hola Habr! La contenedorización es un enfoque para el desarrollo de software en el que una aplicación o servicio, sus dependencias y configuración (archivos de manifiesto de implementación abstracta) se agrupan en una imagen de contenedor. En este artículo, veremos cómo crear una imagen acoplable y usarla para ejecutar R, el shell de Python y más. Únete ahora!



Una aplicación en contenedor puede probarse como módulo e implementarse como una instancia de contenedor en el sistema operativo (SO) del nodo actual. Docker es un proyecto de código abierto para automatizar la implementación de aplicaciones en forma de contenedores portátiles y autónomos que pueden funcionar en la nube o en las instalaciones. Ver aquí para más información.

Microsoft Machine Learning Server es una plataforma empresarial flexible para el análisis de datos escalables, la creación de aplicaciones inteligentes y la búsqueda de información valiosa para el negocio con soporte completo para Python y R. El término " operacionalización " significa la implementación de modelos y códigos en los idiomas R y Python en Microsoft Machine Learning Server en forma de servicios web y el uso posterior de estos servicios en aplicaciones cliente para mejorar la eficiencia de la empresa.

En este artículo, veremos cómo crear una imagen acoplable que contenga Machine Learning Server 9.3 utilizando archivos Docker y cómo usarla para realizar las siguientes operaciones:

  1. Ejecute el shell R.
  2. Python shell de inicio.
  3. Inicie Jupyter Notebook.
  4. Inicie la configuración de OneBox.
  5. Inicio del servicio web R.
  6. Inicio de un servicio web Python.

Componentes requeridos


Cualquier máquina virtual Linux con el software docker community edition (CE) instalado. Al preparar este artículo, implementé Ubuntu 16.04 VM e instalé docker CE .

Paso 1


Primero, crearemos una imagen llamada mlserver con Machine Learning Server 9.3 instalado usando el siguiente archivo acoplable:

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 

Use el comando docker build para crear una imagen mlserver usando el archivo docker anterior:

 docker build -f mlserver-dockerfile -t mlserver. 

Verifique que la creación de la imagen mlserver se haya completado correctamente ejecutando el siguiente comando:

 docker images 

Lanzamiento de Shell R


 docker run -it mlserver R 



Lanzamiento de Python Shell


 docker run -it mlserver mlserver-python 



Lanzar cuaderno Jupyter


 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 

Ejecutar el comando anterior proporciona un enlace abriéndolo en un navegador, puede usar Jupyter Notebooks.



Inicie la configuración de OneBox


Microsoft Learning Server se puede configurar después de la instalación para usarlo como un servidor de implementación y servicios web analíticos de host para la operacionalización .

  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"] 

Cree la imagen mlserver-onebox utilizando el archivo acoplable anterior:

 docker build -f mlserver-onebox-dockerfile -t mlserver-onebox. 

Verifique que la creación de la imagen mlserver-onebox se haya completado correctamente ejecutando el siguiente comando:

 docker images 

Inicie el contenedor onebox con el comando:

 docker run --name mlserver-onebox-container -dit mlserver-onebox 

Verifique el estado del contenedor con:

 docker logs mlserver-onebox-container 

Después de verificar con el comando anterior que las pruebas de diagnóstico fueron exitosas, puede usar este contenedor como un cuadro (los datos de registro de Docker deben contener la siguiente línea: "Todas las pruebas de diagnóstico han pasado").

Obtenga la dirección IP del contenedor ejecutando el comando:

 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mlserver-onebox-container '172.17.0.3' 

Y úsalo como una caja:

 az login --mls --mls-endpoint "http://172.17.0.3:12800" --username "admin" --password "Microsoft@2018" az ml admin diagnostic run 

Inicio del servicio web R


También podemos crear una imagen con un servicio web preconfigurado para que esté listo para usar tan pronto como implementemos el contenedor. Aquí hay un ejemplo de cómo crear una imagen con el servicio web R para simular la transmisión manual , que está preconfigurada en su interior.

  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"] 

Cree una imagen de transmisión manual utilizando el archivo acoplable anterior:

 docker build -f r-manualtransmission-dockerfile -t rmanualtransmission. 

Verifique que la creación de la imagen de transmisión rmanual se haya completado correctamente ejecutando el comando:

 docker images 

Inicie el contenedor con el comando:

 docker run --name rmanualtransmission-container -dit rmanualtransmission 

Verifique el estado del contenedor con:

 docker logs rmanualtransmission-container 

Después de verificar que las pruebas de diagnóstico fueron exitosas y que se publicó el servicio web, puede comenzar a usarlo.

Obtenga la dirección IP del contenedor ejecutando el comando:

 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' rmanualtransmission-container '172.17.0.3' 

Puede usar u obtener el archivo de configuración del servicio web swagger.json R para simular la transferencia manual utilizando comandos 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 

El archivo swagger.json es adecuado para crear una biblioteca cliente en cualquier idioma .

Ejecutar el servicio web de Python


El siguiente es un ejemplo de creación de una imagen con el servicio web Python para simular la transmisión manual preconfigurada en su interior.

  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"] 

Cree una imagen de transmisión pymanual utilizando el archivo acoplable anterior:

 docker build -f py-manualtransmission-dockerfile -t pymanualtransmission. 

Verifique que la creación de la imagen de transmisión pymanual se haya completado correctamente ejecutando el comando:

 docker images 

Inicie el contenedor con el comando:

 docker run --name pymanualtransmission-container -dit pymanualtransmission 

Verifique el estado del contenedor con:

 docker logs pymanualtransmission-container 

Después de verificar que las pruebas de diagnóstico fueron exitosas y que se publicó el servicio web, puede comenzar a usarlo.

Obtenga la dirección IP del contenedor ejecutando el comando:

 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' pymanualtransmission-container '172.17.0.3' 

Puede obtener el archivo swagger.json para configurar un servicio web de Python para simular la transferencia manual utilizando comandos 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 

El archivo swagger.json es adecuado para crear una biblioteca cliente en cualquier idioma .

NOTA También puede cambiar la configuración del sitio web appsettings.json utilizando el archivo magic docker y habilitar la autenticación LDAP / AAD .

Extensiones


Las imágenes locales acopladas creadas se pueden enviar al Registro de contenedores de Azure (ACR ).

Cree un clúster en Azure Kubernetes Service (AKS) con imágenes de ACR que se pueden escalar automáticamente a ambos lados con vainas de escalado automático.

Enlaces


Source: https://habr.com/ru/post/es420159/


All Articles