如何使用 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)

但是,我查看了 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 会抛出错误。

参考https://github.com/aws/amazon-sagemaker-examples/blob/master/sagemaker-python-sdk/scikit_learn_randomforest/Sklearn_on_SageMaker_end2end.ipynb