Azure机器学习——配置 Azure 机器学习Python环境

配置 Azure 机器学习Python环境(Environment类)

  • 一、使用前提
  • 二、Environment类
    • 连接和初始化工作区
    • 创建环境
      • 实例化环境对象
      • 使用 Conda 和 pip 规范文件创建环境
      • 使用现有的 Conda 环境创建环境
    • 将包添加到环境
    • 启用 Docker
    • 注册环境
    • 获取现有环境
  • 三、总结
  • 四、参考资料

本地提交机器学习试验到云上运行时,Azure机器学习会根据试验的运行环境生成一个docker镜像,然后将这个docker镜像push到工作区默认的Azure容器注册表(Azure Container Registry, ACR)中。云上的计算集群接收到该试验任务后会启动计算节点,节点通过之前上传的docker镜像创建docker容器,之后计算任务开始在这些docker容器中执行。
一般来说,直接使用Azure机器学习Python SDK中现成的SKLearn、PyTorch和TensorFlow等框架提交试验任务,任务的Python环境都会自动配置好,基本不需要自行设置。但是 在Mooncake上创建docker镜像时,因为网络原因conda和pip从默认源获取资源的速度非常慢,因此有必要在这里介绍一下如何使用Environment类在Azure机器学习创建镜像时使用conda和pip的国内源。
Azure机器学习——配置 Azure 机器学习Python环境_第1张图片
图1 在模型训练中配置Python运行环境

一、使用前提

在开始本节内容之前,你需要:

  • Azure 订阅和Azure机器学习工作区。创建方法:Azure机器学习(实战篇)——创建Azure机器学习服务
  • 配置Azure机器学习开发环境。配置方法:Azure机器学习(实战篇)——配置 Azure 机器学习开发环境

二、Environment类

Environment类定义了在机器学习试验中使用的 Python 包、环境变量和 Docker 设置,其中包括数据准备、训练和 web 服务部署。 Environment不能跨工作区使用。

连接和初始化工作区

from azureml.core import Workspace, Environment

ws = Workspace.from_config('config.json')

其中’config.json’配置文件的创建请参考:Azure机器学习(实战篇)——配置 Azure 机器学习开发环境。

创建环境

实例化环境对象

若要手动创建环境,请从 SDK 导入 Environment 类。 然后使用以下代码实例化环境对象。

from azureml.core.environment import Environment

myenv=Environment(name="iris-env")
myenv

输出:

{
    "name": "iris-env",
    "version": null,
    "environmentVariables": {
        "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
    },
    "python": {
        "userManagedDependencies": false,
        "interpreterPath": "python",
        "condaDependenciesFile": null,
        "baseCondaEnvironment": null,
        "condaDependencies": {
            "name": "project_environment",
            "dependencies": [
                "python=3.6.2",
                {
                    "pip": [
                        "azureml-defaults"
                    ]
                }
            ],
            "channels": [
                "conda-forge"
            ]
        }
    },
    "docker": {
        "enabled": false,
        "baseImage": "mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04",
        "baseDockerfile": null,
        "sharedVolumes": true,
        "shmSize": "2g",
        "arguments": [],
        "baseImageRegistry": {
            "address": null,
            "username": null,
            "password": null
        }
    },
    "spark": {
        "repositories": [],
        "packages": [],
        "precachePackages": true
    },
    "databricks": {
        "mavenLibraries": [],
        "pypiLibraries": [],
        "rcranLibraries": [],
        "jarLibraries": [],
        "eggLibraries": []
    },
    "inferencingStackVersion": null
}

默认的环境中包含了环境的名字、版本、环境变量、Python的conda和pip等信息,以及训练时docker所用的baseImage。

使用 Conda 和 pip 规范文件创建环境

还可以从 符合Conda 规范或 pip 要求的文件创建环境。 使用from_conda_specification()方法或from_pip_requirements()方法。 在方法参数中,包含你的环境名称和所需文件的文件路径。

# From a Conda specification file
myenv = Environment.from_conda_specification(name = "myenv",
                                             file_path = "Conda环境规范YAML文件路径")

# From a pip requirements file
myenv = Environment.from_pip_requirements(name = "myenv"
                                          file_path = "Pip要求文件路径")

使用现有的 Conda 环境创建环境

如果本地计算机上已有满足试验运行的Conda 环境,则可以使用本地环境创建环境对象。 使用此方法,你可以在远程计算资源运行时重用本地环境。
下面的代码使用本地conda环境“mycondaenv”创建环境对象。 它使用了from_existing_conda_environment()方法。

myenv = Environment.from_existing_conda_environment(name = "myenv",
                                                    conda_environment_name = "mycondaenv")

将包添加到环境

使用 Conda、pip 或专用wheel文件将包添加到环境。 使用CondaDependency类指定每个包依赖项。 将其添加到环境的 PythonSection。
如果 Conda 包存储库中提供了包,则建议使用 Conda 安装而不是 pip 安装。 Conda 包通常附带预生成的二进制文件,使安装更可靠。
下面的示例将某次试验所需要的添加到环境中。 该示例分别使用add_conda_package()方法和add_pip_package()方法。

from azureml.core.conda_dependencies import CondaDependencies

cd = CondaDependencies.create(pip_packages=['joblib==0.13.2','numpy','azureml-dataprep[pandas,fuse]>=1.1.14', 'azureml-defaults'],
                              conda_packages = ['scikit-learn==0.22.1'])

# Adds dependencies to PythonSection of myenv
myenv.python.conda_dependencies = cd

启用 Docker

通过 Azure 机器学习 Environment 类的DockerSection启用 Docker 后,服务将生成一个 Docker 映像。 它会创建一个 Python 环境,该环境使用该 Docker 容器中的规范。 该功能为训练运行提供额外的隔离和可再现性。
启用Docker

# Creates the environment inside a Docker container.
myenv.docker.enabled = True

Azure机器学习会自动使用一个基于 Ubuntu Linux 的基础映像,就是上面myenv输出的"baseImage"。
我们使用这个基础镜像,但是从上面myenv的输出可以看出,conda和pip没有使用国内的源,所以docker镜像创建的过程非常的慢。
我们通过指定自定义 Dockerfile来添加conda和pip的国内源:首先使用 Docker FROM 命令从 Azure 机器学习的基础映像开始,然后添加自己的自定义步骤。这种方法也适合将非 Python 包作为依赖项安装。

# Specify docker steps as a string. Alternatively, load the string from a file.
dockerfile = r"""
FROM mcr.microsoft.com/azureml/base:intelmpi2018.3-ubuntu16.04
RUN conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ && \
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/ && \
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/mro/ && \
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ && \
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/ && \
conda config --set show_channel_urls yes
RUN pip install -U pip
RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
RUN pip config set install.trusted-host mirrors.aliyun.com
RUN echo "Hello from custom container!"
"""

# Set base image to None, because the image is defined by dockerfile.
myenv.docker.base_image = None
myenv.docker.base_dockerfile = dockerfile

注册环境

当你提交运行或部署 web 服务时,环境将自动注册到你的工作区。 你还可以使用register()方法手动注册环境。 此操作使环境成为在云中进行跟踪和版本控制的实体。 实体可以在工作区用户之间共享。
下面的代码将 myenv 环境注册到 ws 工作区。

# Register environment to re-use later
myenv.register(workspace = ws)

当你在训练或部署中首次使用该环境时,它会注册到工作区。 然后,它将在计算目标上生成和部署。 该服务会缓存环境。 重复使用缓存的环境所需的时间比使用新服务或更新的环境少得多。(前提是 conda 依赖关系保持不变)

获取现有环境

使用Environment.list(workspace=“workspace_name”)类查看工作区中的环境。 然后选择要重复使用的环境。

env_list=Environment.list(ws)
print(env_list)

输出:
Azure机器学习——配置 Azure 机器学习Python环境_第2张图片
可以按名称和版本获取特定环境。 下面的代码使用get()方法在 ws 工作区中检索 iris-env 环境的版本 5。

restored_environment = Environment.get(workspace=ws,name="iris-env",version="5")

就可以在接下来的训练和部署中使用该环境。

三、总结

本节介绍了如何使用Azure 机器学习 Environment 类创建环境并指定包依赖关系,目的主要是更新在训练和部署中使用到的docker镜像的conda和pip源。
在Mooncake上使用Azure机器学习,对同一次试验任务来说,不使用国内源构建docker镜像的速度很慢,会极大增加训练模型的时间,如下图所示。
Azure机器学习——配置 Azure 机器学习Python环境_第3张图片
图2 AML使用默认源和使用国内源创建docker镜像的时间对比

四、参考资料

使用 Azure 机器学习使用培训和部署的环境
使用自定义 Docker 基本映像部署模型
如何从看不懂Dockerfile到创建自己的镜像
如何在dockerfile中更换pip install的源

你可能感兴趣的:(Azure机器学习,python,机器学习,人工智能,azure,machine,learning)