¿Qué hace google cloud ml-engine cuando una solicitud Json contiene "_bytes" o "b64"?

La documentación de google cloud(Ver datos binarios en la entrada de predicción) estados:

Su cadena codificada debe formatearse como un objeto JSON con una sola clave llamada b64. El siguiente ejemplo de Python codifica un búfer de datos JPEG sin procesar utilizando la biblioteca base64 para crear una instancia:

{"image_bytes":{"b64": base64.b64encode(jpeg_data)}}

En su código de modelo TensorFlow, debe nombrar los alias de sus tensores de entrada y salida para que terminen con '_bytes'.

Me gustaría entender más sobre cómo funciona este proceso en el lado de la nube de Google.

¿El motor ml decodifica automáticamente algún contenido después de la cadena "b64" para bytear datos?

Cuando la solicitud tiene esta estructura anidada, ¿solo pasa en la sección "b64" a la función de entrada de servicio y elimina la clave "image_bytes"?

¿Se pasa cada solicitud individualmente a la función de entrada de servicio o se agrupan?

¿Definimos los alias de entrada y salida en ServingInputReceiver devueltos por la función de entrada de servicio?

No he encontrado ninguna manera de crear una función de entrada de servicio que utilice esta estructura anidada para definir los marcadores de posición de la característica. Solo uso "b64" en el mío y no estoy seguro de lo que hace gcloud ml-engine al recibir las solicitudes.

Además al predecir localmente usandogcloud ml-engine local predict, el envío de la solicitud con la estructura anidada falla (clave inesperada image_bytes ya que no está definida en la función de entrada de servicio). Pero al predecir usandogcloud ml-engine predict, el envío de solicitudes con la estructura anidada funciona incluso cuando la función de entrada de servicio no contiene ninguna referencia a "image_bytes". La predicción de gcloud también funciona al omitir "image_bytes" y pasar solo "b64".

Un ejemplo que sirve la función de entrada

def serving_input_fn():
    feature_placeholders = {'b64': tf.placeholder(dtype=tf.string,
                                                  shape=[None],
                                                  name='source')}
    single_image = tf.decode_raw(feature_placeholders['b64'], tf.float32)
    inputs = {'image': single_image}
    return tf.estimator.export.ServingInputReceiver(inputs, feature_placeholders)

Di el ejemplo usando imágenes, pero supongo que lo mismo debería aplicarse a todos los tipos de datos enviados como bytes y codificados en base64.

Hay muchas preguntas de stackoverflow que contienen referencias a la necesidad de incluir "_bytes" con fragmentos de información, pero me resultaría útil si alguien pudiera explicar un poco más en detalle lo que está sucediendo, ya que no me sentiría tan afectado. y fallar al formatear solicitudes.

Preguntas de Stackoverflow sobre este tema

cómo hacer predicciones correctas de la imagen jpeg en cloud-ml

Cómo convertir una imagen JPEG en un archivo JSON en Google Machine Learning

cómo hacer predicciones correctas de la imagen jpeg en cloud-ml

Imágenes Base64 con Keras y Google Cloud ML

¿Cómo leer una cadena binaria codificada utf-8 en tensorflow?

Respuestas a la pregunta(1)

Su respuesta a la pregunta