PAI-Blade は、モデル最適化を Python パイプラインに直接統合する optimize() 関数を公開しています。TensorFlow または PyTorch モデルを渡し、最適化レベルとターゲットデバイスを選択すると、推論に対応した最適化済みモデルが返されます。
optimize
def optimize(
model: Any,
optimization_level: str,
device_type: str,
config: Optional[Config] = None,
inputs: Optional[List[str]] = None,
outputs: Optional[List[str]] = None,
input_shapes: Optional[List[List[str]]] = None,
input_ranges: Optional[List[List[str]]] = None,
test_data: List[Dict[str, np.ndarray]] = [],
calib_data: List[Dict[str, np.ndarray]] = [],
custom_ops: List[str] = [],
verbose: bool = False,
) -> Tuple[Any, OptimizeSpec, OptimizeReport]:
passクイックスタート
以下の例は、ロスレス最適化を使用して TensorFlow SavedModel を GPU 推論用に最適化する最小限の呼び出しを示しています。
import blade
optimized_model, opt_spec, opt_report = blade.optimize(
model="/path/to/saved_model", # path to a TensorFlow SavedModel directory
optimization_level="o1", # lossless optimization: graph rewriting + compilation
device_type="gpu",
)キャリブレーションデータとともに量子化 (o2) を使用するには:
import blade
import numpy as np
# Prepare calibration data as a list of feed_dict arguments
calib = [
{"input": np.random.rand(1, 224, 224, 3).astype(np.float32)},
{"input": np.random.rand(1, 224, 224, 3).astype(np.float32)},
]
optimized_model, opt_spec, opt_report = blade.optimize(
model="/path/to/saved_model",
optimization_level="o2", # quantization — requires calib_data
device_type="gpu",
calib_data=calib,
)パラメーター
必須パラメーター
| パラメーター | タイプ | 説明 |
|---|---|---|
model | Multiple types | 最適化するモデルです。「サポートされているモデル形式」をご参照ください。 |
optimization_level | string | 最適化戦略です。有効な値 (大文字と小文字を区別しません): o1、o2。「optimization_level の値」をご参照ください。 |
device_type | string | ターゲットデバイスです。有効な値 (大文字と小文字を区別しません): gpu、cpu、edge (TensorFlow のみ)。 |
オプションパラメーター
| パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
inputs | list[string] | None | 入力ノードの名前です。設定しない場合、PAI-Blade が自動的に推論します。 |
outputs | list[string] | None | 出力ノードの名前です。設定しない場合、PAI-Blade が自動的に推論します。 |
input_shapes | list[list[string]] | None | 入力テンソルの可能なシェイプです。特定のシェイプパターンに対する最適化を改善します。「input_shapes のフォーマット」をご参照ください。 |
input_ranges | list[list[string]] | None | 入力テンソルの値の範囲です。「input_shapes のフォーマット」をご参照ください。 |
test_data | Multiple types | [] | モデルの実行速度を調整するために使用されるテストデータです。データの型は calib_data のフォーマットと一致します。 |
calib_data | Multiple types | [] | 量子化のためのキャリブレーションデータです。optimization_level が o2 の場合に必須です。データの型はモデルフレームワークによって異なります。 |
custom_ops | list[string] | [] | カスタム演算子ライブラリへのパスです。モデルがカスタム演算子に依存している場合は、各ライブラリパスを追加します。 |
verbose | bool | False | 詳細な最適化ログを出力するには True に設定します。問題の診断に役立ちます。 |
config | blade.Config | None | 高度な最適化設定です。「blade.Config」をご参照ください。 |
サポートされているモデル形式
TensorFlow モデルは以下を受け入れます。
GraphDefオブジェクトGraphDef PB ファイル (
.pbまたは.pbtxt) へのパスSavedModel ディレクトリへのパス
PyTorch モデルは以下を受け入れます。
torch.nn.Moduleオブジェクトエクスポートされた
torch.nn.Moduleファイル (.pt) へのパス
optimization_level の値
| 値 | 戦略 | 使用する状況 |
|---|---|---|
o1 | ロスレス最適化 — グラフ書き換えとコンパイル最適化 | 精度を正確に維持する必要がある場合に使用します。キャリブレーションデータは不要です。開始点として推奨されます。 |
o2 | 量子化 | 最大の推論速度向上を望む場合に使用します。calib_data が必要です。 |
calib_dataは、optimization_levelがo2の場合にのみ意味があります。o1の場合は効果がありません。
input_shapes と input_ranges のフォーマット
両方のパラメーターは同じネストされたリスト構造を使用します。各内部リストは入力テンソルごとに 1 つの値を保持し、外部リストは複数のシェイプグループを保持します。
input_shapes — 各要素は "<dim1>*<dim2>*..." フォーマットの文字列です。
# Single model with two inputs, one shape group
input_shapes = [["1*512", "3*256"]]
# Single model with two inputs, three shape groups
input_shapes = [
["1*512", "3*256"],
["5*512", "9*256"],
["10*512", "27*256"],
]input_ranges — 各要素は、括弧、実数、または文字を使用して範囲を指定する文字列です。
# Single model with two inputs, one range group
input_ranges = [["[0.1,0.4]", "[a,f]"]]
# Single model with two inputs, three range groups
input_ranges = [
["[0.1,0.4]", "[a,f]"],
["[1.1,1.4]", "[h,l]"],
["[2.1,2.4]", "[n,z]"],
]calib_data のフォーマット
calib_data (および test_data) のデータの型は、モデルフレームワークによって異なります。
| フレームワーク | タイプ | 説明 |
|---|---|---|
| TensorFlow | list[dict[string, np.ndarray]] | feed_dict 引数のリストで、キャリブレーションサンプルごとに 1 つです。 |
| PyTorch | list[tuple[torch.tensor, ...]] | 入力テンソルタプルのリストで、キャリブレーションサンプルごとに 1 つです。 |
戻り値
optimize() は、Tuple[Any, OptimizeSpec, OptimizeReport] という 3 つの要素のタプルを返します。
| 位置 | 要素 | タイプ | 説明 |
|---|---|---|---|
| 1 | 最適化されたモデル | Multiple types | 入力モデルと同じタイプです。たとえば、TensorFlow SavedModel ディレクトリを渡すと、GraphDef オブジェクトが返されます。 |
| 2 | 外部依存関係 | OptimizeSpec | 最適化が効果を発揮するために必要な環境変数とコンパイルキャッシュです。Python の WITH ステートメントを使用して適用します。SDK を使用する場合は不要です。 |
| 3 | 最適化レポート | OptimizeReport | 最適化結果の詳細です。詳細については、「最適化レポート」をご参照ください。 |
blade.Config
blade.Config を使用して、高度な最適化動作を微調整します。optimize() の config パラメーターにインスタンスを渡します。
class Config(ABC):
def __init__(
self,
disable_fp16_accuracy_check: bool = False,
disable_fp16_perf_check: bool = False,
enable_static_shape_compilation_opt: bool = False,
enable_dynamic_shape_compilation_opt: bool = True,
quant_config: Optional[Dict[str, str]] = None,
) -> None:
pass例:
import blade
config = blade.Config(
enable_static_shape_compilation_opt=True,
quant_config={"weight_adjustment": "true"},
)
optimized_model, opt_spec, opt_report = blade.optimize(
model="/path/to/saved_model",
optimization_level="o2",
device_type="gpu",
calib_data=calib,
config=config,
)blade.Config パラメーター
| パラメーター | タイプ | デフォルト | 説明 |
|---|---|---|---|
disable_fp16_accuracy_check | bool | False | FP16 最適化で精度検証を有効にするかどうかを指定します。False (デフォルト): 精度検証を無効にします。True: 精度検証を有効にします。 |
disable_fp16_perf_check | bool | False | FP16 最適化でパフォーマンス検証を有効にするかどうかを指定します。False (デフォルト): パフォーマンス検証を無効にします。True: パフォーマンス検証を有効にします。 |
enable_static_shape_compilation_opt | bool | False | 静的シェイプコンパイル最適化を有効にします。すべての入力シェイプが推論時に固定されている場合は True に設定します。 |
enable_dynamic_shape_compilation_opt | bool | True | 動的シェイプコンパイル最適化を有効にします。可変長入力を処理するために、デフォルトで有効になっています。 |
quant_config | dict[string, string] | None | 量子化設定です。weight_adjustment キーのみがサポートされています。量子化中にモデルパラメーターを調整して精度損失を減らすには "true" に設定し、無効にするには "false" に設定します。 |