我希望为SageMaker中的服务端点提供一些超参数。训练实例可以使用以下超参数访问输入参数:
estimator = TensorFlow(entry_point='autocat.py',
role=role,
output_path=params['output_path'],
code_location=params['code_location'],
train_instance_count=1,
train_instance_type='ml.c4.xlarge',
training_steps=10000,
evaluation_steps=None,
hyperparameters=params)
但是,在部署终结点时,无法传入用于控制input_fn(serialized_input, content_type)
函数中数据处理的参数。
将参数传递给服务实例的最佳方法是什么?sagemaker.tensorflow.TensorFlow
类中定义的 source_dir
参数是否复制到服务实例?如果是这样,我可以使用 config.yml 或类似的东西。
我遇到了与您类似的问题,我需要从 S3 下载一些东西以在input_fn中进行推理。就我而言,这是一本字典。
三个选项:
- 使用 config.yml 方法,并在任何函数声明之前从入口点文件中下载并导入 S3 文件。这将使input_fn
- 继续使用超参数方法,下载并导入
serving_input_fn
中的矢量化器,并通过全局变量使其可用,以便input_fn
可以访问它。 - 在训练之前从 s3 下载文件,并将其直接包含在source_dir中。
仅当您不需要在初始训练后单独更改矢量化器时,选项 3 才有效。
无论您做什么,都不要直接在input_fn中下载文件。我犯了这个错误,性能很糟糕,因为每次调用端点都会导致下载 s3 文件。
超参数用于训练阶段,以允许您调整(超参数优化 - HPO(模型。一旦你有一个经过训练的模型,推理就不需要这些超参数了。
当您想要将功能传递给服务实例时,您通常在对调用终端节点 API 调用的每个请求的 BODY 中执行此操作(例如,请参阅此处:https://docs.aws.amazon.com/sagemaker/latest/dg/tf-example1-invoke.html(或调用 SageMaker python SDK 中的预测包装器 (https://github.com/aws/sagemaker-python-sdk/tree/master/src/sagemaker/tensorflow(。可以在示例笔记本中看到此类示例 (https://github.com/awslabs/amazon-sagemaker-examples/blob/master/advanced_functionality/tensorflow_iris_byom/tensorflow_BYOM_iris.ipynb(
是的,一种选择是将配置文件添加到source_dir
并将文件加载到input_fn
中。
另一种选择是使用 serving_input_fn(hyperparameters)
.该函数在TensorFlow服务模型中转换TensorFlow模型。例如:
def serving_input_fn(hyperparameters):
# gets the input shape from the hyperparameters
shape = hyperparameters.get('input_shape', [1, 7])
tensor = tf.placeholder(tf.float32, shape=shape)
# returns the ServingInputReceiver object.
return build_raw_serving_input_receiver_fn({INPUT_TENSOR_NAME: tensor})()
TensorFlow Amazon-Sagemaker Hyperparameters TensorFlow-serve