python - 使用“入口点”在 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
?
潜在的想法和担忧:
想法:只需从 MongoDB 中获取模型并从
entry_point
文件中进行反编译。然后 AWS 需要的每个方法都可以引用编译后的模型对象。关注点:鉴于 AWS 将从该文件创建一个 VM 以在其云中运行代码,这种做法是安全的还是最佳实践?此外,源稍后存储在 S3 存储桶中,因此无论权限如何,这都可能带来另一个安全风险。此外,无法从
entry_point
文件中加载 pymongo 之类的依赖项,这使得在不更改训练图像的情况下无法获取数据。想法:在上面创建训练作业和部署实例的文件中进行获取和转编译
train-and-deploy-sagemaker.py
。然后通过估计器中的超参数属性传递一些可以重建模型的代码——比如 Keras 模型 JSON。关注点:根据 AWS,超参数只能是 256 个字符长。
思路:
entry_point
根据需要包含的模型架构动态生成文件。关注点:由于不必要的 I/O 原因,不想在服务器上创建一次性文件,生成代码是一种混乱和不好的做法,因此必须有更好的方法。
想法:使
entry_point
属性成为非外部文件,而是在创建估计器的文件中指定所需的方法。这表面上可以解决我所有的问题,但是......担忧:我在 SageMaker 文档中没有看到任何相关内容。尽管如此,这是最理想的。
任何帮助将不胜感激并提前感谢!
解决方案
请注意,为了简化您的训练脚本,您可以使用SageMaker 脚本模式而不是 entry_point.py。
- 您为估算器指定了一个 requirements_file,因此您将拥有必要的 pip 可安装库。如果 MongoDB 在您的 VPC 中运行,您还需要在 VPC 中运行训练作业。
- 您可以使用 source_dir 或依赖项参数包含相关文件,但是无论如何它们都会在 S3 中结束,您可以在作业完成时清除 S3 存储桶。从类 FrameworkModel:
source_dir (str):路径(绝对或相对)到具有除入口点文件之外的任何其他训练源代码依赖项的目录(默认值:无)。在 SageMaker 上进行培训时,将保留此目录中的结构。如果目录指向 S3,则不会上传任何代码,而是使用 S3 位置。
依赖项(list[str]):目录路径列表(绝对或相对)以及将导出到容器的任何附加库(默认值:[])。库文件夹将被复制到 SageMaker,位于复制入口点的同一文件夹中。如果
source_dir
指向 S3,将上传代码并使用 S3 位置代替
- 是的,最好避免。
- 不可行,因为 SageMaker 从 S3 读取代码。你可以通过一个环境
希望能帮助到你。
推荐阅读
- python - 列表中的特定范围(python)
- javascript - 未能以 html 元素的形式接收 php 响应
- flutter - 如何从列表中删除特定项目?
- d3.js - 如何在d3中放置具有空投影的纬度和经度?
- powershell - PowerShell 一一捕获异常
- javascript - 检查div中是否存在某个单词
- c++ - 在没有上下文参数的情况下将有状态的 lambda 传递给 C 风格的函数
- javascript - Javascript:更改动态 api 数据的颜色?
- javascript - 谷歌优化 - 仅在没有发生重定向时执行 JS
- java - 线程“主”java.lang.IllegalArgumentException 中的异常:输入 == null!- 我相信eclipse找不到png文件