Как сделать параметры доступными для SageMaker Tensorflow Endpoint
Я хочу сделать некоторые гиперпараметры доступными для обслуживающей конечной точки в 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)
функция.
Каков наилучший способ передачи параметров обслуживающему экземпляру? Это source_dir
параметр, определенный в sagemaker.tensorflow.TensorFlow
класс скопирован в обслуживающий экземпляр? Если это так, я мог бы использовать config.yml или подобное.
3 ответа
Ах, у меня была похожая проблема с вами, где мне нужно было загрузить что-то с S3, чтобы использовать в input_fn для вывода. В моем случае это был словарь.
Три варианта:
- используйте подход config.yml и загрузите и импортируйте файл s3 из вашего файла точки входа перед любыми объявлениями функций. Это сделало бы его доступным для input_fn
- Продолжайте использовать гиперпараметрический подход, загрузите и импортируйте векторизатор в
serving_input_fn
и сделать его доступным через глобальную переменную так, чтобыinput_fn
имеет доступ к нему. - Загрузите файл с s3 перед тренировкой и включите его в source_dir напрямую.
Вариант 3 будет работать только в том случае, если вам не нужно вносить изменения в векторизатор отдельно после первоначального обучения.
Что бы вы ни делали, не загружайте файл напрямую в input_fn. Я сделал эту ошибку, и производительность ужасна, поскольку каждый вызов конечной точки приводит к загрузке файла s3.
Гиперпараметры используются на этапе обучения, чтобы позволить вам настроить (Оптимизация гиперпараметров - HPO) вашу модель. Если у вас есть обученная модель, эти гиперпараметры не нужны для вывода.
Когда вы хотите передать функции обслуживающим экземплярам, вы обычно делаете это в BODY каждого запроса вызову API invoke-endpoint (например, смотрите здесь: https://docs.aws.amazon.com/sagemaker/latest/dg/tf-example1-invoke.html) или вызов оболочки для прогнозирования в SDK Python для SageMaker ( 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})()