OnnxRun

ONNXモデルを実行します。

bool  OnnxRun(
  long   onnx_handle, // ONNXセッションハンドル
  ulong   flags,       // 実行モードを説明するフラグ
  ...                  // モデルの入出力
  );

パラメータ

onnx_handle

[in] OnnxCreateまたは OnnxCreateFromBufferで作成されたONNXセッションオブジェクトハンドル

フラグ

[in] 実行もウドを示す、ENUM_ONNX_FLAGS空のフラグ(ONNX_DEBUG_LOGS、 ONNX_NO_CONVERSION)

...

[in] [out] モデルの入出力。

成功の場合はtrue、それ以外の場合はfalse。エラーコードの取得にはGetLastError関数が呼ばれます。

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は自動的に選択されます。

 

例:

const long                             ExtOutputShape[] = {1,1};   // モデルの出力形状
const long                             ExtInputShape [] = {1,10,4}; // モデルの入力形状
#resource "Python/model.onnx" as uchar ExtModel[]                   // リソースとしてのモデル
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
int OnStart(void)
 {
  matrix rates;
//--- 10バーを取得する
  if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
    return(-1);
//--- 一連のOHLCベクトルを入力する
  matrix x_norm=rates.Transpose();
  vector m=x_norm.Mean(0);              
  vector s=x_norm.Std(0);
  matrix mm(10,4);
  matrix ms(10,4);
//--- 正規化行列に入力する
  for(int i=0; i<10; i++)
    {
    mm.Row(m,i);
    ms.Row(s,i);
    }
//--- 入力データを正規化する
  x_norm-=mm;
  x_norm/=ms;
//--- モデルを作成する
  long handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//--- 入力データの形状を指定する
  if(!OnnxSetInputShape(handle,0,ExtInputShape))
    {
    Print("OnnxSetInputShape failed, error ",GetLastError());
    OnnxRelease(handle);
    return(-1);
    }
//--- 出力データの形状を指定する
  if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
    {
    Print("OnnxSetOutputShape failed, error ",GetLastError());
    OnnxRelease(handle);
    return(-1);
    }
//--- 正規化された入力データをfloat型に変換する
  matrixf x_normf;
  x_normf.Assign(x_norm);
//--- ここでモデルの出力データ、つまり価格予測を取得する
  vectorf y_norm(1);
//--- モデルを実行する
  if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
    {
    Print("OnnxRun failed, error ",GetLastError());
    OnnxRelease(handle);
    return(-1);
    }
//--- モデルの出力値をログに出力する
  Print(y_norm);
//--- 逆変換を行って予測価格を取得する
  double y_pred=y_norm[0]*s[3]+m[3];
  Print("price predicted:",y_pred);
//--- 操作完了
  OnnxRelease(handle);
  return(0);
 };

参照

OnnxSetInputShapeOnnxSetOutputShape