Amazon SageMaker Neo,只需训练您的机器学习模型一次,即可随时随地运行它们

阅读数:54 2019 年 10 月 14 日 11:25

Amazon SageMaker Neo,只需训练您的机器学习模型一次,即可随时随地运行它们

机器学习 (ML) 分为两个不同的阶段:训练和推理。训练涉及构建模型,即在数据集上运行 ML 算法以识别有意义的模式。这通常需要大量的存储和计算能力,从而使云成为了使用 Amazon SageMaker 和 AWS Deep Learning AMI 等服务训练 ML 作业的自然场所。

推理涉及使用模型,即预测模型从未见过的数据样本的结果。要求是不同的:开发人员通常关注优化延迟(单次预测需要多长时间?)和吞吐量(我可以并行运行多少项预测?)。当然,您的预测环境的硬件架构对这些指标有很大影响,特别是您在处理资源受限的设备时:作为 Raspberry Pi 发烧友,我常常希望这个小家伙可以加快推理代码的速度。

可以针对特定硬件架构调整模型,但工具的缺乏使得这个过程容易出错并且耗时。对 ML 框架或模型本身的微小更改通常需要用户重新开始。遗憾的是,这迫使大多数 ML 开发人员在任何地方部署相同的模型,而不管底层硬件如何,从而无法显著提升性能。

好吧,就说到这里了。今天,我非常高兴地宣布推出 Amazon SageMaker Neo,它是 Amazon SageMaker 的一项新功能,它使机器学习模型进行一次训练即可在云端和边缘的任何地方以最佳性能运行。

隆重推出 Amazon SageMaker Neo

在没有任何人工干预的情况下,Amazon SageMaker Neo 可以优化部署在 Amazon EC2 实例、Amazon SageMaker 终端节点和 AWS Greengrass 管理的设备上的模型。

以下是支持的配置:

  • 框架和算法:TensorFlow、Apache MXNet、PyTorch、ONNX 和 XGBoost。
  • 硬件架构:现在开始支持 ARM、Intel 和 NVIDIA,即将对 Cadence、Qualcomm 和 Xilinx 硬件提供支持。此外,Amazon SageMaker Neo 以获得 Apache 软件许可的开源代码形式发布,使硬件供应商能够针对自己的处理器和设备进行定制。
    Amazon SageMaker Neo 编译器将模型转换为高效的通用格式,通过紧凑型运行时在设备上执行,它使用的资源不足常规框架以往消耗的资源的百分之一。Amazon SageMaker Neo 运行时使用有助于加快 ML 推理的特定指令集,针对底层硬件进行了优化。

这有三个主要好处:

  • 转换模型的速度最多可提升一倍,而且不会降低精确度。
  • 现在,几乎所有资源有限的设备都可以运行复杂的模型,解锁自动驾驶汽车、自动视频安全和制造中的异常检测等创新用例。
  • 开发人员可以在目标硬件上运行模型,而不依赖于框架。

功能揭秘

大多数机器学习框架将模型表示为计算图:顶点表示对数据阵列(张量)的运算,而边表示运算之间的数据依赖项。Amazon SageMaker Neo 编译器利用计算图中的模式进行高级优化,包括运算符融合,将多项小型运算融合在一起;常量合并,静态预计算图形的一部分以节省执行成本;静态内存规划通道,预分配内存以保存每个中间张量;数据布局转换,将内部数据布局转换为适合硬件的形式。然后,编译器会为每个运算符生成有效的代码。

模型编译完成后,可以由 Amazon SageMaker Neo 运行时运行。与热门深度学习库所需的 500MB 到 1GB 磁盘空间相比,此运行时仅需大约 1MB 的磁盘空间。应用程序通过首先加载运行时来调用模型,然后加载模型定义、模型参数和预编译的运算。

我迫不及待想在我的 Raspberry Pi 上体验一番了。我们开始吧。

下载预先训练过的模型

Apache MXNet、Gluon CV 或 TensorFlow 模型库中提供了大量预先训练过的模型:我使用的是基于 ResNet 架构的 50 层模型,它在 ImageNet 数据集上使用 Apache MXNet 进行了预训练。

首先,我下载 227MB 的模型以及定义其不同层的 JSON 文件。这个文件特别重要:它告诉我输入符号称为“数据”,其形态是 [1,3,224,224],即 1 个图像、3 个通道(红色、绿色和蓝色)、224×224 像素。我需要确保传递给模型的图像具有这种精确的形态。输出形态为 [1, 1000],即包含 ImageNet 数据集中存在的 1000 个类中每个类的概率的向量。

为了定义性能基准,我使用此模型和 Apache MXNet 1.2 的普通未优化版本来预测一些图像:平均而言,推理大约需要 6.5 秒,并且需要大约 306MB 的 RAM。

这很慢:我们编译模型,看看它有多快。

编译适用于 Raspberry Pi 的模型

首先,我们将两个模型文件存储在压缩后的 TAR 存档中,并将其上传到 Amazon S3 存储桶。

复制代码
$ tar cvfz model.tar.gz resnet50_v1-symbol.json resnet50_v1-0000.params
a resnet50_v1-symbol.json
a resnet50_v1-0000.paramsresnet50_v1-0000.params
$ aws s3 cp model.tar.gz s3://jsimon-neo/
upload: ./model.tar.gz to s3://jsimon-neo/model.tar.gz

然后,我只需要为编译作业编写一个简单的配置文件。如果您对其他框架和硬件目标感到好奇,‘aws sagemaker create-compilation-job help‘ 将为您提供要使用的确切语法。

复制代码
{
"CompilationJobName": "resnet50-mxnet-raspberrypi",
"RoleArn": $SAGEMAKER_ROLE_ARN,
"InputConfig": {
"S3Uri": "s3://jsimon-neo/model.tar.gz",
"DataInputConfig": "{\"data\": [1, 3, 224, 224]}",
"Framework": "MXNET"
},
"OutputConfig": {
"S3OutputLocation": "s3://jsimon-neo/",
"TargetDevice": "rasp3b"
},
"StoppingCondition": {
"MaxRuntimeInSeconds": 300
}
}

启动编译过程只需一个命令。

复制代码
$ aws sagemaker create-compilation-job --cli-input-json file://job.json

编译只需几秒钟即可完成。我们弄清楚编译构件的名称,从 Amazon S3 获取它并在本地提取

复制代码
$ aws sagemaker describe-compilation-job \
--compilation-job-name resnet50-mxnet-raspberrypi \
--query "ModelArtifacts"
{
"S3ModelArtifacts": "s3://jsimon-neo/model-rasp3b.tar.gz"
}
$ aws s3 cp s3://jsimon-neo/model-rasp3b.tar.gz .
$ tar xvfz model-rasp3b.tar.gz
x compiled.params
x compiled_model.json
x compiled.so

如您所见,构件包含:

  • 原始模型和符号文件。
  • 存储模型使用的经过编译、针对硬件优化了的运算符的共享对象文件。
    为方便起见,我们将它们重命名为“model.params”、“model.json”和“ model.so ”,然后将它们复制到 Raspberry Pi 上的“resnet50”目录中。
复制代码
$ mkdir resnet50
$ mv compiled.params resnet50/model.params
$ mv compiled_model.json resnet50/model.json
$ mv compiled.so resnet50/model.so
$ scp -r resnet50 pi@raspberrypi.local:~

在 Raspberry Pi 上设置推理环境

在我使用模型预测图像之前,我需要在 Raspberry Pi 上安装相应的运行时。可以使用预先构建的软件包 [neopackages]:我只需下载“armv7l”架构的软件包,然后使用提供的脚本即可将其安装在我的 Pi 上。请注意,我不需要安装任何其他深度学习框架(在本例中为 Apache MXNet),可以节省高达 1GB 的永久存储空间。

复制代码
$ scp -r dlr-1.0-py2.py3-armv7l pi@raspberrypi.local:~
<ssh to the Pi>
$ cd dlr-1.0-py2.py3-armv7l
$ sh ./install-py3.sh

现在我们一切准备就绪。预测图像的时间到了!

使用 Amazon SageMaker Neo 运行时

在 Pi 上,运行时以名为“dlr”(深度学习运行时)的 Python 包的形式提供。使用它来预测图像是您所期望的:

加载模型,定义其输入和输出符号。
加载图像。
预测!
下面是相应的 Python 代码。

复制代码
import os
import numpy as np
from dlr import DLRModel
# Load the compiled model
input_shape = {'data': [1, 3, 224, 224]} # A single RGB 224x224 image
output_shape = [1, 1000] # The probability for each one of the 1,000 classes
device = 'cpu' # Go, Raspberry Pi, go!
model = DLRModel('resnet50', input_shape, output_shape, device)
# Load names for ImageNet classes
synset_path = os.path.join(model_path, 'synset.txt')
with open(synset_path, 'r') as f:
synset = eval(f.read())
# Load an image stored as a numpy array
image = np.load('dog.npy').astype(np.float32)
print(image.shape)
input_data = {'data': image}
# Predict
out = model.run(input_data)
top1 = np.argmax(out[0])
prob = np.max(out)
print("Class: %s, probability: %f" % (synset[top1], prob))

我们试一试这个图像。Chihuahuas 和 Raspberry Pis 是否相互兼容?

复制代码
(1, 3, 224, 224)
类:Chihuahua,概率:0.901803

预测是正确的,但速度和内存消耗呢? 这次预测用时大约 0.85 秒,需要大约 260MB 的 RAM:使用 Amazon SageMaker Neo,预测速度比使用普通模型快 5 倍,RAM 效率提高 15%。

这种令人印象深刻的性能提升并不需要任何复杂和耗时的工作:我们所要做的就是编译模型。当然,您的具体情况可能会有所不同,具体取决于型号和硬件架构,但您应该会看到全面的显著改进,包括在 Amazon EC2 实例上的改进,例如 C5 或 P3 系列。

现已推出

我希望这篇博文提供了丰富的有用信息。使用 Amazon SageMaker Neo 编译模型是免费的,您只需为使用模型(Amazon EC2 实例、Amazon SageMaker 实例和 AWS Greengrass 管理的设备)的底层资源付费。

该服务现已在美国东部(弗吉尼亚北部)、美国西部(俄勒冈)和欧洲(爱尔兰)正式发布。不妨开始体验,并与我们分享您的想法。我们迫不及待想看看您创建的成果!
本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/amazon-sagemaker-neo-train-your-machine-learning-models-once-run-them-anywhere/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布