OnnxRun

Esegue un modello ONNX.

bool  OnnxRun(
 long   onnx_handle,  // handle sessione ONNX
 ulong  flags,        // flag che descrive la modalità di esecuzione
   ...                // ingressi e uscite del modello
   );

Parametri

onnx_handle

[in] Handle ONNX dell'oggetto della sessione creato tramite OnnxCreate o OnnxCreateFromBuffer.

flags

[in] Flag da ENUM_ONNX_FLAGS che descrive la modalità di esecuzione: ONNX_DEBUG_LOGS e ONNX_NO_CONVERSION.

...

[in] [out] Ingressi e uscite del modello.

Restituisce true in caso di successo o false altrimenti. Per ottenere il codice errore, chiamare la funzione GetLastError.

ENUM_ONNX_FLAGS

ID

Descrizione

ONNX_LOGLEVEL_VERBOSE

Registra tutti i messaggi

ONNX_LOGLEVEL_INFO

Registra messaggi informativi, avvisi ed errori (questo flag sostituisce ONNX_DEBUG_LOGS)

ONNX_LOGLEVEL_WARNING

Registra avvisi ed errori (predefinito)

ONNX_LOGLEVEL_ERROR

Registra solo gli errori

ONNX_NO_CONVERSION

Disabilita la conversione automatica, utilizza i dati utente così come sono

ONNX_COMMON_FOLDER  

Carica un file modello dalla cartella Common\Files; il valore è uguale al flag FILE_COMMON

ONNX_USE_CPU_ONLY

Esegue il modello ONNX utilizzando solo la CPU

ONNX_GPU_DEVICE_0

Dispositivo CUDA con indice 0 (predefinito)

ONNX_GPU_DEVICE_1

Dispositivo CUDA con indice 1 *

ONNX_GPU_DEVICE_2

Dispositivo CUDA con indice 2 *

ONNX_GPU_DEVICE_3

Dispositivo CUDA con indice 3 *

ONNX_GPU_DEVICE_4

Dispositivo CUDA con indice 4 *

ONNX_GPU_DEVICE_5

Dispositivo CUDA con indice 5 *

ONNX_GPU_DEVICE_6

Dispositivo CUDA con indice 6 *

ONNX_GPU_DEVICE_7

Dispositivo CUDA con indice 7 *

ONNX_ENABLE_PROFILING

Abilita la profilazione del modello ONNX

* I flag del formato ONNX_GPU_DEVICE_N devono essere utilizzati sui sistemi con due o più GPU compatibili con CUDA. Se vengono specificati più flag di selezione GPU, verrà utilizzato il dispositivo con l'indice più basso.

Se viene specificato un indice del dispositivo inesistente, la GPU verrà selezionata automaticamente.

 

Esempio:

const long                             ExtOutputShape[] = {1,1};    // dimensione del modello d'uscita
const long                             ExtInputShape [] = {1,10,4}; // forma del modello d'ingresso
#resource "Python/model.onnx" as uchar ExtModel[]                   // modello come risorsa
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {
   matrix rates;
//-- ottenere 10 barre
   if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
      return(-1);
//---inserire un insieme di vettori 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);
//-- riempire le matrici di normalizzazione
   for(int i=0i<10i++)
     {
      mm.Row(m,i);
      ms.Row(s,i);
     }
//-- normalizzare i dati d'ingresso
   x_norm-=mm;
   x_norm/=ms;
//-- creare il modello
   long handle=OnnxCreateFromBuffer(ExtModel,ONNX_DEBUG_LOGS);
//-- specificare la dimensione dei dati d'ingresso
   if(!OnnxSetInputShape(handle,0,ExtInputShape))
     {
      Print("OnnxSetInputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//-- specificare la dimensione dei dati d'uscita
   if(!OnnxSetOutputShape(handle,0,ExtOutputShape))
     {
      Print("OnnxSetOutputShape failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//-- convertire i dati d'ingresso normalizzati in tipo float
   matrixf x_normf;
   x_normf.Assign(x_norm);
//-- ottenere i dati d'uscita del modello qui, cioè la previsione dei prezzi
   vectorf y_norm(1);
//-- eseguire il modello
   if(!OnnxRun(handle,ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION,x_normf,y_norm))
     {
      Print("OnnxRun failed, error ",GetLastError());
      OnnxRelease(handle);
      return(-1);
     }
//-- stampa il valore di uscita del modello nel log
   Print(y_norm);
//-- fare la trasformazione inversa per ottenere il prezzo previsto
   double y_pred=y_norm[0]*s[3]+m[3];
   Print("price predicted:",y_pred);
//-- operazione completata
   OnnxRelease(handle);
   return(0);
  };

Vedi anche

OnnxSetInputShape, OnnxSetOutputShape