我知道許多數據科學家,包括我自己,都通過 Jupyter Notebooks 或某些 Python IDE 在支持 GPU 的計算機上,包括本地或在雲中完成大部分工作。近兩年來,作爲 AI/ML 軟件工程師,我正在做的事情是——在一臺沒有 GPU 的機器上準備數據,然後在雲中使用 GPU 虛擬機做訓練。
另一方面,您可能已經聽說過Azure 機器學習——一個特殊的用於機器學習的平臺服務。但是,如果您開始尋找一些入門教程,您將意識到,使用 Azure 的 ML 會創建很多不必要的開銷,並且這個過程不是很理想。例如,在前面提到的例子中訓練腳本是作爲一個 Jupyter Cell 的文本文件創建的,沒有代碼補全,也沒有任何方便地在本地執行或調試的方式。這些額外的開銷也是我們並沒有在我們的項目中儘可能多的使用它的原因。
不過,最近我發現有一個Visual Studio Code Extension for Azure ML。有了這個擴展,您可以在 VS Code 中直接開發您的的訓練代碼,並在本地運行,然後將相同的代碼提交到集羣上進行訓練,只需點擊幾下按鈕。這樣的方式有幾個重要的優勢:
- 您可以將大部分的時間花在本地機器上,並 僅爲訓練使用強大的GPU資源。訓練集羣可以根據需求自動調整大小,通過將機器的最小量設置爲0,可以根據需要調整 VM。
- 您 將訓練的所有結果 維護在一箇中心位置,包括指標和創建模型——沒有必要爲手工爲每個實驗保留精確度記錄。
- 如果 幾個人在同一項目上工作——他們可以使用同一個集羣(所有實驗將進行排隊),並且可以查看彼此的實驗結果。例如,您可以使用 教室環境中的 Azure ML,創建一個集羣供所有人使用,而不是給每個學生創建一個單獨的 GPU 機器,並促進學生之間爲模型精確度進行競爭。
- 如果您需要進行大量訓練,例如用於 超參數優化 ——所有這些可以通過幾個命令來完成,無需手動運行一系列的實驗。
我希望已經說服您來嘗試一下 Azure ML!下面是如何開始使用的最佳方式:
- 安裝Visual Studio Code, Azure Sign In 和 Azure ML 擴展
- 克隆庫 https://github.com/CloudAdvocacy/AzureMLStarter ——它包含了一些示例代碼來訓練識別 MNIST 數字模型。然後,您可以在 VS Code 中打開該克隆庫。
- 繼續閱讀!
Azure ML 的工作區和門戶
Azure ML 中的一切都圍繞着一個 工作區 進行組織。這是您提交實驗、存儲數據和結果模型的中心位置。還有一個特殊的Azure ML Portal,爲您的工作區提供 Web 界面,從這裏您可以執行很多操作,如監視您的實驗和指標等等。
您可以通過 Azure Portal 的 Web 界面創建一個工作區(可參考步驟說明),或使用 Azure CLI(介紹)。
az extension add -n azure-cli-ml
az group create -n myazml -l northeurope
az ml workspace create -w myworkspace -g myazml
工作區包含了一些 計算 資源。一旦您有了一個訓練腳本,可以 提交實驗 到工作區,並指定 計算目標 ——這將確保實驗在指定的位置運行,並將實驗的所有結果存儲在工作區,以供將來參考。
MNIST 訓練腳本
在我們的示例中,我們將展示如何使用 MNIST 數據集來解決非常傳統的手寫數字識別問題。以同樣的方式,您將能夠運行其他任何訓練腳本。
我們的樣本庫包含簡單的 MNIST 訓練腳本 train_local.py
。這個腳本從 OpenML 下載 MNIST 數據集,然後使用 SKLearn 邏輯迴歸
訓練模型並打印結果精確度:
mnist = fetch_openml('mnist_784')
mnist['target'] = np.array([int(x) for x in mnist['target']])
shuffle_index = np.random.permutation(len(mist['data']))
X, y = mnist['data'][shuffle_index], mnist['target'][shuffle_index]
X_train, X_test, y_train, y_test =
train_test_split(X, y, test_size = 0.3, random_state = 42)
lr = LogisticRegression()
lr.fit(X_train, y_train)
y_hat = lr.predict(X_test)
acc = np.average(np.int32(y_hat == y_test))
print('Overall accuracy:', acc)
當然,我們使用邏輯迴歸僅是爲了作爲示例,並不意味着這是解決這個問題的最好方式……
在 Azure ML 中運行腳本
您可以在本地運行此腳本並查看結果。然而,如果我們選擇使用 Azure ML,會給我們帶來兩大好處:
- 在集中式計算資源上調度和運行訓練,其性能通常比本地計算機更強大。Azure ML 會使用合適的配置將腳本打包到 Docker 容器中。
- 將訓練結果記錄到 Azure ML 工作區內的集中位置。要做到這一點,我們需要將下面的代碼添加到腳本中,用來記錄指標:
from azureml.core.run import Run
...
try:
run = Run.get_submitted_run()
run.log('accuracy', acc)
except:
pass
此腳本修改後的版本被稱爲train_universal.py
(它比上面呈現的代碼更復雜一些),它既可以在本地運行(不使用 Azure ML),也可以運行在遠程計算資源上。
爲了從 VS Code 中將其運行在 Azure ML 上,請遵循這些步驟:
-
確保您的 Azure 擴展連接到您的雲帳戶。選擇左側菜單的 Azure 圖標。如果您沒有連接,您會看到在右下角顯示一個通知以便您連接(見圖)。點擊它,並通過瀏覽器登錄。您也可以按下 Ctrl-Shift-P,將彈出命令面板,輸入 Azure Sign In 進行登錄。
-
然後,您應該能夠在 Azure 欄部分的 MACHINE LEARNING 中看見您的工作區:
在這裏,您會看到工作區中的不同對象:計算資源,實驗等。
-
回到文件列表,並用鼠標右鍵點擊
train_universal.py
並選擇 Azure ML: Run as experiment in Azure。 -
確認您的Azure訂閱和您的工作區,然後選擇創建新實驗:
-
創建新的 Compute 和 compute configuration:
- Compute 定義了用於訓練/推理的計算資源。您可以使用本地計算機或任何雲資源。在我們的示例中,我們將使用 AmlCompute 集羣。請建立 STANDARD_DS3_v2 機器的可擴展羣集,節點配置爲 min=0和max=4。您可以從 VS Code 中,或從ML 門戶中進行配置。
- Compute Configuration 定義遠程資源上創建的用於執行訓練的容器選項。特別是,它指定所有要安裝的庫。在我們的例子中,選擇 SkLearn,並確認庫列表。VS Code 中的 Azure ML 工作區
-
然後您會看到一個窗口,顯示下一個實驗的 JSON 描述。您可以在其中編輯信息,例如改變實驗或集羣名稱,並調整一些參數。當您準備好後,點擊 Submit Experiment:
-
在 VS Code 中成功提交實驗後,您會得到一個鏈接,指向Azure ML 門戶中的實驗進度和結果。
您還可以從 Azure ML 門戶 中的 Experiments 選項卡,或 VS Code 中的Azure Machine Learning 欄找到您的實驗:
-
在您的代碼調整一些參數後,如果要再次運行實驗,這個過程會更快、更容易。用鼠標右鍵單擊您的訓練文件,您會看到一個新的菜單選項 Repeat last run ——只需選擇它,實驗將立即被提交。
然後,您將在 Azure ML 門戶中看到所有運行的指標結果,如上面的截圖所示。
現在您已瞭解,將運行提交到 Azure ML 並不複雜,而且一些功能(如從您的運行、模型等存儲所有的統計數據)是免費的。
您可能已經注意到,對我們的示例來說,在集羣上運行腳本所花費的時間比本地運行要長——它甚至可能需要幾分鐘。當然,還有一些開銷,如將腳本和所有環境打包到容器中,並將其發送到雲端。如果羣集被設置爲自動縮放到0節點——可能還會有一些額外的開銷,如虛擬機的啓動,並且當這個示例腳本小到僅需要幾秒鐘來執行的時候,這些開銷都是顯而易見的。然而,在現實的場景中,當訓練需要幾十分鐘,有時甚至更多的時候——這種開銷變得幾乎不再重要,尤其是對從集羣中獲得的速度提升來說。
下一步是什麼?
現在您已經瞭解瞭如何將腳本提交到遠程羣集上來執行,可以開始在您的日常工作中使用 Azure ML了。您可以在普通 PC 上開發腳本,然後在 GPU 虛擬機或集羣上自動計劃執行,並在一個地方保存所有的結果。
不過,使用 Azure ML 不僅僅只有這兩個優勢。Azure ML 也可用於數據存儲和數據集處理——使用不同的訓練腳本來訪問相同的數據會更加方便。另外,您還可以通過 API 自動提交實驗、改變參數——從而進行一些超參數優化。此外,Azure ML 中內置的稱爲Hyperdrive的特定技術,能夠進行更聰明的超參數搜索。我將在下一篇文章中討論這些功能和技術。
原文鏈接: