標籤:

機器學習演算法自動訓練工具Parris,消除你重複建堆棧的煩惱

本文由 【AI前線】原創,推薦閱讀:t.cn/RHNgd73

作者|Joseph Greene

編輯|Emily

AI 前線導讀:「近日,有人嫌一遍又一遍地建立堆棧太麻煩,於是在 Reddit 上推出了一個開源工具 Parris,它能夠幫助開發人員自動訓練機器學習演算法。留言中很多人盛讚這個工具幫助他們省去了耗費在與機器學習主要目標無關的繁瑣工作上的時間。開源的貢獻者也表示,這個工具能夠幫助開發者不必將時間耗費在架構分配和設置、數據收集、數據清理 / 標籤,和文檔記錄等事務上。」

此工具的最大意義——節省成本

那麼,這個工具可以對新入門 AI 的小夥伴有什麼幫助呢?此開源工具的貢獻者在 Reddit 留言中對這一問題做了詳盡的回答:

長話短說,這個工具可以讓您利用雲資源(目前的版本只使用 AWS,但是未來的版本中將加入 GCP 、Azure 等),並且減少時間成本。考慮到我們在機器學習相關的工作上把太多的時間浪費在與演算法無關的事情上,比如架構分配和設置、數據收集、數據清理和標記,日誌記錄等,我們創建了這個工具,只需點擊按鈕即可以開始訓練演算法的全過程。

詳細來說,當您入門機器學習演算法時,第一件引起您注意的事,將是您究竟花費了多長時間來完成演算法的運行。在運行監督式學習演算法時,我們至少需要一個經過整理的標籤數據集、訓練數據集的演算法、運行訓練的架構(可能需要數小時、數天,甚至數周,取決於具體工作),以及包括安裝操作系統、GPU 驅動程序,和項目相關基礎框架的設置。Parris 工具使用的是在 AWS 賬戶中的 CloudFormation 模板,因此我們僅需按下按鈕,或運行一個 CLI 命令即可啟動訓練,包括所有伺服器設置和相關項安裝,並在完成訓練之後自動終止。此外,還可以設置伺服器自動停止的時間,無論訓練是否完成。

另外,實際運行訓練(工作中計算量最大的部分)花費的時間很大程度上取決於硬體設備(假設您的代碼已經做過優化並可高效運行)。使用 GPU 時,許多實踐者(無論是學生、業餘愛好者還是專業人員)要麼必須購買 NVIDIA Titan V 用來存儲數據,要麼只在 CPU 上進行訓練。當然,這不是個二選一的問題,因為雲就是為了這個目的而存在的。這種情況下,雲服務提供商的計算能力可以很好地解決這個問題,只需要花錢買下服務時間,就可以獲得滿足需求的虛擬化伺服器配置。當然,這並不是完美的解決方案,例如,GPU 支持的 AWS 雲服務價格相當昂貴,p3.2xlarge 的服務每月的價格就在 2000 美元以上。當然,市面上也有一些較便宜的伺服器(例如,不需要 GPU 時,我有時會使用 c5.4xlarge,這樣成本會控制在每月 497 美元)。但這僅是雲提供商的問題,在項目啟動之前,您還需要未雨綢繆,了解所有需要的東西。

儘管使用雲資源意味著您不需要為您的項目架設一個伺服器,但設置仍然是一件讓人頭疼的事。這就是這個工具發揮作用的地方:它可以自動啟動伺服器,安裝需要的相關項,載入演算法和訓練集,運行訓練,並在完成時自動終止。由於訓練腳本本身和訓練配置文件取決於個人的工作需求,所以還需要做大量的工作才能啟動訓練。但是,如果您已經有了訓練演算法的腳本,那恭喜您,使用這個工具之前所需要做的大部分工作已經完成了,而您只需要將它輸入,作為 trainer-script.sh 文件的一部分。

如果您是剛入門的新手,只有在完成第一個項目之後,此工具才會對您有所幫助,因為您無法在沒有進行過任何訓練的情況下使用這個工具。演算法和數據集準備就緒後,入門指南會告訴您下一步怎麼做。

請注意,我在示例中引用了一些昂貴的雲服務費用數據,但實際上我並沒有經常使用這些服務,這些成本意在於建立大家「在最壞的情況下」服務成本的意識,以提醒大家忘記關閉服務會導致什麼樣的後果。

入門指南:

什麼是 Parris?

Parris 是一個機器學習演算法訓練工具,具有以下功能:

  • 創建 Lambda 函數
  • 在調用 Lambda 函數時啟動 CloudFormation 堆棧
  • 首次啟動訓練時,在堆棧的 EC2 實例運行 UserData 腳本
  • 完成後停止 EC2 實例。

目的:

此工具的主要目的是減少訓練機器學習演算法時重複設置的次數,可以更有效地利用伺服器的計算時間,以節省成本(伺服器一旦啟動即開始訓練,完成時自動停止)。

下面簡單介紹一下使用 Parris 之前需要做的事:

您需要一個準備好,帶有數據集的機器學習演算法,和一個啟動訓練所需的 Bash 腳本。

0:準備好 Configs

在設置完成之後,您主要要做的事是編輯 traing-config.json 配置文件,以及實際運行訓練的 trainer-script.sh 腳本。由於是第一次設置,您需要設置 Lambda-config.json 配置文件。(這應該不難,因為只有兩行,其中一行是可選的。)

我在示例中使用的是我在 Github 上的一個存儲庫來進行基本訓練,可以讓您對其有一個簡單的了解。除了像 IAM role ARN 值和 S3 存儲名稱這樣的具體事項之外,其他的無需更改。

訓練配置:

  • 將您的子網 ID 更改為您的其中一個子網的 ID。(請確保您已經為 AWS 賬戶設置了 VPC、子網、安全組和 EC2 密鑰對。如果是第一次使用 AWS,您的賬戶中應該有一些可用的默認資源。)
  • 將您的安全組標識更改為 VPC 中的安全組。
  • 將您的 ec2-keypair-name 更改為自己的 EC2 密鑰對。
  • 將您的實例類型更改為 t2.micro 或另一種小型實例類型。

lambda-config.json:

  • 將 lambda-role-arn 更新為自己的 IAM role ARN 值。(如果不知道這是什麼,請查看「Lambda IAM role 指南」,以下是一個可以使用的示例。

在設置 IAM role 時,您需要將一個 policy(或多個 policy)添加到 role,以定義 Lambda 函數可以訪問的所有內容。我使用以下示例,讓 Lambda 函數可以啟動新的 CloudFormation 堆棧,從 S3 存儲中獲取對象:

{n "Version": "2012-10-17",n "Statement": [n {n "Sid": "VisualEditor0",n "Effect": "Allow",n "Action": [n "cloudformation:CreateStack",n "cloudformation:UpdateStack",n "cloudformation:ValidateTemplate",n "ec2:DetachVolume",n "ec2:AttachVolume",n "ec2:ModifyVolume",n "ec2:ModifyVolumeAttribute",n "ec2:DescribeInstances",n "ec2:TerminateInstances",n "ec2:DescribeTags",n "ec2:CreateTags",n "ec2:DescribeVolumesModifications",n "ec2:RunInstances",n "ec2:StopInstances",n "ec2:DescribeVolumeAttribute",n "ec2:CreateVolume",n "ec2:DeleteVolume",n "ec2:DescribeVolumeStatus",n "ec2:StartInstances",n "ec2:DescribeVolumes",n "ec2:ModifyInstanceAttribute",n "ec2:DescribeInstanceStatus",n "s3:GetObject"n ],n "Resource": "*"n }n ]n}n

我強烈推薦(不是必須)制定一個允許 Lambda 寫入 CloudWatch 日誌的 policy,因為它可以讓您在 Lambda 函數出現問題時讀取日誌,以了解發生的故障。以下是我在一個 policy 中的所有 CloudWatch 寫入許可權:

{n "Version": "2012-10-17",n "Statement": [n {n "Sid": "VisualEditor0",n "Effect": "Allow",n "Action": [n "logs:DeleteSubscriptionFilter",n "logs:DeleteLogStream",n "logs:CreateExportTask",n "logs:DeleteResourcePolicy",n "logs:CreateLogStream",n "logs:DeleteMetricFilter",n "logs:TagLogGroup",n "logs:CancelExportTask",n "logs:DeleteRetentionPolicy",n "logs:GetLogEvents",n "logs:AssociateKmsKey",n "logs:FilterLogEvents",n "logs:PutDestination",n "logs:DisassociateKmsKey",n "logs:UntagLogGroup",n "logs:DeleteLogGroup",n "logs:PutDestinationPolicy",n "logs:TestMetricFilter",n "logs:DeleteDestination",n "logs:PutLogEvents",n "logs:CreateLogGroup",n "logs:PutMetricFilter",n "logs:PutResourcePolicy",n "logs:PutSubscriptionFilter",n "logs:PutRetentionPolicy"n ],n "Resource": "*"n }n ]n}n

最後,我們需要建立 trainer-script.sh,並開始運行訓練。這部分最好全部由自己編寫,因為各自演算法的依賴性和推導出訓練結果的方法總是不盡相同的。

trainer-script.sh:

滾動到編輯區,在該行下方添加完整的訓練腳本。請記住,由於訓練腳本是在新的伺服器上啟動,因此在啟動訓練工作之前,需要完成所有依賴關係、目錄結構等設置。

這些完成之後,就差不多可以使用這個工具了!如果您在 lambda-config.json 中沒有使用 s3-training-bucket 值,請繼續下一步。如果您使用 S3 存儲來載入您的配置,則需要將以下文件載入到您的 S3 存儲中,結果如下(如無子目錄或不同文件名):

+---your-s3-bucketn| ---trainer-script.shn| ---training-config.jsonn| ---lambda-config.jsonn

然後進入下一步。

準備好 Lambda 函數

在訓練開始之前,需要 Lambda 配置來啟動這個過程。在此步驟中,您需要創建一個 AWS Lambda 函數,用於同一演算法的多次訓練或多個不同演算法的訓練。

  • 在 Parris 軟體包的根目錄下,激活您的 virtualenv。
  • 使用 $ python setup.py 創建 Lambda 函數。
  • 如果您已經有 Lambda 函數,將更新代碼包。
  • 如果一切順利,日誌將出現一個 ARN 值進行確認。

啟動第一次訓練

  1. 打開 AWS 控制台並進入到您的 Lambda 函數。
  2. 點擊頁面頂部的「測試」按鈕,手動調用該功能。如果沒有配置測試,您需要:
  • 在「測試」按鈕旁邊的「保存的測試事件」下拉列表中,單擊「配置測試事件」,創建一個新的測試事件。
  • 由於 Lambda 函數只有一個活動(當它被調用時啟動一個新的 CloudFormation 堆棧),我們不需要傳遞任何參數。
  • 使用事件名稱 Parris-Test-Event 和{}創建一個測試。點擊保存。
  • 在關閉創建對話框後,點擊下拉菜單中的新測試事件測試,並觀測更新執行結果。

函數運行時,會得出「成功」的執行結果,並輸出{}。

切換到 AWS 控制台的 CloudFormation 視圖,觀察新的 CloudFormation 堆棧啟動。這個步驟應該只需要一兩分鐘,但取決於啟動 instance 的類型。

切換到 AWS 控制台的 EC2 實例視圖,查看最新結果。很快地,訓練工作將開始啟動。

得到訓練結果

訓練結果很大程度上取決於我們如何設置保存結果參數的演算法。在大多數情況下,這些結果將被保存到本地目錄(即伺服器上的某個地方,可能與正在進行訓練的位置相同)。但是,訓練結束後,我們希望將這些內容導出到可以更長久保存的位置。

終止 CloudFormation Stack

現在,您已經成功創建了 CloudFormation 堆棧,並確認其可以按預期運行。我們可以安全地終止這個過程以節省成本。

  1. 打開 AWS 控制台並進入 CloudFormation 視圖。
  2. 從列表中選擇您啟動創建的 CloudFormation 堆棧。
  3. 點擊頁面頂部的操作下拉菜單,點擊刪除堆棧。
  4. 觀察堆棧的事件選項卡(頁面底部)跟蹤其進度,刷新頁面添加新事件。
  5. 結束時,這個堆棧將從列表中消失。
  6. 更新 Lanbda 函數
  7. 更新訓練 Stack
  8. 在 AWS 之外的設備上啟動訓練

設置:

您需要一個 AWS 賬戶,一個 AWS 證書(通過 $ aws configure 進行設置),一個接受訓練的機器學習演算法,當然還要有一個可以訓練的數據集。您可能還需要一個 S3 存儲器或其他存儲位置來存儲演算法的訓練結果。

UNIX/ Linux:

$ git clone https://github.com/jgreenemi/parris.git && cd parrisn$ virtualenv -p python3 envn$ source env/bin/activaten(env) $ pip --versionnpip 9.0.1 from .../env/lib/python3.6/site-packages (python 3.6)n(env) $ pip install -r requirements.txtn

Windows:

$ git clone https://github.com/jgreenemi/parris.git && cd parrisn$ virtualenv -p python3.exe envn$ envScriptsactivaten(env) $ pip --versionnpip 9.0.1 from ...pythonpython36libsite-packages (python 3.6)n(env) $ pip install -r requirements.txtn

如何使用?

按照「入門指南」中的說明進行設置,為進一步了解該工具,還可以查閱「配置指南」,配合「入門指南」使用。

常見問題

請參閱文檔中的常見問題解答頁面。

貢獻者

此工具是在 Apache 2.0 許可下發布的開源項目。

聯繫方式

Joseph Greene, jgreenemi@gmail.com

關注後回復「AI」你懂的


推薦閱讀:

非凸優化基石:Lipschitz Condition
Python vs R : 在機器學習和數據分析領域中的對比
特徵選擇1:用貝葉斯方法挑西瓜
機器學習系列-隨機過程
機器學習和神經科學:你的大腦也在進行深度學習嗎?

TAG:机器学习 |