Python 不能';在AWS Sagemaker中培训scikit学习模型时,不要创建model.tar.gz文件

Python 不能';在AWS Sagemaker中培训scikit学习模型时,不要创建model.tar.gz文件,python,amazon-web-services,amazon-s3,scikit-learn,amazon-sagemaker,Python,Amazon Web Services,Amazon S3,Scikit Learn,Amazon Sagemaker,我想在AWS Sagemaker中为scikit逻辑回归创建一个端点。我有一个train.py文件,其中包含scikit sagemaker的培训代码 import subprocess as sb import pandas as pd import numpy as np import pickle,json import sys def install(package): sb.call([sys.executable, "-m", "pip", "install", packa

我想在AWS Sagemaker中为scikit逻辑回归创建一个端点。我有一个
train.py
文件,其中包含scikit sagemaker的培训代码

import subprocess as sb
import pandas as pd
import numpy as np
import pickle,json
import sys

def install(package):
    sb.call([sys.executable, "-m", "pip", "install", package])

install('s3fs')

import argparse
import os

if __name__ =='__main__':
    parser = argparse.ArgumentParser()

    # hyperparameters sent by the client are passed as command-line arguments to the script.
    parser.add_argument('--solver', type=str, default='liblinear')

    # Data, model, and output directories
    parser.add_argument('--output_data_dir', type=str, default=os.environ.get('SM_OUTPUT_DIR'))
    parser.add_argument('--model_dir', type=str, default=os.environ.get('SM_MODEL_DIR'))
    parser.add_argument('--train', type=str, default=os.environ.get('SM_CHANNEL_TRAIN'))

    args, _ = parser.parse_known_args()

    # ... load from args.train and args.test, train a model, write model to args.model_dir.

    input_files = [ os.path.join(args.train, file) for file in os.listdir(args.train) ]
    if len(input_files) == 0:
        raise ValueError(('There are no files in {}.\n' +
                          'This usually indicates that the channel ({}) was incorrectly specified,\n' +
                          'the data specification in S3 was incorrectly specified or the role specified\n' +
                          'does not have permission to access the data.').format(args.train, "train"))

    raw_data = [ pd.read_csv(file, header=None, engine="python") for file in input_files ]

    df = pd.concat(raw_data)

    y = df.iloc[:,0]
    X = df.iloc[:,1:]



    solver = args.solver
    from sklearn.linear_model import LogisticRegression
    lr = LogisticRegression(solver=solver).fit(X, y)
from sklearn.externals import joblib
def model_fn(model_dir):
    lr = joblib.dump(lr, "model.joblib")
    return lr
在我的sagemaker笔记本中,我运行了以下代码

import os
import boto3
import re
import copy
import time
from time import gmtime, strftime
from sagemaker import get_execution_role
import sagemaker

role = get_execution_role()

region = boto3.Session().region_name

bucket=<bucket> # Replace with your s3 bucket name
prefix = <prefix>

output_path = 's3://{}/{}/{}'.format(bucket, prefix,'output_data_dir')
train_data = 's3://{}/{}/{}'.format(bucket, prefix, 'train')
train_channel = sagemaker.session.s3_input(train_data, content_type='text/csv')

from sagemaker.sklearn.estimator import SKLearn
sklearn = SKLearn(
    entry_point='train.py',
    train_instance_type="ml.m4.xlarge",
    role=role,output_path = output_path,
    sagemaker_session=sagemaker.Session(),
    hyperparameters={'solver':'liblinear'})
现在,对于创建端点

from sagemaker.predictor import csv_serializer
predictor = sklearn.deploy(1, 'ml.m4.xlarge')
在尝试创建端点时,它正在抛出

ClientError: An error occurred (ValidationException) when calling the CreateModel operation: Could not find model data at s3://<bucket>/<prefix>/output_data_dir/sagemaker-scikit-learn-x-y-z-000/output/model.tar.gz.
ClientError:调用CreateModel操作时发生错误(ValidationException):在s3处找不到模型数据:///output_data_dir/sagemaker-scikit-learn-x-y-z-000/output/model.tar.gz。
我检查了我的S3桶。在我的
output\u data\u dir
中有
sagemaker-scikit-learn-x-y-z-000
dir,它有
debug output\training\u job\u end.ts
文件。在我的
文件夹外创建了一个名为
sagemaker-scikit-learn-x-y-z-000
的附加目录,该目录包含
source\sourcedir.tar.gz
文件。通常,每当我使用sagemaker内置算法训练我的模型时,
output\u data\u dir\sagemaker-scikit-learn-x-y-z-000\output\model.tar.gz
就会创建一类文件。有人能告诉我我的scikit模型存储在哪里,如何在不手动操作的情况下将
source\sourcedir.tar.gz
推送到前缀代码中,以及如何查看
sourcedir.tar.gz


编辑:我详细阐述了有关
前缀的问题。每当我运行
sklearn.fit()
,都会在我的S3存储桶中创建两个同名的文件
sagemaker-scikit-learn-x-y-z-000
。在我的
//output\u data\u dir/sagemaker-scikit-learn-x-y-z-000/debug output/training\u job\u end.ts
中创建了一个文件,其他文件在
/sagemaker-scikit-learn-x-y-z-000/source/sourcedir.tar.gz
中创建。为什么在我的
中创建的第二个文件与第一个文件不同?
sourcedir.tar.gz
文件中包含什么?

如果您在S3中找不到模型,我不确定您的模型是否真的存储了。当您在入口点脚本中定义一个调用joblib.dump的函数时,我在主脚本的末尾进行了调用。例如:

# persist model
path = os.path.join(args.model_dir, "model.joblib")
joblib.dump(myestimator, path)
print('model persisted at ' + path)

然后可以在..\output\model.tar.gz中找到该文件,就像在其他情况下一样。为了仔细检查创建的模型,您可能需要在培训协议中找到打印语句。

您必须将模型作为培训代码的最后一步转储。目前,您在错误的位置执行此操作,因为model_fn的目标是加载模型用于推理,而不是用于培训

  • 培训后添加转储:

    lr = LogisticRegression(solver=solver).fit(X, y)
    lr = joblib.dump(lr, args.model_dir)
    
  • 更改model_fn()以加载模型,而不是转储模型


  • 查看更多信息。

    请使用前缀代码进一步解释您的问题。
    lr = LogisticRegression(solver=solver).fit(X, y)
    lr = joblib.dump(lr, args.model_dir)