Amazon Web Services ブログ

Amazon SageMaker で増分学習を簡単に実行する



データ科学者および開発者は、Amazon SageMaker で増分学習を簡単に実行できるようになりました。増分学習は、既存のモデルの知識を新しいデータでさらにトレーニングすることによって拡張する機械学習 (ML) 技術です。今日から、Amazon SageMaker 組み込みビジュアル認識アルゴリズム、画像分類オブジェクト検出のどちらもが、増分学習をすぐにサポートできるようになります。したがって、新しいデータのモデルトレーニングを開始する前に、AWS マネジメントコンソールまたは Amazon SageMaker Python SDK API を使用して、既存の Amazon SageMaker ビジュアル認識モデルを簡単にロードすることができます。

概要

増分学習は、既存の機械学習モデルの知識を新しいデータでさらにトレーニングすることによって継続的に拡張する技術です。したがって、訓練の開始時には、最初に無作為に初期化するのではなく、以前トレーニングを実行して得られたモデルの重みをロードしてから、新しいデータでモデルをさらにトレーニングし続けます。このようにして、以前トレーニングを実行してモデルが得た知識を保持し、それをさらに拡張します。これは、すべてのトレーニングデータに同時にアクセスすることができず、データはバッチ単位で経時的に取得し続ける場合に役立ちます。この学習テクニックを使用して、新しいトレーニングデータでモデルを再トレーニングするときに時間を節約し、リソースを計算することもできます。

このブログ記事では、Amazon SageMaker の増分学習機能を使用して転移学習を実行する方法についても説明します。説明する際は、既存のモデルをシェルフから取り出して使用します。モデルズーから画像分類モデルを選択し、新しい分類タスクを実行するためのモデルをトレーニングする出発点として使用します。転移学習は、特定の機械学習タスクに対して最先端のリファレンスを実装した上で新しいモデルを構築することを可能にします。これは、深く複雑なネットワークを最初からトレーニングするのに十分なデータがない場合にも役立ちます。

では、例を見てみましょう。

Amazon SageMaker の組み込みアルゴリズムを使用してビジュアル認識モデルを段階的にトレーニングする

Amazon SageMaker のビジュアル認識アルゴリズム、画像分類オブジェクト検出の両方で、増分学習をサポートするサンプルノートブックを用意しました。次に、Image Classification ノートブックのコードスニペットを示します。初めて Amazon SageMaker Image Classification モデルをトレーニングする場合、ノートブックにはステップバイステップの手順が記載されています。この例では、Amazon SageMaker で以前にトレーニングした既存の Image Classification モデルが既にあるとします。

ステップ 1: 既存の Amazon SageMaker Image Classification モデルを使用するための入力チャネルを定義する。

Amazon SageMaker チャネルは、トレーニングアルゴリズムが使用できる名前付き入力データソースです。この入力チャネルは “model” という名前でなければならず、既存モデルの Amazon S3 URI を指定します。既存のモデルのアーティファクトは、Amazon SageMaker Training によって作成された単一の gzip 圧縮 tar アーカイブ (.tar.gz サフィックス) です。

s3model = 's3://{}/model/'.format(bucket)
model_data = sagemaker.session.s3_input(s3model, distribution= 'FullyReplicated',s3_data_type='S3Prefix',content_type='application/x-sagemaker-model')
data_channels = {'train': train_data, 'validation': validation_data, 'model': model_data}

ステップ 2: 次にバッチデータのトレーニングを続行する。
num_layers、image_shape、num_classes などのネットワークを定義するハイパーパラメータは、既存のモデルをトレーニングするために使用するパラメータと同じである必要があります。アルゴリズムは事前にトレーニングされた既存のモデルから始まるので、正確さは最初のエポックより高くなり、それによってより迅速な収束につながります。

incr_ic = sagemaker.estimator.Estimator(training_image, role, train_instance_count=1, train_instance_type='ml.p2.xlarge', train_volume_size = 50, train_max_run= 360000, input_mode= 'File', output_path=s3_output_location, sagemaker_session=sess)

incr_ic.set_hyperparameters(num_layers=18, image_shape= "3,224,224", num_classes=257, num_training_samples=15420, mini_batch_size=128, epochs=10, learning_rate=0.01, top_k=2)

incr_ic.fit(inputs=data_channels, logs=True)

これらのステップは、新しいデータでさらにモデルをトレーニングするのに必要な数だけ繰り返すことができます。

ONNX モデルズーの事前にトレーニングされた Caffe モデルを使用して画像分類タスクを実行する

ここでは、シェルフからモデルを選択する方法の例を示します。この例では、ImageNet データセットを使用してトレーニングし、ONNX Model Zoo で利用できる Caffe BVLC GoogleNet モデルを取り上げます。 このモデルを出発点として使用し、Amazon SageMaker を使用して Caltech 101 データセットで新しい画像分類タスクを行うために微調整します。ここでは、「転移学習のための MXNet/Gluon チュートリアル」に示されているのと同じモデルトレーニングスクリプトを使用しています。

Amazon SageMaker MXNet フレームワークコンテナを使用してモデルをトレーニングします。この例では、既存の Gluon ノートブックと同様の Amazon SageMaker Python SDK を使用していることも注意してください。

ステップ 1: ONNX モデルズーから事前にトレーニングされた GoogleNet モデルをダウンロードし、model.onnx ファイルを Amazon S3 にアップロードする。

ONNX モデルズーは、us-east-1 AWS リージョンの Amazon S3 バケットで事前にトレーニングされたモデルをホストしています。事前にトレーニングされたモデルである Amazon S3 URI をそのまま使用することができます。ただし、Amazon SageMaker トレーニングを別の AWS Region (us-west-2 など) で使用している場合のため、リージョン間でファイルを移動させるためのサンプルコードを以下に示します。

# first download model from https://github.com/onnx/models/tree/master/bvlc_googlenet
wget –quiet -P data/ https://s3.amazonaws.com/download.onnx/models/opset_3/bvlc_googlenet.tar.gz

tar -xzf data/bvlc_googlenet.tar.gz -C data/ && rm data/bvlc_googlenet.tar.gz
...
#now upload the model to a bucket in Region where you are using Amazon SageMaker
sagemaker_session.upload_data(path='data/bvlc_googlenet/model.onnx', key_prefix='data/pretrained')

ステップ 2: 入力データのために Amazon SageMaker チャネルを定義する。1 つは Caltech 101 トレーニングデータセット、もう 1 つはトレーニングされた GoogleNet モデルです

この例では、Caltech 101 トレーニングデータセット用の「トレーニング」チャネルと、事前にトレーニングされた GoogleNet モデル用の「事前トレーニング」チャネル (ステップ 1 より) を定義します。

s3train = 's3://{}/{}/'.format(bucket, 'data/ONNX-incremental')
s3pretrained = 's3://{}/{}/'.format(bucket, 'data/pretrained')

training_data = sagemaker.session.s3_input(s3train, distribution= 'FullyReplicated', s3_data_type='S3Prefix', input_mode='File')

pretrained_model = sagemaker.session.s3_input(s3pretrained, distribution='FullyReplicated', s3_data_type='S3Prefix', input_mode='File')

ご覧のように、各チャネルレベルで入力モードを「ファイル」として定義しています。ファイルモードでは、モデルトレーニングが開始される前に、Amazon S3 から事前にトレーニングされたモデルを Amazon SageMaker トレーニングインスタンスに接続されたローカルストレージにフェッチすることができます。

事前に作成された MXNet コンテナを使用して Amazon SageMaker トレーニングを開始するコードを表示する前に、最初に、転移学習のための Gluon チュートリアルから、事前にトレーニングされた GoogleNet モデルに簡単にアクセスするためにモデルトレーニングスクリプトのコードを 1 行ずつ細かく変更する方法を説明します。

ステップ 3: 環境変数を使用して MXNet コンテナ内のチャンネル情報に簡単にアクセスする。

Amazon SageMaker によって自動的に初期化される MXNet コンテナのデフォルト環境変数を使用して、ステップ 2 で定義した入力チャネルに関するすべての情報を使用できます。

parser.add_argument('--training_channel', type=str, default=os.environ['SM_CHANNEL_TRAINING'])

parser.add_argument('--pretrained_model_channel', type=str, default=os.environ['SM_CHANNEL_PRETRAINED'])

これで、モデルトレーニングスクリプトの train 関数をコールし、Caltech 101 トレーニングデータセットと事前トレーニングされた GoogleNet モデルを渡す準備が整いました。

model = train(num_cpus, num_gpus, args.training_channel, args.model_dir, args.pretrained_model_channel, args.batch_size, args.epochs, args.learning_rate, args.weight_decay, args.momentum, args.log_interval)

この更新されたスクリプトは transfer_learning_example.py として保存できます。

以下は、説明のために train 関数から取得した短いコードスニペットです。ご覧のように、この関数は、Caltech 101 トレーニングデータセットをさらに調整する前に、事前トレーニングされた GoogleNet モデルをロードします。

def train(num_cpus, num_gpus, training_dir, model_dir, pretrained_model_dir, batch_size, epochs, learning_rate, weight_decay, momentum, log_interval): dataset_name = "101_ObjectCategories"
    
    # Location of the pre-trained model on local disk
    onnx_path = os.path.join(pretrained_model_dir, 'model.onnx')
    ...
    # Load the ONNX Model
    sym, arg_params, aux_params = onnx_mxnet.import_model(onnx_path)
 
    new_sym, new_arg_params, new_aux_params = get_layer_output(sym, arg_params, aux_params, 'flatten0')
    ...

ステップ 4: あらかじめ構築された MXNet コンテナを使用して Amazon SageMaker でモデルをトレーニングする。

これで、あらかじめ構築された Amazon SageMaker MXNet コンテナを使用して、ステップ 3 で得られたトレーニングスクリプトを実行する準備が整いました。トレーニングをより速く行うには、GPU インスタンスを使用することをお勧めします。この例では、p3.2xlarge インスタンスを使用します。

m = MXNet('transfer_learning_example.py',
          role=role,
          train_instance_count=1,
          train_instance_type='ml.p3.2xlarge',
          framework_version='1.3.0',
          py_version='py2',
          hyperparameters={'batch-size': 32,
                           'epochs': 5,
                           'learning-rate': 0.0005,
                           'weight-decay': 0.00001,
                           'momentum': 0.9})

m.fit(inputs=channels, logs=True)

ステップ 5: トレーニングログからトレーニング精度の向上を観察する。

トレーニングスクリプトは、新しいデータセットのトレーニングされていないネットワークの精度と、新しいデータセットの微調整後の精度を表示します。

Train dataset: 6996 images, Test dataset: 1681 images
...
Untrained network Test Accuracy: 0.0120...
...
Epoch [0] Test Accuracy 0.7025
...
Epoch [1] Test Accuracy 0.8558
...
Epoch [2] Test Accuracy 0.8876
...
Epoch [4] Test Accuracy 0.9183

ご覧のとおり、GPU を数分間微調整するだけで、Caltech 101 Dataset の精度を実質的に向上させることができました。

他の数多くの例と開発者用サポートを利用して開始する

このブログ記事では、Amazon SageMaker の入力チャネルを使用して増分学習と転移学習を簡単に実行する方法の例を紹介しました。開発者用ガイドを参照して開発者向けのリソースをさらに取得したり、開発者フォーラムで質問を投稿したりできます。モデリングをお楽しみください!


著者について

Gurumurthy Swaminathan は Amazon AI プラットフォームグループの上級応用サイエンティストであり、Sagemaker のコンピュータービジョンアルゴリズムの構築に取り組んでいます。彼の現在の研究領域には、ニューラルネットワーク圧縮とコンピュータビジョンアルゴリズムが含まれます。

 

 

 

Jeffrey Geevarghese は、Amazon AI のシニアエンジニアであり、深層学習のためのスケーラブルなインフラストラクチャを構築することに情熱を傾けています。この仕事の前は、機械学習のアルゴリズムとプラットフォームを研究しており、Amazon SageMaker と Amazon Machine Learning の両方の立ち上げチームの一員でした。

 

 

 

Sumit Thakur は AWS Machine Learning プラットホームのシニアプロダクトマネージャーで、クラウドで顧客が容易に機械学習を行える製品を開発することが好きです。彼は、Amazon SageMaker と AWS Deep Learning AMI のプロダクトマネージャーです。余暇には、自然に触れたり、SF テレビシリーズを視聴することが好きです。