關於商業部署機器學習,這有一篇詳盡指南

關於商業部署機器學習,這有一篇詳盡指南

大數據文摘出品

編譯:雪清、小七、Charlene、Alieen

乾貨滿滿,必須收藏的模型部署指南。

有關深度學習或機器學習方面的文章層出不窮,涵蓋了數據收集,數據整理,網絡/算法選擇,訓練,驗證和評估等主題。

但是,當今數據科學麵臨的一個具有挑戰性的難題是在項目的商業化中部署訓練模型,對於任何的以消費者為中心的公司或想要使自己的解決方案擁有更多受眾的個人來說都是如此。

關於商業部署機器學習,這有一篇詳盡指南

大多數時候,為達到預期結果,精力和資源會花在訓練模型上。因此,分配額外的時間和精力來處理計算資源以構建適當的基礎設施,再進行模型複製,以便在不同的實際環境中大規模地實現類似的結果,將會是一項艱鉅的任務。

這是一個漫長的過程,打從你決定使用深度學習來部署模型開始,可以輕易地佔用掉數月的時間。

本文試圖從頭開始全面介紹整個部署過程。此外,也歡迎大家討論評論,以免遺漏了什麼。

組成部分

關於商業部署機器學習,這有一篇詳盡指南

工作流程圖

上述圖片描述了整個API的工作流程,讓我們把它分解一下,並理解每個組件。

客戶端:架構中的客戶端可以是任何設備或第三方應用程序,由它們向搭建有預測模型的服務器發出請求。打個比方,Facebook試圖在新上傳的圖片上標記你的臉。

負載均衡器:負載均衡器嘗試在群集中的多個服務器或實例之間分配工作負載(請求)。負載均衡器的目標是通過避免任何單個資源上的過載來最小化響應時間並最大化輸出。在上圖中,負載均衡面向大眾開放,並將來自客戶端的所有請求分發到群集中的多個Ubuntu服務器。

Nginx:Nginx是一個開源的Web服務器,但也可以用作負載均衡器。Nginx以其高性能和小內存佔用而聞名。它可以在繁重的工作負載下通過開啟一個個新的工作進程來達到目的,每個進程都可以處理數千個連接。

在上述架構圖中,nginx是一個服務器或實例的本地處理器,用於處理來自公共負載均衡器的所有請求。Nginx的一個替代服務器是Apache HTTP Server。

Gunicorn:它是一個Python WSGI HTTP Server,從Ruby的Unicorn項目移植而來。這是一個pre-fork worker模型,意味著一個主文件創建多個被稱作workers的複製文件來處理請求。

由於Python不是多線程的,因此我們嘗試創建多個gunicorn worker,其作為獨立進程擁有自己的內存分配,以此補償處理請求的並行性。Gunicorn適用於各種Python Web框架,還有一個眾所周知的替代方案是uWSGI。

Flask:這是一個用Python編寫的微型web框架。它可以幫助我們開發API或響應請求的Web應用。Flask的其他替代方案是Django,Pyramid和web2py。Flask-RESTful提供了Flask的一個擴展,以支持快速構建REST API。

Keras:這是一個用Python編寫的開源神經網絡庫。它能夠在TensorFlow,CNTK,Theano或MXNet上運行。Keras也有很多替代品:TensorFlow,Caffe2(Caffe),CNTK,PyTorch,MXNet,Chainer和Theano(已停止更新)。

雲平臺:如果有一個與上述所有組件都關聯的平臺,那麼它就是雲。雲是人工智能研究激增的主要催化劑之一,無論是在計算機視覺,自然語言處理,機器學習,機器翻譯,機器人,還是在醫學成像方面,雲以合理的成本為更廣泛的受眾提供了計算資源。

雲Web服務的提供商很少,較為知名的是Amazon Web Services(AWS),Google Cloud和Microsoft Azure。

架構設置

到目前為止,您應該熟悉上一節中提到的組件。在下一節中,我們將從API的角度來理解架構設置,因為它也構成了Web應用程序的基礎。

注意:這個架構設置將基於Python。

開發設置

訓練模型:第一步是基於用例訓練模型,可以使用Keras,TensorFlow或PyTorch。確保你在虛擬環境中執行此操作,因為這有助於隔離多個Python環境,並且還能將所有必要的依賴打包到單獨的文件夾中。

構建API:如果模型足夠好以至於可以開始構建API的話,你可以使用Flask 或是Django來根據需求構建它們。理想情況下,你必須構建Restful API,因為它有助於分離客戶端和服務器,提高可視性、可靠性和可擴展性,並且它是平臺無關的。你可以執行一次徹底的測試,以確保模型根據API的正確預測做出響應。

Web服務器:現在不妨測試一下你構建好了的API的Web服務器。如果你是使用Flask構建的,Gunicorn會是一個不錯的選擇。運行gunicorn web服務器的命令如下:

gunicorn --workers 1--timeout 300 --bind 0.0.0.0:8000 api:app

- workers(INT): The number of worker processes for handling requests.

- timeout (INT): Workers silent for more than this many seconds arekilled and restarted.

- bind (ADDRESS): The socket to bind. [['127.0.0.1:8000']]

- api: The main Python file containing the Flask application.

- app: An instance of the Flask class in the main Python file 'api.py'.

負載平衡器:你可以通過配置nginx來處理gunicorn workers的測試請求,每個worker都有自己的DL模型API。請參閱給出的資源瞭解nginx和gunicorn的相關配置。

資源鏈接:

https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-16-04

負載/性能測試:嘗試使用Apache Jmeter,這是一個旨在加載測試和測量性能的開源應用程序。它也有助於理解nginx的負載分配。另一個選擇是Locust。

生產設置

雲平臺:選擇好雲服務後,要從標準Ubuntu映像(最好是最新的LTS版本)中設置一種機器或實例,而CPU的選擇實際上取決於深度學習模型和用例。機器可以運行後,就可以設置nginx和Python虛擬環境,安裝所有的依賴項並複製API。最後就可以嘗試使用模型運行API了(這需要一定的時間,因為這個是根據為gunicorn定義的工作組數以及要加載所有模型來決定的)。

自定義API映像:確保API運行正常後,可以快照實例,創建一個包含API和模型的自定義圖像,它將保留應用程序的所有設置。

AWS:

https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/tkv-create-ami-from-instance.html

Google:

https://cloud.google.com/compute/docs/images/create-delete-deprecate-private-images

Azure:

https://docs.microsoft.com/en-us/azure/virtual-machines/linux/tutorial-custom-images

負載均衡器:接下來從雲服務創建負載均衡器,可以根據需要設置為公共的或私有的。

AWS:

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-getting-started.html

Google:

https://cloud.google.com/load-balancing/

Azure:

https://docs.microsoft.com/en-us/azure/load-balancer/quickstart-create-basic-load-balancer-portal

一組實例:使用先前創建的自定義API映像來啟動一組實例。

AWS:

https://aws.amazon.com/premiumsupport/knowledge-center/launch-instance-custom-ami/

Google:

https://cloud.google.com/compute/docs/instances/creating-instance-with-custom-machine-type

Azure:

https://docs.microsoft.com/en-us/azure/virtual-machines/windows/create-vm-generalized-managed

集群的負載均衡器:現在可以將實例集群鏈接到負載均衡器,這將確保負載均衡器在所有實例之間平均分配工作。

AWS:

https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-deregister-register-instances.html

Google:

https://cloud.google.com/compute/docs/load-balancing/http/backend-service

Azure:

https://docs.microsoft.com/en-us/azure/load-balancer/quickstart-create-basic-load-balancer-portal

負載/性能測試:就像開發中的負載/性能測試一樣,類似的過程在生產環境也可以進行,但因為現在有數百萬個請求,所以需要去嘗試打破架構,來檢查它的穩定性和可靠性(並不一定總是有用的)。

總結:現在,如果一切正常,你將能用你的第一個可以投入生產級別的深度學習架構來處理數百萬個請求。

其他設置(附加組件)

除了通用設置外,還有其他一些事項需要注意,以確保我們搭建的環境能夠在長時間內自我維護。

自動縮放:這是雲服務中的一項功能,它可以根據收到的請求數量來幫助擴展應用程序中的實例。我們可以在請求激增時進行橫向擴展,在請求減少時進行iLocustn擴展。

應用程序更新:更新應用程序中的深度學習模型或其他功能都是需要時間的,但是如何能在不影響生產環境運行的前提下,更新所有實例,這是個問題。雲服務就提供了一種可以用多種形式來執行此任務的方式,而且具體的雲服務提供商可以提供具體的定製服務。

AWS:

https://aws.amazon.com/premiumsupport/knowledge-center/auto-scaling-group-rolling-updates/

Google:

https://cloud.google.com/compute/docs/instance-groups/updating-managed-instance-groups

Azure:

https://azure.microsoft.com/en-in/updates/auto-os-upgrades/

持續集成:它指的是軟件發佈過程的構建和單元測試階段。每個提交的修訂都會觸發自動構建和測試過程,用它可以將最新版本的模型部署到生產環境中。

關於商業部署機器學習,這有一篇詳盡指南

其他平臺

還有一些其他的系統,可以提供一種結構化的方式在生產環境中部署和設置模型,以下是幾個其他類型系統的介紹:

TensorFlow服務:它是一個開源平臺軟件庫,服務於機器學習模型。基於機器學習的推測作用,它的主要目標是接收訓練後的模型,並管控模型的整個生命週期,它為TensorFlow模型提供了直接可以使用的支持。

官網鏈接:

https://www.tensorflow.org/serving/

關於商業部署機器學習,這有一篇詳盡指南

Docker:它是一種容器虛擬化技術,其行為與輕量級虛擬機類似。它提供了一種簡潔的方法來把應用程序從其依賴項中隔離,以便應用程序在不同操作系統中都可以使用。我們可以在不用共享資源的情況下,在同一個實例上運行多個不同應用程序的docker鏡像。

資料鏈接:

https://github.com/floydhub/dl-docker

關於商業部署機器學習,這有一篇詳盡指南

https://codingpackets.com/virtualization/docker/

Michelangelo:它是Uber的機器學習平臺,其包括在Uber所分析的數據的數量及範圍內建設、部署和運營機器學習解決方案。

關於商業部署機器學習,這有一篇詳盡指南

https://eng.uber.com/michelangelo/

相關報道:

https://medium.com/@maheshkkumar/a-guide-to-deploying-machine-deep-learning-model-s-in-production-e497fd4b734a


分享到:


相關文章: