Azure机器学习——动手实验02:使用云上GPU资源训练一个图像分类模型

本文演示如何使用Azure机器学习服务和Python SDK在多节点GPU计算集群上训练图像分类模型,采用TensorFlow框架和MNIST数据集,涵盖计算资源管理、数据集处理、模型训练及结果分析。


在计算机视觉中使用GPU计算资源可以大大加速模型的训练过程。如果本地没有GPU资源,可以通过Azure机器学习利用Azure上的GPU计算集群。Azure上的计算集群支持并行计算,在有计算任务时启动节点,在完成任务后关闭节点。整个过程都是自动执行的,不仅加速了开发过程,也一定程度上节省了成本。
本节将演示使用Azure机器学习Python SDK 在多节点GPU计算集群上训练一个图像多分类模型,使用的框架为TensorFlow,使用的数据集为著名的MNIST数据集。整个过程都在Jupyter notebook中运行。
模型训练流程如下图所示,涉及到的 工作区、试验、计算集群、Azure机器学习studio等概念,如果不清楚,请查阅: Azure机器学习(理论篇)——Azure机器学习介绍
图1 使用Azure机器学习训练模型流程
图1 使用Azure机器学习训练模型流程

一、使用前提

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

查看Azure机器学习版本:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

import azureml.core
from azureml.core import Workspace

# check core SDK version number
print("Azure ML SDK Version: ", azureml.core.VERSION)

输出:

SDK version: 1.0.85

二、连接和初始化工作区

整个训练过程都是在Azure机器学习工作区内开展的。所以第一步是要连接到工作区。如果还没有工作区,请先创建一个,创建步骤详见:Azure机器学习(实战篇)——创建Azure机器学习服务的第二部分。
使用以下代码连接到Azure机器学习工作区:

ws = Workspace.from_config('config.json')
print('Workspace name: ' + ws.name, 'Azure region: ' + ws.location, 
      'Subscription id: ' + ws.subscription_id, 'Resource group: ' + ws.resource_group, sep = '\n')

'config.json’是存在本地的连接工作区的配置文件,该文件生成方法详见:Azure机器学习(实战篇)——配置 Azure 机器学习开发环境的第四部分。
输出:
在这里插入图片描述

三、创建试验

在当前工作区中创建一个试验,以便在该试验下训练模型。
试验是工作区下面的一个逻辑容器,它涵盖了每一次模型训练的运行记录和结果信息。

from azureml.core import Experiment

experiment_name = 'tf-mnist'
experiment = Experiment(ws, name=experiment_name)

试验创建成功后,可以在Azure机器学习studio中查看。
Azure机器学习studio是除Python SDK外使用Azure机器学习的另一种方式。
图2 在Azure机器学习studio中查看试验信息
图2 在Azure机器学习studio中查看试验信息

四、创建计算资源

与本地训练不同,使用Azure机器学习可以利用云上的计算资源,将训练脚本提交到远程计算集群得到训练结果。
首先创建一个Azure机器学习托管的计算集群AmlCompute,该计算集群支持并行计算,在调参时候非常有用。
通过max_nodes和min_nodes定义集群中的最大和最小计算节点数目。代码中:

  • vm_size=‘STANDARD_NC6’,表示计算集群中的节点是’STANDARD_NC6’规格的虚拟机,该系列虚拟机上有1个或者1个以上的NVIDIA Tesla K80 GPU。更多虚拟机规格请查看此链接
  • max_nodes=4,表示计算集群最大并行任务数为4;
  • min_nodes=0,表示计算集群在没有任务时不会有节点运行,节约开销。

每个Azure订阅的计算集群节点数目都是有限制的,如果创建后的计算集群max_nodes没有达到目标节点数,那可能是已创建的计算集群用光了节点配额,你可以删除不用的计算集群或者申请更多的Azure计算集群节点配额

from azureml.core.compute import AmlCompute
from azureml.core.compute import ComputeTarget
import os

# choose a name for your cluster
compute_name = os.environ.get("AML_COMPUTE_CLUSTER_NAME", "gpu-cluster")
compute_min_nodes = os.environ.get("AML_COMPUTE_CLUSTER_MIN_NODES", 0)
compute_max_nodes = os.environ.get("AML_COMPUTE_CLUSTER_MAX_NODES", 4)

# This example uses GPU VM. For using CPU VM, set SKU to STANDARD_D2_V2
vm_size = os.environ.get("AML_COMPUTE_CLUSTER_SKU", "STANDARD_NC6")


if compute_name in ws.compute_targets:
    compute_target = ws.compute_targets[compute_name]
    if compute_target and type(compute_target) is AmlCompute:
        print("found compute target: " + compute_name)
else:
    print("creating new compute target...")
    provisioning_config = AmlCompute.provisioning_configuration(vm_size = vm_size,
                                                                min_nodes = compute_min_nodes, 
                                                                max_nodes = compute_max_nodes)

    # create the cluster
    compute_target = ComputeTarget.create(ws, compute_name, provisioning_config)
    
    # can poll for a minimum number of nodes and for a specific timeout. 
    # if no min node count is provided it will use the scale settings for the cluster
    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)
    
     # For a more detailed view of current AmlCompute status, use get_status()
    print(compute_target.get_status().serialize())

可以在Azure机器学习studio中查看创建好的计算集群。

图3 在Azure机器学习studio中查看计算资源信息
图3 在Azure机器学习studio中查看计算资源信息

也可以通过SDK来查询:

compute_targets = ws.compute_targets
for name, ct in compute_targets.items():
    print(name, ct.type, ct.provisioning_state)

输出:

cpu-cluster AmlCompute Succeeded
gpu-cluster AmlCompute Succeeded

**注意:1 元试用订阅不支持创建GPU计算节点,如需使用云上GPU资源,需要充值成为标准预付费订阅。**具体内容请参考:1 元试用订阅详情

五、数据集

下载MNIST数据集

Yan LeCun’s website下载MNIST数据集到本地文件夹:

import urllib

os.makedirs('./data/mnist', exist_ok=True)

urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz', filename = './data/mnist/train-images.gz')
urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz', filename = './data/mnist/train-labels.gz')
urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz', filename = './data/mnist/test-images.gz')
urllib.request.urlretrieve('http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz', filename = './data/mnist/test-labels.gz')

示例图片

通过一个utils.py脚本文件将上述数据集压缩文件加载为numpy数组,utils.py保存在当前目录下,代码如下所示:

import gzip
import numpy as np
import struct


# load compressed MNIST gz files and return numpy arrays
def load_data(filename, label=False):
    with gzip.open(filename) as gz:
        struct.unpack('I', gz.read(4))
        n_items = struct.unpack('>I', gz.read(4))
        if not label:
            n_rows = struct.unpack('>I', gz.read(4))[0]
            n_cols = struct.unpack('>I', gz.read(
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值