首页 > 解决方案 > 使用“入口点”在 Sagemaker 中使用预先创建的 Keras 架构训练和部署模型

问题描述

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

entry_point有没有办法在 SageMaker 中通过将估计器的属性指定为定义了这些模型对象的文件来训练和部署这些 Keras 模型架构 - 即仅 Python Keras模型对象?

迄今为止的工作和代码示例 截至目前,当模型架构在单独的文件中定义时,我可以创建一个训练作业并部署一个端点。在SageMaker 的 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')


入口点.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

但是,有没有一种方法可以动态定义该架构?IE 从 MongoDB 中获取预先编写的架构,然后将其编译成相同的 KerasSequential模型entrypoint.py

潜在的想法和担忧:

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

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

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

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

  3. 思路:entry_point根据需要包含的模型架构动态生成文件。

    关注点:由于不必要的 I/O 原因,不想在服务器上创建一次性文件,生成代码是一种混乱和不好的做法,因此必须有更好的方法。

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

    担忧:我在 SageMaker 文档中没有看到任何相关内容。尽管如此,这是最理想的。

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

标签: pythonmongodbamazon-web-serviceskerasamazon-sagemaker

解决方案


请注意,为了简化您的训练脚本,您可以使用SageMaker 脚本模式而不是 entry_point.py。

  1. 您为估算器指定了一个 requirements_file,因此您将拥有必要的 pip 可安装库。如果 MongoDB 在您的 VPC 中运行,您还需要在 VPC 中运行训练作业。
  2. 您可以使用 source_dir 或依赖项参数包含相关文件,但是无论如何它们都会在 S3 中结束,您可以在作业完成时清除 S3 存储桶。从类 FrameworkModel

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

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

  1. 是的,最好避免。
  2. 不可行,因为 SageMaker 从 S3 读取代码。你可以通过一个环境

希望能帮助到你。


推荐阅读