什么是 Azure 机器学习环境?

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

可以使用本地计算机上的 Environment 目标执行以下操作:

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

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

Diagram of an environment in machine learning workflow

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

环境类型

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

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

在用户管理的环境中,你需要负责设置环境,并在计算目标上安装训练脚本所需的每个包。 此外,请确保包含模型部署所需的任何依赖项。

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

创建和管理环境

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

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

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

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

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

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

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

Azure 机器学习将环境定义生成到 Docker 映像和 conda 环境中。 它还会缓存环境,使其可在后续的训练作业和服务终结点部署中重复使用。 远程运行训练脚本需要创建 Docker 映像,但本地作业可以直接使用 conda 环境。

使用某个环境提交作业

当你首次使用某个环境提交远程作业时,Azure 机器学习服务会在与工作区关联的 Azure 容器注册表 (ACR) 上调用 ACR 生成任务。 然后,生成的 Docker 映像将在工作区 ACR 中缓存。 特选环境由全局 ACR 中缓存的 Docker 映像提供支持。 开始执行作业时,计算目标会从相关 ACR 中检索该映像。

对于本地作业,将会基于环境定义创建 Docker 或 conda 环境。 然后,将在目标计算(本地运行时环境或本地 Docker 引擎)上执行脚本。

以 Docker 映像的形式生成环境

如果工作区 ACR 中尚不存在特定环境定义的映像,则系统会生成新映像。 映像生成包括两个步骤:

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

第二步是可选的,环境可能来自 Docker 生成上下文或基础映像。 在这种情况下,你需要负责安装任何 Python 包,方法是在基础映像中包含这些包,或者指定自定义 Docker 步骤。 你还要负责为 Python 可执行文件指定正确的位置。 还可以使用自定义 Docker 基础映像

缓存和重复使用映像

如果你对另一个作业使用相同的环境定义,Azure 机器学习会重用工作区 ACR 中缓存的映像以节省时间。

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

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

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

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

注意

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

环境的计算哈希值将与工作区和全局 ACR 中的或计算目标上的哈希值进行比较(仅限本地作业)。 如果匹配,则拉取并使用缓存的映像,否则触发映像生成。

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

Diagram of environment caching and Docker images

工作区 ACR 中实际缓存的映像的名称类似于 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 机器学习资产。

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

后续步骤