如何使用 Docker 打包注册的模型

本文介绍如何使用 Docker 打包已注册的 Azure 机器学习模型。

必备条件

本文假设你已在机器学习工作区中训练并注册了一个模型。 若要了解如何训练和注册 scikit-learn 模型,请遵循本教程

包模型

在某些情况下,你可能希望在不部署模型的情况下创建 Docker 映像。 或者,你可能希望下载映像并在本地 Docker 安装上运行它。 甚至可能需要下载用于生成映像的文件、对其进行检查和修改并手动生成映像。

这些工作都可以通过打包模型来完成。 此方法能对将模型作为 Web 服务托管所需的全部资产进行打包,让你能下载完整生成的 Docker 映像或生成该映像所需的文件。 可以通过两种方式使用模型打包:

下载已打包的模型: 下载包含模型以及将其作为 Web 服务托管所需的其他文件的 Docker 映像。

生成 Dockerfile: 下载生成 Docker 映像所需的 Dockerfile、模型、入口脚本和其他资产。 然后可以先检查这些文件或进行修改,再在本地生成映像。

这两个包都可用于获取本地 Docker 映像。

提示

创建包类似于部署模型。 使用注册的模型和推理配置。

重要

若要下载完整生成的映像或要在本地生成映像,需要在开发环境中安装 Docker

下载已打包的模型

下面的示例生成一个映像,该映像已在工作区的 Azure 容器注册表中注册:

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

创建包后,可以使用 package.pull() 将映像拉取到本地 Docker 环境。 此命令的输出将显示映像的名称。 例如:

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

下载模型后,使用 docker images 命令列出本地映像:

REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
myworkspacef78fd10.azurecr.cn/package    20190822181338      7ff48015d5bd        4 minutes ago       1.43 GB

若要启动基于此映像的本地容器,请使用以下命令从 Shell 或命令行启动已命名容器。 使用 docker images 命令返回的映像 ID 替换 <imageid> 值。

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

此命令启动名为 myimage 的映像的最新版本。 它将本地端口 6789 映射到 Web 服务正在侦听的容器中的端口 (5001)。 还将名称 mycontainer 分配给容器,使容器更易于停止。 启动容器后,可以将请求提交到 http://localhost:6789/score

生成 Dockerfile 和依赖项

下面的示例演示如何下载在本地生成映像所需的 Dockerfile、模型和其他资产。 generate_dockerfile=True 参数表示需要的是文件,而不是完整生成的映像。

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)

此代码将生成映像所需的文件下载到 imagefiles 目录。 已保存的文件中包含的 Dockerfile 引用存储在 Azure 容器注册表中的基础映像。 在本地 Docker 安装上生成映像时,需要使用地址、用户名和密码完成注册表身份验证。 采取以下步骤,通过本地 Docker 安装生成映像:

  1. 在 Shell 或命令行会话中使用以下命令,使用 Azure 容器注册表对 Docker 进行身份验证。 将 <address><username><password> 替换为 package.get_container_registry() 检索到的值。

    docker login <address> -u <username> -p <password>
    
  2. 若要生成映像,请使用以下命令。 将 <imagefiles> 替换为 package.save() 保存文件的目录的路径。

    docker build --tag myimage <imagefiles>
    

    此命令将映像名设置为 myimage

若要验证是否已生成映像,请使用 docker images 命令。 在列表中应该能看到 myimage 映像:

REPOSITORY      TAG                 IMAGE ID            CREATED             SIZE
<none>          <none>              2d5ee0bf3b3b        49 seconds ago      1.43 GB
myimage         latest              739f22498d64        3 minutes ago       1.43 GB

若要启动基于此映像的新容器,请使用以下命令:

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

此命令启动名为 myimage 的映像的最新版本。 它将本地端口 6789 映射到 Web 服务正在侦听的容器中的端口 (5001)。 还将名称 mycontainer 分配给容器,使容器更易于停止。 启动容器后,可以将请求提交到 http://localhost:6789/score

测试本地容器的示例客户端

以下代码是可与容器结合使用的 Python 客户端示例:

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)

若要通过示例了解采用其他编程语言的客户端,请参阅使用部署为 Web 服务的模型

停止 Docker 容器

若要停止容器,请在不同的 Shell 或命令行中使用以下命令:

docker kill mycontainer

后续步骤