Pro Yearly is on sale from $80 to $50! »

AWSのGPUを安く使って TensorFlowモデルを訓練する方法

F8865f41777ef3caced0e4e6801ff83a?s=47 masa-ita
August 08, 2020

AWSのGPUを安く使って TensorFlowモデルを訓練する方法

F8865f41777ef3caced0e4e6801ff83a?s=128

masa-ita

August 08, 2020
Tweet

Transcript

  1. AWSのGPUを安く使って TensorFlowモデルを訓練する⽅法 板垣正敏@TensorFlow Users Group Niigata Meetup #3 2020/8/8

  2. ⾃⼰紹介 š 板垣 正敏(いたがき まさとし) š 1955年 新潟県・村上市⽣まれ š Python機械学習勉強会in新潟

    世話⼈ š NPO法⼈ 新潟オープンソース協会 理事 š 株式会社BSNアイネット 技術顧問 š 中⼩企業診断⼠ 2
  3. アジェンダ š GPUを持っていない/GPUが⾜りない︖ š クラウドGPUの料⾦ š Amazon SageMakerとは︖ š SageMaker

    トレーニングジョブの仕組み š ⽤意するもの š コンテナ内の標準ディレクトリ構成 š 訓練⽤プログラムの勘所 š Docker ImageのビルドとECRへの登録 š トレーニングジョブの投⼊と完了 š メトリクスの監視⽅法 š どれくらい節約できる︖ š まとめ 3
  4. GPUを持っていない/GPUが⾜りない︖ š Google Colaboratoryは素晴らしい š ⼿元にGPUがない場合に⼀番⼿軽で⼀番安い(なにせ無料)なのがGoogle Colaboratoryです(⽶国では有料プランも) š GPU以外にクラウドTPUも無料で使うことができます š

    ただし、最⼤実⾏時間12時間の制限があるほか、⼀定時間操作を⾏わないと切断さ れます š クラウドを使う š GPUマシンを購⼊するほどではないが、お⾦がかかってもある程度の時間GPUを使い たいとか、たくさんのGPUが必要なモデルの訓練を⾏う場合などは、クラウドを利⽤ することになります 4
  5. Amazon SageMakerとは︖ š AWSでラベリングからデプロイ・管理まで、機械学習のライフサイクルをサポートするサービス群 5

  6. SageMaker トレーニングジョブ の仕組み š AWSのコンテナサービスを使 って機械学習モデルの訓練を 行うサービス š 利用可能なモデル š

    AWSあるいはマーケットプレ イスのアルゴリズム š カスタムアルゴリズム š AWSが用意したコンテナ( TensorFlow, PyTorchなど) š カスタムコンテナ(今回はコ レ) https://towardsdatascience.com/a-quick-guide-to-using-spot-instances- with-amazon-sagemaker-b9cfb3a44a68 6
  7. ⽤意するもの š AWSアカウント š Amazon SageMaker⽤のロール(アタッチするポリシーはAmazonSageMakerFullAccessのみで可) š ECRのレジストリ š S3バケット

    š 訓練⽤プログラム š 訓練⽤データ š Dockerのビルド環境 7
  8. コンテナ内の標準ディレクトリ構成 /opt/ml ├── checkpoints <= 中断に備えてチェックポイントを保存︓S3バケットにコピー ├── code │ └──

    train <= 訓練⽤プログラムのエントリーポイント(既定) ├── input │ ├── config <= SageMakerトレーニングジョブから渡される │ │ ├── hyperparameters.json <= 訓練ジョブ投⼊時に設定したハイパーパラメータが⼊る │ │ └── resourceConfig.json <= Sagemakerが割り当てたリソースに関する情報 │ └── data │ └── training <= 訓練⽤データの場所(既定)︓S3バケットからコピーされる ├── model <= 学習したモデルの保存場所︓圧縮後outputにコピー └── output <= 出⼒⽤ディレクトリ︓S3バケットにコピー 8
  9. 訓練⽤プログラムの勘所 š 訓練⽤プログラムのエントリーポイントは、Shell ファイルまたはPython ファイル š Docker コンテナ内の/opt/ml/code/trainが既定の場所と名前 š 実⾏ファイル名は、環境変数SAGEMAKER_PROGRAMで指定可能

    š プログラムにパラメータを渡す⽅法は2つ š SageMakerトレーニングジョブのハイパーパラメータを通じて渡す š 環境変数を通じて渡す š スポットインスタンスは中断されることを前提に、チェックポイントを 定期的に保存し、起動したときにチェックポイントがある場合には、そ の続きを実⾏するようにすること 9
  10. 中断に備えてチェックポイントを保存 # モデルのチェックポイントをチェックポイントディレクトリに保存する checkpoint_path = os.path.join(checkpoints_dir, 'model_checkpoint_{epoch:05d}’) model_checkpoint_callback = ModelCheckpoint(filepath=checkpoint_path,

    save_weights_only=False) model.fit(train_ds, epochs=train_steps, initial_epoch=initial_epoch, validation_data=val_ds, callbacks=[model_checkpoint_callback], verbose=2) 10
  11. チェックポイントを検索する関数 # チェックポイントディレクトリをスキャンし、最も新しいチェックポイントとエポック数を返す def find_last_checkpoint(checkpoint_path): dirs = [d for d

    in os.listdir(checkpoint_path) if d.startswith('model_checkpoint_’)] epoch_numbers = [re.search('(¥d+)',f).group() for f in dirs] if epoch_numbers: max_epoch_number = max(epoch_numbers) max_epoch_index = epoch_numbers.index(max_epoch_number) max_epoch_dirname = dirs[max_epoch_index] else: max_epoch_dirname = None max_epoch_number = None return max_epoch_dirname, max_epoch_number 11
  12. チェックポイントがあればロード # チェックポイントを検索し、あれば最新の重みをロードし再開するエポック数をセット last_checkpoint, last_epoch = find_last_checkpoint(checkpoints_dir) if last_checkpoint: model

    = models.load_model(os.path.join(checkpoints_dir, last_checkpoint)) initial_epoch = int(last_epoch) print('Model checkpoint #{} was loaded.'.format(last_epoch)) else: model = create_model(num_classes=num_classes) model.compile(loss = 'categorical_crossentropy’, optimizer = 'rmsprop’, metrics = ['accuracy’]) initial_epoch = 0 12
  13. ビルド環境について 開発環境のディレクトリ構造 container ├── Dockerfile ├── build_and_push.sh ├── code │

    └── train └── local_test ├── test_dir └── train_local.sh 簡単なDockerfileの例 FROM tensorflow/tensorflow:2.3.0 RUN pip install pillow ENV PATH="/opt/ml/code:${PATH}” COPY /code /opt/ml/code WORKDIR /opt/ml/code 13 ※コンテナにローカルディレクトリをマウントすれば、ローカルでもテスト可能
  14. Docker ImageのビルドとECRへの登録 # Docker Imageのビルドとタグづけ docker build -t sagemaker-example .

    docker tag sagemaker-example:latest ¥ 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/sagemaker-example:latest # AWS へのログインとECRへのDocker ImageのPush aws ecr get-login-password --region ap-northeast-1 | ¥ docker login --username AWS --password-stdin ¥ 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com docker push 999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/sagemaker-example:latest 14
  15. トレーニングジョブの投⼊と完了 import sagemaker from sagemaker.estimator import Estimator hyperparameters = {'train-steps':

    5} estimator = Estimator(image_uri=‘999999999999.dkr.ecr.ap-northeast-1.amazonaws.com/sagemaker-example:latest’, role="arn:aws:iam::999999999999:role/SagemakerJobRunner”, instance_count=1, instance_type='ml.p2.xlarge’, max_run=24 * 60 * 60, input_mode='File’, output_path='s3://sagemaker-examples.rails.to/output’, base_job_name='Sagemaker-Example’, hyperparameters=hyperparameters, use_spot_instances=True, max_wait=24 * 60 * 60, checkpoint_s3_uri='s3://sagemaker-examples.rails.to/checkpoints’) estimator.fit('s3://sagemaker-examples.rails.to/input/data/training') 15
  16. メトリクスの監視⽅法 š 訓練中の標準出⼒はCloudWatchのログストリームに記録される š 訓練時にメトリクス定義を正規表現で切り取るように定義しておけば、 SageMakerのアルゴリズムメトリクスおよびCloudWatchのメトリクスとし て管理できるようになる š TensorFlowの場合には、Tensorboard⽤のログをチェックポイント⽤ディレ クトリに出⼒することで、実⾏終了後に検証可能

    16
  17. どれくらい節約できる︖ š トレーニングにかかっ た時間のうち、請求可 能な時間のみ課⾦され る š 請求可能な時間×オンデ マンドインスタンスの 単価

    š 節約率は70%前後︖ 17
  18. GPUの料⾦:オンデマンドインスタンス クラウド タイプ vCPU GPU CPUメモリ 料⾦/時間 AWS p2.xlarge 4

    K80/12GB 61GB $1.542 p3.2xlarge 8 V100/16GB 61GB $4.194 p3dn.24xlarge 96 V100/32GB×8/NVLink 768GB $42.783 GCP GPUのみ K80/12GB $0.45 GPUのみ P100/16GB $1.46 GPUのみ V100/16GB $2.48 c2 カスタム構成例 4 K80/12GB 52GB $0.82252 c2 カスタム構成例 8 V100/16GB 61GB $3.0239 c2 カスタム構成例 96 V100/16GB×8 624GB $8.58128 ※AWSは東京リージョン、GCPはアイオワリージョンの料⾦ 18
  19. まとめ š Amazon Sagemakerでは、流儀にしたがったディレクトリ構造のDockerイメージを作れば、マネージ ドスポットインスタンスでの学習が可能になる š データや学習済みモデルなどの受け渡しはS3経由 š インスタンスの停⽌に備えるには、頻繁にチェックポイントを保存しておき、起動時に最新の チェックポイントをロードして訓練を⾏うようにする

    š 訓練中の監視はCloudWatchで可能 š 訓練の実⾏はPythonプログラムからも可能 š オンデマンドインスタンスを⽴てての訓練に⽐べて70%程度の節約が可能︖ š GPU⾃体の料⾦はAWSよりもGCPが安いので、GCPで「プリエンプティブインスタンス」を使う⾃ 動化を⾏えば、そっちの⽅が安くあがりそう︖ 19
  20. 参考 š Train a Model with Amazon SageMaker š https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-training.html

    š SageMaker Python SDK š https://github.com/aws/sagemaker-python-sdk š SageMaker Training Toolkit š https://github.com/aws/sagemaker-training-toolkit š Amazon SageMaker Examples š https://github.com/awslabs/amazon-sagemaker-examples š A quick guide to using Spot instances with Amazon SageMaker š https://towardsdatascience.com/a-quick-guide-to-using-spot-instances-with-amazon-sagemaker-b9cfb3a44a68 š クラスメソッドブログ︓Sagemaker特集カテゴリー š https://dev.classmethod.jp/referencecat/amazon-sagemaker/ 20