コンパイルに向けてモデルを準備する - Amazon SageMaker

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

コンパイルに向けてモデルを準備する

SageMaker Neo では、機械学習モデルが特定の入力データ形状を満たす必要があります。コンパイルで求められる入力形状は、使用する深層学習フレームワークによって異なります。モデルの入力形状が正しくフォーマットされたら、以下の要件に従ってモデルを保存します。モデルを保存したら、モデルアーティファクトを圧縮します。

SageMaker Neo はどのような入力データ形状を想定していますか?

モデルをコンパイルする前に、モデルが正しくフォーマットされていることを確認します。Neo は、トレーニング済みモデルに期待されるデータ入力の名前と形状を、JSON形式またはリスト形式で想定します。想定入力はフレームワークによって異なります。

以下は、 SageMaker Neo が期待する入力形状です。

トレーニング済みモデルのディクショナリ形式を使用して、予想されるデータ入力の名前と形状 (NCHW形式) を指定します。Keras モデルアーティファクトは NHWC (channel-last) 形式でアップロードする必要がありますが、 NCHW (channel-first) 形式で指定 DataInputConfig する必要があります。求められるディクショナリ形式は次のとおりです。

  • 入力が 1 つの場合: {'input_1':[1,3,224,224]}

  • 入力が 2 つの場合: {'input_1': [1,3,224,224], 'input_2':[1,3,224,224]}

トレーニング済みモデルのディクショナリ形式を使用して、予想されるデータ入力の名前と形状 (NCHW形式) を指定します。求められるディクショナリ形式は次のとおりです。

  • 入力が 1 つの場合: {'data':[1,3,1024,1024]}

  • 入力が 2 つの場合: {'var1': [1,1,28,28], 'var2':[1,1,28,28]}

PyTorch モデルでは、次の両方の条件を満たす場合、予想されるデータ入力の名前と形状を指定する必要はありません。

  • PyTorch 2.0 以降を使用してモデル定義ファイルを作成しました。定義ファイルの作成方法の詳細については、「Saving Models for SageMaker Neo PyTorch」のセクションを参照してください。

  • クラウドインスタンス用にモデルをコンパイルしています。 SageMaker Neo がサポートするインスタンスタイプの詳細については、「」を参照してくださいサポートされるインスタンスタイプとフレームワーク

これらの条件を満たすと、 SageMaker Neo は で作成したモデル定義ファイル (.pt または .pth) から入力設定を取得します PyTorch。

それ以外の場合は、以下を実行する必要があります。

トレーニング済みモデルのディクショナリ形式を使用して、予想されるデータ入力の名前と形状 (NCHW形式) を指定します。また、リスト形式を使用して形状のみを指定することもできます。求められるディクショナリ形式は次のとおりです。

  • ディクショナリ形式で入力が 1 つの場合: {'input0':[1,3,224,224]}

  • リスト形式で入力が 1 つの場合: [[1,3,224,224]]

  • ディクショナリ形式で入力が 2 つの場合: {'input0':[1,3,224,224], 'input1':[1,3,224,224]}

  • リスト形式で入力が 2 つの場合: [[1,3,224,224], [1,3,224,224]]

トレーニング済みモデルのディクショナリ形式を使用して、予想されるデータ入力の名前と形状 (NHWC形式) を指定します。求められるディクショナリ形式は次のとおりです。

  • 入力が 1 つの場合: {'input':[1,1024,1024,3]}

  • 入力が 2 つの場合: {'data1': [1,28,28,1], 'data2':[1,28,28,1]}

トレーニング済みモデルのディクショナリ形式を使用して、予想されるデータ入力の名前と形状 (NHWC形式) を指定します。求められるディクショナリ形式は次のとおりです。

  • 入力が 1 つの場合: {'input':[1,224,224,3]}

注記

SageMaker Neo は、エッジデバイスターゲットの TensorFlow Lite のみをサポートします。サポートされている SageMaker Neo エッジデバイスターゲットのリストについては、 SageMaker 「Neoデバイス」ページを参照してください。サポートされている SageMaker Neo クラウドインスタンスターゲットのリストについては、 SageMaker 「Neoサポートされるインスタンスタイプとフレームワーク」ページを参照してください。

入力データの名前と形状は必要ありません。

SageMaker Neo のモデルの保存

次のコード例は、Neo と互換性を持たせるようにモデルを保存する方法を示しています。モデルは圧縮された tar ファイル (*.tar.gz) としてパッケージ化されている必要があります。

Keras モデルでは 1 つのモデル定義ファイル (.h5) が必要です。

SageMaker Neo と互換性を持たせるために Keras モデルを保存するには、次の 2 つのオプションがあります。

  1. model.save("<model-name>", save_format="h5") を使って .h5 形式でエクスポートする。

  2. エクスポート後に SavedModel を Freeze する。

以下は、tf.keras モデルを Frozen グラフとしてエクスポートする方法 (オプション 2) の例です。

import os import tensorflow as tf from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras import backend tf.keras.backend.set_learning_phase(0) model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=(224, 224, 3), pooling='avg') model.summary() # Save as a SavedModel export_dir = 'saved_model/' model.save(export_dir, save_format='tf') # Freeze saved model input_node_names = [inp.name.split(":")[0] for inp in model.inputs] output_node_names = [output.name.split(":")[0] for output in model.outputs] print("Input names: ", input_node_names) with tf.Session() as sess: loaded = tf.saved_model.load(sess, export_dir=export_dir, tags=["serve"]) frozen_graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph.as_graph_def(), output_node_names) tf.io.write_graph(graph_or_graph_def=frozen_graph, logdir=".", name="frozen_graph.pb", as_text=False) import tarfile tar = tarfile.open("frozen_graph.tar.gz", "w:gz") tar.add("frozen_graph.pb") tar.close()
警告

model.save(<path>, save_format='tf') を使う SavedModel クラスを使ってモデルをエクスポートしないでください。この形式はトレーニングには適していますが、推論には適していません。

MXNet モデルは、単一のシンボルファイル*-symbol.jsonと単一のパラメータ として保存する必要があります*.params files

Gluon Models

HybridSequential クラスを使ってニューラルネットワークを定義します。これにより、命令型プログラミングとは対照的な記号型プログラミングの形式でコードが実行されます。

from mxnet import nd, sym from mxnet.gluon import nn def get_net(): net = nn.HybridSequential() # Here we use the class HybridSequential. net.add(nn.Dense(256, activation='relu'), nn.Dense(128, activation='relu'), nn.Dense(2)) net.initialize() return net # Define an input to compute a forward calculation. x = nd.random.normal(shape=(1, 512)) net = get_net() # During the forward calculation, the neural network will automatically infer # the shape of the weight parameters of all the layers based on the shape of # the input. net(x) # hybridize model net.hybridize() net(x) # export model net.export('<model_name>') # this will create model-symbol.json and model-0000.params files import tarfile tar = tarfile.open("<model_name>.tar.gz", "w:gz") for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]: tar.add(name) tar.close()

モデルのハイブリダイズの詳細については、MXNet「ハイブリダイズドキュメント」を参照してください。

Gluon Model Zoo (GluonCV)

GluonCV モデルの zoo は事前にハイブリッド化されているため、それをエクスポートするだけで済みます。

import numpy as np import mxnet as mx import gluoncv as gcv from gluoncv.utils import export_block import tarfile net = gcv.model_zoo.get_model('<model_name>', pretrained=True) # For example, choose <model_name> as resnet18_v1 export_block('<model_name>', net, preprocess=True, layout='HWC') tar = tarfile.open("<model_name>.tar.gz", "w:gz") for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]: tar.add(name) tar.close()
Non Gluon Models

ディスクに保存した場合、Gluon 以外のモデルはすべて *-symbol ファイルと *.params ファイルを使います。したがって、すでに Neo 向けの適切な形式になっています。

# Pass the following 3 parameters: sym, args, aux mx.model.save_checkpoint('<model_name>',0,sym,args,aux) # this will create <model_name>-symbol.json and <model_name>-0000.params files import tarfile tar = tarfile.open("<model_name>.tar.gz", "w:gz") for name in ["<model_name>-0000.params", "<model_name>-symbol.json"]: tar.add(name) tar.close()

PyTorch モデルは、 の入力データ型を持つ定義ファイル (.pt または .pth) として保存する必要がありますfloat32

モデルを保存するには、 torch.jit.traceメソッドの後に torch.saveメソッドを使用します。このプロセスでは、オブジェクトをディスクファイルに保存し、デフォルトでは python pickle (pickle_module=pickle) を使用してオブジェクトと一部のメタデータを保存します。次に、保存したモデルを圧縮された tar ファイルに変換します。

import torchvision import torch model = torchvision.models.resnet18(pretrained=True) model.eval() inp = torch.rand(1, 3, 224, 224) model_trace = torch.jit.trace(model, inp) # Save your model. The following code saves it with the .pth file extension model_trace.save('model.pth') # Save as a compressed tar file import tarfile with tarfile.open('model.tar.gz', 'w:gz') as f: f.add('model.pth') f.close()

PyTorch 2.0 以降でモデルを保存すると、 SageMaker Neo は定義ファイルからモデルの入力設定 (その入力の名前と形状) を取得します。この場合、モデルをコンパイル SageMaker するときに へのデータ入力設定を指定する必要はありません。

SageMaker Neo が入力設定を取得できないようにするには、 _store_inputsのパラメータを torch.jit.trace に設定することができますFalse。これを行うには、モデルをコンパイルするときに への SageMaker データ入力設定を指定する必要があります。

torch.jit.trace メソッドの詳細については、 PyTorch ドキュメントのTORCHJITTRACE「」を参照してください。

TensorFlow には、1 つ.pbまたは 1 つの.pbtxtファイルと、変数を含む変数ディレクトリが必要です。Frozen モデルの場合、必要なのは .pb ファイルまたは .pbtxt ファイルのいずれか 1 つのみです。

次のコード例は、Linux の tar コマンドを使ってモデルを圧縮する方法を示しています。ターミナルまたは Jupyter ノートブック (Jupyter ノートブックを使っている場合は、ステートメントの冒頭に ! マジックコマンドを挿入します) で以下を実行します:

# Download SSD_Mobilenet trained model !wget http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz # unzip the compressed tar file !tar xvf ssd_mobilenet_v2_coco_2018_03_29.tar.gz # Compress the tar file and save it in a directory called 'model.tar.gz' !tar czvf model.tar.gz ssd_mobilenet_v2_coco_2018_03_29/frozen_inference_graph.pb

この例で使われているコマンドフラグは、次を実行します。

  • c: アーカイブを作成する

  • z: gzip を使ってアーカイブを圧縮する

  • v: アーカイブの進行状況を表示する

  • f: アーカイブのファイル名を指定する。

組み込み推定器は、フレームワーク固有のコンテナ、またはアルゴリズム固有のコンテナのいずれかによって作成されます。組み込みのアルゴリズム固有およびフレームワーク固有の推定器の推定器オブジェクトは、いずれも組み込みの .fit メソッドを使ってモデルをトレーニングするときに、モデルを正しい形式で保存します。

例えば、 sagemaker.TensorFlow を使用して TensorFlow 推定器を定義できます。

from sagemaker.tensorflow import TensorFlow estimator = TensorFlow(entry_point='mnist.py', role=role, #param role can be arn of a sagemaker execution role framework_version='1.15.3', py_version='py3', training_steps=1000, evaluation_steps=100, instance_count=2, instance_type='ml.c4.xlarge')

次に、組み込みメソッド .fit を使ってモデルをトレーニングします。

estimator.fit(inputs)

最後に組み込みの compile_model メソッドを使ってモデルをコンパイルする前に:

# Specify output path of the compiled model output_path = '/'.join(estimator.output_path.split('/')[:-1]) # Compile model optimized_estimator = estimator.compile_model(target_instance_family='ml_c5', input_shape={'data':[1, 784]}, # Batch size 1, 3 channels, 224x224 Images. output_path=output_path, framework='tensorflow', framework_version='1.15.3')

sagemaker.estimator.Estimator クラスを使用して、 SageMaker Python の compile_modelメソッドを使用して組み込みアルゴリズムをトレーニングおよびコンパイルするための推定器オブジェクトを初期化することもできますSDK。

import sagemaker from sagemaker.image_uris import retrieve sagemaker_session = sagemaker.Session() aws_region = sagemaker_session.boto_region_name # Specify built-in algorithm training image training_image = retrieve(framework='image-classification', region=aws_region, image_scope='training') training_image = retrieve(framework='image-classification', region=aws_region, image_scope='training') # Create estimator object for training estimator = sagemaker.estimator.Estimator(image_uri=training_image, role=role, #param role can be arn of a sagemaker execution role instance_count=1, instance_type='ml.p3.8xlarge', volume_size = 50, max_run = 360000, input_mode= 'File', output_path=s3_training_output_location, base_job_name='image-classification-training' ) # Setup the input data_channels to be used later for training. train_data = sagemaker.inputs.TrainingInput(s3_training_data_location, content_type='application/x-recordio', s3_data_type='S3Prefix') validation_data = sagemaker.inputs.TrainingInput(s3_validation_data_location, content_type='application/x-recordio', s3_data_type='S3Prefix') data_channels = {'train': train_data, 'validation': validation_data} # Train model estimator.fit(inputs=data_channels, logs=True) # Compile model with Neo optimized_estimator = estimator.compile_model(target_instance_family='ml_c5', input_shape={'data':[1, 3, 224, 224], 'softmax_label':[1]}, output_path=s3_compilation_output_location, framework='mxnet', framework_version='1.7')

SageMaker Python でモデルをコンパイルする方法についてはSDK、「」を参照してくださいモデルをコンパイルする (Amazon SageMaker SDK)