「工具人」何必徹夜守候,SageMaker 幫你靈活排程 Notebook

AWS_AI開發者社群發表於2020-12-09

image

星期五下午五點,你終於趕在下班前搞定了一個複雜、繁瑣的特徵工程策略。這個策略在Amazon SageMaker Studio t3.medium Notebook上已經開始工作,你想做的是插入這個策略到一個大型例項中,通過水平擴充套件將其覆蓋剩餘資料集,然後開始週末的Happy hour。

然而……雖然可以直接升級Notebook例項,但只要一關閉電腦,這項作業馬上就會停止。怎麼辦?作業執行期間一直守在電腦前?為什麼不直接從Notebook排程作業呢?

Amazon SageMaker提供了一套全託管式解決方案,可用於構建、訓練以及部署各種機器學習(ML)模型。在本文中,我們將演示如何使用Amazon SageMaker Processing Jobs配合開源專案Papermill執行Jupyter Notebook。Amazon SageMaker與Amazon CloudWatchAWS Lambda以及整個AWS棧的結合,向我們提供了實時和按計劃擴充套件作業所需模組化骨幹,比如像特徵工程這樣的作業。我們很高興提供了一款DIY工具箱簡化整個流程,使用AWS CloudFormation設定許可權,使用Lambda啟動作業,並使用Amazon Elastic Container Registry (Amazon ECR)建立自定義執行環境。它還包含一套類庫與CLI(命令列執行工具),可用於從任意AWS客戶端初始Notebook執行,外加一款用於提供無縫化使用者體驗的Jupyter外掛。

截至本文撰稿時,大家已經可以在Jupyter notebook中編寫程式碼,並一鍵立即或按計劃將其執行在Amazon SageMaker臨時例項上。使用本文提供的工具,大家將可以從任何下列地方執行這個操作:在Shell提示符下、在Amazon SageMaker的JupyterLab中、在自己的另一個JupyterLab環境中,或者在編寫的程式中自動完成。我們也提供了相關示例程式碼,藉此簡化使用AWS CloudFormation處理繁重的設定過程,並提供了簡便的工具執行和監控整套系統的執行情況。

關於執行Notebook的更多詳細資訊,請參見GitHub repo。GitHub上的aws-samples提供了所有示例原始碼。下面,將介紹如何使用排程的Notebook執行。

何時使用這套解決方案

這套工具箱特別適合執行夜間報告類作業。例如,我們可能需要分析資料科學團隊當天已經完成的所有訓練工作,進行成本/收益分析,並生成一份模型被部署到生產環境後即將帶來的業務價值報告。這類用例就完美適合使用排程的Notebook—— 所有圖形、表格與圖表都將由程式碼自動生成,像我們自己逐步除錯Notebook一樣,不過現在它們將被自動處理,此外結果被持久儲存在Amazon Simple Storage Service (Amazon S3)當中。我們可以使用昨夜執行後的最新Notebook開始新一天的工作,推動分析能力的發展。

或者,設想想縱向擴充套件特徵工程。你已經完成了for迴圈來執行全部Pandas轉換,接下來需要的是時間和將其執行在全部20GB資料上的算力。沒問題 —— 只需要把Notebook放入工具箱內、執行一個作業、關閉Notebook,然後一切就搞定了。無論當前是否在主動使用Jupyter,程式碼都會持續執行在排程的例項上。

或許,你所在的資料科學團隊可能仍然在本地Notebook或者Amazon SageMaker notebook上訓練模型,且尚未採用Amazon SageMaker臨時例項執行訓練作業。使用這套工具箱,我們可以在模型訓練期間輕鬆使用高階計算選項。我們可以為一個小時的模型訓練啟動一臺p3.xlarge例項,但在全天使用可負擔得起的t3.medium例項執行Studio環境。我們可以通過幾行程式碼輕鬆將這些資源接入Experiments SDK。雖然完全支援在p3例項上執行Amazon SageMaker notebook與Amazon SageMaker Studio,但是養成一個僅短期使用最大型例項的習慣是一種節約成本的重要實踐。

你可能還有一個裝滿了物件的S3儲存桶,而且需要在每個物件上執行一個完整的Notebook。這些物件可能是呼叫中心內的電話記錄日期,或是社交網路中特定使用者的推文流。無論如何,我們可以使用這個工具箱輕鬆為這些物件編寫for迴圈,由該工具箱為各個檔案排程作業,在其專用例項上執行該作業,並儲存完成的Notebook在Amazon S3當中。這些甚至可以是從我們喜歡的訓練環境中載入的模型構件 — 打包推理程式碼到Notebook當中,然後使用這個工具箱輕鬆部署。

最後,客戶還向我們反映報告模型的執行效能是對於各利益攸關方的一個重要資產。使用這款工具箱,我們可以施行起一套人工參與的解決方案,該解決方案可以分析特徵重要性、生成ROC曲線,並評估模型在對最終產品很重要的各類極端情況下是如何表現。我們還可以構建一款模型分析器,供團隊中的所有資料科學家輕鬆訪問。我們可以在每一項訓練作業完成後觸發此模型分析器,並在將分析值傳送給各利益攸關方之後結束整個迴圈。

在SageMaker中執行排程Notebook的三種方式

要在Amazon SageMaker中執行Notebook,我們可以使用Lambda函式以配置並執行Amazon SageMaker Processing作業。該函式可直接由使用者呼叫,或者作為目標被新增至Amazon EventBridge規則中以按計劃或通過事件響應的方式執行。要執行的Notebook被儲存為Amazon S3物件,因此即使我們不線上,當執行發生時這些Notebook仍然可以正常執行。下圖展示了這個架構。
image

接下來,我們概述了三種不同的安裝和使用此功能的方法,這些功能允許我們以所需方式處理Notebook和排程。

使用AWS API或者直接使用CLI

我們可以直接使用AWS API以執行並排程Notebook。為簡化流程,我們提供一套CloudFormation模板以配置需要的Lambda函式,同時提供執行Notebook所需要的AWS身份與訪問管理(AWS Identity and Access Management,簡稱IAM)角色及策略。我們還提供相關指令碼,用於構建及定製在執行Notebook時Amazon SageMaker Processing作業使用的Docker容器映象。

在對CloudFormation模板進行例項化並完成容器映象建立之後,可以使用以下程式碼執行一個Notebook:

$ aws lambda invoke --function-name RunNotebook 
 --payload '{"input_path": "s3://mybucket/mynotebook.ipynb", 
 "parameters": {"p": 0.75}}' result.json

要建立排程,請輸入以下程式碼,請注意替換Region(區域)與賬戶編號部分的arn,並替換input_path指向自己的S3儲存桶。

$ aws events put-rule --name "RunNotebook-test" --schedule "cron(15 1 * * ? *)"
$ aws lambda add-permission --statement-id EB-RunNotebook-test 
 --action lambda:InvokeFunction 
 --function-name RunNotebook 
 --principal events.amazonaws.com 
 --source-arn arn:aws:events:us-east-1:123456789:rule/RunNotebook-test
$ aws events put-targets --rule RunNotebook-test 
 --targets '[{"Id": "Default", 
 "Arn": "arn:aws:lambda:us-east-1:123456789:function:RunNotebook", 
 "Input": "{ "input_path": "s3://mybucket/mynotebook.ipynb", 
 "parameters": {"p": 0.75}}"}]‘

通過這種方式,即可將Notebook移動至Amazon S3,監控Amazon SageMaker Processing作業,並從Amazon S3提取輸出的Notebook。

如果是經驗豐富的AWS使用者,希望在不涉及額外依賴項的前提下構建解決方案,那麼這套方案可以說是一套了不起的解決方案。我們甚至可以修改自己編寫的Lambda函式或者Papermill執行容器,來滿足更多具體需求。

關於使用AWS API進行排程Notebook的更多詳細資訊,請參閱GitHub repo上的完整配置說明。

使用便捷工具箱簡化整個流程

為了進一步簡化排程Notebook(尤其當我們不是AWS專家時),AWS還開發出一套便捷的工具箱,封裝AWS工具成為CLI和Python庫,為我們提供更自然的執行和排程Notebook的介面。這款工具箱讓我們可以通過AWS CodeBuild構建自定義執行環境,而不必使用Docker,同時管理並監控Amazon S3互動與作業。

在設定執行完成後,使用以下程式碼執行Notebook:

$ run-notebook run mynotebook.ipynb -p p=0.5 -p n=200

使用以下程式碼進行排程Notebook:

$ run-notebook schedule --at "cron(15 1 * * ? *)" --name nightly weather.ipynb -p "name=Boston, MA"

這款便捷工具箱還包含用於監控作業及檢視當前排程的工具,具體參見以下程式碼:

$ run-notebook list-runs
Date Rule Notebook Parameters Status Job
2020-06-15 15:31:40 fraud-analysis.ipynb name=Tom Completed papermill-fraud-analysis-2020-06-15-22-31-39
2020-06-15 01:00:08 DailyForecastSeattle DailyForecast.ipynb place=Seattle, WA Completed papermill-DailyForecast-2020-06-15-08-00-08
2020-06-15 01:00:03 DailyForecastNewYork DailyForecast.ipynb place=New York, NY Completed papermill-DailyForecast-2020-06-15-08-00-02
2020-06-12 22:34:06 powers.ipynb p=0.5 Completed papermill-powers-2020-06-13-05-34-05
 n=20
$

關於這款便捷工具箱的更多詳細資訊,請參閱GitHub repo

使用GUI通過JupyterLab直接執行Notebook

如果更偏好互動體驗,便捷工具箱還提供JupyterLab擴充套件,可供大家在本地JupyterLab、Amazon SageMaker Studio或Amazon SageMaker notebook例項當中使用。
image

為Amazon SageMaker Studio使用者設定Jupyter擴充套件後,會看到新的Notebook執行側邊欄(火箭飛船圖示)。此邊欄讓我們執行或排程正在檢視的Notebook。我們可以使用預設設定建立的notebook-runner容器,或者構建的其他容器。輸入這些作業用到的和例項需要的執行角色的ARN,就準備好走下一步了。

在選擇Run Now後,Lambda函式會選取Notebook並將其執行在一個Amazon SageMaker Processing作業之上。這時,我們可以選擇Runs以檢視該作業的狀態,詳見以下截圖。
image

作業完成後,完成的Notebook將儲存在Amazon S3當中。請注意,這意味著之前的執行仍將持久化,所以我們可以輕鬆恢復它們。

最後,選擇View Output與Import Notebook匯入輸出Notebook。如果沒有匯入Notebook,則其永遠不會被複制至本地目錄。這樣設計很棒,當我們想檢視什麼在發生時,但是不想生成太多額外的Notebook時,就可以這樣做。
image

關於設定JupyterLab擴充套件以及使用GUI執行並監控Notebook的更多說明資訊,請參閱GitHub repo
總結

本文討論瞭如何將Amazon SageMaker與AWS雲的模組化功能結合起來,藉此為資料科學家及機器學習工程師們在臨時例項上提供無縫化的Notebook執行體驗。我們還發布了一款開源工具箱以進一步簡化整個流程,其中包含一個CLI、便捷工具箱以及Jupyter功能部件。

以此為基礎,我們討論了多種用例,從執行夜間報告到擴充套件特徵工程,再到對最新資料集進行模型分析等。我們也分享了執行這款工具箱的多種示例方式。歡迎瀏覽GitHub上的快速入門教程,並在GitHub repo上檢視更多示例。

image

相關文章