什么是适用于 Python 的 Azure 机器学习 SDK?

数据科学家和 AI 开发人员可以结合 Azure 机器学习服务使用适用于 Python 的 Azure 机器学习 SDK 来构建和运行机器学习工作流。 可与任何 Python 环境中的服务(包括 Jupyter Notebooks、Visual Studio Code 或你偏爱的 Python IDE 交互。

SDK 的重要应用领域包括:

  • 探索、准备和管理机器学习试验中使用的数据集的生命周期。
  • 管理用于监视、记录和组织机器学习试验的云资源。
  • 在本地或使用云资源训练模型,包括 GPU 加速的模型训练。
  • 使用接受配置参数和训练数据的自动化机器学习。 该技术可以自动迭代算法和超参数设置,找到最适合用于运行预测的模型。
  • 部署 Web 服务以将训练的模型转换为可在任何应用程序中使用的 RESTful 服务。

有关帮助入门的分步演练,请尝试学习该教程

以下部分概述了 SDK 中某些最重要的类,以及这些类的常见用法设计模式。 若要获取 SDK,请参阅安装指南

稳定版功能与试验版功能

用于 Python 的 Azure 机器学习 SDK 在同一 SDK 中提供了稳定版功能与试验版功能。

特征/功能状态 说明
稳定版功能 生产就绪

对于大多数用例和生产环境,建议使用这些功能。 它们更新的频率低于试验版功能。
实验性功能 开发

这些功能是新开发的功能和更新,这些功能和更新可能尚未针对生产用途准备就绪或进行充分测试。 尽管这些功能通常可正常运行,但它们可能会包含一些中断性变更。 试验版功能用于修复 SDK 中断性 bug,并且只在测试期间收到更新。 试验版功能也称为“预览版”中的功能。

正如名称所示,试验版(预览)功能用于试验,不被视为无 bug 或稳定。 出于此原因,我们仅向希望试用功能与更新的早期版本并打算参与报告 bug 和故障的高级用户推荐试验版功能。

试验版功能由 SDK 参考中的注释部分标记,并通过 Azure 机器学习文档中的(预览版)等文本表示。

工作区

命名空间azureml.core.workspace.Workspace

Workspace 类是云中的基础资源,用于试验、训练和部署机器学习模型。 它将 Azure 订阅和资源组关联到一个易于使用的对象。

查看创建工作区方法的所有参数以重用现有实例(存储、Key Vault、应用见解和 Azure 容器注册表-ACR)以及修改其他设置,例如专用终结点配置和计算目标。

使用以下代码导入该类并创建新工作区。 如果事先已有一个可用于该工作区的 Azure 资源组,请将 create_resource_group 设置为 False。 某些函数可能会提示输入 Azure 身份验证凭据。

from azureml.core import Workspace
ws = Workspace.create(name='myworkspace',
                      subscription_id='<azure-subscription-id>',
                      resource_group='myresourcegroup',
                      create_resource_group=True,
                      location='eastus2'
                     )

在多个环境中使用同一个工作区,只需先将其写入 JSON 配置文件即可。 这会保存订阅、资源和工作区名称数据。

ws.write_config(path="./file-path", file_name="ws_config.json")

通过读取配置文件来加载工作区。

from azureml.core import Workspace
ws_other_environment = Workspace.from_config(path="./file-path/ws_config.json")

或者,使用静态 get() 方法加载现有工作区,而无需使用配置文件。

from azureml.core import Workspace
ws = Workspace.get(name="myworkspace", subscription_id='<azure-subscription-id>', resource_group='myresourcegroup')

在以下代码示例中,变量 ws 表示 Workspace 对象。

试验

命名空间azureml.core.experiment.Experiment

Experiment 类是代表一系列试运行(各个模型运行)的另一个基础云资源。 以下代码按名称从 Workspace 内部提取 Experiment 对象,如果该名称不存在,则会创建新的 Experiment 对象。

from azureml.core.experiment import Experiment
experiment = Experiment(workspace=ws, name='test-experiment')

运行以下代码获取包含在 Workspace 中的所有 Experiment 对象的列表。

list_experiments = Experiment.list(ws)

使用 get_runs 函数从 Experiment 检索 Run 对象(试运行)的列表。 以下代码检索运行并输出每个运行 ID。

list_runs = experiment.get_runs()
for run in list_runs:
    print(run.id)

可通过两种方式执行试验运行。 如果在 Jupyter 笔记本中以交互方式进行试验,请使用 start_logging 函数。 如果从标准 Python 环境提交试验,请使用 submit 函数。 这两个函数都返回 Run 对象。 在以下代码示例中,experiment 变量表示 Experiment 对象。

运行

命名空间azureml.core.run.Run

一个运行表示试验的单次试运行。 Run 是用来监视试运行的异步执行、存储试运行的输出、分析结果以及访问生成的项目的对象。 在试验代码内部使用 Run 可将指标和项目记录到运行历史记录服务。 功能包括:

  • 存储和检索指标与数据。
  • 使用标记和子层次结构来轻松查找以往的运行。
  • 注册已存储的模型文件用于部署。
  • 存储、修改和检索运行的属性。

通过提交 Experiment 对象和运行配置对象来创建 Run 对象。 使用 tags 参数将自定义类别和标签附加到运行。 以后可以从 Experiment 轻松查找和检索它们。

tags = {"prod": "phase-1-model-tests"}
run = experiment.submit(config=your_config_object, tags=tags)

使用静态 list 函数从 Experiment 获取所有 Run 对象的列表。 指定 tags 参数按先前创建的标记进行筛选。

from azureml.core.run import Run
filtered_list_runs = Run.list(experiment, tags=tags)

使用 get_details 函数检索运行的详细输出。

run_details = run.get_details()

此函数的输出是一个字典,其中包含:

  • 运行 ID
  • 状态
  • 开始和结束时间
  • 计算目标(本地与云)
  • 运行中使用的依赖项和版本
  • 特定于训练的数据(因模型类型而异)

有关如何配置和监视运行的更多示例,请参阅操作指南

“模型”

命名空间azureml.core.model.Model

Model 类用于处理机器学习模型的云表示形式。 方法可帮助在本地开发环境与云中的 Workspace 对象之间转移模型。

可以使用模型注册在 Azure 云的工作区中存储模型并控制模型版本。 按名称和版本标识已注册的模型。 每次使用与现有名称相同的名称来注册模型时,注册表都会将版本递增。 Azure 机器学习支持任何可通过 Python 3 加载的模型,而不仅仅是 Azure 机器学习模型。

以下示例演示如何使用 scikit-learn 生成简单的本地分类模型,将该模型注册到 Workspace,并从云下载该模型。

创建简单的分类器 clf 用于根据客户的年龄预测客户流失率。 然后,将该模型转储到同一目录中的 .pkl 文件。

from sklearn import svm
import joblib
import numpy as np

# customer ages
X_train = np.array([50, 17, 35, 23, 28, 40, 31, 29, 19, 62])
X_train = X_train.reshape(-1, 1)
# churn y/n
y_train = ["yes", "no", "no", "no", "yes", "yes", "yes", "no", "no", "yes"]

clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(X_train, y_train)

joblib.dump(value=clf, filename="churn-model.pkl")

使用 register 函数在工作区中注册该模型。 指定本地模型路径和模型名称。 多次注册同一名称会创建新的版本。

from azureml.core.model import Model

model = Model.register(workspace=ws, model_path="churn-model.pkl", model_name="churn-model-test")

将模型注册到工作区后,可以轻松管理、下载和组织模型。 若要从 Workspace 检索模型对象(例如,在另一个环境中),请使用类构造函数,并指定模型名称和任何可选参数。 然后使用 download 函数下载模型,包括云文件夹结构。

from azureml.core.model import Model
import os

model = Model(workspace=ws, name="churn-model-test")
model.download(target_dir=os.getcwd())

使用 delete 函数从 Workspace 中删除模型。

model.delete()

注册模型后,可以直接将其部署为 Web 服务。 首先创建并注册映像。 此步骤将配置 Python 环境及其依赖项,以及一个用于定义 Web 服务请求和响应格式的脚本。 创建映像后,生成部署配置用于设置计算目标的 CPU 核心和内存参数。 然后附加映像。

ComputeTarget、RunConfiguration 和 ScriptRunConfig

命名空间azureml.core.compute.ComputeTarget
命名空间azureml.core.runconfig.RunConfiguration
命名空间azureml.core.script_run_config.ScriptRunConfig

ComputeTarget 类是用于创建和管理计算目标的抽象父类。 计算目标表示可在其中训练机器学习模型的各种资源。 计算目标可以是本地计算机,也可以是云资源,例如 Azure 机器学习计算、Azure HDInsight 或远程虚拟机。

使用计算目标来利用强大的虚拟机进行模型训练,并设置持久性计算目标或临时运行时调用的目标。 有关设置和管理计算目标的综合指导,请参阅操作指南

下面是演示如何设置 AmlComputeComputeTarget 的子类)目标的简单示例。 此目标在 Workspace 对象中创建一个运行时远程计算资源。 提交作业时,该资源会自动缩放。 运行完成后,会自动删除该资源。

重复使用简单的 scikit-learn 流失率模型,并在当前目录中其自身的 train.py 文件中生成该模型。 在该文件的末尾,创建名为 outputs 的新目录。 此步骤会在云(工作区)中创建一个目录,用于存储 joblib.dump() 序列化的已训练模型。

# train.py

from sklearn import svm
import numpy as np
import joblib
import os

# customer ages
X_train = np.array([50, 17, 35, 23, 28, 40, 31, 29, 19, 62])
X_train = X_train.reshape(-1, 1)
# churn y/n
y_train = ["yes", "no", "no", "no", "yes", "yes", "yes", "no", "no", "yes"]

clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(X_train, y_train)

os.makedirs("outputs", exist_ok=True)
joblib.dump(value=clf, filename="outputs/churn-model.pkl")

接下来,通过实例化 RunConfiguration 对象并设置类型和大小来创建计算目标。 此示例使用最小的资源大小(1 个 CPU 核心,3.5 GB 内存)。 list_vms 变量包含支持的虚拟机及其大小列表。

from azureml.core.runconfig import RunConfiguration
from azureml.core.compute import AmlCompute
list_vms = AmlCompute.supported_vmsizes(workspace=ws)

compute_config = RunConfiguration()
compute_config.target = "amlcompute"
compute_config.amlcompute.vm_size = "STANDARD_D1_V2"

使用 CondaDependencies 类创建远程计算资源的 Python 环境的依赖项。 train.py 文件使用需安装在环境中的 scikit-learnnumpy。 你也可以指定依赖项的版本。 使用 dependencies 对象在 compute_config 中设置环境。

from azureml.core.conda_dependencies import CondaDependencies

dependencies = CondaDependencies()
dependencies.add_pip_package("scikit-learn")
dependencies.add_pip_package("numpy==1.15.4")
compute_config.environment.python.conda_dependencies = dependencies

现在可以提交试验。 使用 ScriptRunConfig 类附加计算目标配置,并指定训练脚本 train.py 的路径/文件。 通过指定 submit() 函数的 config 参数提交试验。 在初始化环境和训练模型时,对生成的运行调用 wait_for_completion以查看异步运行输出。

警告

以下内容是在 ScriptRunConfig 参数中使用时对特定字符的限制:

  • "$;\ 字符由后端转义,因为它们被视为用于分隔 bash 命令的保留字符。
  • ()%!^<>&| 字符进行转义以在 Windows 上本地运行。
from azureml.core.experiment import Experiment
from azureml.core import ScriptRunConfig

script_run_config = ScriptRunConfig(source_directory=os.getcwd(), script="train.py", run_config=compute_config)
experiment = Experiment(workspace=ws, name="compute_target_test")
run = experiment.submit(config=script_run_config)
run.wait_for_completion(show_output=True)

运行完成后,工作区中会提供训练的模型文件 churn-model.pkl

环境

命名空间azureml.core.environment

Azure 机器学习环境指定与训练和评分脚本有关的 Python 包、环境变量和软件设置。 除了 Python 之外,还可以为环境配置 PySpark、Docker 和 R。 在内部,环境会作为 Docker 映像实现,这些映像用于在计算目标上运行训练和评分过程。 环境是机器学习工作区中带版本的托管实体,用于跨各种计算目标和计算类型实现可重现、可审核且可移植的机器学习工作流。

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

  • 开发训练脚本。
  • 对用于模型训练的 Azure 机器学习计算,大规模重复使用相同的环境。
  • 使用这一未绑定到特定计算类型的相同环境部署你的模型。

下面的代码从 SDK 导入 Environment 类,并实例化环境对象。

from azureml.core.environment import Environment
Environment(name="myenv")

使用 Conda、pip 或专用 wheel 文件将包添加到环境。 使用 CondaDependency 类指定每个包依赖项,以便将其添加到环境的 PythonSection 中。

以下示例将包添加到环境。 它添加了 1.17.0 版的 numpy。 它还将 pillow 包添加到环境 myenv 中。 该示例分别使用 add_conda_package() 方法和 add_pip_package() 方法。

from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies

myenv = Environment(name="myenv")
conda_dep = CondaDependencies()

# Installs numpy version 1.17.0 conda package
conda_dep.add_conda_package("numpy==1.17.0")

# Installs pillow package
conda_dep.add_pip_package("pillow")

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

若要提交训练运行,需要将你的环境、计算目标和训练 Python 脚本组合到运行配置中。 此配置是用于提交运行的包装器对象。

提交训练运行时,生成新环境可能需要几分钟时间。 具体的持续时间取决于所需依赖项的大小。 环境由服务缓存。 因此,只要环境定义保持不变,完整安装就只会发生一次。

下面的示例演示如何使用 ScriptRunConfig 作为包装器对象。

from azureml.core import ScriptRunConfig, Experiment
from azureml.core.environment import Environment

exp = Experiment(name="myexp", workspace = ws)
# Instantiate environment
myenv = Environment(name="myenv")

# Add training script to run config
runconfig = ScriptRunConfig(source_directory=".", script="train.py")

# Attach compute target to run config
runconfig.run_config.target = "local"

# Attach environment to run config
runconfig.run_config.environment = myenv

# Submit run 
run = exp.submit(runconfig)

如果在提交运行之前未在运行配置中指定环境,则系统会为你创建一个默认环境。

请参阅模型部署部分以使用环境部署 Web 服务。

Pipeline 和 PythonScriptStep

命名空间azureml.pipeline.core.pipeline.Pipeline
命名空间azureml.pipeline.steps.python_script_step.PythonScriptStep

Azure 机器学习管道是整个机器学习任务的自动化工作流。 子任务封装为管道中的一系列步骤。 Azure 机器学习管道可以十分简单,只有一个调用 Python 脚本的步骤。 管道包含以下功能:

  • 数据准备,包括导入、验证、清理、修整、转换、规范化和暂存
  • 训练配置,包括参数化自变量、文件路径和日志记录/报告配置
  • 反复有效地培训和验证,这可能包括指定特定的数据子集、不同的硬件计算资源、分布式处理和进度监视
  • 部署,包括版本控制、缩放、预配和访问控制
  • 将管道发布到 REST 终结点以从任何 HTTP 库重新运行

PythonScriptStep 是一个基本的内置步骤,用于在计算目标上运行 Python 脚本。 它采用脚本名称和其他可选参数,例如脚本、计算目标、输入和输出的自变量。 以下代码是 PythonScriptStep 的一个简单示例。 有关 train.py 脚本的示例,请参阅教程附属部分。

from azureml.pipeline.steps import PythonScriptStep

train_step = PythonScriptStep(
    script_name="train.py",
    arguments=["--input", blob_input_data, "--output", output_data1],
    inputs=[blob_input_data],
    outputs=[output_data1],
    compute_target=compute_target,
    source_directory=project_folder
)

至少创建一个步骤后,可将步骤链接到一起,并将其发布为简单的自动化管道。

from azureml.pipeline.core import Pipeline

pipeline = Pipeline(workspace=ws, steps=[train_step])
pipeline_run = experiment.submit(pipeline)

有关生成管道工作流的完整示例,请参阅高级教程

管道的创建和使用模式

Azure 机器学习管道与 Azure 机器学习工作区相关联,而管道步骤与该工作区中提供的计算目标相关联。 有关详细信息,请参阅这篇有关工作区的文章,或这篇有关计算目标的介绍文章。

管道步骤的常用模式是:

  1. 指定工作区、计算和存储
  2. 使用以下类配置输入和输出数据
    1. Dataset:使现有的 Azure 数据存储可用
    2. PipelineDataset:封装类型化表格数据
    3. PipelineData:用于一个步骤写入的中间文件或目录数据,旨在供另一步骤使用
  3. 定义一个或多个管道步骤
  4. 使用工作区和步骤实例化管道
  5. 创建要将管道提交到的试验
  6. 监视试验结果

此笔记本很好地示范了此模式。 作业 (job)

有关 Azure 机器学习管道的详细信息,尤其是它们与其他管道类型之间的不同之处,请参阅此文

AutoMLConfig

命名空间azureml.train.automl.automlconfig.AutoMLConfig

使用 AutoMLConfig 类配置自动化机器学习训练的参数。 自动机器学习将迭代机器学习算法和超参数设置的多种组合。 然后,它会根据所选的准确度指标查找最合适的模型。 使用配置可以指定:

  • 任务类型(分类、回归、预测)
  • 算法迭代次数和每次迭代的最长时间
  • 要优化的准确度指标
  • 阻止列表/允许列表的算法
  • 交叉验证次数
  • 计算目标
  • 训练数据

注意

通过安装中的 automl 附加类使用自动化机器学习。

有关设置自动化机器学习试验的详细指导和示例,请参阅教程操作指南

以下代码演示如何为分类模型生成自动化机器学习配置对象,并在提交试验时使用该对象。

from azureml.train.automl import AutoMLConfig

automl_config = AutoMLConfig(task="classification",
                             X=your_training_features,
                             y=your_training_labels,
                             iterations=30,
                             iteration_timeout_minutes=5,
                             primary_metric="AUC_weighted",
                             n_cross_validations=5
                            )

使用 automl_config 对象提交试验。

from azureml.core.experiment import Experiment

experiment = Experiment(ws, "automl_test_experiment")
run = experiment.submit(config=automl_config, show_output=True)

提交试验后,输出将显示每次迭代在完成时的训练准确度。 运行完成后,将返回 AutoMLRun 对象(扩展 Run 类)。 使用 get_output() 函数返回 Model 对象,以获取最合适的模型。

best_model = run.get_output()
y_predict = best_model.predict(X_test)

模型部署

命名空间azureml.core.model.InferenceConfig
命名空间azureml.core.webservice.webservice.Webservice

InferenceConfig 类用于配置设置,这些设置描述承载模型和 Web 服务所需的环境。

Webservice 是用来为模型创建和部署 Web 服务的抽象父类。 有关如何为模型部署做准备以及如何部署 Web 服务的详细指导,请参阅此操作指南

在将模型部署为 Web 服务时,可以使用环境。 环境支持可重现的联网工作流,在此工作流中,你可以在训练计算和推理计算中使用相同的库来部署模型。 在内部,环境作为 Docker 映像实现。 可以使用 Microsoft 提供的映像,也可以使用自己的自定义 Docker 映像。 如果你之前对部署使用了 ContainerImage 类,请参阅 DockerSection 类,以便使用环境完成类似的工作流。

若要部署 Web 服务,请将环境、推理计算、评分脚本和已注册的模型组合到部署对象 deploy() 中。

下面的示例假设你已使用环境 myenv 完成训练运行,并想要将该模型部署到 Azure 容器实例。

from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import AciWebservice, Webservice

# Register the model to deploy
model = run.register_model(model_name = "mymodel", model_path = "outputs/model.pkl")

# Combine scoring script & environment in Inference configuration
inference_config = InferenceConfig(entry_script="score.py",
                                   environment=myenv)

# Set deployment configuration
deployment_config = AciWebservice.deploy_configuration(cpu_cores = 1,
                                                       memory_gb = 1)

# Define the model, inference, & deployment configuration and web service name and location to deploy
service = Model.deploy(workspace = ws,
                       name = "my_web_service",
                       models = [model],
                       inference_config = inference_config,
                       deployment_config = deployment_config)

此示例将创建一个最适合用于小规模测试和快速部署的 Azure 容器实例 Web 服务。 若要将模型部署为生产规模的 Web 服务,请使用 Azure Kubernetes 服务 (AKS)。 有关详细信息,请参阅 AksCompute 类

数据集

命名空间azureml.core.dataset.Dataset
命名空间azureml.data.file_dataset.FileDataset
命名空间azureml.data.tabular_dataset.TabularDataset

Dataset 类是用于探索和管理 Azure 机器学习中的数据的基础资源。 可以探索包含摘要统计信息的数据,并将数据集保存到 AML 工作区,以获取版本控制和可重现性功能。 在训练过程中,模型可以轻松使用数据集。 有关详细用法示例,请参阅操作指南

  • TabularDataset 以表格格式表示通过分析一个文件或一组文件创建的数据。
  • FileDataset 引用数据存储或公共 URL 中的单个或多个文件。

以下示例演示如何创建一个指向数据存储中单个路径的 TabularDataset。

from azureml.core import Dataset

dataset = Dataset.Tabular.from_delimited_files(path = [(datastore, 'train-dataset/tabular/iris.csv')])
dataset.take(3).to_pandas_dataframe()

以下示例演示如何创建引用多个文件 URL 的 FileDataset

from azureml.core.dataset import Dataset

url_paths = [
            'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
            'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
            ]
dataset = Dataset.File.from_files(path=url_paths)

后续步骤

尝试执行以下后续步骤,了解如何将 Azure 机器学习 SDK 用于 Python:

  • 通过该教程了解如何在 Python 中生成、训练和部署模型。

  • 使用左侧的目录查找本网站上的参考文档中所述的类和模块。