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

AI前線發表於2018-01-04

本文由 【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 儲存中獲取物件:

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

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

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

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

trainer-script.sh:

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

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

+---your-s3-bucket
|   \---trainer-script.sh
|   \---training-config.json
|   \---lambda-config.json
複製程式碼

然後進入下一步。

準備好 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 parris
$ virtualenv -p python3 env
$ source env/bin/activate
(env) $ pip --version
pip 9.0.1 from .../env/lib/python3.6/site-packages (python 3.6)
(env) $ pip install -r requirements.txt
複製程式碼

Windows:

$ git clone https://github.com/jgreenemi/parris.git && cd parris
$ virtualenv -p python3.exe env
$ env\Scripts\activate
(env) $ pip --version
pip 9.0.1 from ...\python\python36\lib\site-packages (python 3.6)
(env) $ pip install -r requirements.txt
複製程式碼

如何使用?

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

常見問題

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

貢獻者

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

聯絡方式

Joseph Greene, jgreenemi@gmail.com

關注後回覆「AI」你懂的


相關文章