データ構造体

ONNXモデルでの操作には次のデータ構造が使用されます。

OnnxTypeInfo #

この構造体は、ONNXモデルの入力または出力パラメータの型を記述します

struct OnnxTypeInfo
{
ENUM_ONNX_TYPE       type;         // パラメータ型
OnnxTensorTypeInfo   tensor;       // テンソルの説明
OnnxMapTypeInfo       map;           // マップの説明
OnnxSequenceTypeInfo sequence;     // シーケンスの説明
};

テンソル(ONNX_TYPE_TENSOR)のみを入力として使用できます。この場合、OnnxTypeInfo::tensorフィールドのみに値が入力され、他のフィールドmapとsequence)は定義されていません。

3 つのOnnxTypeInfo型(ONNX_TYPE_TENSOR、ONNX_TYPE_MAP、ONNX_TYPE_SEQUENCE)のうち1つだけを入力として使用できます。対応する部分構造(OnnxTypeInfo::tensor、OnnxTypeInfo::map、OnnxTypeInfo::sequence)は、型に応じて埋められます。

 

OnnxTensorTypeInfo

構造体は、ONNXモデルの入力または出力パラメータのテンソルを記述します

struct OnnxTensorTypeInfo
{
const ENUM_ONNX_DATA_TYPE data_type;     // テンソルのデータ型
const long                 dimensions[];   // テンソルの要素数
};

OnnxMapTypeInfo #

この構造体は、ONNXモデルの出力パラメータで取得されるマップを記述します。

struct OnnxMapTypeInfo
{
const ENUM_ONNX_DATA_TYPE   key_type;     // キーの型
const OnnxTypeInfo&         value_type;   // 値の型
};

OnnxSequenceTypeInfo #

この構造体は、ONNXモデルの出力パラメータで取得されるシークエンスを記述します。

struct OnnxSequenceTypeInfo
{
const OnnxTypeInfo&       value_type;     // シークエンスのデータ型
};

 

 

ENUM_ONNX_TYPE #

ENUM_ONNX_TYPE列挙はモデルパラメータの型を記述します

ID

説明

ONNX_TYPE_UNKNOWN

不明

ONNX_TYPE_TENSOR

テンソル

ONNX_TYPE_SEQUENCE

シークエンス

ONNX_TYPE_MAP

マップ

ONNX_TYPE_OPAQUE

抽象(不透明)

ONNX_TYPE_SPARSETENSOR

スパーステンソル

ENUM_ONNX_DATA_TYPE #

ENUM_ONNX_DATA_TYPE列挙は使用されるデータの型を記述します

ID

説明

ONNX_DATA_TYPE_UNDEFINED

未定義

ONNX_DATA_TYPE_FLOAT

float

ONNX_DATA_TYPE_INT8

8ビットint

ONNX_DATA_TYPE_UINT16

16ビットuint

ONNX_DATA_TYPE_INT16

16ビットint

ONNX_DATA_TYPE_INT32

32ビットint

ONNX_DATA_TYPE_INT64

64ビットint

ONNX_DATA_TYPE_STRING

string

ONNX_DATA_TYPE_BOOL

bool

ONNX_DATA_TYPE_FLOAT16

16ビットfloat

ONNX_DATA_TYPE_DOUBLE

double

ONNX_DATA_TYPE_UINT32

32ビットuint

ONNX_DATA_TYPE_UINT64

64ビットuint

ONNX_DATA_TYPE_COMPLEX64

64ビット複素数

ONNX_DATA_TYPE_COMPLEX128

128ビット複素数

ONNX_DATA_TYPE_BFLOAT16

16ビットbfloat(Brain Floating Point)

ENUM_ONNX_FLAGS #

ENUM_ONNX_FLAGS列挙はモデルの実行モードを記述します

ID

説明

ONNX_LOGLEVEL_VERBOSE

すべてのメッセージをログに記録します

ONNX_LOGLEVEL_INFO

情報メッセージ、警告、およびエラーをログに記録します(このフラグはONNX_DEBUG_LOGSの代わりになります)

ONNX_LOGLEVEL_WARNING

警告とエラーをログに記録します(デフォルト)

ONNX_LOGLEVEL_ERROR

エラーのみをログに記録します

ONNX_NO_CONVERSION

自動変換を無効にし、ユーザーデータをそのまま使用します

ONNX_COMMON_FOLDER  

Common\Filesフォルダからモデルファイルを読み込みます。値はFILE_COMMONフラグと同じです。

ONNX_USE_CPU_ONLY

ONNXモデルをCPUのみで実行します

ONNX_GPU_DEVICE_0

インデックス0のCUDAデバイス(デフォルト)

ONNX_GPU_DEVICE_1

インデックス1のCUDAデバイス*

ONNX_GPU_DEVICE_2

インデックス2のCUDAデバイス*

ONNX_GPU_DEVICE_3

インデックス3のCUDAデバイス*

ONNX_GPU_DEVICE_4

インデックス4のCUDAデバイス*

ONNX_GPU_DEVICE_5

インデックス5のCUDAデバイス*

ONNX_GPU_DEVICE_6

インデックス6のCUDAデバイス*

ONNX_GPU_DEVICE_7

インデックス7のCUDAデバイス*

ONNX_ENABLE_PROFILING

ONNXモデルのプロファイリングを有効化します

* ONNX_GPU_DEVICE_Nの形式のフラグは、2つ以上のCUDA対応GPUを搭載したシステムで使用してください。複数のGPU選択フラグが指定された場合、最も低いインデックスのデバイスが使用されます。

存在しないデバイスインデックスが指定された場合、GPUは自動的に選択されます。

 

ONNXプロファイリング

ONNX_ENABLE_PROFILINGフラグを設定すると、ONNXモデルの実行プロファイリングが有効になります。このフラグが<data_folder>/MQL5/Files/OnnxProfileReportsで設定されると、ファイル「<module_name>_date_time.json」が生成されます。

ここで、<module_name>はMQLプログラムのEX5ファイル名です。

このファイルには、JSON形式で詳細なONNXモデル実行プロファイリングレポートが含まれます。内容には以下が含まれます。

  • セッションのロードおよび初期化時間
  • 個々のグラフノード(Conv、Relu、MaxPool、Gemmなど)の実行時間
  • 使用された実行プロバイダー(例:CUDAExecutionProvider)
  • 入出力テンソルのサイズ情報
  • スレッドスケジューリングの統計情報

 

プロファイリングレポートのデータ例:

{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :698,"ts" :11,"ph" : "X","name" :"model_loading_array","args" : {}},
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :15496,"ts" :869,"ph" : "X","name" :"session_initialization","args" : {}},
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :66055,"ts" :16800,"ph" : "X","name" :"Convolution28_kernel_time","args" : {"parameter_size" : "832","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,1,28,28]},{"float
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :775,"ts" :82867,"ph" : "X","name" :"ReLU32_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,8,28,28]}],"node_index" : "3
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :8818,"ts" :83647,"ph" : "X","name" :"Pooling66_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,8,28,28]}],"node_inde
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :1120,"ts" :92476,"ph" : "X","name" :"Convolution110_kernel_time","args" : {"parameter_size" : "12864","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,8,14,14]},{"flo
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :23,"ts" :93603,"ph" : "X","name" :"ReLU114_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,16,14,14]}],"node_index" : "
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :21,"ts" :93629,"ph" : "X","name" :"Pooling160_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,16,14,14]}],"node_inde
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :16,"ts" :93654,"ph" : "X","name" :"Times212_reshape0_kernel_time","args" : {"parameter_size" : "16","provider" : "CUDAExecutionProvider","op_name" : "Reshape","input_type_shape" : [{"float":[1,16,4,4]},{"int
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :32264,"ts" :93673,"ph" : "X","name" :"Times212/MatMulAddFusion_kernel_time","args" : {"parameter_size" : "10280","provider" : "CUDAExecutionProvider","op_name" : "Gemm","input_type_shape" : [{"float":[1,256]
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :109165,"ts" :16794,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :109600,"ts" :16433,"ph" : "X","name" :"model_run","args" : {}},
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :87,"ts" :126313,"ph" : "X","name" :"Convolution28_kernel_time","args" : {"parameter_size" : "832","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,1,28,28]},{"float":
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :23,"ts" :126403,"ph" : "X","name" :"ReLU32_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,8,28,28]}],"node_index" : "3
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :31,"ts" :126431,"ph" : "X","name" :"Pooling66_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,8,28,28]}],"node_index
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :35,"ts" :126466,"ph" : "X","name" :"Convolution110_kernel_time","args" : {"parameter_size" : "12864","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,8,14,14]},{"floa
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :15,"ts" :126505,"ph" : "X","name" :"ReLU114_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,16,14,14]}],"node_index" :
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :22,"ts" :126523,"ph" : "X","name" :"Pooling160_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,16,14,14]}],"node_ind
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :12,"ts" :126548,"ph" : "X","name" :"Times212_reshape0_kernel_time","args" : {"parameter_size" : "16","provider" : "CUDAExecutionProvider","op_name" : "Reshape","input_type_shape" : [{"float":[1,16,4,4]},{"in
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :40,"ts" :126562,"ph" : "X","name" :"Times212/MatMulAddFusion_kernel_time","args" : {"parameter_size" : "10280","provider" : "CUDAExecutionProvider","op_name" : "Gemm","input_type_shape" : [{"float":[1,256]},

 

ONNXプロファイリングに関する追加情報:https://onnxruntime.ai/docs/performance/tune-performance/profiling-tools.html

 

ONNXモデルを使用する場合の配列変換

機械学習タスクでは、必ずしも高い計算精度が必要なわけではありません。計算を高速化するために、一部のモデルではFloat16やFloat8などの低精度のデータ型を使用します。ユーザーが関連データをモデルに入力できるようにするために、MQL5は、標準のMQL5型を特別なFP16型およびFP8型に変換する4つの特別な関数を提供します。

関数

アクション

ArrayToFP16

float型またはdouble型の配列を、指定された形式のushort型の配列にコピーします

ArrayToFP8

float型またはdouble型の配列を、指定された形式のuchar型の配列にコピーします

ArrayFromFP16

ushort型の配列を、指定された形式のfloat型またはdouble型の配列にコピーします

ArrayFromFP8

uchar型の配列を、指定された形式のfloat型またはdouble型の配列にコピーします

これらの配列変換関数は、以下の列挙で指定された特別な形式を使用します。

ENUM_FLOAT16_FORMAT #

ENUM_FLOAT16_FORMAT列挙では2つのFP16型形式が説明されています。

ID

説明

FLOAT_FP16

標準16ビット形式(ハーフとも呼ばれる)

FLOAT_BFP16

特別なbf16浮動小数点形式

これらの形式にはそれぞれ利点と制限があります。FLOAT16は精度が高くなりますが、より多くのストレージと計算リソースを必要とします。一方、BFLOAT16はデータ処理のパフォーマンスと効率が高くなりますが、精度が劣る可能性があります。

ENUM_FLOAT8_FORMAT #

ENUM_FLOAT8_FORMAT列挙では4つのFP8型形式が説明されています。

FP8(8ビット浮動小数点)は、浮動小数点数を表すために使用されるデータ型の1つです。FP8では、各数値は8データビットで表され、通常は符号、指数、仮数の3つの要素に分割されます。この形式は精度とストレージ効率のバランスが取れているため、メモリと計算効率を必要とするアプリケーションにとって魅力的です。  

ID

説明

FLOAT_FP8_E4M3FN

8ビット浮動小数点数、指数部に4ビット、仮数部に3ビット。通常は係数として使用されます。

FLOAT_FP8_E4M3FNUZ

8ビット浮動小数点数、指数部に4ビット、仮数部に3ビット。NaNをサポートしますが、負のゼロとInfはサポートしません。通常は係数として使用されます。

FLOAT_FP8_E5M2FN

8ビット浮動小数点数、指数部に5ビット、仮数部に2ビット。NaNとInfをサポートします。通常は勾配に使用されます。

FLOAT_FP8_E5M2FNUZ

8ビット浮動小数点数、指数部に5ビット、仮数部に2ビット。NaNをサポートしますが、負のゼロとInfはサポートしません。勾配に使用されます。

FP8の主な利点の1つは、大規模なデータセットの処理効率です。FP8はコンパクトな数値表現を採用することにより、メモリ要件を削減し、計算を高速化します。これは、大規模なデータセットを処理することが多い機械学習および人工知能アプリケーションでは特に重要です。