翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
コンパイルに向けてモデルを準備する
SageMaker Neo では、機械学習モデルが特定の入力データ形状を満たしている必要があります。コンパイルで求められる入力形状は、使用する深層学習フレームワークによって異なります。モデルの入力形状が正しくフォーマットされたら、以下の要件に従ってモデルを保存します。モデルを保存したら、モデルアーティファクトを圧縮します。
SageMaker Neo が想定する入力データの形状
モデルをコンパイルする前に、モデルが正しくフォーマットされていることを確認します。Neo は、トレーニング済みモデルへの想定データ入力の名前と形状が、JSON 形式またはリスト形式で渡されることを想定しています。想定入力はフレームワークによって異なります。
SageMaker Neo が想定する入力形状を以下に示します。
想定データ入力の名前と形状 (NCHW 形式) を指定します。トレーニング済みモデルにはディクショナリ形式を使います。Keras モデルアーティファクトは NHWC (チャネル最後) 形式でアップロードしますが、DataInputConfig は NCHW (チャネル優先) 形式で指定することに注意してください。求められるディクショナリ形式は次のとおりです。
入力が 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 は PyTorch で作成したモデル定義ファイル (.pt または .pth) から入力設定を取得します。
それ以外の場合は、以下を実行する必要があります。
想定データ入力の名前と形状 (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
) が必要です。
Keras モデルを、SageMaker Neo と互換性を持たせるために保存するには、次の 2 つのオプションがあります。
model.save("<model-name>", save_format="h5")
を使って.h5
形式でエクスポートする。エクスポート後に
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 モデルは 1 つのシンボルファイル *-symbol.json
および 1 つのパラメータ *.params files
として保存する必要があります。
PyTorch モデルは入力データ型 float32
で定義ファイル (.pt
または .pth
) として保存する必要があります。
モデルを保存するには、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 AI へのデータ入力設定を指定する必要はありません。
SageMaker Neo が入力設定を取得できないようにするには、torch.jit.trace
の _store_inputs
パラメータを False
に設定します。これを行うには、モデルをコンパイルするときに SageMaker AI へのデータ入力設定を指定する必要があります。
torch.jit.trace
メソッドの詳細については、PyTorch ドキュメントの「TORCH.JIT.TRACE」
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 Python SDK から、sagemaker.estimator.Estimator
クラスを使って推定器オブジェクトを初期化し、組み込みアルゴリズムのトレーニングと compile_model
メソッド を使ったコンパイルを行うこともできます。
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 AI SDK)」を参照してください。