OnnxRun

ONNX 모델을 실행.

bool  OnnxRun(
   long    onnx_handle,  // ONNX 세션 핸들
   ulong   flags,        // 실행 모드를 설명하는 플래그
   ...                   // 모델의 입력과 출력
   );

패러미터

onnx_handle

[in]  다음을 통해 생성된 ONNX session 객체 핸들 OnnxCreate or OnnxCreateFromBuffer.

flags

【in】 ENUM_ONNX_FLAGS의 플래그로 실행 모드를 설명: ONNX_DEBUG_LOGS 및 ONNX_NO_CONVERSION.

...

[in] [out]  모델 입력과 출력.

성공하면 true를 반환하고 그렇지 않으면 false를 반환. error 코드를 얻기 위해서는 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 flag와 같습니다.

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_GPU_DEVICE_N 형식의 플래그는 CUDA 지원 GPU가 2개 이상 있는 시스템에서 사용해야 합니다. 여러 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);
  };

더 참조할 만한 내용

OnnxSetInputShape, OnnxSetOutputShape