使用自定义 Docker 映像训练模型
本文描述如何使用自定义 Docker 映像通过 Azure 机器学习来训练模型。 示例脚本展示了如何通过创建卷积神经网络对图像进行分类。
Azure 机器学习提供了一个默认的 Docker 基础映像。 你还可以使用 Azure 机器学习环境来指定一个不同的基础映像,例如系统维护的 Azure 机器学习基础映像或你自己的自定义映像。 借助自定义基础映像,你可以在运行训练作业时密切管理依赖项,以及更加严格地控制组件版本。
先决条件
若要运行示例代码,配置必须包含以下环境之一:
Azure 机器学习计算实例,具有预加载机器学习 SDK 和示例存储库的专用笔记本服务器。
此配置不需要下载或其他安装。 若要准备此环境,请参阅创建资源以开始使用。
Jupyter Notebook 服务器。 以下资源提供帮助你准备此环境的说明:
- 创建工作区配置文件。
- 安装 Azure 机器学习 SDK。
- 创建可在 Internet 上访问的 Azure 容器注册表或其他 Docker 注册表。
设置训练实验
第一个任务是通过初始化机器学习工作区、定义你的环境并配置计算目标来设置训练实验。
初始化工作区
Azure 机器学习工作区是服务的顶级资源。 它提供了一个集中化位置来处理你创建的所有项目。 在 Python SDK 中,可以通过创建 Workspace
对象来访问工作区项目。
根据需要,通过作为先决条件创建的 config.json 文件创建一个 Workspace
对象。
from azureml.core import Workspace
ws = Workspace.from_config()
定义环境
创建一个 Environment
对象。
from azureml.core import Environment
fastai_env = Environment("fastai2")
以下代码中指定的基础映像支持 fast.ai 库,后者支持分布式深度学习功能。 有关详细信息,请参阅 fast.ai Docker Hub 存储库。
使用自定义 Docker 映像时,你可能已经正确设置了 Python 环境。 在这种情况下,请将 user_managed_dependencies
标志设置为 True
,以使用自定义映像的内置 Python 环境。 默认情况下,Azure 机器学习构建包含指定依赖项的 Conda 环境。 该服务在该环境中运行脚本,而不是使用已安装在基础映像中的任何 Python 库。
fastai_env.docker.base_image = "fastdotai/fastai2:latest"
fastai_env.python.user_managed_dependencies = True
使用专用容器注册表(可选)
若要使用不在工作区中的专用容器注册表中的映像,请使用 docker.base_image_registry
指定存储库的地址以及用户名和密码:
# Set the container registry information
fastai_env.docker.base_image_registry.address = "myregistry.azurecr.cn"
fastai_env.docker.base_image_registry.username = "username"
fastai_env.docker.base_image_registry.password = "password"
使用自定义 Dockerfile(可选)
还可以使用自定义 Dockerfile。 如果需要安装非 Python 包作为依赖项,请使用此方法。 记得将基础映像设置为 None
。
# Specify Docker steps as a string
dockerfile = r"""
FROM mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210615.v1
RUN echo "Hello from custom container!"
"""
# Set the base image to None, because the image is defined by Dockerfile
fastai_env.docker.base_image = None
fastai_env.docker.base_dockerfile = dockerfile
# Alternatively, load the string from a file
fastai_env.docker.base_image = None
fastai_env.docker.base_dockerfile = "./Dockerfile"
重要
Azure 机器学习仅支持提供以下软件的 Docker 映像:
- Ubuntu 18.04 或更高版本
- Conda 4.7.# 或更高版本
- Python 3.7+
- 在用于训练的任何容器映像中,都需要在 /bin/sh 处有符合 POSIX 标准的 shell
若要详细了解如何创建和管理 Azure 机器学习环境,请参阅创建和使用软件环境。
创建或附加计算目标
你需要创建一个计算目标来训练模型。 在本教程中,你将创建 AmlCompute
作为训练计算资源。
创建 AmlCompute
需要几分钟时间。 如果你的工作区中已有 AmlCompute
资源,则此代码会跳过创建流程。
与其他 Azure 服务一样,与 Azure 机器学习服务关联的某些资源(例如 AmlCompute
)存在限制。 有关详细信息,请参阅默认限制以及如何请求更高的配额。
from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException
# Choose a name for your cluster
cluster_name = "gpu-cluster"
try:
compute_target = ComputeTarget(workspace=ws, name=cluster_name)
print('Found existing compute target.')
except ComputeTargetException:
print('Creating a new compute target...')
compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6',
max_nodes=4)
# Create the cluster
compute_target = ComputeTarget.create(ws, cluster_name, compute_config)
compute_target.wait_for_completion(show_output=True)
# Use get_status() to get a detailed status for the current AmlCompute
print(compute_target.get_status().serialize())
重要
为计算上的任何映像生成使用 CPU SKU。
配置训练作业
对于本教程,请使用 GitHub 上的训练脚本 train.py。 实际上,你可以原样接受任何自定义的训练脚本并使用 Azure 机器学习运行它。
创建 ScriptRunConfig
资源,以将作业配置为在所需的计算目标上运行。
from azureml.core import ScriptRunConfig
src = ScriptRunConfig(source_directory='fastai-example',
script='train.py',
compute_target=compute_target,
environment=fastai_env)
提交训练作业
使用 ScriptRunConfig
对象提交训练运行时,submit
方法返回 ScriptRun
类型的对象。 返回的 ScriptRun
对象使你能够以编程方式访问有关训练运行的信息。
from azureml.core import Experiment
run = Experiment(ws,'Tutorial-fastai').submit(src)
run.wait_for_completion(show_output=True)
警告
Azure 机器学习通过复制整个源目录来运行训练脚本。 如果你有不想上传的敏感数据,请使用 .ignore 文件或不将其包含在源目录中。 请改为使用数据存储来访问数据。