Categories
程式開發

機器學習本該用起來更簡單


免責聲明:本文內容是基於我對一些機器學習團隊的觀察結果,而不是對這個行業的一份學術調查。利益相關,我需要先表明自己是Cortex項目的貢獻者,Cortex是一個用來在生產中部署模型的開源平台。

為了方便讀者理解,我拿軟件中無處不在的東西為例,比如數據庫。構建一個數據庫是什麼意思呢?對於Postgres的貢獻者來說,“創建一個數據庫”就是要寫一百萬行C代碼。對於Rails開發者來說,這就是rake db:create的操作。顯然,誰都沒錯,它們只是代表了不同的抽象級別,適用於不同的工程師。

這就是軟件構建的方式,為現代應用程序提供支持的基本軟件(數據庫、Web服務器、請求路由器、哈希庫等)都是因為抽象層的存在讓非專業人士也可以輕鬆使用它們。

機器學習歷來缺少這樣的抽象層,這就限制了該技術的普及。但是,情況正在發生變化。新興起的一批項目的關注重點就是讓機器學習的應用變得更容易。

模型需要對開發人員友好的界面

為了在生產中使用機器學習技術,你需要:

  • 了解模型的專業知識
  • 足夠的數據和資金來訓練模型
  • 清楚機器學習基礎架構知識以部署模型

於是,任何動用機器學習的項目都需要多名專家參與,這是客觀存在的瓶頸。但是,開發人員所希望的是即便缺乏機器學習背景,也能在生產中使用該技術,就像沒有密碼學背景的開發人員仍然可以應用哈希庫來保護用戶數據一樣。

幸運的是,這一天終於要到來了。

填補機器學習的抽象層鴻溝

為了讓機器學習的應用廣泛普及,開發人員必須對機器學習有一個高級層面的理解(什麼是模型、微調、推斷等),並使用可用的抽象來構建應用。

許多必要的抽像已經在研究中了,總結起來可歸結為以下重點領域:

需要更簡單的方法來訓練模型

其實,對於許多應用機器學習技術的用例而言,我們並不需要從頭開始訓練新的模型。

例如,如果你正在開發會話代理,則幾乎可以肯定谷歌Meena的表現要優於其他。如果正在開發文本生成器,則可能使用OpenAI的GPT-2,而不是從頭開始構建文本生成器。對於對象檢測用例,YOLOv3之類的模型可能是不錯的選擇。

得益於遷移學習技術,開發人員可以使用相對少量的數據,將這些開源模型微調以用於任務中。

例如,使用gpt-2-simple之類的新庫時,可以使用簡單的命令行界面微調GPT-2:

$ gpt_2_simple finetune your_custom_data.txt

有了這一抽象層,開發人員就不需要深度的機器學習專業知識,他們只需要知道什麼是微調即可。而且,gpt-2-simple不是唯一可用的抽象。谷歌的CloudAutoML為用戶提供了一個GUI,可讓用戶選擇自己的數據集並自動訓練新模型,過程中無需編寫代碼:

image

Sundar Pichai在撰寫關於AutoML的文章時說:“我們希望AutoML具備當下很少幾位PhD才擁有的能力,並在未來三到五年內,讓成千上萬的開發人員能夠為他們的特定需求設計新的神經網絡。”

從模型生成預測的過程必須簡單

讀到這裡,我們可以發現為特定任務獲取經過訓練的模型已經容易多了。接下來的問題是如何根據模型來生成預測?

有一大把項目提供了模型服務(model serving)功能,其中許多都對接了流行的ML框架。例如,TensorFlow具有TF服務,而ONNX具有ONNX運行時。

除了科技巨頭提供的項目外,許多獨立的開源項目正在解決這個問題。例如,Bert Extractive Summarizer是一個可以輕鬆使用谷歌BERT提取文本摘要的項目。以下是其文檔中的示例

from summarizer import Summarizer

body = 'Text body that you want to summarize with BERT'
body2 = 'Something else you want to summarize with BERT'
model = Summarizer()
model(body)
model(body2)

使用這個庫來生成預測非常簡單,只需導入語句並調用Summarizer()即可。這樣的項目數量越來越多,開發人員無需深入挖掘模型本身的細節,也能更輕鬆地從模型生成預測。

部署模型必須簡單

最後的瓶頸是基礎架構。

為應用程序提供預測很簡單,但是當應用程序需要擴展時,事情就會變得很複雜。以GPT-2為例:

  • GPT-2佔用的空間大於5GB。你需要一台更大的服務器(這也意味著價格會更高)來託管這麼大的模型。
  • GPT-2非常消耗計算資源。就為了提供單個預測,GPT-2就能以100%的佔用率吃掉CPU幾分鐘的計算資源。即便使用一顆GPU,單個預測也可能需要幾秒鐘才能完成。相比之下,Web應用可以通過一個CPU為數百個並髮用戶提供服務。
  • GPT-2非常消耗內存。除了巨大的磁盤空間和計算資源需求之外,GPT-2還需要大量內存才能正常運行而不會崩潰。

哪怕是只應對少量用戶,基礎架構也需要擴展應用程序的很多副本,這意味著要使用Docker對模型容器化,使用Kubernetes來編排容器,而且還要在所使用的雲平台上配置自動縮放。

構建一個用於處理機器學習部署的基礎架構需要學習一整套工具,對於大多數缺乏專業背景的開發人員來說,相關知識有很多都是很陌生的:

image

機器學習基礎架構技術棧

為了讓開發人員可以使用機器學習技術,還需要抽像機器學習的基礎架​​構。這就是諸如Cortex之類的項目(利益相關:我是一位貢獻者)的用武之地。

Cortex通過配置文件和CLI抽象了模型部署的底層開發運維工作:

image

資料來源:Cortex Repo

像Cortex這樣的項目的目標很簡單:輸入一個經過訓練的模型,並將其轉變為任何開發人員都可以使用的預測API。

讓機器學習應用起來更加輕鬆

讓我澄清一點,機器學習背後的基礎數學永遠都很困難。沒有人僅僅因為自己可以調用一個predict()函數就能變身機器學習專家。關鍵在於,開發人員並不必成為機器學習專家(或開發運維專家),也可以在他們的應用程序中使用機器學習技術。

機器學習生態系統終於開始將重心放在簡化機器學習的應用難度上了。開發人員只需少量知識就可以微調一個最前沿模型,將其包裝在一個API中,並使用開源且直觀的抽象將其部署在可伸縮的基礎架構上。

這樣一來,機器學習應用將變得更加容易。進一步說,幾乎所有開發人員都可以使用這種技術。

作者介紹:

Caleb Kaiser,Cortex Lab 創始團隊成員,曾在 AngelList 工作,最初在 Cadillac 供職。

原文鏈接:

https://towardsdatascience.com/machine-learning-is-still-too-hard-to-use-e344773725af