

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 步驟 2. 建立執行階段指令碼
<a name="step2"></a>

![建立執行階段指令碼。](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/ml-production-ready-pipelines/images/step2.png)


 在此步驟中，您將您在步驟 1 中開發的模型及其相關聯的協助程式程式碼整合到 ML 平台，以進行生產就緒的訓練和推論。具體而言，這涉及開發執行階段指令碼，以便將模型納入 SageMaker AI。這些獨立的 Python 指令碼包括預先定義的 SageMaker AI 回呼函數和環境變數。它們會在託管在 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上的 SageMaker AI 容器內執行。[Amazon SageMaker AI Python SDK 文件](https://sagemaker.readthedocs.io/en/stable/index.html)提供有關這些回呼和輔助設定如何一起用於訓練和推論的詳細資訊。以下各節根據我們與客戶合作 AWS 的經驗，提供開發 ML 執行階段指令碼的其他建議。

## 使用處理任務
<a name="proc-job"></a>

SageMaker AI 提供兩種執行批次模式模型推論的選項。您可以使用 SageMaker AI *處理任務*或*批次轉換任務*。每個選項都有優點和缺點。

處理任務包含在 SageMaker AI 容器內執行的 Python 檔案。處理任務包含您在 Python 檔案中放置的任何邏輯。它具有以下優點：
+ 當您了解訓練任務的基本邏輯時，處理任務設定簡單且易於理解。它們與訓練任務共用相同的抽象概念 （例如，調校執行個體計數和資料分佈）。
+ 資料科學家和 ML 工程師可以完全控制資料處理選項。
+ 除了熟悉的讀取/寫入功能之外，資料科學家不需要管理任何 I/O 元件邏輯。
+ 在非 SageMaker AI 環境中執行檔案會稍微容易一些，這有助於快速開發和本機測試。
+ 如果發生錯誤，處理任務會在指令碼失敗時立即失敗，而且沒有非預期的等待重試。

另一方面，批次轉換任務是 SageMaker AI 端點概念的延伸。在執行時間，這些任務會匯入回呼函數，然後處理讀取資料、載入模型和進行預測的輸入/輸出。批次轉換任務具有下列優點：
+ 它們使用與訓練任務所使用的抽象不同的資料分佈抽象。
+ 它們使用相同的核心檔案和函數結構進行批次推論和即時推論，這很方便。
+ 它們具有內建的重試型容錯機制。例如，如果一批記錄發生錯誤，它會在任務因失敗而終止之前重試多次。

由於其透明度、在多個環境中的易用性，以及與訓練任務的共享抽象性，我們決定使用處理任務，而不是本指南中介紹的參考架構中的批次轉換任務。

在雲端中部署 Python 執行階段指令碼之前，您應該先在本機執行。具體而言，我們建議您在建構 Python 指令碼和執行單位測試時使用主要防護子句。

## 使用主保護子句
<a name="main-guard"></a>

使用主保護子句來支援模組匯入和執行 Python 指令碼。個別執行 Python 指令碼有助於偵錯和隔離 ML 管道中的問題。建議下列步驟：
+ 在 Python 處理檔案中使用引數剖析器來指定輸入/輸出檔案及其位置。
+ 為每個 Python 檔案提供主要指南和測試函數。
+ 測試 Python 檔案之後，無論您使用的是 AWS Step Functions 模型還是 SageMaker AI 處理任務，請將其納入 ML 管道的不同階段。
+ 在指令碼的關鍵區段中使用 **Assert** 陳述式，以促進測試和偵錯。例如，您可以使用 **Assert** 陳述式，以確保資料集功能的數目在載入後一致。

## 單元測試
<a name="unit-test"></a>

為管道編寫的執行階段指令碼的單元測試是機器學習管道開發中經常忽略的重要任務。這是因為機器學習和資料科學是相對較新的領域，並且採用成熟的軟體工程實務很緩慢，例如單元測試。由於 ML 管道將用於生產環境，因此在將 ML 模型套用至實際應用程式之前，測試管道程式碼至關重要。

測試執行階段指令碼的單元也為 ML 模型提供下列獨特優勢：
+ 它可防止意外的資料轉換。大多數 ML 管道涉及許多資料轉換，因此這些轉換如預期般執行至關重要。
+ 它會驗證程式碼的重現性。透過使用不同的使用案例進行單元測試，即可偵測程式碼中的任何隨機性。
+ 它強制執行程式碼的模組化。單元測試通常與測試涵蓋範圍量值相關聯，這是特定測試套件 （一組測試案例） 執行程式原始碼的程度。為了達到高測試涵蓋範圍，開發人員會模組化程式碼，因為很難撰寫大量程式碼的單元測試，而不將其分解為函數或類別。
+ 它可防止低品質程式碼或錯誤引入生產環境。

我們建議您使用成熟的單元測試架構，例如 [pytest](https://docs.pytest.org/en/stable/) 來撰寫單元測試案例，因為在架構中管理廣泛的單元測試更容易。

**重要**  
單元測試無法保證所有邊角案例都經過測試，但可協助您在部署模型之前主動避免錯誤。我們建議您也在部署之後監控模型，以確保卓越營運。