為什么我用Go寫機器學習部署平臺,而偏偏不用Python?
雖然在機器學習中,Python已經無孔不入。但Python并不是全能之神手中的魔杖可以為所欲為。很多情況下其實用Python的效果并不如其他語言,比如Go更好,甚至可能更糟。本文介紹了為什么在作者的工作環境下選擇Go而非Python的理由,引發社區關注和熱議。
編程語言就是一個江湖,永遠有人覬覦霸主的位子。
Python如今卻穩坐編程語言界的霸主,尤其是在機器學習領域,所有主流機器學習框架都在用Python。
然而即使是被絕大多數人認可的Python,也并非真的無所不能,也有讓其無能為力、無中生有的情況。
Python引以為豪的機器學習算法,只是機器學習系統的一個組成部分。要實際大規模運行生產機器學習API,還需要實現以下功能的基礎架構:
自動縮放,以便流量波動不會破壞您的APIAPI管理,以處理的API部署滾動更新,以便您可以在更新模型的同時仍為用戶提供服務
對于像Cortex這樣的開源機器學習部署平臺,旨在使所有這些基礎架構自動化,以及日志記錄和成本優化等其他方面的關注,作者Caleb Kaiser認為相比Python而言,Go更合。
相比于出身寒門、一個應屆生的圣誕節無聊之作的Python,Go語言出自Google,作者是三位宗師級人物:Rob Pike、Ken Thompson 和 Robert Griesemer。在以下方面超越了Python:
并發對于機器學習基礎架構至關重要
用戶可以將許多不同的模型部署為不同的API,所有模型都在同一個Cortex集群中進行管理。
為了讓Cortex Operator能夠管理這些不同的部署,需要糾纏一些不同的API。
Cortex調用Kubernetes API在集群上部署模型;同時也需要考慮各種AWS API(EC2 Auto Scaling,S3,CloudWatch等)
用戶不會直接與任何這些API進行交互,取而代之的是,Cortex以編程方式調用這些API來供應集群,啟動部署和監視API。
以一種有效,可靠的方式進行所有這些重疊的API調用是一個挑戰。
同時處理它們是最有效的處理方式,但同時也引入了復雜性,因為現在我們不得不擔心諸如競賽條件之類的事情.Go有一個優雅的,開箱即用的解決方案來解決這個問題:Goroutines。
Goroutines是正常的Go并發執行的功能。許多Goroutine可以放在一個OS線程上,如果Goroutine阻塞了OS線程,則Go運行時會自動將其余Goroutines移至新的OS線程。
Goroutines還提供了一個稱為“通道”的功能,允許Goroutines執行在彼此之間傳遞消息,使我們能夠調度請求并避免出現競爭情況。
使用asyncio等最新工具在Python中實現所有這些功能可能是可行的,但是Go的設計充分考慮了這種用例,這一事實使我們的生活變得更加輕松。
在Go中構建跨平臺CLI更容易
Cortex CLI是一種跨平臺工具,允許用戶直接從命令行部署模型和管理API。
下面的GIF顯示了正在使用的CLI:
事實證明,Python編寫的CLI嘗試在各種平臺之間分發太困難了。
因為Go可以編譯成一個二進制文件(不需要依賴管理),所以它為我們提供了一個在平臺之間分發CLI的簡單解決方案,而無需進行過多的工程工作。經過編譯的Go二進制文件和解釋型語言的性能優勢也很明顯。
根據計算機基準測試游戲,Go的運行速度比Python快得多。許多其他基礎結構CLI工具都是用Go編寫的,這并非巧合,這使我們進入了下一步。
Go生態系統非常適合基礎設施項目
開源的好處之一是,您可以從自己欣賞的項目中學習。 例如,Cortex存在于Kubernetes(本身用Go編寫)生態系統中。 我們很幸運能夠在該生態系統中學習到許多出色的開源項目,其中包括:
- kubectl:Kubernetes的CLI
- minikube:一種在本地運行Kubernetes的工具
- helm:Kubernetes程序包經理
- kops:用于管理生產Kubernetes的工具
- eksctl:Amazon EKS的官方CLI
以上所有內容都是用Go語言編寫的,而不僅僅是Kubernetes項目。
無論你是在看CockroachDB還是Hashicorp的基礎設施項目,包括Vault,Nomad,Terraform,Consul和Packer,它們都是用Go編寫的。
Go在基礎設施領域的流行還有另一個影響,這就是大多數工程師都感興趣!在基礎架構方面工作的人對Go很熟悉,這使得吸引工程師更加容易。
用Go是一種樂趣
相對于Python,Go入門起來有點痛苦,但這是指暫時的。一旦你跨越了門檻,進入Go的世界里,你會發現簡直是“一馬平川”。
Go寬容的性格使它對于大型項目而言如此令人愉悅。
除此以外,相比Python,Go的優勢還體現在:
- 擁有非常棒的編譯器,編譯器可以檢測出你犯的所有低級錯誤
- 更好的并行性。Go 語言就是為并行而生的
- 部署簡單。代碼所需要的所有依賴都在一個二進制文件里
- 風格一致。格式化工具會讓所有代碼風格都保持一致
- 更便捷的工具。一個編輯器+插件滿足幾乎所有需求,都不需要IDE
適用于機器學習的Python,適用于基礎架構的Go
Cortex服務于TensorFlow,PyTorch,scikit-learn和其他Python模型,這意味著與這些模型的接口以及推理前后的處理,用Python完成。
但是,即使將Python代碼打包到了Docker容器中,這些容器都是用Go語言編寫的代碼精心編排的。如果你有興趣成為一名機器學習工程師,那么了解Python是必須的。
但是,如果你對使用機器學習基礎結構感興趣,則應認真考慮使用Go。