什么是 Azure 机器学习环境?

Azure 机器学习环境封装了一个供你在其中进行机器学习训练的环境。 它们指定了 Python 包和有关训练与评分脚本的软件设置。 环境是机器学习工作区中受管理且版本受控的实体,可用于创建跨各种计算目标的可再现、可审核且可移植的机器学习工作流。

可以使用 Environment 对象执行以下任务:

  • 开发训练脚本。
  • 在 Azure 机器学习计算中重用相同的环境进行大规模的模型训练。
  • 使用该相同环境部署你的模型。
  • 重新访问在其中训练了现有模型的环境。

下图说明了如何将单个 Environment 对象同时用于你的作业配置(用于训练)与你的推理和部署配置(用于 Web 服务部署)。

图示:机器学习工作流中的环境

环境、计算目标和训练脚本共同构成了作业配置:完整的训练作业规范。

环境类型

环境可以总体分为三类:特选类、用户管理类以及系统管理类 。

特选环境由 Azure 机器学习提供,且默认可用于你的工作区。 应该按原样使用它们,其中包含的 Python 包和设置的集合可帮助你开始使用各种机器学习框架。 这些预先创建的环境还可以加快部署速度。 特选环境托管在 AzureML 注册表中。 有关完整列表,请参阅 azureml 注册表中的环境

在用户管理的环境中,你需要负责设置环境,并在计算目标上安装训练脚本所需的每个包。 此外,请确保包含模型部署所需的任何依赖项。 用户管理的环境可以是 BYOC(自带容器),也可以基于 Docker 生成上下文,可将映像具体化委托给 AzureML 来处理。

如果你希望通过 conda 自动管理 Python 环境,请使用系统管理的环境。 新的 conda 环境将从基础 Docker 映像顶层的 conda 规范具体化。

创建和管理环境

可以从 Azure 机器学习 Python SDK 和 Azure 机器学习 CLI 等客户端、Azure 机器学习工作室中的“环境”页和 VS Code 扩展创建环境。 每个客户端允许你根据需要自定义基础映像、Dockerfile 和 Python 层。

如需具体的代码示例,请参阅如何使用环境中的“创建环境”部分。

还可以通过工作区轻松管理环境,这样你便可以:

  • 注册环境。
  • 从工作区提取环境以用于训练或部署。
  • 通过编辑现有环境来创建环境的新实例。
  • 查看环境随时间的变化,确保可重现性。
  • 从环境自动生成 Docker 映像。

当你提交试验时,系统会自动在工作区中注册“匿名”环境。 这些环境不会列出,但可按版本检索。

如需代码示例,请参阅如何使用环境中的“管理环境”部分。

生成、缓存和重复使用环境

Azure 机器学习将环境定义生成到 Docker 映像中。 它还会缓存环境,使其可在后续的训练作业和服务终结点部署中重复使用。 远程运行训练脚本需要创建 Docker 映像。 默认情况下,如果未为工作区设置专用计算,则 AzureML 将根据可用的工作区无服务器计算配额管理映像生成目标。

注意

AzureML 工作区中的任何网络限制可能要求设置专用的、用户管理的映像生成计算。 请按照保护工作区资源的步骤操作。

使用某个环境提交作业

首次使用环境提交远程作业或手动创建环境实例时,Azure 机器学习会根据提供的规范生成映像。 结果映像缓存在与工作区关联的容器注册表实例中。 特选环境已缓存在 AzureML 注册表中。 开始执行作业时,计算目标会从相关容器注册表检索该映像。

以 Docker 映像的形式生成环境

如果与 AzureML 工作区关联的容器注册表实例中尚不存在特定环境定义的映像,则会生成新映像。 对于系统管理的环境,映像生成由两个步骤组成:

  1. 下载基础映像,并执行任何 Docker 步骤
  2. 根据环境定义中指定的 conda 依赖项生成 conda 环境。

对于用户管理的环境,提供的 Docker 上下文将按原样生成。 在这种情况下,你需要负责安装任何 Python 包,方法是在基础映像中包含这些包,或者指定自定义 Docker 步骤。

缓存和重复使用映像

如果对另一个作业使用相同的环境定义,Azure 机器学习将重用与工作区关联的容器注册表中的缓存映像。

若要查看缓存映像的详细信息,请查看 Azure 机器学习工作室中的“环境”页或使用 MLClient.environments 获取和检查环境。

为了确定是要重用缓存的映像还是生成新映像,Azure 机器学习会从环境定义计算哈希值,并将其与现有环境的哈希值进行比较。 哈希充当环境的唯一标识符,基于环境定义:

  • Base image
  • 自定义 Docker 步骤
  • Python 包

哈希不受环境名称或版本的影响。 如果你重命名环境或创建与另一个环境具有相同设置和包的新环境,则哈希值将保持不变。 但是,环境定义更改(例如添加或删除 Python 包或更改包版本)会更改生成的哈希值。 更改环境中依赖项或通道的顺序也会更改哈希,并需要生成新映像。 同样,对特选环境所做的任何更改都会导致创建自定义环境。

注意

在不更改环境名称的情况下,无法向特选环境提交任何本地更改。 前缀“AzureML-”和“Microsoft”是专为特选环境保留的,如果名称以两者中的任何一个开头,则作业提交将会失败。

环境的计算哈希值将与工作区容器注册表中的哈希值进行比较。 如果匹配,则拉取并使用缓存的映像,否则触发映像生成。

下图显示了三个环境定义。 其中两个环境的名称和版本不同,但基础映像和 Python 包相同,这会导致生成相同的哈希和相应的缓存映像。 第三个环境具有不同的 Python 包和版本,从而导致生成不同的哈希和缓存映像。

环境缓存和 Docker 映像的示意图

工作区容器注册表中的实际缓存映像的名称类似于 azureml/azureml_e9607b2514b066c851012848913ba19f,哈希显示在末尾。

重要

  • 如果使用未固定的包依赖项(例如 numpy)创建环境,则环境将使用创建环境时可用的包版本。 任何使用匹配定义的后续环境将使用原始版本。

    若要更新包,请指定版本号以强制重新生成映像。 例如,将 numpy 更改为 numpy==1.18.1。 系统将会安装新的依赖项(包括嵌套的依赖项),而这可能会破坏之前正常工作的方案。

  • 使用环境定义中未固定的基础映像(例如 mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04)可能会导致每次更新最新 latest 标记时重新生成映像。 这有助于映像接收最新的补丁和系统更新。

映像修补

Azure 负责修补基础映像的已知安全漏洞。 受支持映像的更新每两周发布一次,Microsoft 承诺最新版本的映像中不存在超过 30 天的未修补漏洞。 已修补的映像在发布时带有新的不可变标记,:latest 标记将更新为已修补映像的最新版本。

你需要更新关联的 Azure 机器学习资产以使用新修补的映像。 例如,使用托管联机终结点时,你需要重新部署终结点以使用修补的映像。

如果你提供自己的映像,则需负责更新它们并更新使用这些映像的 Azure 机器学习资产。

有关基础映像的详细信息,请参阅以下链接:

后续步骤