

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

# 使用 Amazon SageMaker 中的推論管道，將預先處理邏輯部署到單一端點中的 ML 模型
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker"></a>

*Mohan Gowda Purushothama、Gabriel Rodriguez Garcia 和 Mateusz Zaremba，Amazon Web Services*

## 總結
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker-summary"></a>

此模式說明如何在 Amazon SageMaker 中使用[推論管道，在單一端點中部署多個管道](https://docs.aws.amazon.com/sagemaker/latest/dg/inference-pipelines.html)模型物件。管道模型物件代表不同的機器學習 (ML) 工作流程階段，例如預先處理、模型推論和後製處理。為了說明序列連線管道模型物件的部署，此模式示範如何根據內建於 [SageMaker 的線性學習程式演算法，部署預先處理 Scikit-learn](https://docs.aws.amazon.com/sagemaker/latest/dg/sklearn.html) 容器和迴歸模型。 [https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html](https://docs.aws.amazon.com/sagemaker/latest/dg/linear-learner.html) SageMaker 部署託管在 SageMaker 中的單一端點後方。

**注意**  
此模式中的部署會使用 ml.m4.2xlarge 執行個體類型。我們建議您使用符合您資料大小需求和工作流程複雜性的執行個體類型。如需更多資訊，請參閱 [Amazon SageMaker 定價](https://aws.amazon.com/sagemaker/pricing/)。此模式針對 [Scikit-learn 使用預先建置的 Docker 映像](https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-docker-containers-scikit-learn-spark.html)，但您可以使用自己的 Docker 容器，並將其整合到您的工作流程中。

## 先決條件和限制
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker-prereqs"></a>

**先決條件**
+ 作用中的 AWS 帳戶
+ [Python 3.9](https://www.python.org/downloads/release/python-390/)
+ [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/) 和 [Boto3 程式庫](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)
+ 具有基本 SageMaker [許可](https://docs.aws.amazon.com/sagemaker/latest/dg/api-permissions-reference.html)和 Amazon Simple Storage Service (Amazon S3) 許可的 AWS Identity and Access Management (AWS IAM) [角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) [https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html)

**產品版本**
+ [Amazon SageMaker Python SDK 2.49.2](https://sagemaker.readthedocs.io/en/v2.49.2/)

## Architecture
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker-architecture"></a>

**目標技術堆疊**
+ Amazon Elastic Container Registry (Amazon ECR)
+ Amazon SageMaker
+ Amazon SageMaker Studio
+ Amazon Simple Storage Service (Amazon S3)
+ Amazon SageMaker 的[即時推論](https://docs.aws.amazon.com/sagemaker/latest/dg/realtime-endpoints.html)端點

**目標架構**

下圖顯示部署 Amazon SageMaker 管道模型物件的架構。

![部署 SageMaker 管道模型物件的架構](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/1105d51b-752f-46d7-962c-acef1fb3399f/images/12f06715-b1c2-4de0-b277-99ce87308152.png)


該圖顯示以下工作流程：

1. SageMaker 筆記本會部署管道模型。

1. S3 儲存貯體存放模型成品。

1. Amazon ECR 會從 S3 儲存貯體取得來源容器映像。

## 工具
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker-tools"></a>

**AWS 工具**
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) 是一種受管容器映像登錄服務，安全、可擴展且可靠。
+ [Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) 是一項受管 ML 服務，可協助您建置和訓練 ML 模型，然後將模型部署到生產就緒的託管環境中。
+ [Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio.html) 是適用於 ML 的 Web 型整合式開發環境 (IDE)，可讓您建置、訓練、偵錯、部署和監控 ML 模型。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一種雲端型物件儲存服務，可協助您儲存、保護和擷取任何數量的資料。

**Code**

此模式的程式碼可在 GitHub [推論管道搭配 Scikit-learn 和線性學習程式](https://github.com/aws/amazon-sagemaker-examples/blob/main/sagemaker-python-sdk/scikit_learn_inference_pipeline/Inference%20Pipeline%20with%20Scikit-learn%20and%20Linear%20Learner.ipynb)儲存庫中使用。

## 史詩
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker-epics"></a>

### 準備資料集
<a name="prepare-the-dataset"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 為您的迴歸任務準備資料集。 | 在 Amazon SageMaker Studio 中[開啟筆記本](https://docs.aws.amazon.com/sagemaker/latest/dg/notebooks-create-open.html#notebooks-open)。<br />若要匯入所有必要的程式庫並初始化您的工作環境，請在筆記本中使用下列範例程式碼：<pre>import sagemaker<br />from sagemaker import get_execution_role<br /><br />sagemaker_session = sagemaker.Session()<br /><br /># Get a SageMaker-compatible role used by this Notebook Instance.<br />role = get_execution_role()<br /><br /># S3 prefix<br />bucket = sagemaker_session.default_bucket()<br />prefix = "Scikit-LinearLearner-pipeline-abalone-example"</pre><br />若要下載範例資料集，請將下列程式碼新增至您的筆記本：<pre>! mkdir abalone_data<br />! aws s3 cp s3://sagemaker-sample-files/datasets/tabular/uci_abalone/abalone.csv ./abalone_data</pre>** **此模式中的範例使用 UCI Machine Learning 儲存庫中的[鮑魚資料集](https://archive.ics.uci.edu/ml/datasets/abalone)。 | 資料科學家 | 
| 將資料集上傳至 S3 儲存貯體。 | 在您先前準備資料集的筆記本中，新增下列程式碼，將範例資料上傳至 S3 儲存貯體：<pre>WORK_DIRECTORY = "abalone_data"<br /><br />train_input = sagemaker_session.upload_data(<br />    path="{}/{}".format(WORK_DIRECTORY, "abalone.csv"),<br />    bucket=bucket,<br />    key_prefix="{}/{}".format(prefix, "train"),<br />)</pre> | 資料科學家 | 

### 使用 SKLearn 建立資料預處理器
<a name="create-the-data-preprocessor-using-sklearn"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 準備 preprocessor.py 指令碼。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker.html) | 資料科學家 | 
| 建立 SKLearn 預處理器物件。 | 若要建立可納入最終推論管道的 SKLearn 預處理器物件 （稱為 SKLearn 估算器），請在 SageMaker 筆記本中執行下列程式碼：<pre>from sagemaker.sklearn.estimator import SKLearn<br /><br />FRAMEWORK_VERSION = "0.23-1"<br />script_path = "sklearn_abalone_featurizer.py"<br /><br />sklearn_preprocessor = SKLearn(<br />    entry_point=script_path,<br />    role=role,<br />    framework_version=FRAMEWORK_VERSION,<br />    instance_type="ml.c4.xlarge",<br />    sagemaker_session=sagemaker_session,<br />)<br />sklearn_preprocessor.fit({"train": train_input})</pre> | 資料科學家 | 
| 測試預處理器的推論。 | 若要確認您的預處理器已正確定義，請在 SageMaker 筆記本中輸入下列程式碼來啟動[批次轉換任務](https://docs.aws.amazon.com/sagemaker/latest/dg/batch-transform.html)：<pre># Define a SKLearn Transformer from the trained SKLearn Estimator<br />transformer = sklearn_preprocessor.transformer(<br />    instance_count=1, instance_type="ml.m5.xlarge", assemble_with="Line", accept="text/csv"<br />)<br /><br /><br /># Preprocess training input<br />transformer.transform(train_input, content_type="text/csv")<br />print("Waiting for transform job: " + transformer.latest_transform_job.job_name)<br />transformer.wait()<br />preprocessed_train = transformer.output_path</pre> |  | 

### 建立機器學習模型
<a name="create-a-machine-learning-model"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立模型物件。 | 若要根據線性學習程式演算法建立模型物件，請在 SageMaker 筆記本中輸入下列程式碼：<pre>import boto3<br />from sagemaker.image_uris import retrieve<br /><br />ll_image = retrieve("linear-learner", boto3.Session().region_name)<br />s3_ll_output_key_prefix = "ll_training_output"<br />s3_ll_output_location = "s3://{}/{}/{}/{}".format(<br />    bucket, prefix, s3_ll_output_key_prefix, "ll_model"<br />)<br /><br />ll_estimator = sagemaker.estimator.Estimator(<br />    ll_image,<br />    role,<br />    instance_count=1,<br />    instance_type="ml.m4.2xlarge",<br />    volume_size=20,<br />    max_run=3600,<br />    input_mode="File",<br />    output_path=s3_ll_output_location,<br />    sagemaker_session=sagemaker_session,<br />)<br /><br />ll_estimator.set_hyperparameters(feature_dim=10, predictor_type="regressor", mini_batch_size=32)<br /><br />ll_train_data = sagemaker.inputs.TrainingInput(<br />    preprocessed_train,<br />    distribution="FullyReplicated",<br />    content_type="text/csv",<br />    s3_data_type="S3Prefix",<br />)<br /><br />data_channels = {"train": ll_train_data}<br />ll_estimator.fit(inputs=data_channels, logs=True)</pre><br />上述程式碼會從模型的公有 Amazon ECR 登錄檔擷取相關的 Amazon ECR Docker 影像、建立估算器物件，然後使用該物件來訓練迴歸模型。 | 資料科學家 | 

### 部署最終管道
<a name="deploy-the-final-pipeline"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署管道模型。 | 若要建立管道模型物件 （即預處理器物件） 並部署物件，請在 SageMaker 筆記本中輸入下列程式碼：<pre>from sagemaker.model import Model<br />from sagemaker.pipeline import PipelineModel<br />import boto3<br />from time import gmtime, strftime<br /><br />timestamp_prefix = strftime("%Y-%m-%d-%H-%M-%S", gmtime())<br /><br />scikit_learn_inferencee_model = sklearn_preprocessor.create_model()<br />linear_learner_model = ll_estimator.create_model()<br /><br />model_name = "inference-pipeline-" + timestamp_prefix<br />endpoint_name = "inference-pipeline-ep-" + timestamp_prefix<br />sm_model = PipelineModel(<br />    name=model_name, role=role, models= [scikit_learn_inferencee_model, linear_learner_model]<br />)<br /><br />sm_model.deploy(initial_instance_count=1, instance_type="ml.c4.xlarge", endpoint_name=endpoint_name)</pre>您可以調整模型物件中使用的執行個體類型，以符合您的需求。 | 資料科學家 | 
| 測試推論。 | 若要確認端點是否正常運作，請在 SageMaker 筆記本中執行下列範例推論程式碼：<pre>from sagemaker.predictor import Predictor<br />from sagemaker.serializers import CSVSerializer<br /><br />payload = "M, 0.44, 0.365, 0.125, 0.516, 0.2155, 0.114, 0.155"<br />actual_rings = 10<br />predictor = Predictor(<br />    endpoint_name=endpoint_name, sagemaker_session=sagemaker_session, serializer=CSVSerializer()<br />)<br /><br />print(predictor.predict(payload))</pre> | 資料科學家 | 

## 相關資源
<a name="deploy-preprocessing-logic-into-an-ml-model-in-a-single-endpoint-using-an-inference-pipeline-in-amazon-sagemaker-resources"></a>
+ [使用 Amazon SageMaker 推論管道和 Scikit-learn 進行預測之前，請先預先處理輸入資料](https://aws.amazon.com/blogs/machine-learning/preprocess-input-data-before-making-predictions-using-amazon-sagemaker-inference-pipelines-and-scikit-learn/) (AWS Machine Learning 部落格）
+ [使用 Amazon SageMaker (GitHub) 進行端對端Machine Learning ](https://github.com/aws-samples/amazon-sagemaker-build-train-deploy) GitHub