使用“ entrypoint”在Sagemaker中使用预先创建的Keras架构训练和部署模型

时间:2019-04-21 23:49:39

标签: python mongodb amazon-web-services keras amazon-sagemaker

问题序言: 我有一个存储在MongoDB中的用户创建的神经网络体系结构数据库(用我编译为Keras模型的另一种语言编写)。我的目标是采用这些架构,使用它们创建Keras模型,然后使用SageMaker在云中训练它们。截至目前,我可以从MongoDB加载模型并将其完美地编译到Keras。 但是,我无法使用Python SDK将这些动态创建的模型发送到SageMaker。

是否有一种方法可以通过在SageMaker中通过将估算器的entry_point属性指定为定义了这些模型对象的文件来在SageMaker中训练和部署这些Keras模型体系结构(即只是Python Keras模型对象)?

工作日期和代码示例 截至目前,当模型架构在单独的文件中定义时,我可以创建训练作业并部署端点。在SageMaker's GitHub.

上查看此示例的单独文件和部署/培训过程

培训部署Sagemaker.py


# Import Sagemaker Tensorflow
from sagemaker.tensorflow import TensorFlow

# Create an estimator object using the entry_point file entry_point.py
estimator = TensorFlow(entry_point='entry_point.py',
                       role=arn_role,
                       framework_version='1.12.0',
                       hyperparameters={...some hyperparams for the model...},
                       training_steps=1000, 
                       evaluation_steps=100,
                       train_instance_count=4, train_instance_type='ml.p3.8xlarge')

# Start the training job to train the above estimator
estimator.fit(training_data_inputs)

# Deploy said estimator after training
predictor = estimator.deploy(initial_instance_count=1, instance_type='ml.m4.xlarge')


entry_point.py


def keras_model_fn(hyperparameters):
    """keras_model_fn receives hyperparameters from the training job and returns a compiled keras model.
    The model will be transformed into a TensorFlow Estimator before training and it will be saved in a 
    TensorFlow Serving SavedModel at the end of training.

    Args:
        hyperparameters: The hyperparameters passed to the SageMaker TrainingJob that runs your TensorFlow 
                         training script.
    Returns: A compiled Keras model
    """
    model = Sequential()

    ... add layers ...

    return model

def train_input_fn():
    ...

# other functions for inference and training, see link above

但是,有没有一种方法可以动态定义该体系结构? I.E从MongoDB中获取预先编写的架构,然后将其重新编译成Sequential中的相同entrypoint.py Keras模型?

潜在的想法和疑虑:

  1. 构想:只需从MongoDB中获取模型并从entry_point文件中进行转编译。然后,AWS所需的每种方法都可以引用已编译的模型对象。

    关注点:鉴于AWS将根据此文件创建VM以便在其云中运行代码,这是安全还是最佳做法?此外,源随后也会存储在S3存储桶中,因此,无论权限如何,都可能带来另一个安全风险。另外,无法从entry_point文件内加载诸如pymongo之类的依赖项,这使得在不更改训练图像的情况下无法获取数据。

  2. 想法:在创建训练作业和部署实例的文件中进行获取和转编译-上面train-and-deploy-sagemaker.py。然后,通过估算器中的hyperparams属性传递一些可以重建模型的代码,例如Keras模型JSON。

    关注点:根据AWS,超参数只能为256个字符。

  3. 想法:根据其需要包含的模型体系结构动态生成entry_point文件。

    关注点:许多事情,例如由于不必要的I / O原因而不想在服务器上创建一次性文件,生成代码很杂乱且不明智的做法,因此必须有一个更好的选择方式。

  4. 想法:将entry_point属性设置为非外部文件,而是在创建估算器的文件中指定所需的方法。表面上,这将解决我所有的问题,但是...

    关注点:在SageMaker文档中,我对此一无所知。尽管如此,这是最理想的。

任何帮助将不胜感激,并提前致谢!

1 个答案:

答案 0 :(得分:1)

请注意,为简化您的训练脚本,您可以使用SageMaker script mode代替entry_point.py。

  1. 您为估算器指定了requirements_file,因此您将拥有必要的pip可安装库。如果MongoDB在您的VPC中运行,那么您也要在VPC中运行培训作业。
  2. 您可以使用source_dir或依赖性参数来包含相关文件,但是无论如何它们都将以S3结尾,您可以在作业完成时清除S3存储桶。 来自class FrameworkModel
  

source_dir(str):具有任何目录的目录的路径(绝对或相对)   其他训练                   除入口点文件外的源代码依赖性(默认值:无)。其中的结构                   在SageMaker上进行培训时,将保留该目录。                   如果目录指向S3,则不会上传任何代码,而将使用S3位置。

     

依赖关系(list [str]):目录路径的列表(绝对或   相对的)                   将导出到容器的任何其他库(默认值:[])。                   库文件夹将被复制到复制入口点的文件夹中的SageMaker中。                   如果source_dir指向S3,则将上传代码并使用S3位置                   代替

  1. 是的,最好避免。
  2. 由于SageMaker从S3读取代码,因此不可行。您可以通过环境

希望有帮助。