• トップ
  • ブログ一覧
  • SageMakerでPyTorchを動かしてみた
  • SageMakerでPyTorchを動かしてみた

    広告メディア事業部広告メディア事業部
    2020.02.18

    IT技術

    SageMaker( セージメイカー)の本格活用時代に入った

    2019年12月、ラスベガスで『AWS Re:Invent(エーダブリューエス リ:インヴェント)』が行われました。

    そのイベントを見た印象ですが、機械学習関連のサービスが拡充されて、いよいよ SageMaker( セージメイカー) も、本格活用時代に入ったのではと感じています。

    昨年に発表された当初は、MxNet(エムエックスネット)と、ビルトインAmazonアルゴリズム中心で、いまひとつ使い勝手が悪い印象でした。

    環境が整った

    ですが、昨年後半から PyTorch がサポートされるようになり、今回、PyTorch1.0~1.3 がシームレスにサポートされて、使いやすい環境になってきました。

    そこで、今回 Pytorch を使ってみる事を中心に、SageMaker を紹介したいと思います。

    さらに、「既存の PyTorchプログラム」と「SageMaker 上の PyTorch」の違いにも注目していきます!

    Jupyter(ジュパイター)インスタンスの準備

    まず、Jupyter インスタンスの準備を行います。

    SageMakerインスタンスを起動し、「SageMaker Example」タブをクリックします。

    すると、AWSでサポートされている各種機能の、サンプルを見ることができます。

    この中から、「SageMaker Python SDK 」を選択

    今回は、MNIST を AWS が SageMaker 用に改造した、pytorch_mnist.jpynb を選びます。

    右側のオレンジ色の「USE」ボタンを押すと、サンプルから実行ディレクトリーにコピーされて開きます。

    Kernel(カーネル)の切り替え

    SageMaker では、Jupyterノートブックを、AWS でチューニングされた Kernel に切り替えて、実行することができるというのが、大きな特徴です。

    重要なのは、正しい Kernel をセットすることです。

    右上に、現在選択されている、Kernel が表示されています。

    conda_pytorch_p36 以外になっている場合

    選択されているものが、「conda_pytorch_p36」以外になっている場合、表示されている部分を押します。

    ドロップダウンボックスを表示し、「conda_pytorch_p36」に切り替えます。

    準備完了

    これで準備完了です。

    正しくセットされていた場合、1のコードセルをクリックし、緑色にして実行すると、エラーが発生せずに終わります。

    以下、コードセルを順に実行していけば、MNIST の動きを確認することができます。

    一行目で、 SageMakerSDK を import していることに注目して下さい。

    エラーが発生する場合

    Kernel が正しく選ばれていないと、途中で「import するライブラリが見つかりません」というエラーになります。

    昨年までは、 Kernel へのプリインストールライブラリのサポートが不十分で、エラーが発生。

    自前でライブラリを入れる事が、多々ありました。

    うってかわって、現在の Kernel では、エラーなく動かすことができます。

    もしエラーになった場合、「Kernelが正しくセットされているか?」、また「セルを上から順に実行しているか?」を疑ってみて下さい。

    SageMaker Python SDKの概要

    SageMaker は、コンテナ技術を活用して、主に学習管理を主眼として作られたサービスです。

    そして、SageMaker Python SDK は、主に SageMaker で Python を使い機械学習を実行させるために、必要な機能を集めたライブラリです。

    SDK は、多くのサンプルからのカスタマイズを行うか、自前のアルゴリズムを用いることで、機械学習のタスクを実行できるように作られています。

    SDK を理解するには

    また、「SDK」は多くの機能を持っています。

    次の4つの機能の理解が、SDK を理解する第一歩となるでしょう。

    1:SageMaker で学習用のコンテナとやりとりをして、学習管理をする機能

    2:S3 上のデータセットを置いて、コンテナとやりとりして、学習を準備する機能

    3:学習の管理
    実際の学習を行うときには、別コンテナ上でジョブとして動きますので、これの実行管理をおこなうことができ、さらには、ジョブの結果のモデルを保存しておいてくれる機能があります。SageMaker の最大のメリットは、このジョブ管理によって、学習に最適な大きさのインスタンスを選ぶことで、コストを最適化させて、実行することができることです。

    4:学習用パラメータの管理
    実際の学習では、各種パイパーパラメータを変えて実行していきますが、前述の学習管理に紐づいてハイパーパラメータも管理されますので、実際の機械学習の研究・開発で大いに役立ちます。

    mnist.jpynb コードの解説

    データの準備

    torchvision を使ってデータをダウンロードし、これを学習用に S3 にアップロードします。

    PyTorchコンテナの設定と準備

    pytorchコンテナの設定を行います。

    SDK の中での、コア機能になります

    この中で「pytorch のバージョン」、「トレーニングさせるインスタンスタイプ」、「トレーニングのハイパーパラメータ」をセットします。

    entry_point に、「実際に使う pythonファイルを指定している事」に、注目して下さい。

    コンテナは、プログラム上で「esitimater」と呼ばれています。

    つまりここで、 SageMaker Python SDK は、あらかじめ準備されたコンテナを、動的に呼び出して、実行準備をしています。

    コードセルにある、estimaer.fit() の命令が重要です。

    この命令を実行することで、先ほど準備されたコードを実行し、学習がコンテナ上で動くことになります。

    ちなみに、esitimater は、PyTorch 用以外に、Tensorflow 用など、サポートしている機械学習フレームワークごとに存在しています。

    mnist.py 側のコードの解説

    1def train(args):
    2    is_distributed = len(args.hosts) > 1 and args.backend is not None
    3    logger.debug("Distributed training - {}".format(is_distributed))
    4    use_cuda = args.num_gpus > 0
    5    logger.debug("Number of gpus available - {}".format(args.num_gpus))
    6    kwargs = {'num_workers': 1, 'pin_memory': True} if use_cuda else {}
    7    device = torch.device("cuda" if use_cuda else "cpu")

    これは、mnist.py からの重要な部分、train関数の定義部分です。

    Estimater.fit() ですが、実際には、コンテナ上の entry_point のtrain関数を呼び出します。

    argsオブジェクトには、実際に Jupyterプログラムの estimater 内で定義した、ハイパーパラメータなどが格納されています。

    既存の PyTorchプログラムを、SageMaker で動かすためには、学習からモデルの保存部分を、この train関数として定義する必要があります

    PyTorch のサンプル

    PyTorch には、多くのサンプルが存在しています。

    それらについては、AWS が「Additional Example Github Python Tutorial」に公開されています。

    ですので、今回と同じ方法でコピーして動かすことができます。

    また、AWSは定期的にサンプルが追加されています。

    時々、サンプルをチェックすると、思わぬ発見があるかもしれません。

    さいごに

    SageMaker を使うコツは、コンテナ技術で構成されていることをしっかりと意識しましょう。

    すなわち、「Estimator」について、よく知ることです。

    このように、SageMaker を使うことで、PyTorch のプログラムを簡単に実行することが出来ます。

    しかも「パラメータを変更しながら学習を繰り返すことで結果を得る」という、機械学習での研究開発の、泥臭い部分をJupyter 上で簡単に行うことができます。

    以前の環境に比べて、エラーが少なく、とても使いやすい環境に進化していると思います。

    是非試してみてください!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事