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. AWSのGPUを安く使って
    TensorFlowモデルを訓練する⽅法
    板垣正敏@TensorFlow Users Group Niigata Meetup #3 2020/8/8

    View Slide

  2. ⾃⼰紹介
    š 板垣 正敏(いたがき まさとし)
    š 1955年 新潟県・村上市⽣まれ
    š Python機械学習勉強会in新潟 世話⼈
    š NPO法⼈ 新潟オープンソース協会 理事
    š 株式会社BSNアイネット 技術顧問
    š 中⼩企業診断⼠
    2

    View Slide

  3. アジェンダ
    š GPUを持っていない/GPUが⾜りない︖
    š クラウドGPUの料⾦
    š Amazon SageMakerとは︖
    š SageMaker トレーニングジョブの仕組み
    š ⽤意するもの
    š コンテナ内の標準ディレクトリ構成
    š 訓練⽤プログラムの勘所
    š Docker ImageのビルドとECRへの登録
    š トレーニングジョブの投⼊と完了
    š メトリクスの監視⽅法
    š どれくらい節約できる︖
    š まとめ
    3

    View Slide

  4. GPUを持っていない/GPUが⾜りない︖
    š Google Colaboratoryは素晴らしい
    š ⼿元にGPUがない場合に⼀番⼿軽で⼀番安い(なにせ無料)なのがGoogle
    Colaboratoryです(⽶国では有料プランも)
    š GPU以外にクラウドTPUも無料で使うことができます
    š ただし、最⼤実⾏時間12時間の制限があるほか、⼀定時間操作を⾏わないと切断さ
    れます
    š クラウドを使う
    š GPUマシンを購⼊するほどではないが、お⾦がかかってもある程度の時間GPUを使い
    たいとか、たくさんのGPUが必要なモデルの訓練を⾏う場合などは、クラウドを利⽤
    することになります
    4

    View Slide

  5. Amazon SageMakerとは︖
    š AWSでラベリングからデプロイ・管理まで、機械学習のライフサイクルをサポートするサービス群
    5

    View Slide

  6. SageMaker
    トレーニングジョブ
    の仕組み
    š AWSのコンテナサービスを使
    って機械学習モデルの訓練を
    行うサービス
    š 利用可能なモデル
    š AWSあるいはマーケットプレ
    イスのアルゴリズム
    š カスタムアルゴリズム
    š AWSが用意したコンテナ(
    TensorFlow, PyTorchなど)
    š カスタムコンテナ(今回はコ
    レ)
    https://towardsdatascience.com/a-quick-guide-to-using-spot-instances-
    with-amazon-sagemaker-b9cfb3a44a68 6

    View Slide

  7. ⽤意するもの
    š AWSアカウント
    š Amazon SageMaker⽤のロール(アタッチするポリシーはAmazonSageMakerFullAccessのみで可)
    š ECRのレジストリ
    š S3バケット
    š 訓練⽤プログラム
    š 訓練⽤データ
    š Dockerのビルド環境
    7

    View Slide

  8. コンテナ内の標準ディレクトリ構成
    /opt/ml
    ├── checkpoints <= 中断に備えてチェックポイントを保存︓S3バケットにコピー
    ├── code
    │ └── train <= 訓練⽤プログラムのエントリーポイント(既定)
    ├── input
    │ ├── config <= SageMakerトレーニングジョブから渡される
    │ │ ├── hyperparameters.json <= 訓練ジョブ投⼊時に設定したハイパーパラメータが⼊る
    │ │ └── resourceConfig.json <= Sagemakerが割り当てたリソースに関する情報
    │ └── data
    │ └── training <= 訓練⽤データの場所(既定)︓S3バケットからコピーされる
    ├── model <= 学習したモデルの保存場所︓圧縮後outputにコピー
    └── output <= 出⼒⽤ディレクトリ︓S3バケットにコピー
    8

    View Slide

  9. 訓練⽤プログラムの勘所
    š 訓練⽤プログラムのエントリーポイントは、Shell ファイルまたはPython
    ファイル
    š Docker コンテナ内の/opt/ml/code/trainが既定の場所と名前
    š 実⾏ファイル名は、環境変数SAGEMAKER_PROGRAMで指定可能
    š プログラムにパラメータを渡す⽅法は2つ
    š SageMakerトレーニングジョブのハイパーパラメータを通じて渡す
    š 環境変数を通じて渡す
    š スポットインスタンスは中断されることを前提に、チェックポイントを
    定期的に保存し、起動したときにチェックポイントがある場合には、そ
    の続きを実⾏するようにすること 9

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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
    ※コンテナにローカルディレクトリをマウントすれば、ローカルでもテスト可能

    View Slide

  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

    View Slide

  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

    View Slide

  16. メトリクスの監視⽅法
    š 訓練中の標準出⼒はCloudWatchのログストリームに記録される
    š 訓練時にメトリクス定義を正規表現で切り取るように定義しておけば、
    SageMakerのアルゴリズムメトリクスおよびCloudWatchのメトリクスとし
    て管理できるようになる
    š TensorFlowの場合には、Tensorboard⽤のログをチェックポイント⽤ディレ
    クトリに出⼒することで、実⾏終了後に検証可能
    16

    View Slide

  17. どれくらい節約できる︖
    š トレーニングにかかっ
    た時間のうち、請求可
    能な時間のみ課⾦され

    š 請求可能な時間×オンデ
    マンドインスタンスの
    単価
    š 節約率は70%前後︖
    17

    View Slide

  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

    View Slide

  19. まとめ
    š Amazon Sagemakerでは、流儀にしたがったディレクトリ構造のDockerイメージを作れば、マネージ
    ドスポットインスタンスでの学習が可能になる
    š データや学習済みモデルなどの受け渡しはS3経由
    š インスタンスの停⽌に備えるには、頻繁にチェックポイントを保存しておき、起動時に最新の
    チェックポイントをロードして訓練を⾏うようにする
    š 訓練中の監視はCloudWatchで可能
    š 訓練の実⾏はPythonプログラムからも可能
    š オンデマンドインスタンスを⽴てての訓練に⽐べて70%程度の節約が可能︖
    š GPU⾃体の料⾦はAWSよりもGCPが安いので、GCPで「プリエンプティブインスタンス」を使う⾃
    動化を⾏えば、そっちの⽅が安くあがりそう︖
    19

    View Slide

  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

    View Slide