在开始本节内容之前,你需要:
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 要求的文件创建环境。 使用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环境“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
通过 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)
输出:
可以按名称和版本获取特定环境。 下面的代码使用get()方法在 ws 工作区中检索 iris-env 环境的版本 5。
restored_environment = Environment.get(workspace=ws,name="iris-env",version="5")
就可以在接下来的训练和部署中使用该环境。
本节介绍了如何使用Azure 机器学习 Environment 类创建环境并指定包依赖关系,目的主要是更新在训练和部署中使用到的docker镜像的conda和pip源。
在Mooncake上使用Azure机器学习,对同一次试验任务来说,不使用国内源构建docker镜像的速度很慢,会极大增加训练模型的时间,如下图所示。
图2 AML使用默认源和使用国内源创建docker镜像的时间对比
使用 Azure 机器学习使用培训和部署的环境
使用自定义 Docker 基本映像部署模型
如何从看不懂Dockerfile到创建自己的镜像
如何在dockerfile中更换pip install的源