随着云计算技术的发展,特别是由亚马逊、谷歌和微软等主要玩家引入的技术,越来越多的企业开始转向无服务器平台。这种转变使得组织能够更专注于其核心业务战略。本文将探讨亚马逊提供的机器学习服务SageMaker,以及如何利用SageMaker内置的算法来训练、测试和在AWS上部署模型。
整个过程从创建笔记本实例开始,这会为目标分配一个虚拟机(EC2 - 弹性云)和存储(EBS卷)。用户可以选择EC2的类型和大小,以及EBS卷的容量。为了执行大规模计算,可以在常规EC2之上添加额外的虚拟实例。任务完成后,可以通过点击操作下的“停止”来关闭EC2实例。另一方面,即使虚拟机不在使用,EBS卷仍然保留分配的数据。
出于学习目的,可以在免费试用下创建账户,并从服务中选择“Amazon SageMaker”。可以从右上角选择区域。在AWS SageMaker下的“笔记本实例”中,点击“创建笔记本实例”。
创建笔记本实例后,需要分配EC2实例和EBS卷。最后一步是分配访问角色,因为笔记本实例需要权限来调用其他服务,包括SageMaker和S3(下面讨论的另一个存储服务)。
现在已经为实现目标分配了虚拟机,接下来的步骤是创建文件夹、数据集和笔记本。在这里,上传数据集(训练和测试),对训练数据集进行探索性数据分析,并将训练数据集拆分为训练和验证集。希望根据验证集的性能来调整超参数。
通过点击“打开Jupyter”,会打开一个新窗口,可以为项目创建一个文件夹。可以双击文件夹并加载训练、测试数据集,以及已经在本地计算机上完成的探索性数据分析。AWS SageMaker在训练过程中不需要头部,并且目标列应该是数据框架中的第一列。
在开始训练之前,所有数据集(训练、验证和测试)应该上传到S3存储桶中,训练期间会从该存储桶中检索详细信息。S3存储桶本质上是亚马逊提供的简单云存储服务。
可以通过点击AWS服务下的“S3”并分别给出名称和区域来为过程创建一个S3存储桶。S3存储桶也应该与笔记本实例在同一区域。
import boto3
import sagemaker
from sagemaker import get_execution_role
bucket_name = 's3bucketloanprediction'
train_file_name = 'Loan Prediction/Train_final.csv'
val_file_name = 'Loan Prediction/Val_final.csv'
test_file_name = 'Loan Prediction/Test_final.csv'
model_output_location = r's3://{0}/LoanPrediction/model'.format(bucket_name)
def write_to_s3(filename, bucket, key):
with open(filename, 'rb') as f:
return boto3.Session().resource('s3').Bucket(bucket).Object(key).upload_fileobj(f)
write_to_s3('Train_final.csv', bucket_name, train_file_name)
write_to_s3('Val_final.csv', bucket_name, val_file_name)
write_to_s3('Test_final.csv', bucket_name, test_file_name)
所有数据集已成功上传到指定的S3存储桶中。
由于使用的是内置算法,需要调用这些算法进行训练。这些算法存储为ECR(弹性容器注册表)中的容器,每个区域都维护这些容器。通过在代码中给出这些容器的路径,可以调用这些算法。区域特定的注册表路径详细信息可以在链接中找到。
例如,如果想使用来自美国西部(北加利福尼亚)区域的XGBoost分类器,Docker容器路径是‘746614075791.dkr.ecr.us-west-1.amazonaws.com’。接下来的步骤是使用来自ECR的Docker容器构建模型。
container = {'us-west-1': '746614075791.dkr.ecr.us-west-1.amazonaws.com/sagemaker-xgboost:1.0-1-cpu-py3'}
sess = sagemaker.Session()
bucket_name = 's3bucketloanprediction'
model_output_location = r's3://{0}/LoanPrediction/model'.format(bucket_name)
estimator = sagemaker.estimator.Estimator(container[boto3.Session().region_name],
role,
train_instance_count = 1,
train_instance_type='ml.m4.xlarge',
output_path = model_output_location,
sagemaker_session = sess,
base_job_name = 'xgboost-loanprediction')
estimator.set_hyperparameters(max_depth=5, objective = 'binary:logistic', eta=0.1, subsample=0.7, num_round=10, eval_metric = 'auc')
training_file = sagemaker.session.s3_input(s3_data=train_file_location, content_type = "csv")
validation_file = sagemaker.session.s3_input(s3_data=val_file_location, content_type = "csv")
data_channels = {'train':training_file, 'validation':validation_file}
estimator.fit(inputs=data_channels, logs=True)
predictor = estimator.deploy(initial_instance_count = 1, instance_type = 'ml.m4.xlarge', endpoint_name = 'xgboost-loanprediction-ver1')