NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

【新機能】Amazon SageMaker Studio Labで機械学習を無料学習する

こんにちは、上野です。

Amazon SageMaker Studio Labがre:Invent 2021で発表されましたね!

学習に良さそうなサービスなので実際に触ってみました。

Amazon SageMaker Studio Labとは

JupyterLabと呼ばれる機械学習の環境を、無料で利用できるサービスです。もう一度、無料です!!

以下のような特徴があります。

  • AWSアカウントとは別で管理されており、クレジットカード情報も不要
  • GPUも使用可能
  • 15 GBのストレージ付き

機械学習を勉強するにしても、環境設定やコストが懸念だよね。と動画で紹介されていました。 f:id:fu3ak1:20211207170640p:plain

そんな懸念点を解決してくれるサービスです!AWSアカウントとまったく関係ないところで動くので、普通のAWSサービスとはちょっと違った感覚ですね。

申し込んでみる

コチラから申込可能です!

f:id:fu3ak1:20211207164910p:plain

Request Accountを押して、メールアドレスや氏名等の情報をしてリクエストを送信します。

メールを受信するので、忘れずにVerify your emailをクリックしておきます。クリックすると以下のように表示されます。

f:id:fu3ak1:20211207165345p:plain

後はAWS側の承認待ちです。

承認、アカウント作成

2営業日後に、承認メールが来ました。7日間で承認リンクが切れるので、忘れずにクリックしてアカウントを作成しましょう。

f:id:fu3ak1:20211209155305p:plain

必要情報を入力し、Create Accountします。

f:id:fu3ak1:20211209155452p:plain

もう一度確認メールが飛ぶので、メールのリンクをクリックします。(申込から3回ほどメール確認している気がします・・)

f:id:fu3ak1:20211209155537p:plain

f:id:fu3ak1:20211209155611p:plain

やっとSign inです。

f:id:fu3ak1:20211209155802p:plain

入れた!画面下部には、お勉強用の参考ページなどの情報が表示されています。

f:id:fu3ak1:20211209155828p:plain

プロジェクトの開始

プロジェクトをStartしてみます。CPUまたはGPUを選べます。CPUは12時間で自動停止、GPUは4時間で自動停止という仕様になっています。

なお、停止後で手動再起動、再利用は可能で、データも残ります。月あたりの利用時間といった制約は無いようです。ただし、毎回起動が保証されているという訳でもありません。(FAQより)

特にGPUの必要性はないのでCPUで起動してみます。

f:id:fu3ak1:20211209161113p:plain

起動して、残り時間が表示されます。Open Projectをクリックします。

f:id:fu3ak1:20211209161152p:plain

Jupyter Notebook環境が表示されました!最初はGetting Startedのノートブックが1つあるだけでした。

f:id:fu3ak1:20211209161323p:plain

学習プログラムを書いてみる

せっかくなので機械学習モデルを作ってみたいと思います。ここはSageMaker Studio LabというよりはJupyterLabの機能紹介がメインになります。

今回はPyTorchのチュートリアルを参考に、MNISTのモデルを作ってみます。PyTorchはPythonのオープンソースの機械学習ライブラリです。

(参考)MNISTとは

手書き数字の大規模なデータで、今回のように勉強用途等で、画像から数字を予測するモデルを構築する場合に広く使われています。

ja.wikipedia.org

それではやっていきます。まずは新規のノートブックを作成します。

f:id:fu3ak1:20211209171935p:plain

チュートリアルのノートブックを見たい場合は、ターミナルをJupyter Notebook上で開いて以下のコマンドでダウンロードできます。

$ cd sagemaker-studiolab-notebooks/
$ wget https://pytorch.org/tutorials/_downloads/5ddab57bb7482fbcc76722617dd47324/nn_tutorial.ipynb

ダウンロードしたノートブックを左のメニューから選択することで内容確認できます。

f:id:fu3ak1:20211209172549p:plain

ダウンロードしたノートブックを参考に、モデル作成に最低限必要なコードを自分のノートブックに実装していきます。

※PyTorchのコードにあまり興味が無い方は読み飛ばしてください※

全体のソースコードは以下のようになりました。

# ライブラリインストール
%pip install requests
%pip install matplotlib
%pip install torch

# モジュールimport
from pathlib import Path
import requests
import pickle
import gzip
from matplotlib import pyplot
import numpy as np
import torch
from torch import nn
from torch import optim
from torch.utils.data import DataLoader
from torch.utils.data import TensorDataset
import torch.nn.functional as F

# MNISTデータダウンロード、読込
DATA_PATH = Path("data")
PATH = DATA_PATH / "mnist"

PATH.mkdir(parents=True, exist_ok=True)

URL = "https://github.com/pytorch/tutorials/raw/master/_static/"
FILENAME = "mnist.pkl.gz"

if not (PATH / FILENAME).exists():
        content = requests.get(URL + FILENAME).content
        (PATH / FILENAME).open("wb").write(content)
        
with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
        ((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")

# 画像の確認(1枚目)
pyplot.imshow(x_train[0].reshape((28, 28)), cmap="gray")
print(x_train.shape)

# Torch形式にデータを変換
x_train, y_train, x_valid, y_valid = map(
    torch.tensor, (x_train, y_train, x_valid, y_valid)
)
n, c = x_train.shape

# Dataloaderの使用
bs = 64

train_ds = TensorDataset(x_train, y_train)
train_dl = DataLoader(train_ds, batch_size=bs, shuffle=True)

valid_ds = TensorDataset(x_valid, y_valid)
valid_dl = DataLoader(valid_ds, batch_size=bs * 2)

# nn.Sequentialモデルの実装
#https://pytorch.org/tutorials/beginner/nn_tutorial.html#nn-sequential

lr = 0.1 #学習率
epochs = 10 #エポック数

class Lambda(nn.Module):
    def __init__(self, func):
        super().__init__()
        self.func = func

    def forward(self, x):
        return self.func(x)


def preprocess(x):
    return x.view(-1, 1, 28, 28)

def fit(epochs, model, loss_func, opt, train_dl, valid_dl):
    for epoch in range(epochs):
        model.train()
        for xb, yb in train_dl:
            loss_batch(model, loss_func, xb, yb, opt)

        model.eval()
        with torch.no_grad():
            losses, nums = zip(
                *[loss_batch(model, loss_func, xb, yb) for xb, yb in valid_dl]
            )
        val_loss = np.sum(np.multiply(losses, nums)) / np.sum(nums)

        print(epoch, val_loss)

def loss_batch(model, loss_func, xb, yb, opt=None):
    loss = loss_func(model(xb), yb)

    if opt is not None:
        loss.backward()
        opt.step()
        opt.zero_grad()

    return loss.item(), len(xb)
        
model = nn.Sequential(
    Lambda(preprocess),
    nn.Conv2d(1, 16, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    nn.Conv2d(16, 16, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    nn.Conv2d(16, 10, kernel_size=3, stride=2, padding=1),
    nn.ReLU(),
    nn.AvgPool2d(4),
    Lambda(lambda x: x.view(x.size(0), -1)),
)

opt = optim.SGD(model.parameters(), lr=lr, momentum=0.9)
loss_func = F.cross_entropy

fit(epochs, model, loss_func, opt, train_dl, valid_dl)

# 画像とその予測結果を表示

data = x_valid[0]
preds = model(data) # predictions
print(torch.argmax(preds))

pyplot.imshow(data.reshape((28, 28)), cmap="gray")

ノートブックでは随時次のように実行結果を確認しながら進めることができます。

学習データの画像を表示したり、

f:id:fu3ak1:20211209213928p:plain

損失の状況を確認したり(良い感じに減って学習できています)、

f:id:fu3ak1:20211209214013p:plain

作成したモデルの予測も確認できます。tensor()の()内の数字が予測結果で、表示されている画像が予測対象の画像です。

いくつか(検証データで)試しましたが良い感じで予測できています。

3
f:id:fu3ak1:20211209220215p:plain 8
f:id:fu3ak1:20211209220236p:plain 6
f:id:fu3ak1:20211209220258p:plain

検証は以上です。

まとめ

Amazon SageMaker Studio Labはパブリックプレビュー状態ですが、勉強、検証用途のサービスになりますので、積極的に使ってみてはいかがでしょうか。繰り返しになりますが無料なのが最高ですね。

AWSアカウント上でJupyterノートブックや、Cloud9などのIDEを使っている場合、心のどこかに「あぁ、今起動してるから料金発生しているな・・」という気持ちが残ります。そういったことを気にせず学習できるのは素晴らしいですね。GPUも使用できるので、それなりに大規模なデータ、複雑なニューラルネットワークなども実装できそうです。

また、ここで作成したプロジェクトをAWSアカウントのSageMaker Studioにも持っていけるようです。(FAQより)
PoC的にAWSアカウントもお金も不要のLabで試して、うまくいったらAWSアカウントを作成して本格構築という進め方もできそうですね。

GoogleにはColaboratoryという似たサービスがあるので、そことどう違いが出てくるのか今後も気になるところです。

それでは!

f:id:fu3ak1:20210325095452j:plain

執筆者上野史瑛

Japan APN Ambassador 2020
AWSを中心としたクラウドの導入、最適化を専門に行っています。