在 Amazon SageMaker 上訓練和部署自訂 GPU 支援的 ML 模型 - AWS Prescriptive Guidance

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

在 Amazon SageMaker 上訓練和部署自訂 GPU 支援的 ML 模型

由安庫爾舒克拉(AWS)創建

:Containment PoC 或試驗

技術:機器學習與 AI;容器與微服務

AWS 服務:亞馬遜 ECS; Amazon SageMaker

Summary

訓練和部署圖形處理單元 (GPU) 支援的機器學習 (ML) 模型,需要初始設定和初始化特定環境變數,才能完全發揮 NVIDIA GPU 的優點。不過,設定環境並使其與 Amazon Amazon Web Services (AWS) 雲端上的 Amazon SagMaker 架構相容可能非常耗時。

此模式可協助您使用 Amazon SageMaker 訓練和建置自訂 GPU 支援的 ML 模型。它提供了訓練和部署建立在開放原始碼 Amazon 審查資料集上的自訂 CatBoost 模型的步驟。然後,您可以在p3.16xlargeAmazon Elastic Compute Cloud (Amazon EC2) 執行個體。

如果您的組織想要在 SageMaker 上部署現有 GPU 支援的 ML 模型,則此模式非常有用。您的資料科學家可以遵循此模式中的步驟,建立支援 NVIDIA GPU 的容器,並在這些容器上部署 ML 模型。

先決條件和限制

先決條件

  • 作用中的 AWS 帳戶

  • Amazon Simple Storage Service (Amazon S3) 來源儲存貯體,用於儲存貯體,用於儲存貯體。

  • 對 SSageMaker 筆記本實例和 Jupyter 筆記本的了解。

  • 了解如何使用基本 SSageMaker 角色權限、S3 儲存貯體存取和更新權限,以及 Amazon 彈性容器登錄 (Amazon ECR) 的其他權限來建立 AWS 身分和存取管理 (IAM) 角色。

限制

  • 此模式適用於受監督的 ML 工作負載,並使用 Python 編寫的程式碼。

Architecture

技術堆疊

  • SageMaker

  • Amazon ECR

Tools

工具

  • Amazon ECR— Amazon Elastic Container Registry (Amazon ECR) 是 AWS 受管容器映像登錄服務,具安全性、可擴展性和可靠性。

  • Amazon SageMaker— SageMaker 是全受管的 ML 服務。

  • Docker— Docker 是快速建置、測試及部署應用程式的軟體平台。

  • Python-Python 是一種編程語言。

Code

此模式的代碼可以在 GitHub使用 Catboost 和 SageMaker 實現審查分類模型儲存庫。

Epics

任務描述所需技能
建立 IAM 角色,並連接所需政策。

登入 AWS 管理主控台,開啟 IAM 主控台,並建立新的 IAM 角色。將下列政策連接到 IAM 角色: 

  • AmazonEC2ContainerRegistryFullAccess

  • AmazonS3FullAccess

  • AmazonSageMakerFullAccess

如需此項目的詳細資訊,請參閱建立筆記本執行個體在 Amazon Sagemaker 文檔中。

DataScientist
建立 SSageMaker 筆記本執行個體。

開啟 SSageMaker 主控台,選擇筆記本實例,然後選擇建立筆記本實例。適用於IAM 角色下,請選擇您先前建立的 IAM 角色。根據您的需求設定筆記型電腦執行個體,然後選擇建立筆記本實例

如需詳細步驟和指示,請參閱建立筆記本執行個體在 Amazon Sagemaker 文檔中。

DataScientist
複製儲存庫。

在 SageMaker 筆記本實例中打開終端並克隆 GitHub使用 Catboost 和 SageMaker 實現審查分類模型儲存庫:

git clone https://github.com/aws-samples/review-classification-using-catboost-sagemaker.git
啟動 Jupyter 筆記本。

啟動Review classification model with Catboost and SageMaker.ipynbJupyter 筆記本,其中包含預定義的步驟。

DataScientist
任務描述所需技能
在 Jupyter 筆記本中運行命令。

開啟 Jupyter 筆記本並執行下列故事中的命令,準備資料來訓練您的 ML 模型。

DataScientist
從 S3 儲存貯體讀取資料。

import pandas as pd import csv fname = 's3://amazon-reviews-pds/tsv/amazon_reviews_us_Digital_Video_Download_v1_00.tsv.gz' df = pd.read_csv(fname,sep='\t',delimiter='\t',error_bad_lines=False)

DataScientist
預先處理資料。

import numpy as np def pre_process(df): df.fillna(value={'review_body': '', 'review_headline': ''}, inplace=True) df.fillna( value={'verified_purchase': 'Unk'}, inplace=True) df.fillna(0, inplace=True) return df df = pre_process(df) df.review_date = pd.to_datetime(df.review_date) df['target'] = np.where(df['star_rating']>=4,1,0)

請注意:此程式碼會取代'review_body'替換為空字串,並取代'verified_purchase'與 Column'Unk',這意味著「未知」。

 

DataScientist
將資料分割成訓練、驗證和測試資料集。

若要讓目標標籤的分佈在分割集中保持完全相同,您必須使用scikit-learn 資料庫

from sklearn.model_selection import StratifiedShuffleSplit sss = StratifiedShuffleSplit(n_splits=2, test_size=0.10, random_state=0) sss.get_n_splits(df, df['target']) for train_index, test_index in sss.split(df, df['target']): X_train_vallid , X_test = df.iloc[train_index], df.iloc[test_index] sss.get_n_splits(X_train_vallid, X_train_vallid['target']) for train_index, test_index in sss.split(X_train_vallid, X_train_vallid['target']): X_train , X_valid = X_train_vallid.iloc[train_index], X_train_vallid.iloc[test_index]

DataScientist
任務描述所需技能
準備並推送 Docker 映像。

在 Jupyter 筆記本中,從以下故事執行命令以準備 Docker 映像並將其推送到 Amazon ECR。

多長線
在 Amazon ECR 中建立儲存庫。

%%sh algorithm_name=sagemaker-catboost-github-gpu-img chmod +x code/train chmod +x code/serve account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-east-1} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" aws ecr create-repository --repository-name "${algorithm_name}" > /dev/nul

多長線
在本機建置 Docker 影像。

docker build -t "${algorithm_name}" . docker tag ${algorithm_name} ${fullname}

多長線
執行 Docker 影像並將之推送至 Amazon ECR。
docker push ${fullname}
多長線
任務描述所需技能
建立 SageMaker 超參數調校任務。

在 Jupyter 筆記本中,運行以下故事的命令,使用您的 Docker 映像創建 SageMaker 超參數調整工作。

DataScientist
建立 Sagemaker 預估器。

建立Sagemaker 預估器通過使用 Docker 映像的名稱。

import sagemaker as sage from time import gmtime, strftime sess = sage.Session() from sagemaker.tuner import IntegerParameter, CategoricalParameter, ContinuousParameter, HyperparameterTuner account = sess.boto_session.client('sts').get_caller_identity()['Account'] region = sess.boto_session.region_name image = '{}.dkr.ecr.{}.amazonaws.com/sagemaker-catboost-github-gpu-img:latest'.format(account, region) tree_hpo = sage.estimator.Estimator(image, role, 1, 'ml.p3.16xlarge', train_volume_size = 100, output_path="s3://{}/sagemaker/DEMO-GPU-Catboost/output".format(bucket), sagemaker_session=sess)

DataScientist
建立 HPO 任務。

使用參數範圍建立超參數最佳化 (HPO) 調整工作,並將列車和驗證集做為參數傳遞給函數。

hyperparameter_ranges = {'iterations': IntegerParameter(80000, 130000), 'max_depth': IntegerParameter(6, 10), 'max_ctr_complexity': IntegerParameter(4, 10), 'learning_rate': ContinuousParameter(0.01, 0.5)} objective_metric_name = 'auc' metric_definitions = [{'Name': 'auc', 'Regex': 'auc: ([0-9\\.]+)'}] tuner = HyperparameterTuner(tree_hpo, objective_metric_name, hyperparameter_ranges, metric_definitions, objective_type='Maximize', max_jobs=50, max_parallel_jobs=2)

DataScientist
執行 HPO 工作。

train_location = 's3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/train/' valid_location = 's3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/valid/' tuner.fit({'train': train_location, 'validation': valid_location })

DataScientist
獲得表現最佳的訓練工作。

import sagemaker as sage from time import gmtime, strftime sess = sage.Session() best_job =tuner.best_training_job()

DataScientist
任務描述所需技能
在模型預測測試資料上建立 SageMaker 批次轉換工作。

在 Jupyter 筆記本中,從下列故事執行命令,從 SageMaker 超參數調整工作建立模型,並在測試資料上提交 SagMaker 批次轉換工作,以進行模型預測。

DataScientist
建立「切割 SageMaker」模型。

使用最佳訓練工作在 SageMaker 模型中建立模型。

attached_estimator = sage.estimator.Estimator.attach(best_job) output_path ='s3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/test-predictions/' input_path ='s3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/test/' transformer = attached_estimator.transformer(instance_count=1, instance_type='ml.p3.16xlarge', assemble_with='Line', accept='text/csv', max_payload=1, output_path=output_path, env = {'SAGEMAKER_MODEL_SERVER_TIMEOUT' : '3600' })

DataScientist
建立批次轉換任務。

在測試資料集上建立批次轉換工作。

transformer.transform(input_path, content_type='text/csv', split_type='Line')

DataScientist
任務描述所需技能
閱讀結果並評估模型的效能。

在 Jupyter 筆記本中,從下列內文執行命令來讀取結果,並評估模型在 ROC 曲線下方區域 (ROC-AUC) 和精確回收曲線下方區域 (PR-AUC) 模型度量上的效能。

如需此項目的詳細資訊,請參閱Amazon Machine Learning 關鍵概念在 Amazon Machine Learning (Amazon ML) 文檔中。

DataScientist
閱讀批次轉換工作結果。

讀取批次將工作結果轉換為資料框架。

file_name = 's3://'+bucket+'/sagemaker/DEMO-GPU-Catboost/data/test-predictions/file_1.out' results = pd.read_csv(file_name, names=['review_id','target','score'] ,sep='\t',escapechar ='\\' , quoting=csv.QUOTE_NONE, lineterminator='\n',quotechar='"').dropna()

DataScientist
評估效能測量結果。

評估機型在 ROC-AUC 和 PR-AUC 上的效能。

from sklearn import metrics import matplotlib import pandas as pd matplotlib.use('agg', warn=False, force=True) from matplotlib import pyplot as plt %matplotlib inline def analyze_results(labels, predictions): precision, recall, thresholds = metrics.precision_recall_curve(labels, predictions) auc = metrics.auc(recall, precision) fpr, tpr, _ = metrics.roc_curve(labels, predictions) roc_auc_score = metrics.roc_auc_score(labels, predictions) print('Neural-Nets: ROC auc=%.3f' % ( roc_auc_score)) plt.plot(fpr, tpr, label="data 1, auc=" + str(roc_auc_score)) plt.xlabel('1-Specificity') plt.ylabel('Sensitivity') plt.legend(loc=4) plt.show() lr_precision, lr_recall, _ = metrics.precision_recall_curve(labels, predictions) lr_auc = metrics.auc(lr_recall, lr_precision) # summarize scores print('Neural-Nets: PR auc=%.3f' % ( lr_auc)) # plot the precision-recall curves no_skill = len(labels[labels==1.0]) / len(labels) plt.plot([0, 1], [no_skill, no_skill], linestyle='--', label='No Skill') plt.plot(lr_recall, lr_precision, marker='.', label='Neural-Nets') # axis labels plt.xlabel('Recall') plt.ylabel('Precision') # show the legend plt.legend() # show the plot plt.show() return auc analyze_results(results['target'].values,results['score'].values)

DataScientist

其他資訊

下列清單會顯示 Docker 檔案中執行的不同項目建置、執行並將 Docker 映像推送到 Amazon ECR史詩般的。

安裝 Python 與反應。

FROM amazonlinux:1    RUN yum update -y && yum install -y python36 python36-devel python36-libs python36-tools python36-pip && \  yum install gcc tar make wget util-linux kmod man sudo git -y && \  yum install wget -y && \  yum install aws-cli -y && \  yum install nginx -y && \ yum install gcc-c++.noarch -y && yum clean all

安裝套件

RUN pip-3.6 install --no-cache-dir --upgrade pip && \pip3 install --no-cache-dir --upgrade setuptools && \ pip3 install Cython && \ pip3 install --no-cache-dir numpy==1.16.0 scipy==1.4.1 scikit-learn==0.20.3 pandas==0.24.2 \ flask gevent gunicorn boto3 s3fs matplotlib joblib catboost==0.20.2

安裝 CUDA 和 CUDNN

RUN wget https://developer.nvidia.com/compute/cuda/9.0/Prod/local_installers/cuda_9.0.176_384.81_linux-run \ && chmod u+x cuda_9.0.176_384.81_linux-run \ && ./cuda_9.0.176_384.81_linux-run --tmpdir=/data --silent --toolkit --override \ && wget https://custom-gpu-sagemaker-image.s3.amazonaws.com/installation/cudnn-9.0-linux-x64-v7.tgz \ && tar -xvzf cudnn-9.0-linux-x64-v7.tgz \ && cp /data/cuda/include/cudnn.h /usr/local/cuda/include \ && cp /data/cuda/lib64/libcudnn* /usr/local/cuda/lib64 \ && chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn* \ && rm -rf /data/*

為 SageMaker 建立所需的目錄結構

RUN mkdir /opt/ml /opt/ml/input /opt/ml/input/config /opt/ml/input/data /opt/ml/input/data/training /opt/ml/model /opt/ml/output /opt/program

設定 NVIDIA 環境變數

ENV PYTHONPATH=/opt/program ENV PYTHONUNBUFFERED=TRUE ENV PYTHONDONTWRITEBYTECODE=TRUE ENV PATH="/opt/program:${PATH}" # Set NVIDIA mount environments ENV LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64:$LD_LIBRARY_PATH ENV NVIDIA_VISIBLE_DEVICES="all" ENV NVIDIA_DRIVER_CAPABILITIES="compute,utility" ENV NVIDIA_REQUIRE_CUDA "cuda>=9.0"

將訓練和推斷文件複製到 Docker 映像

COPY code/* /opt/program/ WORKDIR /opt/program