「MXNet/Gluon」開発チームによる「ハンズオン」に参加してきました。(2日目のまとめ)

「MXNet/Gluon」のハンズオンに参加してきました!「Model zoo」にあるモデルを少し使ってみたいですね。
2018.12.21

2018年12月17日(月)~19日(水)にAWSJ主催で実施された「MXNet/Gluon」のハンズオン に参加してきましたので、まとめレポートを書こうと思います。
本エントリーは12月18日(火)のハンズオンのまとめレポートです。
1日めのエントリーはこちらです。

当日の報告資料はこちらです。
MXNet_Gluon_Workshop_2018121
Hyperparameter_tuning
Segmentation
DataProcessing

目次

1.報告内容

当日の報告内容は下記の5点でした。それぞれの概要をまとめます。

  • 「Segmentation」についての説明とハンズオン
  • 「MXNet/Gluon」を使ったデータの前処理について
  • 教師データ作成のための「データのアノテーションづけ」の方法について
  • ハイパーパラメータチューニングについて
  • 業務webアプリへのSageMakerの活用パターンの紹介

2.「Segmentation」についての説明とハンズオン

2日目は「Semantic Segmentation」や「Instance Segmentation」等の「Segmentation」系のアルゴリズムについての紹介から始まりました。

まずは「Segmentationを学ぶうえで認識しておくべきこと」として下記の3点が挙げられていました。

  • 画像中の物体を画素単位で識別する技術
  • 「Semantic Segmentation」では同一クラスの物体には同じラベルをつける
  • 「Instance Segmentation」では同一クラスでも、物体それぞれを識別できるようにラベルをつける

    また、「Image Classification」,「Object Detection」,「Segmentation」の違いを「INPUT」、「OUTPUT」、「評価指標」の観点から整理していました。
    「Segmentation」は画素単位で結果を出力することになるため、「OUTPUT&評価指標」に画素単位で見る項目が存在するのが特徴です。

    メジャーなモデルとしては、下記のようなものがあります。

    それぞれのモデルの特徴を下記のようにざっくりと整理していました。
    「FCN」はネットワークがシンプルなので使いやすいのですが精度をあまり高くすることができず、より精度を上げるためには「PSPNet」や「DeepLab」を使う必要があります。

    また、「Segmentation」の学習テクニックとして、「学習率の調整」や「転移学習を複数回実施すること」を挙げておられました。「Segmentation」は教師データを自前で用意することが困難なので、既に用意されているデータセットで複数回学習することでより汎用的なパラメータを学ぶことが現実的に良い学習方法とのことです。

    「Segmentation」の説明は以上で終わり、続いてハンズオンとして実際に「Gluon model zoo」に用意されている「FCN(Fully Convolutional Networks)」、「DeepLab」を使ってみました。
    ハンズオン内容については、下記のコマンドで取得できるファイルの「04_Segmentation/02_sagemaker_integration/SemanticSegmentation.ipynb」をご参照ください。

    wget https://tinyurl.com/aws-mxnet-gluon-workshop -O workshop.zip
    unzip workshop.zip
    

    また、GluonCVで「segmentation」をする場合はModel Zooに用意されているパラメータを利用すると、転移学習が容易にできます。

    3.「MXNet/Gluon」を使ったデータの前処理について

    続いては、「MXNet/Gluon」を使った画像処理方法についての説明に移りました。
    「GluonCV」では画像を扱った学習において必要な処理を「DataSet」、「Transformation」「DataLoader」の3つに分けて処理していきます。

    「DataSet」は画像とラベルを取得する役割を果たします。
    ここはタスクによって様々な対応を取る必要があります。

    「Transformation」は画像の前処理をする部分です。
    特に学習時は色々な前処理を施すことが多いかと思いますが、「GluonCV」だと処理内容を下記の画像の右側のように追記していくことが可能なので、柔軟に記述することができます。

    「DataLoader」は「次のミニバッチ分のデータを事前に取得しておく」、「各スレッドに処理を投げる」等のデータを捌く役割をします。

    以上の役割の違いから、GluonCVにおける処理の流れは下記のようになります。

    また、MXNetには「DataSet」、「Transformation」、「DataLoader」の役割をまとめて行う「ImageRecordIter」という関数も用意されています。
    柔軟性は低いもののC++のレイヤーで実装されているため、処理が早いのが特徴です。

    下記は「ImageRecordIter」の記述例ですが、「データの格納場所&ラベル(recファイル)」、「前処理」、「スレッド数やバッチサイズ」等、 「DataSet」、「Transformation」、「DataLoader」の役割をまとめて実行していることがわかるかと思います。
    また、「画像分類」系に対応するための処理はある程度「ImageRecordIter」で対応できるそうですが、それ以外のタスク(物体検出等)についてはまだPythonで前処理を書く方が柔軟に対応できるため、現実的だそうです。

    train_data = mx.io.ImageRecordIter(
        path_imgrec=os.path.join(train_path, "train.rec"),
        resize=256,
        data_shape=(3, 224, 224),
        preprocess_threads=num_workers,
        batch_size=batch_size,
        rand_crop=True,
        rand_mirror=True,
        shuffle=True,
        max_random_scale=1.05,
        min_random_scale=0.95,
        max_rotate_angle=10,
        random_h=10,
        random_l=10,
        random_s=10,
        mean_r=123.67500305,
        mean_g=116.27999878,
        mean_b=103.52999878,
        std_r=58.39500046,
        std_g=57.12000275,
        std_b=57.375)   
    

    「ImageRecordIter」はまだCPU上で動作する部分が多いのですが、「より処理速度を向上するためにGPU上で処理」させる「Nvidia DALI」についても紹介されました。

    また、データはHDDやSSDよりもRAMにあった方が処理が早く、

    通常の画像の拡張子よりも「RecordIO」形式にした方がファイルがまとめられて処理も早くなるので、
    (執筆時点では、「画像分類」、「物体検出」系のアルゴリズムにしか対応できていないようですが)

    「MXNet/Gluon」で画像を扱う際の理想としては「RAMにデータを置いて」、「データをRecordIOにパッキング」して、「Nvidia DALIを使って処理」をするのが理想的だそうです。

    4.教師データ作成のための「データのアノテーションづけ」の方法について

    続いて、「データのアノテーション」についての紹介です。
    アノテーションは大変な作業なので、複数人で作業をする必要があり、そのため「上手く共同作業をする仕組み」、もしくは「作業を委託する仕組み」が必要なのですが、Amazon SageMaker Ground Truthはまさにその仕組みを提供しています。

    また、「Amazon SageMaker Ground Truth」では、アノテーションづけを半自動化する仕組みとして、「ある程度アノテーションづけしたデータをもとに、まだアノテーションづけされていないデータにもアノテーションづけする」機能があります。この時に、閾値を高めに設定しておき、「かなりの精度でアノテーションづけが正常にできそうな画像については、アノテーションづけを半自動化する」ことが可能となります。

    「Amazon SageMaker Ground Truth」でどんなことができるのか、については下記のエントリーが参考になります。
    Amazon SageMaker Ground Truthで画像分類用教師画像を作ってみる

    5.ハイパーパラメータチューニングについて

    続いて、ハイパーパラメータのチューニングについての紹介です。

    まず、ハイパーパラメータチューニングのイメージですが、機械学習では下記のように「ロス関数」を最小化するために様々なハイパーパラメータをチューニングする必要があります。

    ハイパーパラメータのチューニング方法として有名な手法として「Grid Search」という手法があります。
    この手法は、指定したハイパーパラメータの組み合わせを全て試す、といった手法です。

    この手法では「組み合わせを全パターン試すと、試行回数が多くなりすぎる」、「過去の試行結果を活かせない」といった問題があります。
    例えば、10個のハイパーパラメータで、各々5個づつ値を指定した場合は5^10回試行する必要が出てくるため現実的に実行不可能となるため、「探索できる範囲が限られて」しまいます。

    そのほかのチューニング方法として、「Random Search」という手法も紹介されました。
    この手法は「Grid Search」とは異なり、探索するハイパーパラメータをランダムに決定する、というものです。

    この「Random Search」には、「このハイパーパラメータで良い結果だったから、次はこの値を使おう」といった、事前の試行結果を利用できていない、といった問題があります。

    そこで、「ハイパーパラメータ、評価指標の関係」を「特定のモデルで仮定」することでハイパーパラメータをチューニングする「モデルベース」のチューニング手法として「ベイズ最適化」が紹介されていました。
    この手法では、事前の試行結果を利用することができ、また「まだあまり計算していないハイパーパラメータの範囲」も計算するため、効率よくハイパーパラメータのチューニングをすることが可能です。

    「ベイズ最適化」の計算過程では「獲得関数を最大化」するハイパーパラメータを選択するのですが、この獲得関数は「評価指標がどのくらいの値になりそうか(平均)」と「どれくらい、まだよくわからないか(共分散)」の2要素をINPUTとしています。
    そのため、「過去の試行結果の活用」と「探索」をバランスよくこなすことができます。

    この「ベイズ最適化」はSageMakerの自動モデルチューニングで実装されているため、簡単に使えて便利なのですが「指定する範囲を大きくしすぎると、計算コストが大きくなり、計算結果が悪かったハイパーパラメータの近くが選択されない」ことになるのでご注意ください。

    「ベイズ最適化」の紹介の後は、「Gluonのmodel zoo」に用意されている「ResNet-50」の転移学習にベイズ最適化を利用するハンズオンに移りました。
    ハンズオンの詳細については「05_DataProcessing/01_classification_with_recordio/gloncv-classification-with-recordio-sagemaker.ipynb」をご参照ください。

    6.業務webアプリへのSageMakerの活用パターンの紹介

    最後に「業務webアプリケーションへのSageMakerの活用パターン」の紹介がありました。
    ざっくり構成を述べると、下記の通りです。

    • HTMLページを作成し、画像を指定して「API Gateway」で作成したAPIを叩く
    • API Gatewayで作成したAPIからLambda関数を実行する
    • Lambda関数では、INPUTとして画像を受け取り、SageMaker推論用エンドポイントに処理を投げる

    Lambda関数中ではinvoke_endpointを使って推論用エンドポイントに処理を投げます。
    Lambda関数の環境変数にエンドポイント名を指定しておくと、エンドポイント名の変更等に柔軟に対応できるので、運用が楽になりそうです。

    7.まとめ

    以上で、2日目のハンズオンの内容の報告を終わります。

    「Segmentation」、や「MXNet/Gluonを使った画像データの扱い」、「Ground Truthによるデータのアノテーションづけ」、「ハイパーパラメータチューニング」、「業務webアプリケーションへのSageMakerの活用パターンの紹介」等盛りだくさんでしたが、少しでもどなたかの参考になれば幸いです。