国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

TensorFlow在產品環境中運行模型的實踐經驗總結

stackfing / 3115人閱讀

摘要:它使用機器學習來解釋用戶提出的問題,并用相應的知識庫文章來回應。使用一類目前較先進的機器學習算法來識別相關文章,也就是深度學習。接下來介紹一下我們在生產環境中配置模型的一些經驗。

我們如何開始使用TensorFlow ?

在Zendesk,我們開發了一系列機器學習產品,比如的自動答案(Automatic Answers)。它使用機器學習來解釋用戶提出的問題,并用相應的知識庫文章來回應。當用戶有問題、投訴或者查詢時,他們可以在線提交請求。收到他們的請求后,Automatic Answers將分析請求,并且通過郵件建議客戶閱讀相關的可能最有幫助的文章。

Automatic Answers使用一類目前較先進的機器學習算法來識別相關文章,也就是深度學習。 我們使用Google的開源深度學習庫TensorFlow來構建這些模型,利用圖形處理單元(GPU)來加速這個過程。Automatic Answers是我們在Zendesk使用Tensorflow完成的第一個數據產品。在我們的數據科學家付出無數汗水和心血之后,我們才有了在Automatic Answers上效果非常好的Tensorflow模型。

但是構建模型只是問題的一部分,我們的下一個挑戰是要找到一種方法,使得模型可以在生產環境下服務。模型服務系統將經受大量的業務。所以需要確保為這些模型提供的軟件和硬件基礎架構是可擴展的、可靠的和容錯的,這對我們來說是非常重要的。接下來介紹一下我們在生產環境中配置TensorFlow模型的一些經驗。

順便說一下我們的團隊——Zendesk的機器學習數據團隊。我們團隊包括一群數據科學家、數據工程師、一位產品經理、UX /產品設計師以及一名測試工程師。

Data Team At Zendesk Melbourne

TensorFlow模型服務 ?

經過數據科學家和數據工程師之間一系列的討論,我們明確了一些核心需求:

預測時的低延遲

橫向可擴展

適合我們的微服務架構

可以使用A/B測試不同版本的模型

可以與更新版本的TensorFlow兼容

支持其他TensorFlow模型,以支持未來的數據產品

TensorFlow Serving ?

經過網上的調研之后,Google的TensorFlow Serving成為我們推薦的模型服務。TensorFlow Serving用C++編寫,支持機器學習模型服務。開箱即用的TensorFlow Serving安裝支持:

TensorFlow模型的服務

從本地文件系統掃描和加載TensorFlow模型

(小編注:TensorFlow和TensorFlow Serving的區別:TensorFlow項目主要是基于各種機器學習算法構建模型,并為某些特定類型的數據輸入做適應學習,而TensorFlow Serving則專注于讓這些模型能夠加入到產品環境中。開發者使用TensorFlow構建模型,然后TensorFlow Serving基于客戶端輸入的數據使用前面TensorFlow訓練好的模型進行預測。)

TensorFlow Serving將每個模型視為可服務對象。它定期掃描本地文件系統,根據文件系統的狀態和模型版本控制策略來加載和卸載模型。這使得可以在TensorFlow Serving繼續運行的情況下,通過將導出的模型復制到指定的文件路徑,而輕松地熱部署經過訓練的模型。

? ?

TensorFlow Serving Architecture

根據這篇Google博客中報告的基準測試結果,他們每秒記錄大約100000個查詢,其中不包括TensorFlow預測處理時間和網絡請求時間。

有關TensorFlow Serving架構的更多信息,請參閱TensorFlow Serving文檔。

通信協議(gRPC) ?

TensorFlow Serving提供了用于從模型調用預測的gRPC接口。gRPC是一個開源的高性能遠程過程調用(remote procedure call,RPC)框架,它在HTTP/2上運行。與HTTP/1.1相比,HTTP/2包含一些有趣的增強,比如它對請求復用、雙向流和通過二進制傳輸的支持,而不是文本。

默認情況下,gRPC使用Protocol Buffers (Protobuf)作為其信息交換格式。Protocol Buffers是Google的開源項目,用于在高效的二進制格式下序列化結構化數據。它是強類型,這使它不容易出錯。數據結構在.proto文件中指定,然后可以以各種語言(包括Python,Java和C ++)將其編譯為gRPC請求類。 這是我第一次使用gRPC,我很想知道它與其他API架構(如REST)相比誰性能更好。

模型訓練和服務架構 ?

我們決定將深度學習模型的訓練和服務分為兩個管道。下圖是我們的模型訓練和服務架構的概述:

Model Training and Serving Architecture

模型訓練管道

模型訓練步驟:

我們的訓練特征是從Hadoop中提供的數據生成的。

生成的訓練特征保存在AWS S3中。

然后使用AWS中的GPU實例和S3中的批量訓練樣本訓練TensorFlow模型。

一旦模型被構建并驗證通過,它將被發布到S3中的模型存儲庫。

模型服務管道

驗證的模型在生產中通過將模型從模型庫傳送到TensorFlow Serving實例來提供。

基礎結構 ?

我們在AWS EC2實例上運行TensorFlow Serving。Consul在實例之前設置,用于服務發現和分發流量。客戶端連接從DNS查找返回的第一個可用IP。或者彈性負載平衡可用于更高級的負載平衡。由于TensorFlow模型的預測本質上是無狀態操作,所以我們可以通過旋轉加速更多的EC2實例 來實現橫向可擴展性。

另一個選擇是使用Google Cloud平臺提供的Cloud ML,它提供TensorFlow Serving作為完全托管服務。 但是,當我們在大概2016年9月推出TensorFlow Serving時,Cloud ML服務處于alpha階段,缺少生產使用所需的功能。因此,我們選擇在我們自己的AWS EC2實例中托管,以實現更精細的粒度控制和可預測的資源容量。

模型服務的實現 ?

下面是我們實現TensorFlow Serving部署和運行所采取的步驟:

1.從源編譯TensorFlow Serving

首先,我們需要編譯源代碼來產生可執行的二進制文件。然后就可以從命令行執行二進制文件來啟動服務系統。

假設你已經配置好了Docker,那么一個好的開端就是使用提供的Dockerfile來編譯二進制文件。請按照以下步驟:

運行該gist中的代碼以構建適合編譯TensorFlow Serving的docker容器。

在正在運行的docker容器中運行該gist中的代碼以構建可執行二進制文件。

一旦編譯完成,可執行二進制文件將在你的docker鏡像的以下路徑中:/work/serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server

2.運行模型服務系統

上一步生成的可執行二進制文件(tensorflow_model_server)可以部署到您的生產實例中。 如果您使用docker編排框架(如Kubernetes或Elastic Container Service),您還可以在docker容器中運行TensorFlow Serving。

現在假設TensorFlow模型存儲在目錄/work/awesome_model_directory下的生產主機上。你可以在端口8999上使用以下命令來運行TensorFlow Serving和你的TensorFlow模型:

/tensorflow_model_server — port=8999 — model_base_path=/work/awesome_model_directory

默認情況下,TensorFlow Serving會每秒掃描模型基本路徑,并且可以自定義。此處列出了可作為命令行參數的可選配置。

3.從服務定義(Service Definitions)生成Python gRPC存根

下一步是創建可以在模型服務器上進行預測的gRPC客戶端。這可以通過編譯.proto文件中的服務定義,從而生成服務器和客戶端存根來實現。.proto文件在TensorFlow Serving源碼中的tensorflow_serving_apis文件夾中。在docker容器中運行以下腳本來編譯.proto文件。運行提交版本號為46915c6的腳本的示例:

./compile_ts_serving_proto.sh 46915c6

運行該腳本后應該在tensorflow_serving_apis目錄下生成以下定義文件:

model_pb2.py

predict_pb2.py

prediction_service_pb2.py

你還可以使用grpc_tools Python工具包來編譯.proto文件。

4.從遠程主機調用服務

可以使用編譯后的定義來創建一個python客戶端,用來調用服務器上的gRPC調用。比如這個例子用一個同步調用TensorFlow Serving的Python客戶端。

如果您的用例支持異步調用預測,TensorFlow Serving還支持批處理預測以達到性能優化的目的。要啟用此功能,你應該運行tensorflow_model_server同時開啟flag?—enable_batching。這是一個異步客戶端的例子。

從其他存儲加載模型

如果你的模型沒有存儲在本地系統中應該怎么辦?你可能希望TensorFlow Serving可以直接從外部存儲系統(比如AWS S3和Google Storage)中直接讀取。

如果是這種情況,你將需要通過Custom Source來拓展TensorFlow Serving以使其可以讀取這些源。TensorFlow Serving僅支持從文件系統加載模型。

一些經驗 ?

我們在產品中已經使用TensorFlow Serving大概半年的時間,我們的使用體驗是相當平穩。它具有良好的預測時間延遲。以下是我們的TensorFlow Serving實例一周內的預測時間(以秒為單位)的第95百分位數的圖(約20毫秒):

然而,在生產中使用TensorFlow Serving的過程中,我們也有一些經驗教訓可以跟大家分享。

1.模型版本化

到目前為止,我們已經在產品中使用了幾個不同版本的TensorFlow模型,每一個版本都有不同的特性,比如網絡結構、訓練數據等。正確處理模型的不同版本已經是一個重要的任務。這是因為傳遞到TensorFlow Serving的輸入請求通常涉及到多個預處理步驟。這些預處理步驟在不同TensorFlow模型版本下是不同的。預處理步驟和模型版本的不匹配可能導致錯誤的預測。

1a.明確說明你想要的版本

我們發現了一個簡單但有用的防止錯誤預測的方法,也就是使用在model.proto定義中指定的版本屬性,它是可選的(可以編譯為model_pb2.py)。這樣可以始終保證你的請求有效負載與預期的版本號匹配。

當你請求某個版本(比如從客戶端請求版本5),如果TensorFlow Serving服務器不支持該特定版本,它將返回一個錯誤消息,提示找不到模型。

1b.服務多個模型版本

TensorFlow Serving默認的是加載和提供模型的版本。當我們在2016年9月首次應用TensorFlow Serving時,它不支持同時提供多個模型。這意味著在指定時間內它只有一個版本的模型。這對于我們的用例是不夠的,因為我們希望服務多個版本的模型以支持不同神經網絡架構的A / B測試。

其中一個選擇是在不同的主機或端口上運行多個TensorFlow Serving進程,以使每個進程提供不同的模型版本。這樣的話就需要:

用戶應用程序(gRPC客戶端)包含切換邏輯,并且需要知道對于給定的版本需要調用哪個TensorFlow Serving實例。這增加了客戶端的復雜度,所以不是推薦。

一個可以將版本號映射到TensorFlow Serving不同實例的注冊表。

更理想的解決方案是TensorFlow Serving可以支持多個版本的模型。

所以我決定使用一個“lab day”的時間來擴展TensorFlow Serving,使其可以服務多個版本的時間。在Zendesk,“lab day”就是我們可以每兩周有一天的時間來研究我們感興趣的東西,讓它成為能夠提高我們日常生產力的工具,或者一種我們希望學習的新技術。我已經有8年多沒有使用C++代碼了。但是,我對TensorFlow Serving代碼庫的可讀性和整潔性印象深刻,這使其易于擴展。支持多個版本的增強功能已經提交,并且已經合并到主代碼庫中。

TensorFlow Serving維護人員對補丁和功能增強的反饋非常迅速。從的主分支,你可以啟動TensorFlow Serving,用model_version_policy中附加的flag來服務多個模型版本:

/work/serving/bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server — port=8999 — model_base_path=/work/awesome_model_directory — model_version_policy=ALL_VERSIONS

一個值得注意的要點是,服務多個模型版本,需要權衡的是更高的內存占用。所以上述的flag運行時,記住刪除模型基本路徑中的過時模型版本。

2.活用壓縮

當你部署一個新的模型版本的時候,建議在復制到model_base_path之前,首先將導出的TensorFlow模型文件壓縮成單個的壓縮文件。Tensorflow Serving教程中包含了導出訓練好的Tensorflow模型的步驟。導出的檢查點TensorFlow模型目錄通常具有以下文件夾結構:

一個包含版本號(比如0000001)和以下文件的父目錄:

saved_model.pb:序列化模型,包括模型的圖形定義,以及模型的元數據(比如簽名)。

variables:保存圖形的序列化變量的文件。壓縮導出的模型:

tar -cvzf modelv1.tar.gz 0000001

為什么需要壓縮?

壓縮后轉移和復制更快

如果你將導出的模型文件夾直接復制到model_base_path中,復制過程可能需要一段時間,這可能導致導出的模型文件已復制,但相應的元文件尚未復制。如果TensorFlow Serving開始加載你的模型,并且無法檢測到源文件,那么服務器將無法加載模型,并且會停止嘗試再次加載該特定版本。

3.模型大小很重要

我們使用的TensorFlow模型相當大,在300Mb到1.2Gb之間。我們注意到,在模型大小超過64Mb時,嘗試提供模型時將出現錯誤。這是由于protobuf消息大小的硬編碼64Mb限制,如這個TensorFlow Serving在Github上的問題所述。

最后,我們采用Github問題中描述的補丁來更改硬編碼的常量值。(這對我們來說還是一個問題。如果你可以找到在不改變硬編碼的情況下,允許服務大于64Mb的模型的替代方案,請聯系我們。)

4.避免將源移動到你自己的分支下

從實現時開始,我們一直從主分支構建TensorFlow Serving源,的版本分支(v0.4)在功能和錯誤修復方面落后于主分支。因此,如果你只通過檢查主分支來創建源,一旦新的更改被合并到主分支,你的源也可能改變。為了確保人工制品的可重復構建,我們發現檢查特定的提交修訂很重要:

TensorFlow Serving

TensorFlow(TensorFlow Serving里的Git子模塊)

期待未來加入的一些功能增強清單 ?

這里是一些我們比較感興趣的希望以后TensorFlow Serving會提供的功能:

健康檢查服務方法

一個TensorFlow Serving實例可以支持多種模型類型

直接可用的分布式存儲(如AWS S3和Google存儲)中的模型加載

直接支持大于64Mb的模型

不依賴于TensorFlow的Python客戶端示例

歡迎加入本站公開興趣群

商業智能與數據分析群

興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識

QQ群:81035754

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/4490.html

相關文章

  • “大數據+”實踐:數據平臺設計與搭建

    摘要:在近期舉辦的全球架構師峰會上,個推首席數據架構師袁凱,基于他在數據平臺的建設以及數據產品研發的多年經驗,分享了面向機器學習數據平臺的設計與搭建。二具體開展機器學習的過程原始數據經過數據的處理,入庫到數據倉里。 機器學習作為近幾年的一項熱門技術,不僅憑借眾多人工智能產品而為人所熟知,更是從根本上增能了傳統的互聯網產品。在近期舉辦的2018 ArchSummit全球架構師峰會上,個推首席數...

    BlackHole1 評論0 收藏0
  • 玩轉TensorFlow Lite:有道云筆記實操案例分享

    摘要:如何進行操作本文將介紹在有道云筆記中用于文檔識別的實踐過程,以及都有些哪些特性,供大家參考。年月發布后,有道技術團隊第一時間跟進框架,并很快將其用在了有道云筆記產品中。微軟雅黑宋體以下是在有道云筆記中用于文檔識別的實踐過程。 這一兩年來,在移動端實現實時的人工智能已經形成了一波潮流。去年,谷歌推出面向移動端和嵌入式的神經網絡計算框架TensorFlowLite,將這股潮流繼續往前推。Tens...

    Hanks10100 評論0 收藏0
  • 深度學習

    摘要:深度學習在過去的幾年里取得了許多驚人的成果,均與息息相關。機器學習進階筆記之一安裝與入門是基于進行研發的第二代人工智能學習系統,被廣泛用于語音識別或圖像識別等多項機器深度學習領域。零基礎入門深度學習長短時記憶網絡。 多圖|入門必看:萬字長文帶你輕松了解LSTM全貌 作者 | Edwin Chen編譯 | AI100第一次接觸長短期記憶神經網絡(LSTM)時,我驚呆了。原來,LSTM是神...

    Vultr 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<