OnnxRun

运行ONNX模型。

bool  OnnxRun(
   long    onnx_handle,  // ONNX会话句柄
   ulong   flags,        // 描述运行模式的标识
   ...                   // 模型的输入和输出
   );

参数

onnx_handle

[in]  通过OnnxCreateOnnxCreateFromBuffer创建的ONNX会话对象句柄。

flags

[in] ENUM_ONNX_FLAGS中的标识,描述运行模式:ONNX_DEBUG_LOGS和ONNX_NO_CONVERSION。

...

[in] [out]  模型输入和输出。

成功返回true,否则返回false。要获取错误代码,请调用GetLastError函数。

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

仅使用 CPU 执行 ONNX 模型

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_GPUD_N 形式的标志应在具有两个或多个 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=0i<10i++)
     {
      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);
     }
//--- 将标准化输入数据转换为浮点类型
   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