Docking Web Services dans R et Python

Bonjour, Habr! La conteneurisation est une approche du développement logiciel dans laquelle une application ou un service, ses dépendances et sa configuration (fichiers manifestes de déploiement abstrait) sont regroupés dans une image de conteneur. Dans cet article, nous allons voir comment créer une image docker et l'utiliser pour exécuter R, le shell Python, etc. Rejoignez-nous maintenant!



Une application conteneurisée peut être testée en tant que module et déployée en tant qu'instance de conteneur dans le système d'exploitation (OS) du nœud actuel. Docker est un projet open source destiné à automatiser le déploiement d'applications sous la forme de conteneurs autonomes portables pouvant fonctionner dans le cloud ou sur site. Voir ici pour plus d'informations.

Microsoft Machine Learning Server est une plate-forme d'entreprise flexible pour l'analyse de données évolutive, la création d'applications intelligentes et la recherche d'informations utiles avec une prise en charge complète de Python et R. Le terme « opérationnalisation » signifie le déploiement de modèles et de code en langues R et Python sur Microsoft Machine Learning Server sous la forme de services Web et l'utilisation ultérieure de ces services dans les applications clientes pour améliorer l'efficacité de l'entreprise.

Dans cet article, nous verrons comment créer une image Docker contenant Machine Learning Server 9.3 à l' aide de fichiers Docker et comment l'utiliser pour effectuer les opérations suivantes:

  1. Exécutez le shell R.
  2. Démarrage du shell Python.
  3. Lancez Jupyter Notebook.
  4. Lancez la configuration OneBox.
  5. Démarrage du service Web R.
  6. Démarrage d'un service Web Python.

Composants requis


Toute machine virtuelle Linux avec le logiciel Docker Community Edition (CE) installé. Pour préparer cet article, j'ai déployé la machine virtuelle Ubuntu 16.04 et installé Docker CE .

Étape 1


Tout d'abord, nous allons créer une image appelée mlserver avec Machine Learning Server 9.3 installé à l'aide du fichier docker suivant:

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 

Utilisez la commande docker build pour créer une image mlserver à l'aide du fichier docker ci-dessus:

 docker build -f mlserver-dockerfile -t mlserver. 

Vérifiez que la création de l'image mlserver s'est terminée avec succès en exécutant la commande suivante:

 docker images 

Lancement de Shell R


 docker run -it mlserver R 



Lancement du shell Python


 docker run -it mlserver mlserver-python 



Lancez 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 

L'exécution de la commande ci-dessus donne un lien en l'ouvrant dans un navigateur, vous pouvez utiliser Jupyter Notebooks.



Lancer la configuration OneBox


Microsoft Learning Server peut être configuré après l'installation pour être utilisé comme serveur de déploiement et héberger des services Web analytiques pour l' opérationnalisation .

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

Créez l'image mlserver-onebox à l'aide du fichier docker ci-dessus:

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

Vérifiez que la création de l'image mlserver-onebox s'est terminée avec succès en exécutant la commande suivante:

 docker images 

Lancez le conteneur onebox avec la commande:

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

Vérifiez l'état du conteneur avec:

 docker logs mlserver-onebox-container 

Après avoir vérifié avec la commande ci-dessus que les tests de diagnostic ont réussi, vous pouvez utiliser ce conteneur comme une boîte (les données du journal Docker doivent contenir la ligne suivante: «Tous les tests de diagnostic ont réussi».).

Obtenez l'adresse IP du conteneur en exécutant la commande:

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

Et utilisez-le en une seule boîte:

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

Démarrage du service Web R


Nous pouvons également créer une image avec un service Web préconfiguré afin qu'elle soit prête à être utilisée dès que nous déployons le conteneur. Voici un exemple de création d'une image avec le service Web R pour simuler la transmission manuelle , qui est pré-configurée à l'intérieur.

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

Créez une image de transmission manuelle à l'aide du fichier docker ci-dessus:

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

Vérifiez que la création de l'image rmanualtransmission s'est terminée avec succès en exécutant la commande:

 docker images 

Lancez le conteneur à l'aide de la commande:

 docker run --name rmanualtransmission-container -dit rmanualtransmission 

Vérifiez l'état du conteneur avec:

 docker logs rmanualtransmission-container 

Après avoir vérifié que les tests de diagnostic ont réussi et que le service Web est publié, vous pouvez commencer à l'utiliser.

Obtenez l'adresse IP du conteneur en exécutant la commande:

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

Vous pouvez utiliser ou obtenir le fichier de paramètres du service Web swagger.json R pour simuler un transfert manuel à l'aide des commandes 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 

Le fichier swagger.json convient à la création d'une bibliothèque cliente dans n'importe quelle langue .

Exécution du service Web Python


Ce qui suit est un exemple de création d'une image avec le service Web Python pour simuler la transmission manuelle préconfigurée à l'intérieur.

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

Créez une image de transmission manuelle à l'aide du fichier docker ci-dessus:

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

Vérifiez que la création d'image pymanualtransmission s'est terminée avec succès en exécutant la commande:

 docker images 

Lancez le conteneur à l'aide de la commande:

 docker run --name pymanualtransmission-container -dit pymanualtransmission 

Vérifiez l'état du conteneur avec:

 docker logs pymanualtransmission-container 

Après avoir vérifié que les tests de diagnostic ont réussi et que le service Web est publié, vous pouvez commencer à l'utiliser.

Obtenez l'adresse IP du conteneur en exécutant la commande:

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

Vous pouvez obtenir le fichier swagger.json pour configurer un service Web Python pour simuler un transfert manuel à l'aide des commandes 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 

Le fichier swagger.json convient à la création d'une bibliothèque cliente dans n'importe quelle langue .

REMARQUE Vous pouvez également modifier les paramètres du site Web appsettings.json à l'aide du fichier Magic Docker et activer l' authentification LDAP / AAD .

Extensions


Les images de docker locales créées peuvent être envoyées au registre de conteneurs Azure (ACR ).

Créez un cluster dans Azure Kubernetes Service (AKS) à l' aide d'images d'ACR qui peuvent évoluer automatiquement des deux côtés à l'aide de pods de mise à l'échelle automatique .

LIENS


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


All Articles