AICompilerは、AI (PAI)-BladeのためのMachine Learning Platformと統合されたAIコンパイラ最適化コンポーネントです。 AICompilerは、静的シェイプコンパイラと動的シェイプコンパイラを提供します。 AICompilerを使用すると、追加の設定を構成することなく、透過的で普遍的に適用される方法でモデル推論のパフォーマンスを向上させることができます。 このトピックでは、AICompilerを使用してTensorFlowおよびPyTorchモデルを最適化する方法について説明します。
背景情報
これまでのところ、AIモデルの構造は進化し、より基盤となるコンピューティングハードウェアが使用され、ユーザーの習慣はより多様化しています。 このため、AIモデルのパフォーマンスと効率を手動で向上させることは困難です。 これにより、AIコンパイラ最適化の開発が一般的な関心事となっている。
従来のコンパイラは、高級言語で記述されたコードを入力として使用し、マシンコードを記述する必要はありません。 深層学習コンパイラには、従来のコンパイラと同様の機能があり、入力としてより高いレベルの抽象化を伴う柔軟な計算グラフを使用します。 深層学習コンパイラの出力には、基盤となるマシンコードと、CPUやGPUなどのハードウェアプラットフォームの実行エンジンが含まれます。 AICompilerは、AIコンピューティングタスクのパフォーマンスを向上させるための共通コンパイラとして機能するように開発されています。 AICompilerを使用する場合は、上位レベルのモデル開発のみに集中する必要があります。 これにより、手動での最適化作業を減らし、ハードウェアのパフォーマンスを最大限に活用できます。
過去2年間、PAIチームはAIコンパイラ最適化の開発に多くの時間とリソースを費やしてきました。 最適化コンポーネントの1つとして、AICompilerはPAI-Bladeと統合されており、透過的で普遍的に適用される方法で推論用のモデルを最適化およびデプロイするのに役立ちます。
AICompilerは、静的シェイプコンパイラと動的シェイプコンパイラを提供します。 動的形状コンパイラは、計算グラフの形状が劇的に変化するモデル推論タスクを含むすべてのタイプのタスクに適しています。 静的形状コンパイラは、計算グラフの形状が静的またはわずかに変化して最適なパフォーマンスを実現するタスクに適しています。 次の表は、2つのコンパイラを比較しています。
コンパイラ | TensorFlow | PyTorch | シナリオ |
静的形状コンパイラ | 対応 | 非対応 | 最適なパフォーマンスを実現するために、計算グラフの形状が静的またはわずかに変化するタスクに適しています。 |
動的形状コンパイラ | 対応 | 対応 | すべてのタイプのタスクに適しています。 |
デフォルトでは、PAI-Bladeは、動的シェイプコンパイラがモデルに適しているかどうかを自動的に判断します。 追加情報を入力として提供する必要はありません。 タスク内の計算グラフの形状が静的またはわずかに変化している場合、PAI-Bladeはモデルに静的形状コンパイラを使用してパフォーマンスを向上させます。 次のセクションでは、静的シェイプコンパイラと動的シェイプコンパイラを使用してさまざまなモデルを最適化する方法の例を示します。
動的シェイプコンパイラを使用してTensorFlowモデルを最適化する
この例では、オープンソース自動音声認識 (ASR) モデルがデモンストレーションのために使用される。
モデルとテストデータをダウンロードします。
# Download the sample model and test data. wget https://pai-blade.cn-hangzhou.oss.aliyun-inc.com/test_public_model/bbs/tf_aicompiler_demo/frozen.pb wget https://pai-blade.cn-hangzhou.oss.aliyun-inc.com/test_public_model/bbs/tf_aicompiler_demo/test_bc4.npy
モデルとテストデータを読み込みます。 次に、
blade.optimize
メソッドを呼び出します。 追加の設定を構成する必要はありません。import numpy as np import tensorflow as tf import blade # Load the model and test data. graph_def = tf.GraphDef() with open('./frozen.pb', 'rb') as f: graph_def.ParseFromString(f.read()) test_data = np.load('test_bc4.npy', allow_pickle=True, encoding='bytes',).item() # Optimize the model. optimized_model, opt_spec, report = blade.optimize( graph_def, # The original model, here is a TF GraphDef. 'o1', # Optimization level o1 or o2. device_type='gpu', # Target device to run the optimized model. config=blade.Config(), inputs=['encoder_memory_placeholder', 'encoder_memory_length_placeholder'], outputs=['score', 'seq_id'], test_data=[test_data] #verbose=True ) # Save the optimization results. tf.train.write_graph(optimized_model, "./", "optimized.pb", as_text=False) print("Report: {}".format(report))
モデルが最適化されると、
blade.optimize
メソッドは最適化レポートを返します。 レポートから、AICompilerによって達成された最適化効果を確認できます。 最適化レポートの以下の例では、Tesla T4の性能は、透過的かつ普遍的に適用される方法で2.23倍改善される。 レポートのフィールドの詳細については、「最適化レポート」をご参照ください。{ "name": "TfAicompilerGpu", "status": "effective", "speedup": "2.23", "pre_run": "120.54 ms", "post_run": "53.99 ms" }
静的シェイプコンパイラを使用してTensorFlowモデルを最適化する
タスク内の計算グラフの形状が静的またはわずかに変化している場合は、blade.optimize
メソッドの入力パラメーター設定を設定して、モデルの静的形状コンパイラを指定できます。 次のサンプルコードは、例を提供します。
optimized_model, opt_spec, report = blade.optimize(
graph_def, # The original model, here is a TF GraphDef.
'o1', # Optimization level o1 or o2.
device_type='gpu', # Target device to run the optimized model.
# Provide an additional config here in order to try Static Shape Compilation:
config=blade.Config(enable_static_shape_compilation_opt = True),
inputs=['encoder_memory_placeholder', 'encoder_memory_length_placeholder'],
outputs=['score', 'seq_id'],
test_data=[test_data]
#verbose=True
)
入力パラメーター設定の詳細については、「blade. config」をご参照ください。
モデルが最適化されると、blade.optimize
メソッドは最適化レポートを返します。 レポートから、AICompilerによって達成された最適化効果を確認できます。 この例では、テスラT4の性能は2.35倍改善される。 レポートのフィールドの詳細については、「最適化レポート」をご参照ください。
{
"name": "TfAicompilerGpu",
"status": "effective",
"speedup": "2.35",
"pre_run": "114.91 ms",
"post_run": "48.86 ms"
}
動的シェイプコンパイラを使用してPyTorchモデルを最適化する
この例では、オープンソースASRモデルがデモンストレーションに使用されます。
モデルをダウンロードします。
# PyTorch 1.6.0 # Python3.6 wget https://pai-blade.cn-hangzhou.oss.aliyun-inc.com/test_public_model/bbs/pt_aicompiler_demo/orig_decoder_v2.pt
モデルとテストデータを読み込みます。 次に、
blade.optimize
メソッドを呼び出します。 追加の設定を構成する必要はありません。import os import time import torch # To use blade, just import it. import blade # Load the model. pt_file = 'orig_decoder_v2.pt' batch = 8 model = torch.jit.load(pt_file) # Prepare the test data. def get_test_data(batch_size=1): decoder_input_t = torch.LongTensor([1] * batch_size).cuda() decoder_hidden_t = torch.rand(batch_size, 1, 256).cuda() decoder_hidden_t = decoder_hidden_t * 1.0 decoder_hidden_t = torch.tanh(decoder_hidden_t) output_highfeature_t = torch.rand(batch_size, 448, 4, 50).cuda() attention_sum_t = torch.rand(batch_size, 1, 4, 50).cuda() decoder_attention_t = torch.rand(batch_size, 1, 4, 50).cuda() et_mask = torch.rand(batch_size, 4, 50).cuda() return (decoder_input_t, decoder_hidden_t, output_highfeature_t, attention_sum_t, decoder_attention_t, et_mask) dummy = get_test_data(batch) # Optimize the model. optimized_model, opt_spec, report = blade.optimize( model, # The original model, here is a torch scrip model. 'o1', # Optimization level o1 or o2. device_type='gpu', # Target device to run the optimized model. test_data=[dummy], # For PyTorch, input data is list of tupoles. config=blade.Config() ) print("spec: {}".format(opt_spec)) print("report: {}".format(report)) # Save the optimization results. torch.jit.save(optimized_model, 'optimized_decoder.pt')
モデルが最適化されると、
blade.optimize
メソッドは最適化レポートを返します。 レポートから、AICompilerによって達成された最適化効果を確認できます。 最適化レポートの以下の例では、Tesla T4の性能は、透過的かつ普遍的に適用される方法で2.45倍改善される。 レポートのフィールドの詳細については、「最適化レポート」をご参照ください。"optimizations": [ { "name": "PyTorchMlir", "status": "effective", "speedup": "2.45", "pre_run": "1.99 ms", "post_run": "0.81 ms" } ],