问题序言: 我有一个存储在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模型?
潜在的想法和疑虑:
构想:只需从MongoDB中获取模型并从entry_point
文件中进行转编译。然后,AWS所需的每种方法都可以引用已编译的模型对象。
关注点:鉴于AWS将根据此文件创建VM以便在其云中运行代码,这是安全还是最佳做法?此外,源随后也会存储在S3存储桶中,因此,无论权限如何,都可能带来另一个安全风险。另外,无法从entry_point
文件内加载诸如pymongo之类的依赖项,这使得在不更改训练图像的情况下无法获取数据。
想法:在创建训练作业和部署实例的文件中进行获取和转编译-上面train-and-deploy-sagemaker.py
。然后,通过估算器中的hyperparams属性传递一些可以重建模型的代码,例如Keras模型JSON。
关注点:根据AWS,超参数只能为256个字符。
想法:根据其需要包含的模型体系结构动态生成entry_point
文件。
关注点:许多事情,例如由于不必要的I / O原因而不想在服务器上创建一次性文件,生成代码很杂乱且不明智的做法,因此必须有一个更好的选择方式。
想法:将entry_point
属性设置为非外部文件,而是在创建估算器的文件中指定所需的方法。表面上,这将解决我所有的问题,但是...
关注点:在SageMaker文档中,我对此一无所知。尽管如此,这是最理想的。
任何帮助将不胜感激,并提前致谢!
答案 0 :(得分:1)
请注意,为简化您的训练脚本,您可以使用SageMaker script mode代替entry_point.py。
source_dir(str):具有任何目录的目录的路径(绝对或相对) 其他训练 除入口点文件外的源代码依赖性(默认值:无)。其中的结构 在SageMaker上进行培训时,将保留该目录。 如果目录指向S3,则不会上传任何代码,而将使用S3位置。
依赖关系(list [str]):目录路径的列表(绝对或 相对的) 将导出到容器的任何其他库(默认值:[])。 库文件夹将被复制到复制入口点的文件夹中的SageMaker中。 如果
source_dir
指向S3,则将上传代码并使用S3位置 代替
希望有帮助。