Partilhar via


Como empacotar um modelo registrado com o Docker

Este artigo mostra como empacotar um modelo registrado do Azure Machine Learning com o Docker.

Pré-requisitos

Este artigo pressupõe que você já treinou e registrou um modelo em seu espaço de trabalho de aprendizado de máquina. Para aprender a treinar e registrar um modelo scikit-learn, siga este tutorial.

Modelos de pacote

Em alguns casos, talvez você queira criar uma imagem do Docker sem implantar o modelo. Ou talvez você queira baixar a imagem e executá-la em uma instalação local do Docker. Você pode até mesmo querer baixar os arquivos usados para construir a imagem, inspecioná-los, modificá-los e construir a imagem manualmente.

O modelo de embalagem permite que você faça essas coisas. 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. Há duas maneiras de usar o modelo de embalagem:

Baixar um modelo empacotado: baixe uma imagem do Docker que contenha o modelo e outros arquivos necessários para hospedá-lo como um serviço Web.

Gerar um Dockerfile: baixe o Dockerfile, o modelo, o script de entrada e outros ativos necessários para criar uma imagem do Docker. Em seguida, você pode inspecionar os arquivos ou fazer alterações antes de criar a imagem localmente.

Ambos os pacotes podem ser usados para obter uma imagem local do Docker.

Gorjeta

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 baixar uma imagem totalmente construída ou criar uma imagem localmente, você precisa ter o Docker instalado em seu ambiente de desenvolvimento.

Baixar um modelo empacotado

O exemplo a seguir cria uma imagem, que é registrada no registro de contêiner do Azure para seu espaço de trabalho:

package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)

Depois de criar um pacote, você pode usar package.pull() para puxar a imagem para seu ambiente Docker local. A saída deste comando exibirá o nome da imagem. Por exemplo:

Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338.

Depois de baixar o modelo, use 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 contêiner local com base nessa imagem, use o seguinte comando para iniciar um contêiner nomeado a partir do shell ou da linha de comando. Substitua o <imageid> valor pelo ID da docker images imagem retornado pelo comando.

docker run -p 6789:5001 --name mycontainer <imageid>

Este comando inicia a versão mais recente da imagem denominada myimage. Ele mapeia a porta local 6789 para a porta no contêiner no qual o serviço Web está escutando (5001). Também atribui o nome mycontainer ao contentor, o que torna o contentor mais fácil de parar. Depois que o contêiner for iniciado, você poderá enviar solicitações para http://localhost:6789/score.

Gerar um Dockerfile e dependências

O exemplo a seguir mostra como baixar o Dockerfile, o modelo e outros ativos necessários para criar uma imagem localmente. O generate_dockerfile=True parâmetro indica que você deseja os arquivos, não uma imagem totalmente construída.

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)

Esse código baixa os arquivos necessários para construir a imagem no imagefiles diretório. O Dockerfile incluído nos arquivos salvos faz referência a uma imagem base armazenada em um registro de contêiner do Azure. Ao criar a imagem em sua instalação local do Docker, você precisa usar o endereço, o nome de usuário e a senha para autenticar no registro. Use as seguintes etapas para criar a imagem usando uma instalação local do Docker:

  1. Em uma sessão de shell ou linha de comando, use o comando a seguir para autenticar o Docker com o registro de contêiner do Azure. Substitua <address>, <username>e <password> pelos valores recuperados por package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. Para criar a imagem, use o seguinte comando. Substitua <imagefiles> pelo caminho do diretório onde package.save() os arquivos foram salvos.

    docker build --tag myimage <imagefiles>
    

    Este comando define o nome da imagem como myimage.

Para verificar se a imagem foi criada, use o docker images comando. Você deve 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 contêiner com base nessa imagem, use o seguinte comando:

docker run -p 6789:5001 --name mycontainer myimage:latest

Este comando inicia a versão mais recente da imagem denominada myimage. Ele mapeia a porta local 6789 para a porta no contêiner no qual o serviço Web está escutando (5001). Também atribui o nome mycontainer ao contentor, o que torna o contentor mais fácil de parar. Depois que o contêiner for iniciado, você poderá enviar solicitações para http://localhost:6789/score.

Exemplo de cliente para testar o contêiner local

O código a seguir é um exemplo de um cliente Python que pode ser usado com o contêiner:

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 em outras linguagens de programação, consulte Consumir modelos implantados como serviços Web.

Pare o contêiner do Docker

Para parar o contêiner, use o seguinte comando de um shell ou linha de comando diferente:

docker kill mycontainer

Próximos passos