Skip to content

Instantly share code, notes, and snippets.

@hariby
Last active September 12, 2021 02:23
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hariby/1da937a98b82274d13e724cc921f0b57 to your computer and use it in GitHub Desktop.
Save hariby/1da937a98b82274d13e724cc921f0b57 to your computer and use it in GitHub Desktop.

AWS でもう一歩進める機械学習 Amazon SageMaker ハンズオンセミナー

概要

日時: 2021年 6月 15日 (火) 12:00 - 15:00

Twitter ハッシュタグ: #startupfm

AWS メンバー紹介

Starup Solutions Architect

  • @_hariby: 日本のスタートアップに対する AWS 導入支援、特に機械学習・量子コンピュータ担当をやっています。
  • @eccyan: 複数企業のスタートアップを渡り歩き Startup SA としてジョイン。好きな筋トレはスクワットです!
  • @spesnova: 大中小様々な企業を経て AWS にジョイン。ソリューションアーキテクトとして日本のスタートアップを支援。
  • @nog: スタートアップ、メガベンチャー等でサーバサイド開発や技術責任者等を担当。好きなおにぎりは筋子です。

Time Table

注: 内容・スケジュールについては変更される可能性がございます

1. 導入

2. ハンズオンワークショップ

2.1. ハンズオン環境

Event Engine を利用します。ログイン URL (expired) を開いた後、登録時に記入したメールアドレスで認証を行って下さい。認証方法は Email One-Time Password (OTP) または Login with Amazon アカウント (AWS アカウントではない) が選択できます。

AWS マネージメントコンソールにログインし、SageMaker Studio (Oregon Region) を開いて下さい。その後、各自で SageMaker Studio のユーザーを作成します。Studio にログイン後、ハンズオンでは SageMaker JumpStart を利用します。

2.2. コンテンツ

  • Notebook1: Training and Hosting a PyTorch Model
    • Amazon SageMaker で Python スクリプトを用いた機械学習モデルのトレーニング (40分)
    • Amazon SageMaker で推論エンドポイントへのデプロイとアプリとの統合 (40分)
  • Notebook2: How to Use Spot Training
    • SageMaker Managed Spot Training によるコスト削減 (20分)

2.3. 発展編

2.3.1 PyTorch サンプルの Managed Spot Training への書き換え

Notebook1: Training and Hosting a PyTorch Model を使って Spot Training を試す場合、"SAVING AND LOADING A GENERAL CHECKPOINT IN PYTORCH" を参考に cifar10.py の各エポック後 (125行目) に checkpoint を保存するよう以下を追加:

        torch.save({'epoch': epoch, 'model_state_dict': model.cpu().state_dict(), 'optimizer_state_dict': optimizer.state_dict(), 'loss': loss}, '/opt/ml/checkpoints/model.pth')

105行目以降 (epoch の for loop が始まる前) に、保存済みの checkpoint があれば読み込むよう以下を追加:

    try:
        checkpoint = torch.load('/opt/ml/checkpoints/model.pth')
        model.load_state_dict(checkpoint['model_state_dict'])
        checkpoint_epoch = checkpoint['epoch'] + 1
    except:
        checkpoint_epoch = 0

ループを checkpoint_epoch から始めるよう以下のように書き換え:

    for epoch in range(checkpoint_epoch, args.epochs):

また、Notebook 上では Managed Spot Training を呼び出すよう以下の5行を PyTorch estimator に追加:

                    use_spot_instances=use_spot_instances, 
                    max_run=max_run, 
                    max_wait=max_wait, 
                    checkpoint_s3_uri=checkpoint_s3_uri, 
                    checkpoint_local_path=checkpoint_local_path

更にその上にセルを追加し、パラメータを記載 (checkpoint_s3_uri がトレーニングごとに変わるようにしています):

use_spot_instances = True
max_run = 3600
max_wait = 7200 if use_spot_instances else None
import uuid

checkpoint_suffix = str(uuid.uuid4())[:8]
checkpoint_s3_uri = (
    "s3://{}/{}/artifacts/pytorch-checkpoint-{}/".format(bucket, prefix, checkpoint_suffix)
    if use_spot_instances
    else None
)
checkpoint_local_path='/opt/ml/checkpoints/'

を追記。

2.3.2 AWS SDK (boto3) からの推論呼び出し

SageMaker SDK (sagemaker) ではなく、AWS SDK (e.g. Python だと boto3) を使って呼び出す方法について説明します。 SageMakerRuntime クラスの invoke_endpoint() を使います。EndpointName='pytorch-training-2021-06-15-XX-XX-XX-XX' を作成済みのエンドポイント名に置き換えて以下を実行します。

from cifar_utils import classes, show_img, train_data_loader, test_data_loader

test_loader = test_data_loader()

import numpy as np
import torchvision, torch

# get some test images
dataiter = iter(test_loader)
images, labels = dataiter.next()

# print images, labels, and predictions
show_img(torchvision.utils.make_grid(images))
print('GroundTruth: ', ' '.join('%4s' % classes[labels[j]] for j in range(4)))

# invocation
import boto3 

client = boto3.client('sagemaker-runtime')

response = client.invoke_endpoint(
    EndpointName='pytorch-training-2021-06-15-XX-XX-XX-XX',
    Body=json.dumps(images.numpy().tolist()),
    ContentType='application/json')

outputs = response['Body'].read()

import torch
_, predicted = torch.max(torch.from_numpy(np.array(json.loads(outputs), dtype=np.float32)), 1)

print('Predicted:   ', ' '.join('%4s' % classes[predicted[j]] for j in range(4)))

3. デモ

GitHub aws/amazon-sagemaker-examples リポジトリの中からいくつかサンプルノートブックを使ってデモをお見せします。

4. まとめ

  • Q&A (20分)
  • アンケート URL (expired)

参考資料

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment