【问题标题】:sagemaker invoke_endpoint signature_def feature prepsagemaker invoke_endpoint signature_def 功能准备
【发布时间】:2018-03-26 12:31:38
【问题描述】:

我有一个使用自定义估计器的 sagemaker tensorflow 模型,类似于 abalone.py sagemaker tensorflow 示例,在 serving_input_fn 中使用 build_raw_serving_input_receiver_fn:

def serving_input_fn(params):
    tensor = tf.placeholder(tf.float32, shape=[1, NUM_FEATURES])
    return build_raw_serving_input_receiver_fn({INPUT_TENSOR_NAME: tensor})()

使用 json 从 java 脚本请求预测:

  response = @client.invoke_endpoint(
    endpoint_name: @name,
    content_type: "application/json",
    accept: "application/json",
    body: values.to_json
    )

到目前为止一切都很好。现在我想添加一些特征工程(使用从训练数据派生的缩放器对特征进行缩放转换)。按照Data Normalization with tensorflow tf-transform 的答案模式,我现在有了像这样的 serving_input_fn:

def serving_input_fn(params):
    feature_placeholders = {
        'f1': tf.placeholder(tf.float32, [None]),
        'f2': tf.placeholder(tf.float32, [None]),
        'f3': tf.placeholder(tf.float32, [None]),
    }
    features = {
        key: tf.expand_dims(tensor, -1)
        for key, tensor in feature_placeholders.items()
    }
    return tf.estimator.export.ServingInputReceiver(add_engineering(features), feature_placeholders)

来自 saved_model_cli 显示 --dir 。 --all I can see the input signature has changed:

signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['f1'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: Placeholder_1:0
inputs['f2'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: Placeholder_2:0
inputs['f3'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: Placeholder:0

我如何准备特征以根据这个新模型进行预测?在 python 中,我一直没有成功地尝试像

requests = [{'f1':[0.1], 'f2':[0.1], 'f3':[0.2]}]
predictor.predict(requests)

还需要从 java-script 发送预测请求。

【问题讨论】:

    标签: tensorflow tensorflow-serving amazon-sagemaker


    【解决方案1】:

    你可以定义一个

    def input_fn(data=None, content_type=None):
    

    这将在调用 SageMaker 时直接调用。您可以在此功能中进行功能准备。 model_fn 将在此函数之后调用。 确保返回字符串和 TensorProto 的字典。 dict{"input tensor name", TensorProto} 来自 input_fn 方法。

    您可以在哪里找到更多详细信息

    https://docs.aws.amazon.com/sagemaker/latest/dg/tf-training-inference-code-template.html

    示例 input_fn 如下所示

    def input_fn(data=None, content_type=None):
        """
        Args:
            data: An Amazon SageMaker InvokeEndpoint request body
            content_type: An Amazon SageMaker InvokeEndpoint ContentType value for data.
        Returns:
            object: A deserialized object that will be used by TensorFlow serving as input.
        """
    
        # `inputs` is based on the parameters defined in the model spec's signature_def
        return {"inputs": tf.make_tensor_proto(data, shape=(1,))}
    

    【讨论】:

    • 谢谢,会试试的。我曾想过这一点,但感觉像是一种解决方法……也想在代码中找到 sagemaker 的默认 input_fn 以作为模板但找不到。
    【解决方案2】:

    按照 Raman 的建议,已设法通过 sagemaker input_fn 定义将特征值用于预测。这意味着回到我开始的 build_raw_serving_input_receiver_fn serving_input_fn(帖子顶部)。 input_fn 如下所示:

    def input_fn(data=None, content_type=None):
        if content_type == 'application/json':
            values = np.asarray(json.loads(data))
            return {"inputs": tf.make_tensor_proto(values=values, shape=values.shape, dtype=tf.float32)}
        else:
            return {"inputs": data}
    

    虽然我不能通过例如一个从训练到这个过程的缩放器,它可能会将它嵌入到 sagemaker 需要的 model.py 文件中(其中包含这个 input_fn defn)。我所拥有的是通过 python 解决的正确响应

    data = [[0.1, 0.2, 0.3]]
    payload = json.dumps(data)
    
    response = client.invoke_endpoint(
        EndpointName=endpoint_name,
        Body=payload,
        ContentType='application/json'
    )
    result = json.loads(response['Body'].read().decode())
    

    values = np.asarray([[0.1, 0.2, 0.3]])
    prediction = predictor.predict(values)
    

    这对我来说是全新的......如果您知道任何潜在问题,请提出改进​​建议/提醒我。

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 2014-08-27
      • 2023-01-26
      • 2012-11-23
      • 2015-12-19
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多