具有推理功能的 TensorFlow + Keras 多 GPU 模型

Posted

技术标签:

【中文标题】具有推理功能的 TensorFlow + Keras 多 GPU 模型【英文标题】:TensorFlow + Keras multi gpu model with inference 【发布时间】:2019-10-12 01:16:46 【问题描述】:

我正在尝试使用以code 为模型的 Keras 的 Xception 模型进行图像分类。但是我想使用多个 GPU 来使用这个function 进行批量并行图像分类。我相信这是可能的,并且我的原始代码在没有多 GPU 支持的情况下工作,但是我无法让 multi_gpu_model 函数像我期望的那样工作。对于多 GPU 示例,我正在关注此 example。这是我的代码(它是 Flask 应用程序的后端),它实例化模型,在创建类时对示例 ndarray 进行预测,然后在分类函数中期望 base 64 编码图像:

import os
from keras.preprocessing import image as preprocess_image
from keras.applications import Xception
from keras.applications.inception_v3 import preprocess_input, decode_predictions
from keras.utils import multi_gpu_model
import numpy as np
import tensorflow as tf
import PIL.Image
from numpy import array


class ModelManager:

    def __init__(self, model_path):
        self.model_name = 'ImageNet'
        self.model_version = '1.0'
        self.batch_size = 32
        height = 224
        width = 224
        num_classes = 1000
        # self.model = tf.keras.models.load_model(os.path.join(model_path, 'ImageNetXception.h5'))
        with tf.device('/cpu:0'):
            model = Xception(weights=None,
                             input_shape=(height, width, 3),
                             classes=num_classes, include_top=True)
            # Replicates the model on 8 GPUs.
        # This assumes that your machine has 8 available GPUs.
        self.parallel_model = multi_gpu_model(model, gpus=8)
        self.parallel_model.compile(loss='categorical_crossentropy',
                                    optimizer='rmsprop')

        print("Loaded Xception model.")
        x = np.empty((1, 224, 224, 3))
        self.parallel_model.predict(x, batch_size=self.batch_size)
        self.graph = tf.get_default_graph()
        self.graph.finalize()

    def classify(self, ids, images):
        results = []
        all_images = np.empty((0, 224, 224, 3))
        # all_images = []
        for image_id, image in zip(ids, images):
            # This does the same as keras.preprocessing.image.load_img
            image = image.convert('RGB')
            image = image.resize((224, 224), PIL.Image.NEAREST)

            x = preprocess_image.img_to_array(image)
            x = np.expand_dims(x, axis=0)
            x = preprocess_input(x)
            all_images = np.append(all_images, x, axis=0)
        # all_images.append(x)
        # a = array(all_images)
        # print(type(a))
        # print(a[0])

        with self.graph.as_default():
            preds = self.parallel_model.predict(all_images, batch_size=288)
        #print(type(preds))

        top3 = decode_predictions(preds, top=3)[0]
        print(top3)
        output = [((t[1],) + t[2:]) for t in top3]

        predictions = [
            'label': label, 'probability': probability * 100.0
            for label, probability in output
        ]

        results.append(
            'id': 1,
            'predictions': predictions
        )
        print(len(results))
        return results

我不确定的部分是传递预测函数的内容。目前,我正在创建一个我想要在预处理后分类的图像的 ndarray,然后将其传递给 predict 函数。该函数返回,但 preds 变量不符合我的预期。我试图遍历 preds 对象,但是当我传递单个项目时 decode_predictions 错误,但是当我传递整个 preds ndarray 时以一个预测响应。在示例代码中,他们不使用 decode_predictions 函数,所以我不确定如何将它与来自 parallel_model.predict 的响应一起使用。感谢您提供任何帮助或资源。

【问题讨论】:

您能弄清楚如何使用多 GPU 进行预测/推理吗?任何帮助表示赞赏。 @PushpenduGhosh 不,我不是。现在可能/更容易使用 TensorFlow 2.0,但我还没有尝试过。 【参考方案1】:

以下网站说明了如何正确地做到这一点link

【讨论】:

该链接是我在问题中的第二个链接。该页面上没有使用 decode_predictions 函数的地方,这是我卡住的地方。

以上是关于具有推理功能的 TensorFlow + Keras 多 GPU 模型的主要内容,如果未能解决你的问题,请参考以下文章

TensorFlow 推理

使用 NVIDIA TensorRT 推理引擎运行 TensorFlow

修改 tensorflow savedmodel pb 文件以使用自定义操作进行推理

TensorFlow slim inception resnet v2 推理

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?

tensorflow C++ 批量推理