Обучение и развертывание моделей SageMaker ML с использованием AWS Lambda (NodeJS) - PullRequest
0 голосов
/ 11 июля 2019

Я использую 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 описываетTrainingJob. Я получаю статус "InProgress"

После этого я вызываю функцию waitFor для sagemaker, чтобы дождаться завершения учебного задания, используя следующий метод:

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 создает второе учебное задание до завершения первого учебного задания и продолжает создавать последующие учебные задания с тем же именем.

enter image description here

Я думаю, что это связано с параметром StoppingCondition (MaxRuntimeInSeconds: 86400) в функции createTrainingJob.

Я хочу знать, существует ли какое-либо решение, которое создает одну учебную работу и возвращает результаты после завершения обучающей работы?

=============================================== =========== Обновление:

Я следую «Планированию обучения модели SageMaker с помощью функции Lambda» https://www.youtube.com/watch?v=FJaykbAtGTM.

Я могу создать учебную работу, если я использую приведенный ниже код в своей функции лямбда-выражений.

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 для создания / обновления конечной точки.

Если я использую приведенный ниже код, он продолжает создавать несколько учебных заданий, и лямбда-функция никогда не завершается.

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)}`);

Я хочу развернуть / обновить конечную точку после завершения обучения.

1 Ответ

0 голосов
/ 11 июля 2019

Я не очень разбираюсь в JS, но разве вы не должны передавать идентификатор учебной работы, которую вы ждете? Согласно документу, это правильное использование:

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
});
...