【问题标题】:Convert a TensorFlow model in a format that can be served将 TensorFlow 模型转换为可以提供的格式
【发布时间】:2019-10-31 16:07:27
【问题描述】:

我正在关注 Tensorflow 服务文档,将我训练的模型转换为可以在 Docker 容器中提供的格式。由于我是 Tensorflow 的新手,我正在努力将这个经过训练的模型转换为适合服务的形式。

模型已经过训练,我有检查点文件和 .meta 文件。所以,我需要从上述两个文件中获取 .pb 文件和 variables 文件夹。谁能给我建议一种方法来为模型提供服务?

.
|-- tensorflow model
|       -- 1
|       |-- saved_model.pb
|       -- variables
|           |-- variables.data-00000-of-00001
|           -- variables.index

【问题讨论】:

    标签: tensorflow deployment deep-learning tensorflow-serving


    【解决方案1】:

    有多种方法可以做到这一点,更复杂的模型可能需要其他方法。 我目前正在使用here 描述的方法,该方法适用于 tf.keras.models.Model 和 tf.keras.Sequential 模型(不确定 tensorflow 子类化?)。

    下面是一个最小的工作示例,包括使用 python 创建一个模型(看起来你已经通过你的文件夹结构完成了这个,可以忽略第一步)

    import tensorflow as tf
    from tensorflow.keras.layers import Input, Dense
    from tensorflow.keras.models import Model
    import tensorflow.keras.backend as K
    
    inputs = Input(shape=(2,))
    x = Dense(128, activation='relu')(inputs)
    x = Dense(32, activation='relu')(x)
    outputs = Dense(1)(x)
    
    model = Model(inputs=inputs, outputs=outputs)
    model.compile(optimizer='adam', loss='mse')
    
    # loading existing weights, model architectural must be the same as the existing model
    #model.load_weights(".//MODEL_WEIGHT_PATH//WEIGHT.h5") 
    
    export_path = 'SAVE_PATH//tensorflow_model//1'
    
    with K.get_session() as sess:
        tf.saved_model.simple_save(
                sess,
                export_path,
                inputs={'inputs': model.input}, # for single input
                #inputs={t.name[:-5]: t for t in model.input}, # for multiple inputs
                outputs={'outputs': model.output})
    

    我建议您使用文件夹名称“tensorflow_model”而不是“tensorflow model”,以避免可能出现的空格问题。

    然后我们可以在终端中构建docker镜像(对于windows,使用^代替\作为线刹车,并在路径中使用//C/代替C:\):

    docker run -p 8501:8501 --name tfserving_test \
      --mount type=bind,source="SAVE_PATH/tensorflow_model",target=/models/tensorflow_model \
      -e MODEL_NAME=tensorflow_model -t tensorflow/serving
    

    现在容器应该已经启动并运行了,我们可以用 python 测试服务

    import requests
    import json
    #import numpy as np
    
    payload = {
      "instances": [{'inputs': [1.,1.]}]
    }
    
    r = requests.post('http://localhost:8501/v1/models/tensorflow_model:predict', json=payload)
    print(json.loads(r.content))
    # {'predictions': [[0.121025]]}
    

    容器正在使用我们的模型,对输入 [1., 1.] 给出预测 0.121025

    【讨论】:

    • 我已将其更改为 Tensorflow_model,但我仍在努力从使用 Tensorflow 训练的 VGG-16 模型中恢复变量。如果没有变量,我如何使用 Docker 服务它? .@KrisR89
    • 我不确定我是否完全理解您的问题@Ashish,但是“tf.saved_model.simple_save()”使用与您在问题中给出的相同文件夹结构保存模型。然后你只需要指向你的父文件夹“tensorflow_model”,tensorflow-servings应该会自动使用正确的模型(.pb)、变量和variable.index
    • 话虽如此,我正在努力恢复训练好的模型,所以我没有上述结构中的任何文件。您的示例描述了 Keras 的服务方法,而我对 Tensorflow 的看法相同。
    • 非常抱歉!没看你的问题够好!我不是 tensorflow 低级 api 的专家,因为 tf2.0 似乎会将焦点从图形转移到 tf.keras 和子类化(如果你是 tensorflow 的新手,我建议你也这样做)。话虽如此,我认为您仍然应该能够使用模型会话以及输入和输出张量来使用“tf.saved_model.simple_save()”。
    【解决方案2】:

    从您的问题来看,您的意思是您不再可以访问 Model 并且您只有 Check Point files.meta files

    如果是这种情况,您可以参考以下链接,其中包含将这些文件转换为 '.pb' file 的代码。

    Tensorflow: How to convert .meta, .data and .index model files into one graph.pb file

    https://github.com/petewarden/tensorflow_makefile/blob/master/tensorflow/python/tools/freeze_graph.py

    如果您可以访问经过训练的模型,那么我猜您当前正在使用 tf.train.Saver 保存它。取而代之的是,您可以使用下面提到的三个(常用)函数中的任何一个来保存模型并导出它:

    1. tf.saved_model.simple_save => 在这种情况下,服务期间仅支持 Predict API。 KrisR89 在他的回答中提到了这个例子。

    2. tf.saved_model.builder.SavedModelBuilder => 在这种情况下,您可以定义 SignatureDefs,即您要在 Serving 期间访问的 API。 您可以在以下链接中找到有关如何使用它的示例, https://github.com/tensorflow/serving/blob/master/tensorflow_serving/example/mnist_saved_model.py

    3. 第三种方式如下图:

      分类器 = tf.estimator.DNNClassifier(config=training_config, feature_columns=feature_columns,hidden_​​units=[256, 32], optimizer=tf.train.AdamOptimizer(1e-4),n_classes=NUM_CLASSES,dropout=0.1, model_dir= FLAGS.model_dir)

      classifier.export_savedmodel(FLAGS.saved_dir,

      serving_input_receiver_fn=serving_input_receiver_fn)

    可以在以下链接中找到有关如何使用 Estimator 保存模型的示例。这支持预测和分类 API。

    https://github.com/yu-iskw/tensorflow-serving-example/blob/master/python/train/mnist_premodeled_estimator.py

    如果这些信息有帮助,或者您需要任何进一步的帮助,请告诉我。

    【讨论】:

      【解决方案3】:

      我希望这会有所帮助:

      import tensorflow as tf
      from tensorflow.contrib.keras import backend as K
      from tensorflow.python.client import device_lib
      
      K.set_learning_phase(0)
      model = tf.keras.models.load_model('my_model.h5')
      
      
      export_path = './'
      with K.get_session() as sess:
          tf.saved_model.simple_save(
              sess,
              export_path,
              inputs={'input_image': model.input},
              outputs={t.name: t for t in model.outputs}
          )
          print('Converted to SavedModel!!!')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多