模型秒變API只需一行代碼,支持TensorFlow等框架

2020-12-18 機器之心Pro

選自GitHub

機器之心編譯

參與:一鳴、杜偉

還在為機器學習模型打包成 API 發愁?這個工具能讓你一行代碼直接打包。

專注於機器學習應用的人們知道,從訓練好的模型到實際的工業生產工具還有一定的距離。其中工作量很大的地方在於將模型打包,預留 API 接口,並和現有的生產系統相結合。近日,GitHub 上有了這樣一個項目,能夠讓用戶一行代碼將任意模型打包為 API。這一工具無疑能夠幫助開發者在實際的生產應用中快速部署模型。

項目地址:https://github.com/cortexlabs/cortex

項目特點和原理

該項目名為 Cortex,是一個命令行工具。作者表示,該項目具有以下優點:

自動定義:Cortex 可以自動定義需要負責生產工作的 API;多框架支持:Cortex 支持多種機器學習框架,包括 TensorFlow、PyTorch、scikit-learn、XGBoost 等;CPU/GPU 支持:Cortex 能夠在 CPU 或者 GPU 上進行推理工作;回滾式更新:Cortex 可以對部署的 API 直接更新;日誌流:Cortex 會保留部署模型的日誌流,並在 CLI 上顯示;預測監控:Cortex 能夠監控網絡的評價指標,並追蹤預測結果;最小配置:部署時,用戶只需要在一個名為 cortex.yaml 的文件中配置相關屬性。

這一項目是怎樣工作的?具體而言,每當用戶運行 cortex deploy 時,命令行將配置屬性和代碼發送到伺服器集群上。每個模型都載入到一個 Docker 容器中,包括相關的 Python 包和處理請求的代碼。模型通過網絡服務,如 Elastic Load Balancing (ELB)、Flask、TensorFlow Serving 和 ONNX Runtime 公開 API 給用戶使用。容器通過 Elastic Kubernetes Service (EKS) 進行控制,而日誌文件和評價指標的記錄和列印工作由 CloudWatch 完成。

使用方法

使用過程主要分為以下三個步驟:

定義模型的 AP

# predictor.pymodel = download_my_model()defpredict(sample, metadata):return model.predict(sample["text"])

如上所示,用戶需要做的是定義代表這個 API 的函數,使其能夠根據輸入數據返回輸出。

配置部署

# cortex.yaml- kind: deploymentname: sentiment- kind: apiname: classifierpredictor: path: predictor.pytracker:

model_type: classificationcompute:

gpu: 1

第二個步驟中,用戶需要創建一個新的 yaml 文件,這個文件用於配置相關屬性。

具體而言,用戶可以定義部署模型的名稱,本例中名為 classifierpredictor。然後還需要定義 API 的名稱,如 classifierpredictor 以及路徑、模型的類型和使用的 GPU 數量等。

AWS 部署

$ cortex deploycreating classifier

(http://***.amazonaws.com/sentiment/classifier)

以 AWS 為例,以上工作完成後,用戶可以創建這個 API,使其利用 AWS 進行工作。

當然,用戶還可以實時保存推斷結果,如下所示:

$ curl http://***.amazonaws.com/sentiment/classifier \-X POST -H "

Content-Type: application/json" \-d '{"text":

"the movie was great!"}'positive

此外,用戶還可以監控運行結果。

$cortex get classifier --watchstatusup-to-date available requested last update avg latencylive 1 1 1

8s 123msclasscountpositive8negative4

使用教程

為了讓用戶更好地使用這一工具,項目作者同時還提供了一些使用案例。包括:

基於 TensorFlow 和 BERT 進行情感分析:https://github.com/cortexlabs/cortex/tree/0.10/examples/tensorflow/sentiment-analysis基於 TensorFlow 和 Inception 模型進行圖像分類:https://github.com/cortexlabs/cortex/tree/0.10/examples/tensorflow/image-classifier基於 PyTorch 和 DistilGPT2 進行文本生成:https://github.com/cortexlabs/cortex/tree/0.10/examples/pytorch/text-generator基於 XGBoost / ONNX 進行虹膜分類:https://github.com/cortexlabs/cortex/tree/0.10/examples/xgboost/iris-classifier

以使用 BERT 進行情感分析為例:

首先用戶需要在模型上定義 API 接口函數,使其可以通過函數輸入數據,並返回模型的推理結果。這一 py 文件被定義為 handler.py:

# handler.pyimport tensorflow as tfimport tensorflow_hub as hubfrom bert import tokenization, run_classifierlabels = ["negative", "positive"]with tf.Graph().as_default(): bert_module = hub.Module("https://tfhub.dev/google/bert_uncased_L-12_H-768_A-12/1") info = bert_module(signature="tokenization_info", as_dict=True)with tf.Session() as sess: vocab_file, do_lower_case = sess.run([info["vocab_file"], info["do_lower_case"]]) tokenizer = tokenization.FullTokenizer(vocab_file=vocab_file, do_lower_case=do_lower_case)def pre_inference(sample, signature, metadata): input_example = run_classifier.InputExample(guid="", text_a=sample["review"], label=0) input_feature = run_classifier.convert_single_example(0, input_example, [0, 1], 128, tokenizer) return {"input_ids": [input_feature.input_ids]}def post_inference(prediction, signature, metadata): return labels[prediction["labels"][0]]

接著,用戶需要定義配置 yaml 文件,在文件中指定相關屬性,這裡需要注意,文件名必須定義為 cortex.yaml:

# cortex.yaml

- kind: deployment name: sentiment- kind: api name: classifier tensorflow: model: s3://cortex-examples/tensorflow/sentiment-analysis/bert request_handler: handler.py tracker: model_type: classification

從中可以看到,yaml 文件中需要指定出使用的模型,以及作為 API 接口的 py 文件(即第一步中定義了的 py 文件)。

然後進行部署即可:

$ cortex deploydeployment started

如果需要獲得監控信息,則需要輸入 cortex get 命令:

$ cortex get classifier --watchstatus up-to-date available requested last update

avg latencylive 1118s

還可以用命令行獲得實時預測:

$ cortex get classifierurl: http://***.amazonaws.com/sentiment/classifier$ curl http://***.amazonaws.com/sentiment/classifier \ -XPOST -H"Content-Type: application/json" \ -d '{"review": "The movie was great!"}'"positive

相關焦點

  • 一行代碼切換TensorFlow與PyTorch,模型訓練也能用倆框架
    很顯然,這樣的框架交互,能節省很多重寫代碼的麻煩事。github項目地址:BlackHC/TfPyTh為什麼框架間的交互很重要目前 GitHub 上有很多優質的開源模型,它們大部分都是用 PyTorch 和 TensorFlow 寫的。
  • TensorFlow極速入門
    一、前言目前,深度學習已經廣泛應用於各個領域,比如圖像識別,圖形定位與檢測,語音識別,機器翻譯等等,對於這個神奇的領域,很多童鞋想要一探究竟,這裡拋磚引玉的簡單介紹下最火的深度學習開源框架 tensorflow。
  • tensorflow極速入門
    最後給出了在 tensorflow 中建立一個機器學習模型步驟,並用一個手寫數字識別的例子進行演示。1、 tensorflow是什麼?tensorflow 是 google 開源的機器學習工具,在2015年11月其實現正式開源,開源協議Apache 2.0。下圖是 query 詞頻時序圖,從中可以看出 tensorflow 的火爆程度。
  • tensorflow安裝教程
    tensorflow是谷歌開源的人工智慧庫,有最完善的生態支持。是進行人工智慧領域開發和科研的必備工具。本文在windows10下,藉助anacondatensorflow as tf,有警告但是沒有報錯,說明安裝成功。
  • TensorFlow發布JavaScript開發者的機器學習框架TensorFlow.js
    去年的 TensorFlow 開發者大會上,該框架正式升級到了 1.0 版本,逐漸成為最流行的深度學習框架。今年,TensorFlow 發布了面向 JavaScript 開發者的全新機器學習框架 TensorFlow.js。
  • 漫談分布式計算框架
    Mapreduce 正如其名,是一個很基本的 map-reduce 式的計算模型(好像沒說一樣)。Spark 定義了一套 RDD 模型,本質上是一系列的 map/reduce 組成的一個 DAG 圖。Tensorflow 的計算模型也是一張圖,但是 tensorflow 的圖比起 spark 來,顯得更「複雜」一點。你需要為圖中的每個節點和邊作出定義。
  • 正確debug的TensorFlow的姿勢
    當討論在tensorflow上編寫代碼時,總是將其與PyTorch進行比較,討論框架有多複雜,以及為什麼要使用tf.contrib的某些部分,做得太爛了。此外,我認識很多數據科學家,他們只用Github上已有的repo來用tensorflow。對這個框架持這種態度的原因是非常不同的,但是今天讓我們關注更實際的問題:調試用tensorflow編寫的代碼並理解它的主要特性。
  • Tensorflow新版來襲,不僅集成英偉達TensorRT,還支持JavaScript
    ,還可以導入脫機訓練的TensorFlow和Keras模型來進行預測,並且對WebGL實現了無縫支持的能力。圖|新版TensorFlow也支持了TensorFlow Hub功能,可大幅加速模型的可重複使用部分的發現、發布與使用隨著Tensorflow 1.7.0的發布,TensorFlow Lite也迎來了更新,最新版的TensorFlow Lite大幅減少核心解釋器的大小,從前一版的1.1MB,縮減到75KB的大小,同時在進行一些量化模型時
  • 輸入示例,自動生成代碼:TensorFlow官方工具TF-Coder已開源
    項目地址:https://github.com/google-research/tensorflow-coderGoogle Colab 試用地址:https://colab.research.google.com/github/google-research/tensorflow-coder/blob/master/TF-Coder_Colab.ipynb
  • 基於tensorflow框架對手寫字體MNIST數據集的識別
    本文我們利用python語言,通過tensorflow框架對手寫字體MNIST資料庫進行識別。學習每一門語言都有一個「Hello World」程序,而對數字手寫體資料庫MNIST的識別就是深度學習的「Hello World」代碼。下面我們給出詳細的步驟。tensorflow概述tensorflow是用C++語言實現的一個深度學習模塊。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    論文地址:http://download.tensorflow.org/paper/whitepaper2015.pdfTensorFlow 現已被公司、企業與創業公司廣泛用於自動化工作任務和開發新系統,其在分布式訓練支持、可擴展的生產和部署選項、多種設備(比如安卓)支持方面備受好評。
  • 對比PyTorch和TensorFlow的自動差異和動態子類化模型
    使用自定義模型類從頭開始訓練線性回歸,比較PyTorch 1.x和TensorFlow 2.x之間的自動差異和動態模型子類化方法,這篇簡短的文章重點介紹如何在PyTorch 1.x和TensorFlow 2.x中分別使用帶有模塊/模型API的動態子類化模型,以及這些框架在訓練循環中如何使用AutoDiff獲得損失的梯度並從頭開始實現
  • 玩轉TensorFlow Lite:有道雲筆記實操案例分享
    TFLite 的代碼結構作為 TFLite 的使用者,我們也探索了一下 TFLite 的代碼結構,這裡分享一下。目前,TFLite 的代碼位於 TensorFlow 工程中 "tensorflow/contrib/lite" 文件夾下。文件夾下有若干頭/源文件和一些子文件夾。
  • TensorFlow vs PyTorch:哪個是深度學習網絡編程的最佳框架呢?
    import tensorflow as tf而對於PyTorch來說,需要的兩個庫為:import torchimport torchvisionb)加載和預處理數據使用TensorFlow加載和準備數據可以通過以下兩行代碼完成:在PyTorch中是這樣的:我們可以使用matplotlib.pyplot庫驗證這兩段代碼是否已經正確加載了相同數據
  • TensorFlow極簡教程:創建、保存和恢復機器學習模型
    代碼的結構與之前相同,唯一不同的是這次使用張量(tensor)操作來定義誤差。使用張量可以並行(parallel)運行代碼。每個數據點被看作是來自獨立同分布的樣本。因為每個數據點假定是獨立的,所以計算也是獨立的。當使用張量時,每個數據點都在分隔的計算內核上運行。我們有 8 個數據點,所以如果你有一個有八個內核的計算機,它的運行速度應該快八倍。
  • TensorFlow 2.1指南:keras模式、渴望模式和圖形模式(附代碼)
    哪種框架最適合我的用例?這種方法可擴展嗎?我們是否考慮到可擴展性?如果你像我一樣是一個普通人,那麼可能已經體驗到有時會陷入應用程式開發的困境,以至於很難停下來,去思考一下我們是否採取了有效的方式。在AI領域尤其如此。眾所周知,人工智慧是一個快速發展的領域。當天發表了新的研究。正在迅速開發的主要AI框架之間存在著巨大的鬥爭。
  • TensorFlow開發者峰會:重磅發布TensorFlow.js
    預編譯的 TensorFlow 二進位文件已經在 180 多個國家被下載了超過 1000 萬次,GitHub 上的原始碼現在已經有超過 1200 個貢獻者。在TensorFlow 1.0發布之後的兩年中,TensorFlow 不斷更新升級,逐漸成為機器學習社區最流行的深度學習框架。
  • 從框架優缺點說起,這是一份TensorFlow入門極簡教程
    機器之心在本文介紹了 PyTorch 和 Caffe 等深度學習框架的優缺點及 TensorFlow 基礎,包括靜態計算圖、張量、TensorBoard 可視化和模型參數的保存等。需要大量的非必要冗長代碼。如果你希望同時支持 CPU 和 GPU,你需要為每一個實現額外的函數。你還需要使用普通的文本編輯器來定義你的模型。真令人頭疼!幾乎每個人都希望程序化地定義模型,因為這有利於不同組件之間的模塊化。有趣的是,Caffe 的主要架構師現在在 TensorFlow 團隊工作。專一性。僅定位在計算機視覺(但做得很不錯)。不是以 Python 編寫!
  • 令人困惑的TensorFlow!
    在下圖中,上半部分是我們運行的代碼及其輸出,下半部分是生成的計算圖。import tensorflow as tf計算圖:可見,僅僅導入 TensorFlow 並不會給我們生成一個有趣的計算圖。而只是一個單獨的,空白的全局變量。
  • 什麼是TensorFlow,TensorFlow教程
    DistBelief的原始碼經過修改,被做成了一個更好的基於應用程式的庫,2015年,它被稱為tensorflow。TensorFlow是什麼?TensorFlow是一個強大的面向數據流的機器學習庫,由谷歌的Brain Team創建,於2015年開源。它被設計成易於使用和廣泛應用於數字和神經網絡的問題以及其他領域。