【发布时间】: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 函数等待训练作业完成:
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