0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

機(jī)器學(xué)習(xí)模型的最簡(jiǎn)單方法之一將TensorFlow Serving與Docker結(jié)合起來

Tensorflowers ? 來源:未知 ? 作者:李倩 ? 2018-11-06 11:12 ? 次閱讀

能夠簡(jiǎn)單快捷地提供機(jī)器學(xué)習(xí)模型是從試驗(yàn)轉(zhuǎn)向生產(chǎn)的關(guān)鍵挑戰(zhàn)之一。服務(wù)機(jī)器學(xué)習(xí)模型就是采用經(jīng)訓(xùn)練的模型并使其能夠應(yīng)對(duì)預(yù)測(cè)請(qǐng)求的過程。在生產(chǎn)中服務(wù)時(shí),您需要確保您的環(huán)境可重現(xiàn),強(qiáng)制隔離并且是安全的。為此,提供機(jī)器學(xué)習(xí)模型的最簡(jiǎn)單方法之一是就是將 TensorFlow Serving 與 Docker 結(jié)合起來。 Docker 是一種將軟件打包成單元(我們稱之為容器)的工具,其中包含運(yùn)行軟件所需的一切。

TensorFlowServing 在 Docker 容器中運(yùn)行

自 TensorFlowServing 1.8 發(fā)布以來,我們一直在改進(jìn)對(duì) Docker 的支持。 我們現(xiàn)在提供 Docker images 用于 CPUGPU 模型的服務(wù)和開發(fā)。為了解使用 TensorFlowServing 部署模型究竟有多么容易,讓我們嘗試將 ResNet 模型投入生產(chǎn)。 此模型在 ImageNet 數(shù)據(jù)集上進(jìn)行訓(xùn)練,并將 JPEG 鏡像作為輸入并返回鏡像的分類類別。

我們的示例將假設(shè)您正在運(yùn)行 Linux,不過它在 macOS 或 Windows 應(yīng)該也可以運(yùn)行,僅需少量修改,甚至不需要修改。

使用 TensorFlowServing 和 Docker 服務(wù) ResNet

第一步安裝 Docker CE。 這將為您提供運(yùn)行和管理 Docker 容器所需的所有工具。

TensorFlow Serving 為其 ML 模型使用 SavedModel 格式。SavedModel 是一種語言中立的,可恢復(fù)的,密集的序列化格式,使更高級(jí)別的系統(tǒng)和工具能夠生成,使用和轉(zhuǎn)換 TensorFlow 模型。 有幾種方法可以導(dǎo)出 SavedModel(包括來自 Keras)。 在本練習(xí)中,我們只需下載預(yù)先訓(xùn)練的 pre-trained ResNetSavedModel:

$ mkdir / tmp / resnet $ curl -s https://storage.googleapis.com/download.tensorflow.org/models/official/20181001_resnet/savedmodels/resnet_v2_fp32_savedmodel_NHWC_jpg.tar.gz | tar --strip-components = 2 -C / tmp / resnet -xvz

我們現(xiàn)在應(yīng)該在 / tmp / resnet 中有一個(gè)包含我們模型的文件夾。可以通過運(yùn)行來驗(yàn)證這一點(diǎn):

$ ls / tmp / resnet 1538687457

現(xiàn)在我們有了模型,使用 Docker 服務(wù)就像拉來最新發(fā)布的 TensorFlowServing 來服務(wù)環(huán)境鏡像一樣簡(jiǎn)單,并將其指向模型:

$ docker pull tensorflow / serving $ docker run -p 8501:8501 - name tfserving_resnet --mount type = bind,source = / tmp / resnet,target = / models / resnet -e MODEL_NAME = resnet -t tensorflow / serving &... ... main.cc:327]在0.0.0.0:8500運(yùn)行ModelServer ...... ... main.cc:337]導(dǎo)出HTTP / REST API:localhost:8501 ...

分解命令行參數(shù),我們:

-p 8501:8501 : 將容器的端口 8501(TensorFlow 服務(wù)響應(yīng) REST API 請(qǐng)求)發(fā)布到主機(jī)的端口 8501

--name tfserving_resnet : 我們?yōu)槿萜鲃?chuàng)建名稱為 “tfserving_resnet”,這樣稍后我們可以作參考

--mount type=bind,source=/tmp/resnet,target=/models/resnet : 在容器(/ models / resnet)上安裝主機(jī)的本地目錄(/ tmp / resnet),以便 TensorFlow 服務(wù)可以從容器內(nèi)部讀取模型。

-e MODEL_NAME=resnet : 告訴 TensorFlow Serving 下載名為 “resnet” 的模型

-t tensorflow/serving : 基于服務(wù)鏡像 “tensorflow / serving” 運(yùn)行 Docker 容器

接下來,讓我們下載 python 客戶端腳本,它將發(fā)送服務(wù)的模型鏡像并獲取預(yù)測(cè)。 我們還將測(cè)量服務(wù)器響應(yīng)時(shí)間。

$ curl -o /tmp/resnet/resnet_client.py https://raw.githubusercontent.com/tensorflow/serving/master/tensorflow_serving/example/resnet_client.py

此腳本將下載貓的鏡像并在測(cè)量響應(yīng)時(shí)間時(shí)將其重復(fù)發(fā)送到服務(wù)器,如腳本的主循環(huán)中所示:

1# The server URL specifies the endpoint of your server running the ResNet

2# model with the name "resnet" and using the predict interface.

3SERVER_URL = 'http://localhost:8501/v1/models/resnet:predict'

4

5...

6

7# Send few actual requests and time average latency.

8total_time = 0

9num_requests = 10

10for _ in xrange(num_requests):

11response = requests.post(SERVER_URL, data=predict_request)

12response.raise_for_status()

13total_time += response.elapsed.total_seconds()

14prediction = response.json()['predictions'][0]

15

16print('Prediction class: {}, avg latency: {} ms'.format(

17prediction['classes'], (total_time*1000)/num_requests))

此腳本使用請(qǐng)求模塊,因此如果您尚未安裝,則需要安裝它。通過運(yùn)行此腳本,您應(yīng)該看到如下所示的輸出:

$ python /tmp/resnet/resnet_client.py

Prediction class: 282, avg latency: 185.644 ms

如您所見,使用 TensorFlow Serving 和 Docker 創(chuàng)建模型非常簡(jiǎn)單直白。您甚至可以創(chuàng)建自己的嵌入式模型的自定義 Docker 鏡像,以便更輕松地進(jìn)行部署。

通過構(gòu)建優(yōu)化的 TensorFlow Serving 二進(jìn)制文件來提高性能

既然我們?cè)?Docker 中提供了一個(gè)模型,您可能已經(jīng)注意到來自 TensorFlowServing 的日志消息如下所示:

Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

TensorFlowServing 已發(fā)布的 Docker 鏡像旨在竭盡所能來使用 CPU 架構(gòu),因此省略了一些優(yōu)化以最大限度地提高兼容性。如果您沒有看到此消息,則您的二進(jìn)制文件可能已針對(duì)您的 CPU 進(jìn)行了優(yōu)化。

根據(jù)您的模型執(zhí)行的操作,這些優(yōu)化可能會(huì)對(duì)您的服務(wù)性能產(chǎn)生重大影響。值得慶幸的是,將您自己的優(yōu)化服務(wù)鏡像組合在一起非常簡(jiǎn)單。

首先,我們要構(gòu)建 TensorFlowServing 的優(yōu)化版本。最簡(jiǎn)單的方法是構(gòu)建官方的 TensorFlowServing 開發(fā)環(huán)境 Docker 鏡像。這具有為鏡像構(gòu)建的系統(tǒng)自動(dòng)生成優(yōu)化的 TensorFlow 服務(wù)二進(jìn)制文件的良好特性。為了區(qū)分我們創(chuàng)建的鏡像和官方鏡像,我們將 $USER/ 添加到鏡像名稱之前。讓我們稱這個(gè)開發(fā)鏡像為 $USER/ tensorflow-serving-devel:

$ docker build -t $USER/tensorflow-serving-devel -f Dockerfile.devel https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker

構(gòu)建 TensorFlow 服務(wù)開發(fā)鏡像可能需要一段時(shí)間,具體取決于計(jì)算機(jī)的速度。 完成之后,讓我們使用優(yōu)化的二進(jìn)制文件構(gòu)建一個(gè)新的服務(wù)鏡像,并將其命名為 $USER/tensorflow-serving:

$ docker build -t $USER/tensorflow-serving --build-arg TF_SERVING_BUILD_IMAGE=$USER/tensorflow-serving-devel https://github.com/tensorflow/serving.git#:tensorflow_serving/tools/docker

現(xiàn)在我們有了新的服務(wù)鏡像,讓我們?cè)俅螁?dòng)服務(wù)器:

$ docker kill tfserving_resnet$ docker run -p 8501:8501 --name tfserving_resnet --mount type=bind,source=/tmp/resnet,target=/models/resnet -e MODEL_NAME=resnet -t $USER/tensorflow-serving &

最后運(yùn)行我們的客戶端:

$ python /tmp/resnet/resnet_client.pyPrediction class: 282, avg latency: 84.8849 ms

在我們的機(jī)器上,我們看到使用原生優(yōu)化二進(jìn)制文件,每次預(yù)測(cè)平均加速超過 100 毫秒(119%)。在不同的機(jī)器(和型號(hào))上您可能會(huì)看到不同的結(jié)果。

最后,隨意銷毀 TensorFlow Serving 容器:

$ docker kill tfserving_resnet

現(xiàn)在您已經(jīng)使用 Docker 運(yùn)行 TensorFlowServing,您可以輕松地在容器中部署機(jī)器學(xué)習(xí)模型,同時(shí)最大限度地提高部署和性能。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8330

    瀏覽量

    132223
  • tensorflow
    +關(guān)注

    關(guān)注

    13

    文章

    328

    瀏覽量

    60454

原文標(biāo)題:使用 TensorFlow Serving 和 Docker 快速服務(wù)于機(jī)器學(xué)習(xí)

文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問STM32 Nucleo系列與Arduino具體怎么結(jié)合起來用?

    STM32 Nucleo系列與Arduino具體怎么結(jié)合起來用?
    發(fā)表于 05-14 07:00

    設(shè)計(jì)個(gè)信號(hào)發(fā)生器的電路,而且具有數(shù)字時(shí)鐘的功能,就是如何兩者結(jié)合起來

    設(shè)計(jì)個(gè)信號(hào)發(fā)生器的電路,而且具有數(shù)字時(shí)鐘的功能,就是如何兩者結(jié)合起來
    發(fā)表于 06-23 09:40

    讓python跟labview相結(jié)合起來搞些小動(dòng)作怎么樣,相互學(xué)習(xí)

    本帖最后由 你挺能鬧啊 于 2017-8-16 11:26 編輯 這段時(shí)間致在弄這個(gè)python,做UI界面不合適,只能與labview的強(qiáng)大儀器結(jié)合起來玩玩了,下面都是寫簡(jiǎn)單的調(diào)用,有沒有興趣
    發(fā)表于 08-16 11:26

    準(zhǔn)備做個(gè)電子diy太陽能和led結(jié)合起來,大家有什么好的創(chuàng)意嗎?

    準(zhǔn)備做個(gè)電子diy太陽能和led結(jié)合起來,大家有什么好的創(chuàng)意嗎?
    發(fā)表于 04-21 09:56

    請(qǐng)問STM32怎么和lora結(jié)合起來做無線串口?

    我是新人,沒有積分,抱歉了大家,但是我想問問怎么和LORA結(jié)合起來,麻煩回答的大佬詳細(xì)些,謝謝。另外就是求套教程,好些的教程,謝謝!
    發(fā)表于 01-21 06:35

    四軸姿態(tài)怎么和電機(jī)結(jié)合起來

    最近做DIY小四軸,硬件基本已搭好,是個(gè)x模式的,有個(gè)疑惑 ,希望大家看看,發(fā)表下意見,,我已經(jīng)從6050中得到姿態(tài)角了,,1.那我該怎么把他和電機(jī)結(jié)合起來呢?2.都說調(diào)pid,那我pid 是誰的pid呢,,,角度?它有跟姿態(tài)有什么關(guān)系呢
    發(fā)表于 06-17 04:36

    如何把庫函數(shù)和寄存器結(jié)合起來

    沒有和我們講清楚,所以在這里提問下.接著,有個(gè)更嚴(yán)重的問題,剛我介紹的是原子書上講的寄存器程序的建立過程,如果想建立個(gè)庫函數(shù)的程序那么整個(gè)程序是樣的?能不能
    發(fā)表于 07-29 03:02

    如何把庫函數(shù)寫的文件和寄存器寫的文件結(jié)合起來用?

    庫函數(shù)寫的文件 怎么樣和 寄存器寫的文件 結(jié)合起來用???庫函數(shù)寫的文件 怎么樣和 寄存器寫的文件 結(jié)合起來用啊?庫函數(shù)寫的文件 怎么樣和 寄存器寫的文件 結(jié)合起來用啊?庫函數(shù)寫的文件 怎么樣
    發(fā)表于 08-07 02:49

    這款語音套件與micro bit結(jié)合起來,看下小車效果

    。該項(xiàng)目主要定位在青少年編程教學(xué):慶科的這款語音套件與micro bit結(jié)合起來,通過在編程中增加語音互動(dòng),來增加青少年學(xué)習(xí)編程的樂趣。 通過自己組裝、改裝小車,DIY小車軌道,改裝電路等,提高
    發(fā)表于 09-24 20:31

    怎樣把Matlab和STM32結(jié)合起來

    文章目錄前言、軟件的安裝二、使用步驟1.先配置stm32cubeMX(我這里做的是個(gè)串口通訊)2.matlab的配置3.工程生成總結(jié)前言今天帶大家把Matlab和STM32結(jié)合起來,強(qiáng)強(qiáng)聯(lián)合
    發(fā)表于 07-16 06:37

    微機(jī)原理與單片機(jī)結(jié)合起來

    專業(yè)測(cè)控技術(shù)與儀器系 班級(jí)測(cè)控0601-03 任課教師周靜職稱教授教學(xué)目的和要求本課程是一門將微機(jī)原理與單片機(jī)結(jié)合起來的技術(shù)基礎(chǔ)課,通過本課程的學(xué)習(xí),目的是使學(xué)生能...
    發(fā)表于 07-16 06:27

    如何STM32的IO口與外部中斷結(jié)合起來

    如何使用STM32的外部輸入中斷?STM32的外部中斷輸入口需要做哪些設(shè)置?如何STM32的IO口與外部中斷結(jié)合起來?
    發(fā)表于 11-17 06:51

    把STM32CubeMX和TrueSTUDIO結(jié)合起來

    STM32CubeMX和TrueSTUDIO結(jié)合起來用。終于,ST官方看到客戶需求了,2019年推出了STM32CubeIDE,直接把STM32CubeMX和TrueSTUDIO整合起來。當(dāng)時(shí)是1.0版本,我
    發(fā)表于 01-13 07:47

    有什么方法可以把單片機(jī)和java結(jié)合起來

    wifi模塊該怎樣去使用呢?有什么方法可以把單片機(jī)和java結(jié)合起來呢?
    發(fā)表于 02-22 07:45

    WRLDSAR與戶外游戲結(jié)合起來,推出款A(yù)R智能彈跳球

    過去年,增強(qiáng)現(xiàn)實(shí)(AR)的知名度大幅提升,比如ARKit的推出,以及隨后支持AR的智能手機(jī)應(yīng)用程序數(shù)量的增加。WRLDS是家玩具公司,它希望通過推出AR智能彈跳球,AR與戶外游戲結(jié)合起
    發(fā)表于 08-17 09:10 ?1343次閱讀