本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 SageMaker 元件
在本教學課程中,您可以使用適用於 Kubeflow 管道的 SageMaker Components 執行管道,以使用 Kmeans 搭配 上的MNIST資料集來訓練分類模型 SageMaker。工作流程使用 Kubeflow Pipelines 作為協調工具 SageMaker ,並執行工作流程的每個步驟。此範例取自現有 SageMaker 範例
您可以使用 KFP 儀表板、 KFP 或 Boto3 AWS SDK for Python (Boto3) 在 Python 中定義管道CLI,以編譯、部署和執行工作流程。MNIST 分類管道範例的完整程式碼可在 Kubeflow Github 儲存庫
您可以在 上找到其他 SageMaker Kubeflow 管道範例
若要執行分類管道範例,請 SageMaker IAM建立執行角色,授予訓練任務存取 AWS 資源的許可,然後繼續執行與您的部署選項對應的步驟。
建立 SageMaker 執行角色
kfp-example-sagemaker-execution-role
IAM 角色是由 SageMaker 任務擔任的執行期角色,以存取 AWS 資源。在下列命令中,您可以建立名為 的IAM執行角色kfp-example-sagemaker-execution-role
、連接兩個受管政策 (AmazonSageMakerFullAccess、AmazonS3FullAccess),以及與 建立信任關係 SageMaker ,以授予 SageMaker 任務對這些 AWS 資源的存取權。
執行管道時,您可以將此角色作為輸入參數提供。
執行下列 命令以建立角色。請注意輸出中傳回ARN的 。
SAGEMAKER_EXECUTION_ROLE_NAME=kfp-example-sagemaker-execution-role TRUST="{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"sagemaker.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" } ] }" aws iam create-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --assume-role-policy-document "$TRUST" aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess aws iam get-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --output text --query 'Role.Arn'
遵循SageMaker 使用 K 平均值MNIST分類的訓練管道教學
準備資料集
若要執行管道,您需要將資料擷取預處理指令碼上傳至 Amazon S3 儲存貯體。此儲存貯體和此範例的所有資源都必須位於 us-east-1
區域中。如需與建立儲存貯體相關的資訊,請參閱建立儲存貯體。
從您在閘道節點上複製的 Kubeflow 儲存庫 mnist-kmeans-sagemaker
資料夾中,執行下列命令,將 kmeans_preprocessing.py
檔案上傳到 Amazon S3 儲存貯體。將 <bucket-name>
變更為 Amazon S3 儲存貯體的名稱。
aws s3 cp mnist-kmeans-sagemaker/kmeans_preprocessing.py s3://
<bucket-name>
/mnist_kmeans_example/processing_code/kmeans_preprocessing.py
編譯和部署您的管道
定義管道之後,您必須先將其編譯成中繼表示形式,然後才能將其提交至叢集上的 Kubeflow 管道服務。中繼表示法是壓縮為 tar.gz YAML 檔案的檔案形式的工作流程規格。您需要 KFPSDK來編譯管道。
安裝 KFP SDK
從閘道節點的命令列執行下列命令:
-
在 Kubeflow 管道文件中
安裝KFPSDK下列指示。 -
確認 KFP SDK 已使用下列命令安裝:
pip show kfp
-
驗證已正確安裝
dsl-compile
,如下所示:which dsl-compile
編譯管道
您有三個選項可與 Kubeflow 管道互動:KFPUI、 KFP CLI或 KFP SDK。下列各節說明使用 KFP UI 和 的工作流程CLI。
完成以下步驟以設定節點。
-
使用 Amazon S3 儲存貯體名稱和IAM角色 修改 Python 檔案ARN。
-
使用
dsl-compile
命令行中的命令來編譯管道,如下所示。將<path-to-python-file>
取代為管道的路徑,將<path-to-output>
取代為您希望 tar.gz 檔案所在的位置。dsl-compile --py
<path-to-python-file>
--output<path-to-output>
使用 上傳和執行管道 KFP CLI
從閘道節點的命令列完成下列步驟。KFP 會將管道的執行組織為實驗。您可以選擇指定實驗名稱。如果未指定,則該執行將列在預設值實驗下。
-
上傳您的管道,如下所示:
kfp pipeline upload --pipeline-name
<pipeline-name>
<path-to-output-tar.gz>
您的輸出看起來應該如下所示。請記下管道
ID
。Pipeline 29c3ff21-49f5-4dfe-94f6-618c0e2420fe has been submitted Pipeline Details ------------------ ID 29c3ff21-49f5-4dfe-94f6-618c0e2420fe Name sm-pipeline Description Uploaded at 2020-04-30T20:22:39+00:00 ... ...
-
使用以下命令來建立執行。KFP CLI 執行命令目前不支援在建立執行時指定輸入參數。您需要在編譯之前更新 AWS SDK for Python (Boto3) 管道檔案中的參數。將
<experiment-name>
和<job-name>
取代為任何名稱。將<pipeline-id>
取代為您提交的管道的 ID。將 取代<your-role-arn>
為 ARN的kfp-example-pod-role
。將<your-bucket-name>
取代為您建立的 Amazon S3 儲存貯體的名稱。kfp run submit --experiment-name
<experiment-name>
--run-name<job-name>
--pipeline-id<pipeline-id>
role_arn="<your-role-arn>
" bucket_name="<your-bucket-name>
"您也可以使用作為
dsl-compile
命令輸出而建立的已編譯管道套件直接提交執行。kfp run submit --experiment-name
<experiment-name>
--run-name<job-name>
--package-file<path-to-output>
role_arn="<your-role-arn>
" bucket_name="<your-bucket-name>
"您的輸出看起來應如以下所示:
Creating experiment aws. Run 95084a2c-f18d-4b77-a9da-eba00bf01e63 is submitted +--------------------------------------+--------+----------+---------------------------+ | run id | name | status | created at | +======================================+========+==========+===========================+ | 95084a2c-f18d-4b77-a9da-eba00bf01e63 | sm-job | | 2020-04-30T20:36:41+00:00 | +--------------------------------------+--------+----------+---------------------------+
-
導覽至使用者介面以檢查工作進度。
使用 UI KFP 上傳和執行管道
-
在左側面板中,選擇管道標籤。
-
在右上角,選擇 +UploadPipeline。
-
輸入名稱和描述。
-
選擇上傳檔案,然後輸入您使用 CLI或 與 建立的 tar.gz 檔案路徑 AWS SDK for Python (Boto3)。
-
在左側面板中,選擇管道標籤。
-
尋找您建立的管道。
-
選擇 +CreateRun。
-
輸入您的輸入參數。
-
選擇執行。
執行預測
部署分類管道後,您可以針對由部署元件建立的端點執行分類預測。使用 KFP UI 檢查 的輸出成品sagemaker-deploy-model-endpoint_name
。下載 .tgz 檔案以擷取端點名稱,或檢查您使用的區域中的 SageMaker 主控台。
設定執行預測的許可
如果要從閘道節點執行預測,請略過本節。
若要使用任何其他機器執行預測,請將 sagemaker:InvokeEndpoint
許可指派給用戶端機器使用IAM的角色。
-
在閘道節點上,執行下列動作以建立IAM政策檔案:
cat <<EoF > ./sagemaker-invoke.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sagemaker:InvokeEndpoint" ], "Resource": "*" } ] } EoF
-
將政策連接至用戶端節點IAM的角色。
執行下列命令。
<your-instance-IAM-role>
以IAM角色的名稱取代 。將<path-to-sagemaker-invoke-json>
取代為您建立的政策檔案的路徑。aws iam put-role-policy --role-name
<your-instance-IAM-role>
--policy-name sagemaker-invoke-for-worker --policy-document file://<path-to-sagemaker-invoke-json>
執行預測
-
從具有下列內容
mnist-predictions.py
的用戶端機器建立 AWS SDK for Python (Boto3) 檔案。取代ENDPOINT_NAME
變數。指令碼載入MNIST資料集,CSV從這些數字建立 ,然後將 CSV 傳送到端點進行預測並列印結果。import boto3 import gzip import io import json import numpy import pickle ENDPOINT_NAME='
<endpoint-name>
' region = boto3.Session().region_name # S3 bucket where the original mnist data is downloaded and stored downloaded_data_bucket = f"jumpstart-cache-prod-{region}" downloaded_data_prefix = "1p-notebooks-datasets/mnist" # Download the dataset s3 = boto3.client("s3") s3.download_file(downloaded_data_bucket, f"{downloaded_data_prefix}/mnist.pkl.gz", "mnist.pkl.gz") # Load the dataset with gzip.open('mnist.pkl.gz', 'rb') as f: train_set, valid_set, test_set = pickle.load(f, encoding='latin1') # Simple function to create a csv from our numpy array def np2csv(arr): csv = io.BytesIO() numpy.savetxt(csv, arr, delimiter=',', fmt='%g') return csv.getvalue().decode().rstrip() runtime = boto3.Session(region).client('sagemaker-runtime') payload = np2csv(train_set[0][30:31]) response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME, ContentType='text/csv', Body=payload) result = json.loads(response['Body'].read().decode()) print(result) -
執行 AWS SDK for Python (Boto3) 檔案,如下所示:
python mnist-predictions.py
檢視結果和日誌
管道執行時,您可以選擇任何元件來檢查執行詳細資訊,例如輸入和輸出。這會列出已建立資源的名稱。
如果KFP請求已成功處理且任務 SageMaker 已建立,則KFP使用者介面中的元件日誌會提供在 中建立任務的連結 SageMaker。如果成功建立任務,也會提供 CloudWatch 日誌。
如您在同一叢集上執行過多管道工作,您可能會看到錯誤訊息,指出您沒有足夠的 Pod 可用。若要修正此問題,請登入閘道節點並刪除由您未使用的管道所建立的 Pod:
kubectl get pods -n kubeflow kubectl delete pods -n kubeflow
<name-of-pipeline-pod>
清除
管道完成後,您需要清除資源。
-
從KFP儀表板中,如果管道未選擇終止 ,則終止管道執行。
-
如果終止選項不起作用,請登入閘道節點並手動終止管道執行所建立的所有 Pod,如下所示:
kubectl get pods -n kubeflow kubectl delete pods -n kubeflow
<name-of-pipeline-pod>
-
使用 AWS 您的帳戶登入 SageMaker 服務。手動停止所有訓練、批次轉換和HPO任務。刪除模型、資料儲存貯體和端點,以避免產生任何額外費用。終止管道執行不會停止 中的任務 SageMaker。