誰能取代Python?我使用Go來部署機器學習模型的原因

全文共1881字,預計學習時長7分鐘


誰能取代Python?我使用Go來部署機器學習模型的原因

圖源:unsplash


毋庸置疑,Python是如今最受歡迎的機器學習語言。雖然機器學習框架使用CUDA C / C ++之類的語言進行實際運算,但它們都提供了Python接口。這也是為什麼大多數機器學習從業人員都工作中都使用Python。


而機器學習基礎設施——Cortex的代碼庫88.3%都是Go語言編寫的。


誰能取代Python?我使用Go來部署機器學習模型的原因

圖源:Cortex GitHub


大規模部署模型不同於編寫調用PyTorch和TensorFlow函數的Python腳本。為了實際大規模運行生產機器學習API,需要基礎架構來執行以下操作:


· API管理,以處理多個部署進程。

· 自動縮放,這樣流量波動就不會破壞API(並且AWS保持可管理性)。

· 滾動更新,以便更新模型的同時仍然服務於請求。


我們構建了Cortex來提供此功能,並決定在Go語言中進行編寫,有以下幾個原因:


誰能取代Python?我使用Go來部署機器學習模型的原因

1.基礎設施社區已經接受了Go


我們是軟件工程師而不是數據科學家,之所以加入機器學習,是因為想要構建Gmail的智能編寫之類的功能,而不是因為對反向傳播著迷。


我們希望有一個簡單的工具,能夠採用經過訓練的模型並自動實現所需的所有基礎設施(例如可複製的部署,可擴展的請求處理,自動監視等),從而將其部署為API。


儘管還不存在多合一的模型到微服務平臺,但我們之前已經在普通軟件中實現了所有這些功能。我們知道哪種工具最適合這份工作,以及用什麼語言編寫。


構建Kubernetes,Docker和Terraform等工具的團隊使用Go,是因為它運行很快,可以很好地處理併發程序。它編譯為單個二進制文件。選擇Go風險相對較低,其他團隊也在使用Go來解決類似的問題。


此外,用Go編寫可以使基礎架構工程師(他們可能已經熟悉該語言)工作起來更容易。


誰能取代Python?我使用Go來部署機器學習模型的原因

2.在Go中構建跨平臺的CLI更容易


我們希望CLI在Linux和Mac上均可使用。最初,我們嘗試用Python進行編寫,但是用戶總是很難讓它在不同的環境中工作。當在Go中重建CLI時,可以將其編譯為單個二進制文件,可以在各個平臺上發佈,而無需做太多工程工作。


編譯後的Go二進制代碼與解釋型語言相比,其性能優勢也很明顯。根據計算機語言基準測試遊戲,Go運行得比Python快得多。


因此用Go編寫許多其他基礎結構CLI(例如eksctl,kops和Helm客戶端)也並非偶然。


誰能取代Python?我使用Go來部署機器學習模型的原因

3.Go解決了與併發和調度相關的問題


管理部署需要許多服務同時並準確地運行。幸運的是,Goroutines,channels和Go的內置計時器和週期性計時器為併發和調度提供了一種巧妙的解決方案。


在較高的層次上,Goroutine是一個正常函數,Go通過在虛擬的獨立線程上執行來同時運行。多個Goroutine可以安裝在單個OS線程上。channels允許Goroutine共享數據,而內置計時器和週期性計時器允許部署Goroutine。


誰能取代Python?我使用Go來部署機器學習模型的原因

圖源:unsplash


我們在需要時使用Goroutines來實現併發(例如當Cortex需要將多個文件上傳到S3,而且並行運行將節省時間),或使可能長時間運行的功能(例如CloudWatch的流日誌)不會阻塞主線程。


此外,在Goroutines中使用計時器和代碼來運行Cortex的自動縮放器。筆者已經撰寫了一份完整的報告,關於如何在Cortex中實現副本級自動縮放,更簡略的版本是Cortex計算排隊和進行中的請求數,計算每個副本應處理的併發請求數,並適當地擴展。


為此,Cortex的監視功能需要以一致的間隔執行。Go的調度程序可確保其按預期進行監視,而Goroutines允許每個監視功能並行獨立地執行每個API。


在Python中實現所有這些功能可以使用asyncio之類的工具。但是,Go讓事情變得簡單,這對我們來說非常有益。


誰能取代Python?我使用Go來部署機器學習模型的原因

4. Go有助於建立可靠的基礎架構


最後一點,Go可以幫助實現Cortex最重要的功能:可靠性。


可靠性在所有軟件中都非常重要,但是對於推理基礎架構來說絕對至關重要。Cortex中的漏洞可能會嚴重影響推理程序。


誰能取代Python?我使用Go來部署機器學習模型的原因

圖源:unsplash


雖然我們對每個發行版都進行了全面的測試,但是Go的靜態類型和編譯步驟可以初步防止漏洞。如果存在嚴重的漏洞,則很有可能在編譯期間被捕獲。對於一個小團隊來說非常有幫助。


Go對於漏洞零容忍的特性可能使它比Python更難入門,但是這些內部防護欄是第一道防線,它們有助於避免愚蠢的錯誤。


誰能取代Python?我使用Go來部署機器學習模型的原因

使用Python編寫腳本,使用Go進行基礎架構


Python對我們來說仍然是很重要的,它在Cortex中佔有一席之地,尤其是在模型推斷方面。


Cortex支持將Python用於模型服務腳本。我們編寫的Python將模型加載到內存中,進行推理前/後處理,並處理請求。但是,即使是Python代碼也被打包到了Docker容器中,這些容器由Go編寫的代碼進行編排。


誰能取代Python?我使用Go來部署機器學習模型的原因

圖源:unsplash


Python仍然是數據科學和機器學習工程中最受歡迎的語言。但在機器學習基礎架構方面,Go是更好的選擇。事實上,除了Python之外,還有更多工具可以生產機器學習系統,等待我們去發現和嘗試。


誰能取代Python?我使用Go來部署機器學習模型的原因

留言點贊關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範


分享到:


相關文章: