Amazon で GPU がサポートするカスタム ML モデルのトレーニングとデプロイ SageMaker - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon で GPU がサポートするカスタム ML モデルのトレーニングとデプロイ SageMaker

環境:PoC またはパイロット

テクノロジー:機械学習と AI、コンテナとマイクロサービス

AWS サービス: Amazon ECS、Amazon SageMaker

[概要]

グラフィックプロセッシングユニット (GPU) がサポートする機械学習 (ML) モデルをトレーニングしてデプロイするには、NVIDIA GPU の利点を最大限に引き出すために、特定の環境変数の初期設定と初期化が必要です。ただし、環境をセットアップし、Amazon Web Services (AWS) クラウド上の Amazon SageMaker アーキテクチャと互換性を持たせるには時間がかかる場合があります。

このパターンは、Amazon を使用して GPU がサポートするカスタム ML モデルをトレーニングおよび構築するのに役立ちます SageMaker。オープンソースの Amazon Reviews データセット上に構築されたカスタム CatBoost モデルをトレーニングしてデプロイする手順について説明します。その後、p3.16xlarge Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでパフォーマンスをベンチマークできます。

このパターンは、組織が既存の GPU 対応 ML モデルを にデプロイする場合に役立ちます SageMaker。データサイエンティストは、このパターンの手順に従って NVIDIA GPU 対応コンテナを作成し、それらのコンテナに ML モデルをデプロイできます。

前提条件と制限

前提条件

  • アクティブな AWS アカウント。

  • モデルのアーティファクトと予測を保存する Amazon Simple Storage Service (Amazon S3) ソースバケット。

  • SageMaker ノートブックインスタンスと Jupyter Notebook の理解。

  • 基本的なロールのアクセス許可、S3 バケットのアクセスと更新のアクセス許可、および Amazon Elastic Container Registry (Amazon ECR) の追加アクセス許可を持つ AWS Identity and Access Management (IAM) SageMaker ロールを作成する方法を理解しています。

制約事項

  • このパターンは、Python で記述されたコードをトレインしてデプロイする教師付き ML ワークロードを対象としています。

アーキテクチャ

テクノロジースタック

  • SageMaker

  • Amazon ECR

ツール

ツール

  • Amazon ECR」— Amazon Elastic Container Registry (Amazon ECR) は、セキュリティ、スケーラビリティ、信頼性を備えた AWS マネージドコンテナイメージレジストリサービスです。

  • Amazon SageMaker – はフルマネージド型の ML サービス SageMaker です。

  • Docker」— Docker は、アプリケーションを迅速に構築、テスト、デプロイするためのソフトウェアプラットフォームです。

  • Python」— Python はプログラミング言語です。

Code

このパターンのコードは、 GitHub 「Catboost とリポジトリを使用したレビュー分類モデルの実装 SageMaker」で入手できます。

エピック

タスク説明必要なスキル
IAM ロールを作成して、必要なポリシーをアタッチします。

AWS マネジメントコンソールにサインインし、IAM コンソール を開き、新しいIAMロールを作成します。次のポリシーを IAM ロールにアタッチします。 

  • AmazonEC2ContainerRegistryFullAccess

  • AmazonS3FullAccess

  • AmazonSageMakerFullAccess

詳細については、Amazon ドキュメントの「ノートブックインスタンスの作成」を参照してください。 SageMaker

データサイエンティスト
SageMaker ノートブックインスタンスを作成します。

SageMaker コンソールを開き、ノートブックインスタンス を選択し、ノートブックインスタンスの作成 を選択します。[IAM ロール] には、前に作成したIAM ロールを選択します。要件に従ってノートブックインスタンスを設定し、[ノートブックインスタンスを作成] を選択します。

詳細な手順と手順については、Amazon ドキュメントの「ノートブックインスタンスの作成」を参照してください。 SageMaker

データサイエンティスト
リポジトリをクローン作成します。

SageMaker ノートブックインスタンスでターミナルを開き、次のコマンドを実行して、Catboost とリポジトリを使用したレビュー分類モデルの GitHub実装のクローンを作成します。 SageMaker

git clone https://github.com/aws-samples/review-classification-using-catboost-sagemaker.git
Jupyter Notebook を開始します。

定義済みのステップが含まれている Review classification model with Catboost and SageMaker.ipynb Jupyter notebook を起動します。

データサイエンティスト
タスク説明必要なスキル
Jupyter notebook でコマンドを実行します。

Jupyter notebook を開き、以下のストーリーのコマンドを実行して ML モデルをトレーニングするためのデータを準備します。

データサイエンティスト
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)
データサイエンティスト
データを前処理します。
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' の NULL 値を空の文字列に置き換え、'verified_purchase' 列を「不明」を意味する 'Unk' 文字列に置き換えます。

 

データサイエンティスト
データをトレーニング、検証、テストデータセットに分割します。

ターゲットラベルの分布を分割セット全体で同じに保つには、「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]
データサイエンティスト
タスク説明必要なスキル
Docker イメージを準備してプッシュします。

Jupyter notebook で、以下のストーリーのコマンドを実行して Docker イメージを準備し、Amazon ECR にプッシュします。

ML エンジニア
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
ML エンジニア
Docker イメージをローカルで構築します。
docker build -t "${algorithm_name}" . docker tag ${algorithm_name} ${fullname}
ML エンジニア
Docker イメージを実行し、Amazon ECR にプッシュします。
docker push ${fullname}
ML エンジニア
タスク説明必要なスキル
SageMaker ハイパーパラメータ調整ジョブを作成します。

Jupyter Notebook で、次のストーリーのコマンドを実行して、Docker イメージを使用して SageMaker ハイパーパラメータチューニングジョブを作成します。

データサイエンティスト
SageMaker 推定器を作成します。

Docker イメージの名前を使用してSageMaker 推定器を作成します。

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)
データサイエンティスト
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)
データサイエンティスト
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 })
データサイエンティスト
最もパフォーマンスの高いトレーニングジョブを受けます。
import sagemaker as sage from time import gmtime, strftime sess = sage.Session() best_job =tuner.best_training_job()
データサイエンティスト
タスク説明必要なスキル
モデル予測のテストデータに SageMaker バッチ変換ジョブを作成します。

Jupyter Notebook で、次のストーリーのコマンドを実行して SageMaker ハイパーパラメータ調整ジョブからモデルを作成し、モデル予測用のテストデータに SageMaker バッチ変換ジョブを送信します。

データサイエンティスト
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' })
データサイエンティスト
バッチ変換ジョブを作成します。

テストデータセットにバッチ変換ジョブを作成します。

transformer.transform(input_path, content_type='text/csv', split_type='Line')
データサイエンティスト
タスク説明必要なスキル
結果を読み込み、モデルのパフォーマンスを評価する。

Jupyter notebook では、以下のストーリーのコマンドを実行して結果を読み取り、ROC 曲線下面積 (ROC-AUC) と精度再現曲線下面積 (PR-AUC) モデルメトリクスでモデルのパフォーマンスを評価します。

詳細については、Amazon Machine Learning (Amazon ML) ドキュメントの「Amazon 機械学習の主要概念」を参照してください。

データサイエンティスト
バッチ変換ジョブの結果をお読みください。

バッチ変換ジョブの結果をデータフレームに読み込みます。

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()
データサイエンティスト
パフォーマンスメトリクスを評価します。

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)
データサイエンティスト

追加情報

以下のリストは、Docker イメージの [ビルド、実行、および Amazon ECR エピックへのプッシュ] で実行される Dockerfile のさまざまな要素を示しています。

aws-cli を使用して 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

Python パッケージのインストール

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