Docking Web Services em R e Python

Olá Habr! A conteinerização é uma abordagem ao desenvolvimento de software na qual um aplicativo ou serviço, suas dependências e configuração (arquivos de manifesto de implantação abstrata) são empacotados juntos em uma imagem de contêiner. Neste artigo, veremos como criar uma imagem do docker e usá-la para executar o R, o shell Python e muito mais. Inscreva-se agora!



Um aplicativo em contêiner pode ser testado como um módulo e implementado como uma instância de contêiner no sistema operacional (SO) do nó atual. O Docker é um projeto de código aberto para automatizar a implantação de aplicativos na forma de contêineres portáteis e independentes que podem funcionar na nuvem ou no local. Veja aqui para mais informações.

O Microsoft Machine Learning Server é uma plataforma corporativa flexível para análise de dados escalável, criando aplicativos inteligentes e encontrando informações valiosas para os negócios com suporte total para Python e R. O termo " operacionalização " significa a implantação de modelos e códigos nas linguagens R e Python no Microsoft Machine Learning Server na forma de serviços da web e o uso subsequente desses serviços em aplicativos clientes para melhorar a eficiência da empresa.

Neste artigo, veremos como criar uma imagem de janela de encaixe contendo o Machine Learning Server 9.3 usando arquivos do Docker e como usá-la para executar as seguintes operações:

  1. Execute o shell R.
  2. Inicialização do shell Python.
  3. Inicie o Jupyter Notebook.
  4. Inicie a configuração do OneBox.
  5. Iniciando o serviço da web R.
  6. Iniciando um serviço da Web Python.

Componentes Necessários


Qualquer máquina virtual Linux com software docker community edition (CE) instalado. Na preparação deste artigo, implantei a VM do Ubuntu 16.04 e instalei o docker CE .

Etapa 1


Primeiro, criaremos uma imagem chamada mlserver com o Machine Learning Server 9.3 instalado usando o seguinte arquivo de janela de encaixe:

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 o comando docker build para criar uma imagem mlserver usando o arquivo docker acima:

 docker build -f mlserver-dockerfile -t mlserver. 

Verifique se a criação da imagem mlserver foi concluída com êxito executando o seguinte comando:

 docker images 

Lançamento do Shell R


 docker run -it mlserver R 



Lançamento do shell Python


 docker run -it mlserver mlserver-python 



Iniciar o 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 

A execução do comando acima fornece um link, abrindo-o em um navegador, você pode usar os Jupyter Notebooks.



Iniciar configuração do OneBox


O Microsoft Learning Server pode ser configurado após a instalação para ser usado como servidor de implantação e hospedar serviços web analíticos para operacionalização .

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

Crie a imagem mlserver-onebox usando o arquivo de encaixe acima:

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

Verifique se a criação da imagem mlserver-onebox foi concluída com êxito executando o seguinte comando:

 docker images 

Inicie o contêiner onebox com o comando:

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

Verifique as condições do contêiner com:

 docker logs mlserver-onebox-container 

Após verificar com o comando acima se os testes de diagnóstico foram bem-sucedidos, você pode usar este contêiner como uma caixa (os dados do log do Docker devem conter a seguinte linha: “Todos os testes de diagnóstico foram aprovados”.).

Obtenha o endereço IP do contêiner executando o comando:

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

E use-o como uma caixa:

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

Iniciando o serviço da web R


Também podemos criar uma imagem com um serviço da Web pré-configurado para que fique pronto para uso assim que implantarmos o contêiner. Aqui está um exemplo de criação de uma imagem com o serviço da web R para simular a transmissão manual , que é pré-configurada dentro dela.

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

Crie uma imagem de transmissão manual usando o arquivo docker acima:

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

Verifique se a criação da imagem de transmissão rmanual foi concluída com êxito executando o comando:

 docker images 

Inicie o contêiner usando o comando:

 docker run --name rmanualtransmission-container -dit rmanualtransmission 

Verifique as condições do contêiner com:

 docker logs rmanualtransmission-container 

Depois de verificar se os testes de diagnóstico foram bem-sucedidos e o serviço da web foi publicado, você pode começar a usá-lo.

Obtenha o endereço IP do contêiner executando o comando:

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

Você pode usar ou obter o arquivo de configurações do serviço da web swagger.json R para simular a transferência manual usando os 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 

O arquivo swagger.json é adequado para criar uma biblioteca cliente em qualquer idioma .

Executando o serviço Web Python


A seguir, é apresentado um exemplo de criação de uma imagem com o serviço da Web Python para simular a transmissão manual pré-configurada dentro dela.

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

Crie uma imagem de transmissão pymanual usando o arquivo docker acima:

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

Verifique se a criação da imagem de transmissão pymanual foi concluída com êxito executando o comando:

 docker images 

Inicie o contêiner usando o comando:

 docker run --name pymanualtransmission-container -dit pymanualtransmission 

Verifique as condições do contêiner com:

 docker logs pymanualtransmission-container 

Depois de verificar se os testes de diagnóstico foram bem-sucedidos e o serviço da web foi publicado, você pode começar a usá-lo.

Obtenha o endereço IP do contêiner executando o comando:

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

Você pode obter o arquivo swagger.json para configurar um serviço da Web Python para simular a transferência manual usando os 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 

O arquivo swagger.json é adequado para criar uma biblioteca cliente em qualquer idioma .

NOTA Você também pode alterar as configurações do site appsettings.json usando o arquivo docker mágico e ativar a autenticação LDAP / AAD .

Extensões


Imagens de janela de encaixe local criadas podem ser enviadas para o ACR (Registro de Contêiner do Azure ).

Crie um cluster no Serviço de Kubernetes do Azure (AKS) usando imagens do ACR que podem ser dimensionadas automaticamente para os dois lados usando os pods de Escala Automática .

LINKS


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


All Articles