优化预测成本与性能:SageMaker的实用技巧
在机器学习项目中,成本优化和性能提升是至关重要的。本文将介绍如何使用Amazon SageMaker Neo编译模型,以及如何在不同设备上部署模型,同时提供一份成本优化清单。
探索用Neo编译的模型
通过查看传递给 compile_model() API的输出位置,我们可以看到Neo生成的模型工件:
$ aws s3 ls s3://sagemaker-eu-west-1-123456789012/dogscats/output-neo/
model-ml_c5.tar.gz
将其复制到本地并解压后,我们发现它包含原始模型及其编译版本:
$ aws s3 cp s3://sagemaker-eu-west-1-123456789012/dogscats/output-neo/model-ml_c5.tar.gz .
$ tar xvfz model-ml_c5.tar.gz
compiled.meta
model-shapes.json
compiled.params
compiled_model.json
compiled.so
特别地, compiled.so 文件是一个包含模型运算符硬件优化版本的原生文件:
$ file compiled.so
compiled.so: ELF 64-bit LSB shared object, x86-64
$ nm compiled.so | grep conv | head -3
0000000000005880 T fused_nn_contrib_conv2d_NCHWc
00000000000347a0 T fused_nn_contrib_conv2d_NCHWc_1
0000000000032630 T fused_nn_contrib_conv2d_NCHWc_2
在树莓派上部署图像分类模型
树莓派是一款出色的设备,尽管其计算和内存能力有限,但它能够使用复杂的深度学习模型进行图像预测。以下是在树莓派上部署模型的步骤:
1. 在SageMaker笔记本中,为树莓派编译模型:
output_path = 's3://{}/{}/output-neo/'.format(bucket, prefix)
ic_neo_model = ic.compile_model(
target_instance_family='rasp3b',
input_shape={'data':[1, 3, 224, 224]},
role=role,
framework='mxnet',
framework_version='1.5.1',
output_path=output_path)
- 在本地机器上,从S3获取编译好的模型工件并复制到树莓派:
$ aws s3 cp s3://sagemaker-eu-west-1-123456789012/dogscats/output-neo/model-rasp3b.tar.gz .
$ scp model-rasp3b.tar.gz pi@raspberrypi:~
- 在树莓派上,将编译好的模型解压到
resnet50目录:
$ mkdir resnet50
$ tar xvfz model-rasp3b.tar.gz -C resnet50
- 安装DLR:
$ wget https://neo-ai-dlr-release.s3-us-west-2.amazonaws.com/v1.9.0/rasp3b/dlr-1.9.0-py3-none-any.whl
$ pip3 install dlr-1.9.0-py3-none-any.whl
- 编写一个函数来处理图像:
import numpy as np
from PIL import Image
def process_image(filename):
image = Image.open(filename)
image = image.resize((224,224))
image = np.asarray(image) # (224,224,3)
image = np.moveaxis(image, 2, 0) # (3,224,224)
image = image[np.newaxis, :] # (1,3,224,224)
return image
- 导入DLR并加载编译好的模型:
from dlr import DLRModel
model = DLRModel('resnet50')
- 加载图像:
image = process_image('dog.jpg')
#image = process_image('cat.png')
input_data = {'data': image}
- 对图像进行100次预测:
import time
total = 0
for i in range(0,100):
tick = time.time()
out = model.run(input_data)
print(out[0])
tock = time.time()
total += tock - tick
print(total)
狗和猫的图像分别被预测为 [2.554065e-09 1.000000e+00] 和 [9.9967313e-01 3.2689856e-04] ,考虑到模型约84%的验证准确率,这是非常不错的结果。预测时间约为每张图像1.2秒,相比原始模型的6 - 7秒有了显著提升。
在AWS Inferentia上部署模型
AWS Inferentia是一款专门为高吞吐量和低成本预测而设计的定制芯片。Inferentia芯片托管在EC2 inf1实例上,这些实例有不同的规格,包含1、4或16个芯片。每个芯片包含四个NeuronCores,实现了高性能矩阵乘法引擎,可加速典型的深度学习操作,如卷积。NeuronCores还包含大缓存,可减少外部内存访问。
要在Inferentia上运行模型,需要使用Neuron SDK进行编译和部署。该SDK支持TensorFlow、PyTorch和Apache MXNet模型。你可以在EC2实例上使用Neuron SDK自行编译和部署模型,SageMaker也简化了整个过程,因为inf1实例是Neo可以编译模型的目标架构之一。示例代码可参考: https://github.com/awslabs/amazon-sagemaker-examples/tree/master/sagemaker_neo_compilation_jobs/deploy_tensorflow_model_on_Inf1_instance
成本优化清单
在机器学习项目的各个阶段,都应该关注成本。以下是一份成本优化清单:
1. 数据准备阶段
- 避免构建临时ETL工具 :使用托管服务,如Amazon Glue、Amazon Athena或Amazon SageMaker Data Wrangler,避免自行搭建基于实例的ETL工具。如果使用Amazon EMR,应避免运行长期低使用率的集群,尽量使用临时集群和Spot实例。相关信息可参考:
- https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-longrunning-transient.html
- https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-instance-purchasing-options.html
- 使用SageMaker Ground Truth和自动标注 :对于大型非结构化数据集的标注,启用SageMaker Ground Truth的自动标注功能可以节省大量时间和金钱。详情可参考: https://docs.aws.amazon.com/sagemaker/latest/dg/sms-automated-labeling.html
2. 实验阶段
- 不一定要使用SageMaker Studio :可以在本地机器或本地开发服务器上使用SageMaker Python SDK进行开发。
- 停用不需要的Studio实例 :及时停用闲置的实例,避免不必要的费用。
- 小规模实验并选择合适的实例 :在实验初期,使用数据集的一小部分进行实验,选择较小的笔记本实例。例如,5名开发人员每天工作10小时,使用 ml.c5.2xlarge 实例的每日成本为$27.85,而使用 ml.t3.xlarge 实例的每日成本可降至$11.65,每月可节省$486。
- 使用本地模式 :在实验阶段,使用本地模式可以避免启动AWS云托管基础设施,快速迭代且无需成本。
3. 模型训练阶段
- 不在Studio实例上训练 :应在托管实例上运行训练作业,避免在笔记本中使用大型实例进行训练,训练完成后实例会自动终止,避免过度付费。
- 将数据集打包成RecordIO/TFRecord文件 :这样可以更轻松、快速地移动和分发数据集。
- 使用管道模式 :管道模式可将数据集直接从Amazon S3流式传输到训练实例,无需复制,节省启动时间。
- 选择合适的训练实例 :可通过CloudWatch指标来选择合适的训练实例。
- 使用托管Spot训练 :托管Spot训练应作为默认设置,可显著降低训练成本。
- 使用AWS提供的深度学习库版本 :AWS团队会对深度学习库进行优化,使用官方版本可获得更好的性能。相关信息可参考:
- https://aws.amazon.com/blogs/machine-learning/faster-training-with-optimized-tensorflow-1-6-on-amazon-ec2-c5-and-p3-instances/
- https://aws.amazon.com/about-aws/whats-new/2018/11/tensorflow-scalability-to-256-gpus/
- https://aws.amazon.com/blogs/machine-learning/amazon-web-services-aSchieves-fastest-training-times-for-bert-and-mask-r-cnn/
4. 模型部署阶段
- 使用批量转换 :如果不需要在线预测,可使用批量转换,批量作业完成后,底层实例会自动终止,避免过度付费。
- 删除不必要的端点 :及时删除不再使用的端点,避免不必要的费用。
- 选择合适的端点并使用自动扩展 :根据实际需求选择合适的端点,并使用自动扩展功能来优化成本。
- 使用多模型端点 :将多个模型整合到一个端点上,减少资源使用。
- 使用Amazon Neo编译模型 :编译模型可减少硬件资源的使用。
- 大规模部署时使用AWS Inferentia :在大规模部署时,使用AWS Inferentia代替GPU实例可降低成本。
- 自动化一切 :自动化机器学习工作流程可以提高效率,降低成本。
- 购买Savings Plans :Savings Plans是一种灵活的定价模式,可提供低价格的AWS使用方案,根据使用期限和承诺,可节省高达72%的基于实例的SageMaker成本。详情可参考: https://aws.amazon.com/blogs/aws/slash-your-machine-learning-costs-with-instance-price-reductions-and-savings-plans-for-amazon-sagemaker/
通过遵循这份成本优化清单,你不仅可以大幅削减机器学习预算,还能构建更强大、更灵活的工作流程。希望这些技巧能帮助你在机器学习项目中取得更好的成果!
优化预测成本与性能:SageMaker的实用技巧
成本优化技巧技术点分析
为了更直观地理解各个阶段的成本优化技巧,下面通过表格形式对每个阶段的技巧及其优势进行分析:
|阶段|技巧|优势|
| ---- | ---- | ---- |
|数据准备|避免构建临时ETL工具|使用托管服务无需自行搭建基础设施,按需付费;使用临时集群和Spot实例可降低成本|
|数据准备|使用SageMaker Ground Truth和自动标注|节省大型非结构化数据集标注的时间和金钱|
|实验|不一定要使用SageMaker Studio|可在本地开发,降低成本|
|实验|停用不需要的Studio实例|避免闲置实例产生费用|
|实验|小规模实验并选择合适的实例|减少资源浪费,降低成本|
|实验|使用本地模式|无需启动AWS云托管基础设施,快速迭代且无成本|
|模型训练|不在Studio实例上训练|训练完成后实例自动终止,避免过度付费|
|模型训练|将数据集打包成RecordIO/TFRecord文件|方便移动和分发数据集|
|模型训练|使用管道模式|节省数据集传输的启动时间|
|模型训练|选择合适的训练实例|根据实际需求选择,避免资源浪费|
|模型训练|使用托管Spot训练|显著降低训练成本|
|模型训练|使用AWS提供的深度学习库版本|获得更好的性能|
|模型部署|使用批量转换|批量作业完成后实例自动终止,避免过度付费|
|模型部署|删除不必要的端点|避免不必要的费用|
|模型部署|选择合适的端点并使用自动扩展|根据需求优化成本|
|模型部署|使用多模型端点|整合模型,减少资源使用|
|模型部署|使用Amazon Neo编译模型|减少硬件资源使用|
|模型部署|大规模部署时使用AWS Inferentia|降低大规模部署成本|
|模型部署|自动化一切|提高效率,降低成本|
|模型部署|购买Savings Plans|提供低价格的AWS使用方案,节省成本|
不同阶段成本优化流程
下面通过mermaid格式的流程图展示不同阶段成本优化的流程:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(数据准备阶段):::process --> A1(避免构建临时ETL工具):::process
A --> A2(使用SageMaker Ground Truth和自动标注):::process
B(实验阶段):::process --> B1(不一定要使用SageMaker Studio):::process
B --> B2(停用不需要的Studio实例):::process
B --> B3(小规模实验并选择合适的实例):::process
B --> B4(使用本地模式):::process
C(模型训练阶段):::process --> C1(不在Studio实例上训练):::process
C --> C2(将数据集打包成RecordIO/TFRecord文件):::process
C --> C3(使用管道模式):::process
C --> C4(选择合适的训练实例):::process
C --> C5(使用托管Spot训练):::process
C --> C6(使用AWS提供的深度学习库版本):::process
D(模型部署阶段):::process --> D1(使用批量转换):::process
D --> D2(删除不必要的端点):::process
D --> D3(选择合适的端点并使用自动扩展):::process
D --> D4(使用多模型端点):::process
D --> D5(使用Amazon Neo编译模型):::process
D --> D6(大规模部署时使用AWS Inferentia):::process
D --> D7(自动化一切):::process
D --> D8(购买Savings Plans):::process
总结
在机器学习项目中,成本优化和性能提升是关键目标。通过使用Amazon SageMaker Neo编译模型,我们可以在不同设备上高效部署模型。在树莓派上部署模型时,通过一系列步骤可以显著提升预测性能;在AWS Inferentia上部署模型则能利用其定制芯片的优势实现高吞吐量和低成本预测。
同时,遵循成本优化清单,在数据准备、实验、模型训练和模型部署的各个阶段采取相应的优化技巧,可以大幅削减机器学习预算,构建更强大、更灵活的工作流程。希望这些实用技巧能帮助你在机器学习项目中取得更好的成果,合理利用资源,实现成本与性能的平衡。
在实际应用中,你可以根据项目的具体需求和特点,有针对性地选择和应用这些技巧。并且不断尝试和实践,结合实际情况进行调整和优化,以达到最佳的成本效益。祝你在机器学习的道路上取得成功!
SageMaker优化预测成本与性能技巧
超级会员免费看

1322

被折叠的 条评论
为什么被折叠?



