ML引擎 - 慢推理时间

时间:2018-05-17 12:21:32

标签: python tensorflow google-cloud-ml

我们提供的Google云端文档

  

Cloud Machine Learning Engine在线预测是一项优化的服务   通过托管模型运行您的数据,延迟时间尽可能短   可能。您将小批量数据发送到服务并返回   你在回应中的预测。你可以学到更多一般知识   有关在线预测与其他预测的信息   概念。   块引用

https://cloud.google.com/ml-engine/docs/tensorflow/online-predict

我必须说,我对它的体验是低于标准的。不要误会我的意思,我喜欢ML Engine,我在那里做了很多训练,但根据我的经验,推理时间太荒谬了。

我在尺寸为256x256的图像上创建了一个小型语义分割网络。我正在使用Estimators,我将模型转换为SavedModel格式,然后使用此代码进行预测

predictor_fn = tf.contrib.predictor.from_saved_model(
    export_dir=saved_model_dir,
    signature_def_key="prediction"
)

在我的电脑上,这给了我约0.9秒的推理时间。我在一个Datalab实例上尝试了相同的代码,机器类型为 n1-highmem-2 ,这使我的推理时间大约为2.3秒。

现在,如果我在ML-Engine上提供我保存的模型

gcloud ml-engine models create SEM --regions europe-west1
gcloud ml-engine versions create SEM --model V0 --origin "MY_BUCKET_PATH" --runtime-version=1.6

服务输入功能如下:

def parse_incoming_tensors(incoming):
    img = vgg16_normalize(tf.reshape(incoming, [-1, 256, 256, 3]))
    return img


def serving_input_fn_web():
    """Input function to use when serving the model on ML Engine."""
    inputs = tf.placeholder(tf.string, shape=(None, ))
    feature_input = batch_base64_to_tensor(inputs)
    feature_input = {'img': parse_incoming_tensors(feature_input)}

    return tf.estimator.export.ServingInputReceiver(feature_input, inputs)

然后,我使用这个类进行预测:

class MakeQuery():
    def __init__(self, project, model, version=None, client_secret=None):
        # Set the environment variable
        secret_path = os.path.abspath('./client_secret.json')
        os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = secret_path

        # Create service object and prepare the name of the model we are going to query
        self._service = googleapiclient.discovery.build('ml', 'v1')
        self._name = 'projects/{}/models/{}'.format(project, model)
        self._project = self._service.projects()

        if version is not None:
            self._name += '/versions/{}'.format(version)

    def predict(self, instances):
        response = self._project.predict(name=self._name, body=instances).execute()

        if 'error' in response:
            raise RuntimeError(response['error'])

        return response

    def get_prediction(self, img_arrays):
        input_list = [{'input': array_to_base64_websafe_resize(img)} for img in img_arrays]
        input_format = {'instances': input_list}

        return self.predict(input_format)

然后每个预测请求需要10秒! ML-Engine是否每次提出请求时都会认真部署模型?

TL; DR 使用Estimators中的Tensorflow SavedModel格式,Google ML-Engine上的推理时间非常慢。

  • Razer 2017:0.9s
  • Datalab n1-highmem-2:2.3秒
  • ML-Engine 10秒

0 个答案:

没有答案