tensorflow(6)利用tensorflow/serving實現模型部署及預測

2021-03-02 NLP奇幻之旅

  在文章tensorflow(5)將ckpt轉化為pb文件並利用tensorflow/serving實現模型部署及預測中,筆者以一個簡單的例子,來介紹如何在tensorflow中將ckpt轉化為pb文件,並利用tensorflow/serving來實現模型部署及預測。本文將會介紹如何使用tensorflow/serving來實現單模型部署、多模型部署、模型版本控制以及模型預測。
  我們將會以Docker形式使用tensorflow/serving,因此需要在你的環境中安裝好Docker。我們以tensorflow/serving:1.14.0為例,所以我們需要拉取這個鏡像到本地:

docker pull tensorflow/serving:1.14.0

  本文演示的項目結構如下:

項目結構單模型部署及預測 創建模型

  我們先使用Tensorflow創建模型:z=x*y+t,其中x,y等於2.0,t為變量,z為輸出結果。創建模型腳本(single_model.py)的完整代碼如下:

# -*- coding: utf-8 -*-
import tensorflow as tf

g = tf.Graph()
with g.as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.add(xy, t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 1.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/add/add.ckpt')

輸出結果為:

result:  5.0

生成pb文件

  上述模型生成pb文件的完整代碼(single_ckpt_2_pb.py)如下:

# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow.python import saved_model

export_path = "pb_models/add/1"

graph = tf.Graph()
saver = tf.train.import_meta_graph("./ckpt_models/add/add.ckpt.meta", graph=graph)
with tf.Session(graph=graph) as sess:
    saver.restore(sess, tf.train.latest_checkpoint("./ckpt_models/add"))
    saved_model.simple_save(session=sess,
                            export_dir=export_path,
                            inputs={"t": graph.get_operation_by_name('t').outputs[0]},
                            outputs={"z": graph.get_operation_by_name('z').outputs[0]})

運行上述代碼,會在pb_models文件夾下生成文件如下:

$ tree pb_models/
pb_models/
├── add
│   └── 1
│       ├── saved_model.pb
│       └── variables
│           ├── variables.data-00000-of-00001
│           └── variables.index

模型部署

  接著我們使用Docker部署該模型,命令如下:

docker run -t --rm -p 8551:8501 -v "absolute_path_to_pb_models/pb_models/add:/models/add" -e MODEL_NAME=add tensorflow/serving:1.14.0

其中absolute_path_to_pb_models為pb_models所在的完整路徑。輸出結果如下:

2021-01-06 04:14:32.790794: I tensorflow_serving/model_servers/server.cc:82] Building single TensorFlow model file config:  model_name: add model_base_path: /models/add
2021-01-06 04:14:32.810015: I tensorflow_serving/model_servers/server_core.cc:462] Adding/updating models.
2021-01-06 04:14:32.810054: I tensorflow_serving/model_servers/server_core.cc:561]  (Re-)adding model: add
2021-01-06 04:14:32.910293: I tensorflow_serving/core/basic_manager.cc:739] Successfully reserved resources to load servable {name: add version: 1}
2021-01-06 04:14:32.910317: I tensorflow_serving/core/loader_harness.cc:66] Approving load for servable version {name: add version: 1}
2021-01-06 04:14:32.910327: I tensorflow_serving/core/loader_harness.cc:74] Loading servable version {name: add version: 1}
2021-01-06 04:14:32.910373: I external/org_tensorflow/tensorflow/contrib/session_bundle/bundle_shim.cc:363] Attempting to load native SavedModelBundle in bundle-shim from: /models/add/1
2021-01-06 04:14:32.910385: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:31] Reading SavedModel from: /models/add/1
2021-01-06 04:14:32.910573: I external/org_tensorflow/tensorflow/cc/saved_model/reader.cc:54] Reading meta graph with tags { serve }
2021-01-06 04:14:32.916524: I external/org_tensorflow/tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2021-01-06 04:14:32.956639: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:202] Restoring SavedModel bundle.
2021-01-06 04:14:33.075419: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:311] SavedModel load for tags { serve }; Status: success. Took 165028 microseconds.
2021-01-06 04:14:33.075456: I tensorflow_serving/servables/tensorflow/saved_model_warmup.cc:103] No warmup data file found at /models/add/1/assets.extra/tf_serving_warmup_requests
2021-01-06 04:14:33.075528: I tensorflow_serving/core/loader_harness.cc:86] Successfully loaded servable version {name: add version: 1}
2021-01-06 04:14:33.084877: I tensorflow_serving/model_servers/server.cc:324] Running gRPC ModelServer at 0.0.0.0:8500 ...
[warn] getaddrinfo: address family for nodename not supported
2021-01-06 04:14:33.117161: I tensorflow_serving/model_servers/server.cc:344] Exporting HTTP/REST API at:localhost:8501 ...
[evhttp_server.cc : 239] RAW: Entering the event loop ...

出現上述結果即表示模型部署成功,其中8500為gRPC埠,8501為HTTP埠,這裡我們只使用了HTTP埠。

模型預測

  查看模型部署狀態的curl命令:

curl http://192.168.1.193:8551/v1/models/add

輸出結果為:

{
 "model_version_status": [
  {
   "version": "1",
   "state": "AVAILABLE",
   "status": {
    "error_code": "OK",
    "error_message": ""
   }
  }
 ]
}

  查看模型部署元數據的curl命令:

curl http://192.168.1.193:8551/v1/models/add/metadata

輸出結果為:

{
    "model_spec": {
        "name": "add",
        "signature_name": "",
        "version": "1"
    },
    "metadata": {
        "signature_def": {
            "signature_def": {
                "serving_default": {
                    "inputs": {
                        "t": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [],
                                "unknown_rank": true
                            },
                            "name": "t:0"
                        }
                    },
                    "outputs": {
                        "z": {
                            "dtype": "DT_FLOAT",
                            "tensor_shape": {
                                "dim": [],
                                "unknown_rank": true
                            },
                            "name": "z:0"
                        }
                    },
                    "method_name": "tensorflow/serving/predict"
                }
            }
        }
    }
}

從中我們可以看到模型的輸入與輸出。
  使用curl命令進行模型預測:

curl --location --request POST 'http://192.168.1.193:8551/v1/models/add:predict' \
--header 'Content-Type: application/json' \
--data-raw '{
    "instances": [{"t": 2.0}]
}'

輸出結果為:

{
    "predictions": [
        6.0
    ]
}

  如果使用Python進行模型預測,其代碼(single_tf_serving.py)如下:

# -*- coding: utf-8 -*-
import requests

# 利用tensorflow/serving的HTTP接口請求進行預測
t = 2.0
tensor = {"instances": [{"t": t}]}

url = "http://192.168.1.193:8551/v1/models/add:predict"
req = requests.post(url, json=tensor)
if req.status_code == 200:
    z = req.json()['predictions'][0]
    print("model_add:", z)

多模型部署及預測 創建模型

  我們先使用Tensorflow創建多個模型:z=x*y+t,z=x*y-t,z=x*y*t,z=x*y/t,,其中x,y等於2.0,t為變量,z為輸出結果。創建模型腳本(multi_model.py)的完整代碼如下:

# -*- coding: utf-8 -*-
import tensorflow as tf

# add model
with tf.Graph().as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.add(xy, t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 3.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/add/add.ckpt')

# substract model
with tf.Graph().as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.subtract(xy, t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 3.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/subtract/subtract.ckpt')

# multipy
with tf.Graph().as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.multiply(xy, t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 3.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/multiply/multiply.ckpt')

# divide model
with tf.Graph().as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.divide(xy, t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 3.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/divide/divide.ckpt')

輸出結果如下:

result:  7.0
result:  1.0
result:  12.0
result:  1.3333334

生成pb文件

  上述模型生成pb文件的完整代碼(multi_ckpt_2_pb.py)如下:(注意,運行代碼前需刪除pb_models下的add目錄,不然會報錯。)

# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow.python import saved_model


# change ckpt file to pb file
def model_export(model_name):
    export_path = "pb_models/{}/1".format(model_name)
    graph = tf.Graph()
    saver = tf.train.import_meta_graph("./ckpt_models/{}/{}.ckpt.meta".format(model_name, model_name),
                                       graph=graph)
    with tf.Session(graph=graph) as sess:
        saver.restore(sess, tf.train.latest_checkpoint("./ckpt_models/{}".format(model_name)))
        saved_model.simple_save(session=sess,
                                export_dir=export_path,
                                inputs={"t": graph.get_operation_by_name('t').outputs[0]},
                                outputs={"z": graph.get_operation_by_name('z').outputs[0]})


model_export("add")
model_export("subtract")
model_export("multiply")
model_export("divide")

運行上述代碼,會在pb_models文件夾下生成文件如下:

$ tree pb_models/
pb_models/
├── add
│   └── 1
│       ├── saved_model.pb
│       └── variables
│           ├── variables.data-00000-of-00001
│           └── variables.index
├── divide
│   └── 1
│       ├── saved_model.pb
│       └── variables
│           ├── variables.data-00000-of-00001
│           └── variables.index
├── models.config
├── multiply
│   └── 1
│       ├── saved_model.pb
│       └── variables
│           ├── variables.data-00000-of-00001
│           └── variables.index
└── subtract
    └── 1
        ├── saved_model.pb
        └── variables
            ├── variables.data-00000-of-00001
            └── variables.index

12 directories, 13 files

模型部署

  tensorflow/serving支持多個模型同時部署,其部署命令如下:

docker run -t -d --rm -p 8551:8501 -v "absolute_path_to_pb_models/pb_models:/models" tensorflow/serving:1.14.0 --model_config_file=/models/models.config

其中absolute_path_to_pb_models為pb_models所在的完整路徑。需要註明models.config文件,正是在這個文件中,我們配置了多個模型的部署信息,文件內容如下:

model_config_list {
  config {
    name: "add"
    base_path: "/models/add"
    model_platform: "tensorflow"
  },
  config {
    name: "subtract"
    base_path: "/models/subtract"
    model_platform: "tensorflow"
  },
  config {
    name: "multiply"
    base_path: "/models/multiply"
    model_platform: "tensorflow"
  },
  config {
    name: "divide"
    base_path: "/models/divide"
    model_platform: "tensorflow"
  }
}

模型預測

  使用Python腳本進行模型預測的代碼(multi_tf_serving.py)如下:

# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow.python import saved_model


# change ckpt file to pb file
def model_export(model_name):
    export_path = "pb_models/{}/1".format(model_name)
    graph = tf.Graph()
    saver = tf.train.import_meta_graph("./ckpt_models/{}/{}.ckpt.meta".format(model_name, model_name),
                                       graph=graph)
    with tf.Session(graph=graph) as sess:
        saver.restore(sess, tf.train.latest_checkpoint("./ckpt_models/{}".format(model_name)))
        saved_model.simple_save(session=sess,
                                export_dir=export_path,
                                inputs={"t": graph.get_operation_by_name('t').outputs[0]},
                                outputs={"z": graph.get_operation_by_name('z').outputs[0]})


model_export("add")
model_export("subtract")
model_export("multiply")
model_export("divide")

輸出結果如下:

model_add:  8.0
model_subtract:  0.0
model_multiply:  16.0
model_divide:  1.0

模型版本控制及預測 創建模型

  tensorflow/serving還支持同一個模型的不同版本的部署。我們在這裡創建一個add模型,其有三個版本,分別為:z=x*y+t,z=x*y+2t,z=x*y+3t,,其中x,y等於2.0,t為變量,z為輸出結果。創建模型腳本(version_control_model.py)的完整代碼如下:

# -*- coding: utf-8 -*-
import tensorflow as tf

# 第一個模型
g = tf.Graph()
with g.as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.add(xy, t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 1.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/add/add.ckpt')


# 第二個模型
g = tf.Graph()
with g.as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.add(xy, 2*t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 1.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/add/add2.ckpt')


# 第三個模型
g = tf.Graph()
with g.as_default() as g:
    x = tf.Variable(2.0, dtype=tf.float32, name="x")
    y = tf.Variable(2.0, dtype=tf.float32, name="y")
    xy = x * y
    t = tf.placeholder(shape=None, dtype=tf.float32, name="t")
    z = tf.add(xy, 3*t, name="z")


with tf.Session(graph=g) as sess:
    sess.run(tf.global_variables_initializer())
    result = sess.run(z, feed_dict={t: 1.0})
    print("result: ", result)

    # save the model
    saver = tf.train.Saver()
    saver.save(sess, save_path='./ckpt_models/add/add3.ckpt')

輸出結果如下:

result:  5.0
result:  6.0
result:  7.0

生成pb文件

  上述模型生成pb文件的完整代碼(version_control_ckpt_2_pb.py)如下:(注意,運行代碼前需刪除pb_models下的add目錄,不然會報錯。)

# -*- coding: utf-8 -*-
import tensorflow as tf
from tensorflow.python import saved_model


# change ckpt file to pb file
def model_export(model_version, tf_version):
    export_path = "pb_models/add/{}".format(tf_version)
    graph = tf.Graph()
    saver = tf.train.import_meta_graph("./ckpt_models/add/{}.ckpt.meta".format(model_version),
                                       graph=graph)
    with tf.Session(graph=graph) as sess:
        saver.restore(sess, tf.train.latest_checkpoint("./ckpt_models/add"))
        saved_model.simple_save(session=sess,
                                export_dir=export_path,
                                inputs={"t": graph.get_operation_by_name('t').outputs[0]},
                                outputs={"z": graph.get_operation_by_name('z').outputs[0]})


model_export("add", 1)
model_export("add2", 2)
model_export("add3", 3)

運行上述代碼,會在pb_models文件夾下生成文件如下:

pb_models/
├── add
│   ├── 1
│   │   ├── saved_model.pb
│   │   └── variables
│   │       ├── variables.data-00000-of-00001
│   │       └── variables.index
│   ├── 2
│   │   ├── saved_model.pb
│   │   └── variables
│   │       ├── variables.data-00000-of-00001
│   │       └── variables.index
│   └── 3
│       ├── saved_model.pb
│       └── variables
│           ├── variables.data-00000-of-00001
│           └── variables.index
└── models.config

7 directories, 10 files

模型部署

  tensorflow/serving支持模型的多個版本同時部署,其部署命令如下:

docker run -t -d --rm -p 8551:8501 -v "absolute_path_to_pb_models/pb_models:/models" tensorflow/serving:1.14.0 --model_config_file=/models/models.config

其中absolute_path_to_pb_models為pb_models所在的完整路徑。需要註明models.config文件,正是在這個文件中,我們配置了add模型的版本部署信息,文件內容如下:

model_config_list {
  config {
    name: "add"
    base_path: "/models/add"
    model_platform: "tensorflow"
    model_version_policy{
        all{
        }
    }
  }
}

注意model_version_policy欄位,這裡選擇all,表示部署所有版本的模型。model_version_policy:模型版本策略,支持如下三種:

all:同時服務所有版本

latest:默認,默認值:1

specific:服務指定版本,可同時配置多個

模型預測

  使用Python腳本進行模型預測的代碼(version_control_tf_serving.py)如下:

# -*- coding: utf-8 -*-
import requests

# 利用tensorflow/serving的HTTP接口請求進行預測
def model_predict(model_version):
    t = 4.0
    tensor = {"instances": [{"t": t}]}

    url = "http://192.168.1.193:8551/v1/models/add/versions/{}:predict".format(model_version)
    req = requests.post(url, json=tensor)
    if req.status_code == 200:
        z = req.json()['predictions'][0]
        print("model_version{}: ".format(model_version), z)


model_predict("1")
model_predict("2")
model_predict("3")

輸出結果如下:

model_version1:  8.0
model_version2:  12.0
model_version3:  16.0

注意不同版本的模型請求url是不同的,規則如下:

/v1/models/<model name>/versions/<version number>

總結

  本項目已經上傳至Github,網址為:https://github.com/percent4/tensorflow_serving_examples 。
  感謝大家的閱讀,後續將介紹如何使用tensorflow/serving來部署BERT模型。

相關焦點

  • tensorflow(7)利用tensorflow/serving實現BERT模型部署
    本文將會詳細介紹如何使用tensorflow/serving來實現BERT模型的部署及預測。  我們以Github上的bertNER為例,該項目使用BERT+Bi-LSTM+CRF結構實現中文序列標註,對BERT進行微調,並且提供了模型訓練、模型預測的辦法。
  • tensorflow(8)將h5文件轉化為pb文件並利用tensorflow/serving實現模型部署
    在文章NLP(三十四)使用keras-bert實現序列標註任務中,我們使用Keras和Keras-bert進行模型訓練、模型評估和模型預測。我們對人民日報實體數據集進行模型訓練,保存後的模型文件為example.h5,h5是Keras保存模型的一種文件格式。
  • TensorFlow Serving入門
    、驗證和預測,但模型完善之後的生產上線流程,就變得五花八門了。準備TF Serving的Docker環境目前TF Serving有Docker、APT(二級制安裝)和源碼編譯三種方式,但考慮實際的生產環境項目部署和簡單性,推薦使用Docker方式。docker pull tensorflow/serving2.
  • TensorFlow 2.0 部署:TensorFlow Serving
    TensorFlow Serving 可以直接讀取 SavedModel 格式的模型進行部署(導出模型到 SavedModel 文件的方法見 @前文 )。使用以下命令即可:tensorflow_model_server \ --rest_api_port=埠號(如8501) \ --model_name=模型名 \ --model_base_path="SavedModel格式模型的文件夾絕對地址(不含版本號)"註解TensorFlow
  • 國外大神在Kubernetes上使用Istio部署TensorFlow模型
    在本文中,我們將使用經過預先訓練的導出的ResNet模型作為示例,以在服務基礎結構上進行部署。S3模型資料庫訪問ML模型,Tensorflow服務摘要裝載機任意文件系統路徑作為接口,與GCS和S3雲存儲文件系統外的所述盒實現。
  • 教程 | 從零開始:TensorFlow機器學習模型快速部署指南
    GitHub 地址:https://github.com/hiveml/simple-ml-serving其中包含的條目有:檢查 TensorFlow 安裝:https://github.com/hiveml/simple-ml-serving/blob/master/test/test_tensorflow.sh利用 stdin 運行在線分類
  • 社區分享 | Spark 玩轉 TensorFlow 2.0
    本文來自社區投稿與徵集,作者梁雲,轉自:https://github.com/lyhue1991/eat_tensorflow2_in_30_days本篇文章介紹在 Spark 中調用訓練好的 TensorFlow 模型進行預測的方法。本文內容的學習需要一定的 Spark 和 Scala 基礎。
  • TensorFlow筆記:模型保存、加載和Fine-tune
    1.4 saved_model模式雖然saved_model也支持模型加載,並進行遷移學習。可是不得不說saved_model幾乎就是為了部署而生的,因為依靠tf.Serving部署模型時要求模型格式必須是saved_model格式。
  • Tensorflow的C語言接口部署DeeplabV3+語義分割模型
    tensorflow框架一般都是基於Python調用,但是有些時候跟應用場景,我們希望調用tensorflow C語言的接口,在C++的應用開發中使用它。要這麼幹,首先需要下載tensorflow源碼,完成編譯,然後調用相關的API函數實現C語言版本的調用,完成模型的加載、前向推理預測與解析。
  • Tensorflow Object Detection API 終於支持tensorflow1.x與tensorflow2.x了
    基於tensorflow框架構建的快速對象檢測模型構建、訓練、部署框架,是針對計算機視覺領域對象檢測任務的深度學習框架。之前tensorflow2.x一直不支持該框架,最近Tensorflow Object Detection API框架最近更新了,同時支持tensorflow1.x與tensorflow2.x。
  • Tensorflow如何導出與使用預測圖
    一個例子首先定義個網絡模型,對於輸入與預測部分tensor的name屬性我們都給予賦值。/my_cnn_mnist.model", global_step=10000)導出預測圖之後使用預測實現手寫數字預測的代碼如下import argparseimport tensorflow as tfimport numpy as np
  • TensorFlow框架裡的各種模型們
    SavedModel在訓練模型和部署模型中起到的重要作用然而,有的時候我們對部署好的模型推理速度也有很高的要求,比如無人車駕駛場景中,如果使用一個經典的深度學習模型,很容易就跑到200毫秒的延時,那麼這意味著,在實際駕駛過程中,你的車一秒鐘只能看到5張圖像,這當然是很危險的一件事。
  • 詳解Tensorflow模型量化(Quantization)原理及其實現方法
    一、模型量化的背景需求Resnet-152神經網絡的提出證明了越寬越深越大的模型往往比越窄越淺越小的模型精度要高,但是越寬越深越大的模型對計算資源要求更高,而現在模型應用越來越傾向於從雲端部署到邊緣側,受限於邊緣側設備的計算資源,我們不得不考慮設備存儲空間(storage)、設備內存大小(memory)、設備運行功耗(power)及時延性(
  • 模型秒變API只需一行代碼,支持TensorFlow等框架
    專注於機器學習應用的人們知道,從訓練好的模型到實際的工業生產工具還有一定的距離。其中工作量很大的地方在於將模型打包,預留 API 接口,並和現有的生產系統相結合。近日,GitHub 上有了這樣一個項目,能夠讓用戶一行代碼將任意模型打包為 API。這一工具無疑能夠幫助開發者在實際的生產應用中快速部署模型。
  • 利用 TensorRT 實現 TensorFlow 低延遲推理
    SavedModel 格式包含共享或部署經過訓練的模型所需的所有信息。在原生 TensorFlow 中,工作流通常涉及加載保存的模型並使用 TensorFlow 運行時運行推理。在 TF-TRT 中還涉及一些額外步驟,包括將 TensorRT 優化應用到 TensorRT 支持的模型子計算圖,以及可選地預先構建 TensorRT 引擎。
  • Tensorflow 入門:Tensor
    通過最後一句代碼可以看到:tensorflow 2.0 中的計算圖默認是立即執行的(Eagerly Execution)。 Tensor 持有標量值Tensor 可以持有標量:tensor 的 dtype 屬性給出了這個 tensor 的數據類型。這裡 tensorflow 推斷出該 tensor 的數據類型是 int32。
  • TensorFlow 2.0 部署:模型導出
    在部署模型時,我們的第一步往往是將訓練好的整個模型完整導出為一系列標準格式的文件,然後即可在不同的平臺上部署模型文件。這時,TensorFlow 為我們提供了 SavedModel 這一格式。當模型導出為 SavedModel 文件時,無需建立模型的原始碼即可再次運行模型,這使得 SavedModel 尤其適用於模型的分享和部署。後文的 TensorFlow Serving(伺服器端部署模型)、TensorFlow Lite(移動端部署模型)以及 TensorFlow.js 都會用到這一格式。Keras 模型均可方便地導出為 SavedModel 格式。
  • TensorFlow 安裝手冊 — 使用 pip 安裝 TensorFlow
    本文將為大家詳細介紹如何利用 pip 安裝 TensorFlow 。gpu/tensorflow_gpu-1.11.0-cp35-cp35m-linux_x86_64.whlPython 3.6 CPU-onlyhttps://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.11.0-cp36-cp36m-linux_x86_64.whlPython 3.6
  • TensorFlow Wide And Deep 模型詳解與應用
    年 6 月左右發布的一類用於分類和回歸的模型,並應用到了 Google Play 的應用推薦中 [1]。wide and deep 模型的核心思想是結合線性模型的記憶能力(memorization)和 DNN 模型的泛化能力(generalization),在訓練過程中同時優化 2 個模型的參數,從而達到整體模型的預測能力最優。
  • 將您的代碼從 TensorFlow 1 遷移到 TensorFlow 2(二)
    我們建議您使用 Keras 定義自己的模型,然後使用 tf.keras.estimator.model_to_estimator 實用程序將模型變為 Estimator。下面的代碼展示創建和訓練 Estimator 時如何使用這個實用工具。