Como empacotar um modelo registado com o Docker
Este artigo mostra como empacotar um modelo do Azure Machine Learning registado com o Docker.
Pré-requisitos
Este artigo pressupõe que já preparou e registou um modelo na sua área de trabalho de machine learning. Para saber como preparar e registar um modelo scikit-learn, siga este tutorial.
Modelos de pacote
Em alguns casos, poderá querer criar uma imagem do Docker sem implementar o modelo. Em alternativa, poderá querer transferir a imagem e executá-la numa instalação local do Docker. Poderá até querer transferir os ficheiros utilizados para criar a imagem, inspecioná-los, modificá-los e compilar a imagem manualmente.
O empacotamento de modelos permite-lhe efetuar estas ações. Esta funcionalidade empacota todos os ativos necessários para alojar um modelo como serviço Web e permite-lhe transferir uma imagem do Docker totalmente criada ou os ficheiros necessários para criar uma imagem. Existem duas formas de utilizar o empacotamento de modelos:
Transfira um modelo empacotado: Transfira uma imagem do Docker que contenha o modelo e outros ficheiros necessários para alojá-lo como um serviço Web.
Gerar um Dockerfile: Transfira o Dockerfile, o modelo, o script de entrada e outros recursos necessários para criar uma imagem do Docker. Em seguida, pode inspecionar os ficheiros ou fazer alterações antes de criar a imagem localmente.
Ambos os pacotes podem ser utilizados para obter uma imagem do Docker local.
Dica
O processo de criação de um pacote é semelhante ao de implementação de um modelo. Para o efeito, utiliza um modelo registado e uma configuração de inferência.
Importante
Para transferir uma imagem totalmente criada ou criar uma imagem localmente, tem de ter o Docker instalado no seu ambiente de desenvolvimento.
Transferir um modelo empacotado
O exemplo seguinte cria uma imagem, que está registada no registo de contentor do Azure para a sua área de trabalho:
package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
Depois de criar um pacote, pode utilizar package.pull()
para solicitar a imagem para o seu ambiente local do Docker. O resultado deste comando apresentará o nome da imagem. Por exemplo:
Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338
.
Depois de transferir o modelo, utilize o docker images
comando para listar as imagens locais:
REPOSITORY TAG IMAGE ID CREATED SIZE
myworkspacef78fd10.azurecr.io/package 20190822181338 7ff48015d5bd 4 minutes ago 1.43 GB
Para iniciar um contentor local com base nesta imagem, utilize o seguinte comando para iniciar um contentor com nome a partir da shell ou da linha de comandos. Substitua o <imageid>
valor pelo ID de imagem devolvido pelo docker images
comando .
docker run -p 6789:5001 --name mycontainer <imageid>
Este comando inicia a versão mais recente da imagem com o nome myimage
. Mapeia a porta local 6789 para a porta no contentor no qual o serviço Web está a escutar (5001). Também atribui o nome mycontainer
ao contentor, o que facilita a paragem do contentor. Depois de o contentor ser iniciado, pode submeter pedidos para http://localhost:6789/score
.
Gerar um Dockerfile e dependências
O exemplo seguinte mostra como transferir o Dockerfile, o modelo e outros recursos necessários para criar uma imagem localmente. O generate_dockerfile=True
parâmetro indica que pretende os ficheiros, não uma imagem totalmente criada.
package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)
Este código transfere os ficheiros necessários para criar a imagem para o imagefiles
diretório. O Dockerfile incluído nos ficheiros guardados faz referência a uma imagem de base armazenada num registo de contentor do Azure. Quando cria a imagem na instalação local do Docker, tem de utilizar o endereço, o nome de utilizador e a palavra-passe para efetuar a autenticação no registo. Utilize os seguintes passos para criar a imagem com uma instalação local do Docker:
A partir de uma shell ou sessão de linha de comandos, utilize o seguinte comando para autenticar o Docker com o registo de contentor do Azure. Substitua
<address>
,<username>
e<password>
pelos valores obtidos porpackage.get_container_registry()
.docker login <address> -u <username> -p <password>
Para criar a imagem, utilize o seguinte comando. Substitua
<imagefiles>
pelo caminho do diretório ondepackage.save()
os ficheiros foram guardados.docker build --tag myimage <imagefiles>
Este comando define o nome da imagem como
myimage
.
Para verificar se a imagem foi criada, utilize o docker images
comando . Deverá ver a myimage
imagem na lista:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 2d5ee0bf3b3b 49 seconds ago 1.43 GB
myimage latest 739f22498d64 3 minutes ago 1.43 GB
Para iniciar um novo contentor com base nesta imagem, utilize o seguinte comando:
docker run -p 6789:5001 --name mycontainer myimage:latest
Este comando inicia a versão mais recente da imagem com o nome myimage
. Mapeia a porta local 6789 para a porta no contentor no qual o serviço Web está a escutar (5001). Também atribui o nome mycontainer
ao contentor, o que facilita a paragem do contentor. Depois de o contentor ser iniciado, pode submeter pedidos para http://localhost:6789/score
.
Cliente de exemplo para testar o contentor local
O código seguinte é um exemplo de um cliente Python que pode ser utilizado com o contentor:
import requests
import json
# URL for the web service.
scoring_uri = 'http://localhost:6789/score'
# Two sets of data to score, so we get two results back.
data = {"data":
[
[ 1,2,3,4,5,6,7,8,9,10 ],
[ 10,9,8,7,6,5,4,3,2,1 ]
]
}
# Convert to JSON string.
input_data = json.dumps(data)
# Set the content type.
headers = {'Content-Type': 'application/json'}
# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
Por exemplo, clientes noutras linguagens de programação, veja Consumir modelos implementados como serviços Web.
Parar o contentor do Docker
Para parar o contentor, utilize o seguinte comando a partir de uma shell ou linha de comandos diferente:
docker kill mycontainer
Passos seguintes
- Resolver problemas de uma implementação com falhas
- Implementar no Azure Kubernetes Service
- Criar aplicações cliente para consumir serviços Web
- Atualizar serviços Web
- Como implementar um modelo com uma imagem personalizada do Docker
- Utilizar o TLS para proteger um serviço Web através do Azure Machine Learning
- Monitorizar os modelos do Azure Machine Learning com o Application Insights
- Recolher dados para modelos em produção
- Criar alertas de eventos e acionadores para implementações de modelos