- ONNXサポート
- フォーマット変換
- データ型の自動変換
- モデルの作成
- モデルの実行
- ストラテジーテスターでの実行
- OnnxCreate
- OnnxCreateFromBuffer
- OnnxRelease
- OnnxRun
- OnnxGetInputCount
- OnnxGetOutputCount
- OnnxGetInputName
- OnnxGetOutputName
- OnnxGetInputTypeInfo
- OnnxGetOutputTypeInfo
- OnnxSetInputShape
- OnnxSetOutputShape
- データ構造体
データ構造体
ONNXモデルでの操作には次のデータ構造が使用されます。
OnnxTypeInfo #
この構造体は、ONNXモデルの入力または出力パラメータの型を記述します
struct OnnxTypeInfo
|
テンソル(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)は、型に応じて埋められます。
構造体は、ONNXモデルの入力または出力パラメータのテンソルを記述します
struct OnnxTensorTypeInfo
|
OnnxMapTypeInfo #
この構造体は、ONNXモデルの出力パラメータで取得されるマップを記述します。
struct OnnxMapTypeInfo
|
OnnxSequenceTypeInfo #
この構造体は、ONNXモデルの出力パラメータで取得されるシークエンスを記述します。
struct OnnxSequenceTypeInfo
|
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" : {}},
|
ONNXプロファイリングに関する追加情報:https://onnxruntime.ai/docs/performance/tune-performance/profiling-tools.html
ONNXモデルを使用する場合の配列変換
機械学習タスクでは、必ずしも高い計算精度が必要なわけではありません。計算を高速化するために、一部のモデルではFloat16やFloat8などの低精度のデータ型を使用します。ユーザーが関連データをモデルに入力できるようにするために、MQL5は、標準のMQL5型を特別なFP16型およびFP8型に変換する4つの特別な関数を提供します。
関数 |
アクション |
|---|---|
float型またはdouble型の配列を、指定された形式のushort型の配列にコピーします |
|
float型またはdouble型の配列を、指定された形式のuchar型の配列にコピーします |
|
ushort型の配列を、指定された形式のfloat型またはdouble型の配列にコピーします |
|
uchar型の配列を、指定された形式のfloat型またはdouble型の配列にコピーします |
これらの配列変換関数は、以下の列挙で指定された特別な形式を使用します。
ENUM_FLOAT16_FORMAT #
ENUM_FLOAT16_FORMAT列挙では2つのFP16型形式が説明されています。
これらの形式にはそれぞれ利点と制限があります。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はコンパクトな数値表現を採用することにより、メモリ要件を削減し、計算を高速化します。これは、大規模なデータセットを処理することが多い機械学習および人工知能アプリケーションでは特に重要です。