【问题标题】:Training & Deploying SageMaker ML Models using AWS Lambda (NodeJS)使用 AWS Lambda (NodeJS) 训练和部署 SageMaker ML 模型
【发布时间】:2019-07-11 02:38:14
【问题描述】:

我正在使用 AWS Lambda (NodeJS) 创建 sagemaker 训练作业并使用 Sagemaker Javascript SDK 进行部署。

我正在关注以下 AWS JavaScript SDK 文档

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SageMaker.html

我正在使用以下脚本来创建培训作业。

Create Training Job:
=====================

    let TrainingJobName = 'Training-' + curr_date_time
    let TrainingImage   = 'XXXXXX.dkr.ecr.us-east-1.amazonaws.com/xxxx:latest'
    let S3Uri           = 's3://xxx.xxxx.sagemaker/csv'

    console.log(`TrainingJobName: ${TrainingJobName}`);

    let params = {
        AlgorithmSpecification: { /* required */
            TrainingInputMode: 'File', /* required */
            TrainingImage: TrainingImage
        },
        OutputDataConfig: { /* required */
            S3OutputPath: 's3://xxx.xxxx.sagemaker/xxxx/output', /* required */
        },
        ResourceConfig: { /* required */
            InstanceCount: 1, /* required */
            InstanceType: 'ml.m4.xlarge', /* required */
            VolumeSizeInGB: 1, /* required */
        },
        RoleArn: 'arn:aws:iam::xxxxx:role/service-role/AmazonSageMaker-ExecutionRole-xxxx', /* required */
        StoppingCondition: { /* required */
            MaxRuntimeInSeconds: 86400
        },
        TrainingJobName: TrainingJobName, /* required */
        InputDataConfig: [
            {
                ChannelName: 'training', /* required */
                DataSource: { /* required */
                    S3DataSource: {
                        S3DataType: 'S3Prefix', /* required */
                        S3Uri: S3Uri, /* required */
                        S3DataDistributionType: 'FullyReplicated'
                    }
                },
                CompressionType: null,
                ContentType: '',
                RecordWrapperType: null,
            }
        ]
    };

    return await sagemaker.createTrainingJob(params).promise();

创建培训作业后,我使用 sagemaker describeTrainingJob 函数查询作业状态。 我的状态为“InProgress”

之后,我使用以下方法调用 sagemaker waitFor 函数等待训练作业完成:

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SageMaker.html#trainingJobCompletedOrStopped-waiter

let waitFor_result = await sagemaker.waitFor('trainingJobCompletedOrStopped', {TrainingJobName: training_job_name}).promise();
console.log(`waitFor_result : ${JSON.stringify(waitFor_result)}`);

我发现 sagemaker waitFor 在第一个训练作业完成之前创建了第二个训练作业,并继续创建具有相同作业名称的后续训练作业。

我认为这是由于 createTrainingJob 函数中的 StoppingCondition 参数 (MaxRuntimeInSeconds:86400) 造成的。

我想知道是否有任何解决方案可以创建单个训练作业并在训练作业完成后返回结果?

================================================ =========== 更新:

我正在关注“使用 Lambda 函数调度 SageMaker 模型的训练”https://www.youtube.com/watch?v=FJaykbAtGTM。

如果我在我的 lambda 函数中使用以下代码,我可以创建一个培训工作。

let training_job_result = await start_model_training();
console.log(`Sagemaker training result : ${JSON.stringify(training_job_result)}`);

let training_job_arn = training_job_result["TrainingJobArn"];
let training_job_name = training_job_arn.split("/")[1];


let desc_training_job = await sagemaker.describeTrainingJob({TrainingJobName: training_job_name}).promise();
let desc_status = desc_training_job["TrainingJobStatus"];
console.log(`Training job desc_status 1 : ${JSON.stringify(desc_status)}`);

但我需要等到训练作业完成并调用 sagemaker deploy 方法来创建/更新端点。

如果我使用下面的代码,那么它会继续创建多个训练作业,并且 lambda 函数永远不会终止。

let waitFor_result = await sagemaker.waitFor('trainingJobCompletedOrStopped', {TrainingJobName: training_job_name}).promise();
console.log(`waitFor_result : ${JSON.stringify(waitFor_result)}`);


desc_training_job = await sagemaker.describeTrainingJob({TrainingJobName: training_job_name}).promise();
desc_status = desc_training_job["TrainingJobStatus"];
console.log(`Training job desc_status 2 : ${JSON.stringify(desc_status)}`);

我想在训练完成后部署/更新端点。

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-sagemaker aws-sdk-js


    【解决方案1】:

    我对 JS 了解不多,但是你不应该传递你正在等待的培训工作的 id 吗?根据文档,这是正确的用法:

    var params = {
      TrainingJobName: 'STRING_VALUE' /* required */
    };
    sagemaker.waitFor('trainingJobCompletedOrStopped', params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

    【讨论】:

    • 我确实在 sagemaker.waitFor() 参数中传递了 TrainingJobName。
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2022-07-30
    • 2020-06-29
    • 2018-12-24
    • 2019-12-13
    相关资源
    最近更新 更多