Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

masa-ita
August 08, 2020

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

masa-ita

August 08, 2020
Tweet

More Decks by masa-ita

Other Decks in Technology

Transcript

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

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

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

    ただし、最⼤実⾏時間12時間の制限があるほか、⼀定時間操作を⾏わないと切断さ れます š クラウドを使う š GPUマシンを購⼊するほどではないが、お⾦がかかってもある程度の時間GPUを使い たいとか、たくさんのGPUが必要なモデルの訓練を⾏う場合などは、クラウドを利⽤ することになります 4
  4. SageMaker トレーニングジョブ の仕組み š AWSのコンテナサービスを使 って機械学習モデルの訓練を 行うサービス š 利用可能なモデル š

    AWSあるいはマーケットプレ イスのアルゴリズム š カスタムアルゴリズム š AWSが用意したコンテナ( TensorFlow, PyTorchなど) š カスタムコンテナ(今回はコ レ) https://towardsdatascience.com/a-quick-guide-to-using-spot-instances- with-amazon-sagemaker-b9cfb3a44a68 6
  5. コンテナ内の標準ディレクトリ構成 /opt/ml ├── checkpoints <= 中断に備えてチェックポイントを保存︓S3バケットにコピー ├── code │ └──

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

    š プログラムにパラメータを渡す⽅法は2つ š SageMakerトレーニングジョブのハイパーパラメータを通じて渡す š 環境変数を通じて渡す š スポットインスタンスは中断されることを前提に、チェックポイントを 定期的に保存し、起動したときにチェックポイントがある場合には、そ の続きを実⾏するようにすること 9
  7. チェックポイントを検索する関数 # チェックポイントディレクトリをスキャンし、最も新しいチェックポイントとエポック数を返す 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
  8. チェックポイントがあればロード # チェックポイントを検索し、あれば最新の重みをロードし再開するエポック数をセット 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
  9. ビルド環境について 開発環境のディレクトリ構造 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 ※コンテナにローカルディレクトリをマウントすれば、ローカルでもテスト可能
  10. 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
  11. トレーニングジョブの投⼊と完了 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
  12. 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
  13. まとめ š Amazon Sagemakerでは、流儀にしたがったディレクトリ構造のDockerイメージを作れば、マネージ ドスポットインスタンスでの学習が可能になる š データや学習済みモデルなどの受け渡しはS3経由 š インスタンスの停⽌に備えるには、頻繁にチェックポイントを保存しておき、起動時に最新の チェックポイントをロードして訓練を⾏うようにする

    š 訓練中の監視はCloudWatchで可能 š 訓練の実⾏はPythonプログラムからも可能 š オンデマンドインスタンスを⽴てての訓練に⽐べて70%程度の節約が可能︖ š GPU⾃体の料⾦はAWSよりもGCPが安いので、GCPで「プリエンプティブインスタンス」を使う⾃ 動化を⾏えば、そっちの⽅が安くあがりそう︖ 19
  14. 参考 š 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