天天看點

為何我們用 Go 而非 Python 編寫機器學習基礎設施平台?

雲栖号: https://yqh.aliyun.com 第一手的上雲資訊,不同行業精選的上雲企業案例庫,基于衆多成功案例萃取而成的最佳實踐,助力您上雲決策!
為何我們用 Go 而非 Python 編寫機器學習基礎設施平台?

作者 | Caleb Kaiser

譯者 | 劉志勇

AI 前線導讀:Go 又稱 Golang,是 Google 開發的一種靜态強類型、編譯型、并發型且具有垃圾回收功能的程式設計語言。Go 語言于 2009 年 11 月正式宣布推出并開放源代碼,開始在 Linux 及 Mac OS X 平台上進行了實作,後追加 Windows 系統下的實作。大部分用過 Go 語言的人都認可其是一種非常不錯的生産力工具,有人總結其優點如下:部署簡單、并發性好、語言設計良好、執行性能好。Cortex Labs 介紹了團隊為何用 Go 而非 Python 編寫機器學習基礎設施。

Python 是機器學習項目中最流行的語言,就這點而言,應該不會有人提出異議。盡管 R、C++ 和 Julia 之類的語言都有自己的擁趸和用例,但 Python 仍然是 最受歡迎的 程式設計語言,在每個主流的機器學習架構中都能見到它的身影。

最近,我們建構了一個将機器學習模型部署為 API 的開源平台—— Cortex,我們考慮了很久應該如何選擇程式設計語言。最終的結果是代碼庫中有 87.5% 用的是 Go。經過一番比較,我們認為:Python 适用于機器學習,而 Go 适用于基礎設施。

為何我們用 Go 而非 Python 編寫機器學習基礎設施平台?

Python 所擅長的機器學習算法隻是生産機器學習系統的組成部分之一。要實際大規模運作生産機器學習 API,你需要能夠實作如下功能的基礎設施:

  • 可自動伸縮,以便在發生流量波動時不會中斷 API。
  • API 管理,用于處理同時部署的 API。
  • 滾動更新,以便在為使用者提供服務的同時更新模型。

Cortex 的建構旨在自動化實作所有這些基礎設施的功能,以及其他關注點,如日志記錄、成本優化等。Go 是滿足這些因素的理想選擇,原因如下:

1.并發性對機器學習基礎設施至關重要

使用者可以将許多不同的模型部署為不同的 API,所有這些 API 都在同一個 Cortex 叢集中進行管理。為了讓 Cortex Operator 管理這些不同的部署,它需要處理幾個不同的 API。例舉幾個例子:

  • Kubernetes API,Cortex 調用該 API 在叢集上部署模型。
  • 各種 AWS API:EC2 Auto Scaling、S3、CloudWatch 等,Cortex 調用這些 API 來管理 AWS 上的部署。

使用者并不直接與這些 API 中的任何一個進行互動。相反,Cortex 是通過程式設計方式調用這些 API 來進行配置叢集、驅動部署和監控 API 的。

要使所有這些重疊的 API 調用具有可執行性、可靠性是一個挑戰。最有效的處理方式,是對它們進行并發處理,但同時也引入了複雜性,因為現在我們必須考慮競争條件之類的問題。

對于這一問題,Go 有一個優雅的、開箱即用的解決方案:Goroutines。

另外,Goroutines 也是 Go 并發執行的普通函數。我們可以寫一整篇文章來深入探讨 Goroutines 是如何工作的,但從高層次來講,Goroutines 是由 Go 運作時自動管理的輕量級線程。許多 Goroutines 可以放在單個 OS 線程上,如果 Goroutines 阻塞了一個 OS 線程,Go 運作時會自動将其餘的 Goroutines 轉移到新的 OS 線程上。

Goroutines 還提供了稱為“通道”的特性,允許 Goroutines 在它們之間傳遞消息,還允許我們排程請求并防止出現競争條件。

如果要在 Python 中實作所有這些功能,可以用 asyncio 之類的最新工具來實作,但 Go 在設計時就考慮到了這個用例,這點讓我們的工作變得更輕松。

2.用 Go 來建構跨平台的 CLI 更容易

Cortex CLI 是一個跨平台的工具,允許使用者直接從指令行部署模型和管理 API。下面動圖顯示了 CLI 的實際運作情況:

為何我們用 Go 而非 Python 編寫機器學習基礎設施平台?

最初,我們用 Python 編寫 CLI,但事實證明,試圖跨平台進行分發實在是太困難了。因為 Go 可以編譯成單一的二進制檔案,不需要依賴管理,這就為我們提供了一個簡單的解決方案,可以做到跨平台進行分發 CLI,而不需要做太多額外的工程計劃。

與解釋性程式設計語言相比,編譯後的 Go 二進制代碼的性能優勢也非常顯著。根據計算機基準測試的結果來看,Go 要 比 Python 快得多。

許多其他基礎設施 CLI 工具都是用 Go 編寫的,這可能并非偶然,這就引出了我們的下一個問題。

3.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 更容易吸引工程師。事實上,Cortex Labs 最優秀的工程師之一,正是通過尋找 Go 開發崗位時遇到了我們,對此我們感到非常幸運。

4.用 Go 進行工作是一種樂趣

關于為什麼我們最終用 Go 建構 Cortex,我要說的最後一點就是,Go 确實非常不錯。

相對于 Python,Go 入門有點痛苦。然而,Go 的高冷性質使它成為大型項目的樂趣所在。我們仍然對軟體進行嚴格的測試,但靜态輸入和編譯,這兩件事會讓初學者有點不舒服,但這就像是我們的防護欄,幫助我們來編寫(相對)沒有 bug 的代碼。

也許你會認為,可能還有其他語言可以提供某種優勢,但總的來說,Go 最能滿足我們的技術和審美需求。

結束語

我們仍然喜歡 Python,它在 Cortex 中也占有一席之地,尤其是在推理處理方面。

Cortex 為 TensorFlow、PyTorch、scikit-learn 和其他 Python 模型提供服務,這意味着與模型的接口以及推理前後處理都是用 Python 來完成的。然而,即使是 Python 代碼也被打包到 Docker 容器中,這些容器也是由用 Go 語言編寫的代碼進行編排的。

如果你想成為一名機器學習工程師,那麼就必須或多或少了解 Python,這是沒有商量餘地的。但是,如果你對機器學習基礎設施感興趣的話,那麼,你就應該認真考慮使用 Go。

原文釋出時間:2020-01-15

本文作者: Caleb Kaiser

本文來自阿裡雲雲栖号合作夥伴“

AI前線

”,了解相關資訊可以關注“