Andocken von Webdiensten in R und Python

Hallo Habr! Die Containerisierung ist ein Ansatz für die Softwareentwicklung, bei dem eine Anwendung oder ein Dienst, seine Abhängigkeiten und seine Konfiguration (abstrakte Bereitstellungsmanifestdateien) zusammen in ein Container-Image gepackt werden. In diesem Artikel geht es darum, ein Docker-Image zu erstellen und es zum Ausführen von R, Python-Shell und mehr zu verwenden. Jetzt mitmachen!



Eine containerisierte Anwendung kann als Modul getestet und als Containerinstanz im Betriebssystem des aktuellen Knotens bereitgestellt werden. Docker ist ein Open Source-Projekt zur Automatisierung der Bereitstellung von Anwendungen in Form von tragbaren, in sich geschlossenen Containern, die in der Cloud oder vor Ort arbeiten können. Weitere Informationen finden Sie hier.

Microsoft Machine Learning Server ist eine flexible Unternehmensplattform für skalierbare Datenanalysen, die Erstellung intelligenter Anwendungen und das Auffinden geschäftsrelevanter Informationen mit vollständiger Unterstützung für Python und R. Der Begriff „ Operationalisierung “ bezeichnet die Bereitstellung von Modellen und Code in R- und Python-Sprachen auf Microsoft Machine Learning Server in Form von Webdiensten und der anschließenden Verwendung dieser Dienste in Clientanwendungen zur Verbesserung der Effizienz des Unternehmens.

In diesem Artikel wird erläutert, wie Sie mithilfe von Docker-Dateien ein Docker-Image mit Machine Learning Server 9.3 erstellen und die folgenden Vorgänge ausführen:

  1. Führen Sie die R-Shell aus.
  2. Start der Python-Shell.
  3. Starten Sie Jupyter Notebook.
  4. Starten Sie die OneBox-Konfiguration.
  5. Starten des Webdienstes R.
  6. Starten eines Python-Webdienstes.

Erforderliche Komponenten


Jede virtuelle Linux-Maschine mit installierter Docker Community Edition (CE) -Software. Bei der Vorbereitung dieses Artikels habe ich die Ubuntu 16.04-VM bereitgestellt und Docker CE installiert .

Schritt 1


Zuerst erstellen wir ein Image namens mlserver mit Machine Learning Server 9.3, das mit der folgenden Docker-Datei installiert wird:

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 

Verwenden Sie den Docker-Build-Befehl , um ein mlserver-Image mit der obigen Docker-Datei zu erstellen:

 docker build -f mlserver-dockerfile -t mlserver. 

Stellen Sie sicher, dass die Erstellung des mlserver-Images erfolgreich abgeschlossen wurde, indem Sie den folgenden Befehl ausführen:

 docker images 

R Shell-Start


 docker run -it mlserver R 



Start der Python-Shell


 docker run -it mlserver mlserver-python 



Starten Sie 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 

Wenn Sie den obigen Befehl ausführen, erhalten Sie einen Link, indem Sie ihn in einem Browser öffnen. Sie können Jupyter-Notizbücher verwenden.



Starten Sie die OneBox-Konfiguration


Microsoft Learning Server kann nach der Installation so konfiguriert werden, dass es als Bereitstellungsserver und Host für analytische Webdienste für die Operationalisierung verwendet wird .

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

Erstellen Sie das mlserver-onebox-Image mit der obigen Docker-Datei:

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

Stellen Sie sicher, dass die Erstellung des mlserver-onebox-Images erfolgreich abgeschlossen wurde, indem Sie den folgenden Befehl ausführen:

 docker images 

Starten Sie den Onebox-Container mit dem folgenden Befehl:

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

Überprüfen Sie den Zustand des Behälters mit:

 docker logs mlserver-onebox-container 

Nachdem Sie mit dem obigen Befehl überprüft haben, ob die Diagnosetests erfolgreich waren, können Sie diesen Container als One-Box verwenden (die Docker-Protokolldaten sollten die folgende Zeile enthalten: "Alle Diagnosetests sind bestanden").

Ermitteln Sie die IP-Adresse des Containers, indem Sie den folgenden Befehl ausführen:

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

Und verwenden Sie es als One-Box:

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

Starten des R-Webdienstes


Wir können auch ein Image mit einem vorkonfigurierten Webdienst erstellen, damit es sofort nach der Bereitstellung des Containers einsatzbereit ist. Hier ist ein Beispiel für die Erstellung eines Images mit dem R-Webdienst zur Simulation der manuellen Übertragung , das darin vorkonfiguriert ist.

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

Erstellen Sie mit der obigen Docker-Datei ein Bild für die manuelle Übertragung:

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

Stellen Sie sicher, dass die Erstellung des manuellen Übertragungsabbilds erfolgreich abgeschlossen wurde, indem Sie den folgenden Befehl ausführen:

 docker images 

Starten Sie den Container mit dem folgenden Befehl:

 docker run --name rmanualtransmission-container -dit rmanualtransmission 

Überprüfen Sie den Zustand des Behälters mit:

 docker logs rmanualtransmission-container 

Nachdem Sie überprüft haben, ob die Diagnosetests erfolgreich waren und der Webdienst veröffentlicht wurde, können Sie ihn verwenden.

Ermitteln Sie die IP-Adresse des Containers, indem Sie den folgenden Befehl ausführen:

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

Sie können die Webdienst-Einstellungsdatei swagger.json R verwenden oder abrufen, um die manuelle Übertragung mithilfe von Curl-Befehlen zu simulieren:

 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 

Die Datei swagger.json eignet sich zum Erstellen einer Clientbibliothek in einer beliebigen Sprache .

Ausführen des Python-Webdienstes


Das folgende Beispiel zeigt , wie Sie mit dem Python-Webdienst ein Image erstellen, um die darin vorkonfigurierte manuelle Übertragung zu simulieren .

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

Erstellen Sie ein pymanuelles Übertragungsbild mit der obigen Docker-Datei:

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

Stellen Sie sicher, dass die Erstellung des pymanualtransmission-Images erfolgreich abgeschlossen wurde, indem Sie den folgenden Befehl ausführen:

 docker images 

Starten Sie den Container mit dem folgenden Befehl:

 docker run --name pymanualtransmission-container -dit pymanualtransmission 

Überprüfen Sie den Zustand des Behälters mit:

 docker logs pymanualtransmission-container 

Nachdem Sie überprüft haben, ob die Diagnosetests erfolgreich waren und der Webdienst veröffentlicht wurde, können Sie ihn verwenden.

Ermitteln Sie die IP-Adresse des Containers, indem Sie den folgenden Befehl ausführen:

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

Sie können die Datei swagger.json zum Einrichten eines Python-Webdienstes abrufen, um die manuelle Übertragung mithilfe von Curl-Befehlen zu simulieren:

 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 

Die Datei swagger.json eignet sich zum Erstellen einer Clientbibliothek in einer beliebigen Sprache .

HINWEIS Sie können die Einstellungen der Website appsettings.json auch mithilfe der Magic Docker-Datei ändern und die LDAP / AAD-Authentifizierung aktivieren.

Erweiterungen


Erstellte lokale Docker-Images können an die Azure Container Registry (ACR ) gesendet werden.

Erstellen Sie einen Cluster in Azure Kubernetes Service (AKS) mit Bildern von ACR , die mithilfe von Autoscale-Pods automatisch auf beide Seiten skaliert werden können .

LINKS


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


All Articles