如何使用 Boto3 SDK 为 SageMaker 训练作业指定源目录和入口点?用例是通过 Lambda 调用开始训练
How to specify source directory and entry point for a SageMaker training job using Boto3 SDK? The use case is start training via Lambda call
我一直在 SageMaker notebook 实例上使用 SageMaker Python SDK 并在本地使用 IAM 凭证 运行ning 训练作业。它们运行良好,但我希望能够通过 AWS Lambda + Gateway 开始训练工作。
Lambda 不支持 SageMaker SDK(高级 SDK),因此我不得不在我的 Lambda 处理程序中使用来自 boto3
的 SageMaker 客户端,例如
sagemaker = boto3.client('sagemaker')
据说这个 boto3 服务级 SDK 会给我 100% 的控制权,但我找不到参数或配置名称来指定源目录和入口点。我正在 运行 定制训练作业,需要在飞行中生成一些数据(使用 Keras 生成器)。
这是我的 SageMaker SDK 调用示例[=23=]
tf_estimator = TensorFlow(base_job_name='tensorflow-nn-training',
role=sagemaker.get_execution_role(),
source_dir=training_src_path,
code_location=training_code_path,
output_path=training_output_path,
dependencies=['requirements.txt'],
entry_point='main.py',
script_mode=True,
instance_count=1,
instance_type='ml.g4dn.2xlarge',
framework_version='2.3',
py_version='py37',
hyperparameters={
'model-name': 'my-model-name',
'epochs': 1000,
'batch-size': 64,
'learning-rate': 0.01,
'training-split': 0.80,
'patience': 50,
})
输入路径通过调用fit()
注入
input_channels = {
'train': training_input_path,
}
tf_estimator.fit(inputs=input_channels)
source_dir
是用于查找我的 src.zip.gz
的 S3 URI,其中包含模型和脚本
进行训练。
entry_point
是训练的开始。 TensorFlow 容器只需 运行s python main.py
code_location
是一个 S3 前缀,如果我要 运行,可以将训练源代码上传到这里
此培训使用本地模型和脚本在本地进行。
output_path
是训练作业将模型工件上传到的 S3 URI。
但是,我查看了 SageMaker.Client.create_training_job 的文档,找不到任何允许我设置源目录和入口点的字段。
这是一个例子,
sagemaker = boto3.client('sagemaker')
sagemaker.create_training_job(
TrainingJobName='tf-training-job-from-lambda',
Hyperparameters={} # Same dictionary as above,
AlgorithmSpecification={
'TrainingImage': '763104351884.dkr.ecr.us-west-1.amazonaws.com/tensorflow-training:2.3.1-gpu-py37-cu110-ubuntu18.04',
'TrainingInputMode': 'File',
'EnableSageMakerMetricsTimeSeries': True
},
RoleArn='My execution role goes here',
InputDataConfig=[
{
'ChannelName': 'train',
'DataSource': {
'S3DataSource': {
'S3DataType': 'S3Prefix',
'S3Uri': training_input_path,
'S3DataDistributionType': 'FullyReplicated'
}
},
'CompressionType': 'None',
'RecordWrapperType': 'None',
'InputMode': 'File',
}
],
OutputDataConfig={
'S3OutputPath': training_output_path,
}
ResourceConfig={
'InstanceType': 'ml.g4dn.2xlarge',
'InstanceCount': 1,
'VolumeSizeInGB': 16
}
StoppingCondition={
'MaxRuntimeInSeconds': 600 # 10 minutes for testing
}
)
从上面的配置来看,SDK 接受训练输入和输出位置,但是哪个配置字段允许用户指定源代码目录和入口点?
您可以像这样将 source_dir 传递给超参数:
response = sm_boto3.create_training_job(
TrainingJobName=f"{your job name}"),
HyperParameters={
'model-name': 'my-model-name',
'epochs': 1000,
'batch-size': 64,
'learning-rate': 0.01,
'training-split': 0.80,
'patience': 50,
"sagemaker_program": "script.py", # this is where you specify your train script
"sagemaker_submit_directory": "s3://" + bucket + "/" + project + "/" + source, # your s3 URI like s3://sm/tensorflow/source/sourcedir.tar.gz
},
AlgorithmSpecification={
"TrainingImage": training_image,
...
},
注意:确保它是 xxx.tar.gz 否则。否则 Sagemaker 会抛出错误。
我一直在 SageMaker notebook 实例上使用 SageMaker Python SDK 并在本地使用 IAM 凭证 运行ning 训练作业。它们运行良好,但我希望能够通过 AWS Lambda + Gateway 开始训练工作。
Lambda 不支持 SageMaker SDK(高级 SDK),因此我不得不在我的 Lambda 处理程序中使用来自 boto3
的 SageMaker 客户端,例如
sagemaker = boto3.client('sagemaker')
据说这个 boto3 服务级 SDK 会给我 100% 的控制权,但我找不到参数或配置名称来指定源目录和入口点。我正在 运行 定制训练作业,需要在飞行中生成一些数据(使用 Keras 生成器)。
这是我的 SageMaker SDK 调用示例[=23=]
tf_estimator = TensorFlow(base_job_name='tensorflow-nn-training',
role=sagemaker.get_execution_role(),
source_dir=training_src_path,
code_location=training_code_path,
output_path=training_output_path,
dependencies=['requirements.txt'],
entry_point='main.py',
script_mode=True,
instance_count=1,
instance_type='ml.g4dn.2xlarge',
framework_version='2.3',
py_version='py37',
hyperparameters={
'model-name': 'my-model-name',
'epochs': 1000,
'batch-size': 64,
'learning-rate': 0.01,
'training-split': 0.80,
'patience': 50,
})
输入路径通过调用fit()
input_channels = {
'train': training_input_path,
}
tf_estimator.fit(inputs=input_channels)
source_dir
是用于查找我的src.zip.gz
的 S3 URI,其中包含模型和脚本 进行训练。entry_point
是训练的开始。 TensorFlow 容器只需 运行spython main.py
code_location
是一个 S3 前缀,如果我要 运行,可以将训练源代码上传到这里 此培训使用本地模型和脚本在本地进行。output_path
是训练作业将模型工件上传到的 S3 URI。
但是,我查看了 SageMaker.Client.create_training_job 的文档,找不到任何允许我设置源目录和入口点的字段。
这是一个例子,
sagemaker = boto3.client('sagemaker')
sagemaker.create_training_job(
TrainingJobName='tf-training-job-from-lambda',
Hyperparameters={} # Same dictionary as above,
AlgorithmSpecification={
'TrainingImage': '763104351884.dkr.ecr.us-west-1.amazonaws.com/tensorflow-training:2.3.1-gpu-py37-cu110-ubuntu18.04',
'TrainingInputMode': 'File',
'EnableSageMakerMetricsTimeSeries': True
},
RoleArn='My execution role goes here',
InputDataConfig=[
{
'ChannelName': 'train',
'DataSource': {
'S3DataSource': {
'S3DataType': 'S3Prefix',
'S3Uri': training_input_path,
'S3DataDistributionType': 'FullyReplicated'
}
},
'CompressionType': 'None',
'RecordWrapperType': 'None',
'InputMode': 'File',
}
],
OutputDataConfig={
'S3OutputPath': training_output_path,
}
ResourceConfig={
'InstanceType': 'ml.g4dn.2xlarge',
'InstanceCount': 1,
'VolumeSizeInGB': 16
}
StoppingCondition={
'MaxRuntimeInSeconds': 600 # 10 minutes for testing
}
)
从上面的配置来看,SDK 接受训练输入和输出位置,但是哪个配置字段允许用户指定源代码目录和入口点?
您可以像这样将 source_dir 传递给超参数:
response = sm_boto3.create_training_job(
TrainingJobName=f"{your job name}"),
HyperParameters={
'model-name': 'my-model-name',
'epochs': 1000,
'batch-size': 64,
'learning-rate': 0.01,
'training-split': 0.80,
'patience': 50,
"sagemaker_program": "script.py", # this is where you specify your train script
"sagemaker_submit_directory": "s3://" + bucket + "/" + project + "/" + source, # your s3 URI like s3://sm/tensorflow/source/sourcedir.tar.gz
},
AlgorithmSpecification={
"TrainingImage": training_image,
...
},
注意:确保它是 xxx.tar.gz 否则。否则 Sagemaker 会抛出错误。