Strutture dati

Le seguenti strutture dati sono utilizzate per operazioni con modelli ONNX:

OnnxTypeInfo #

La struttura descrive il tipo di un ingresso o parametro d'uscita di un modello ONNX

struct OnnxTypeInfo
 {
  ENUM_ONNX_TYPE        type;          // tipo di parametro
  OnnxTensorTypeInfo    tensor;        // descrizione del tensore
  OnnxMapTypeInfo       map;           // descrizione della mappa
  OnnxSequenceTypeInfo  sequence;      // descrizione della sequenza
 };

Solo il tensore (ONNX_TYPE_TENSOR) può essere usato come ingresso. In questo caso, solo il campo OnnxTypeInfo::tensor è riempito con valori, mentre gli altri campi (mappa e sequenza) non sono definiti.

Solo uno dei tre tipi OnnxTypeInfo (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP o ONNX_TYPE_SEQUENCE) può essere utilizzato come ingresso. La sottostruttura corrispondente (OnnxTypeInfo::tensor, OnnxTypeInfo::map o OnnxTypeInfo::sequence) viene riempita a seconda del tipo.

 

OnnxTensorTypeInfo

La struttura descrive il tensore in ingresso o parametro d'uscita di un modello ONNX

struct OnnxTensorTypeInfo
 {
  const ENUM_ONNX_DATA_TYPE  data_type;      // tipo di dati nel tensore
  const long                 dimensions[];   // numero di elementi nel tensore
 };

OnnxMapTypeInfo #

La struttura descrive la mappa ottenuta nel parametro d'uscita di un modello ONNX

struct OnnxMapTypeInfo
 {
  const ENUM_ONNX_DATA_TYPE  key_type;      // tipo di chiave
  const OnnxTypeInfo&        value_type;    // tipo di valore
 };

OnnxSequenceTypeInfo #

La struttura descrive la sequenza ottenuta nel parametro d'uscita di un modello ONNX

struct OnnxSequenceTypeInfo
 {
  const OnnxTypeInfo&        value_type;      // tipo di dati nella sequenza
 };

 

 

ENUM_ONNX_TYPE #

L'enumerazione ENUM_ONNX_TYPE definisce il tipo di parametro di un modello

ID

Descrizione

ONNX_TYPE_UNKNOWN

Sconosciuto

ONNX_TYPE_TENSOR

Tensore

ONNX_TYPE_SEQUENCE

Sequenza

ONNX_TYPE_MAP

Mappa

ONNX_TYPE_OPAQUE

Astratto (opaco)

ONNX_TYPE_SPARSETENSOR

Tensore sparso

ENUM_ONNX_DATA_TYPE #

L'enumerazione >ENUM_ONNX_DATA_TYPE definisce il tipo di dati usato

ID

Descrizione

ONNX_DATA_TYPE_UNDEFINED

Non definito

ONNX_DATA_TYPE_FLOAT

float

ONNX_DATA_TYPE_INT8

int 8-bit

ONNX_DATA_TYPE_UINT16

uint 16-bit

ONNX_DATA_TYPE_INT16

int 16-bit

ONNX_DATA_TYPE_INT32

int 32-bit

ONNX_DATA_TYPE_INT64

int 64-bit

ONNX_DATA_TYPE_STRING

string

ONNX_DATA_TYPE_BOOL

bool

ONNX_DATA_TYPE_FLOAT16

float 16-bit

ONNX_DATA_TYPE_DOUBLE

double

ONNX_DATA_TYPE_UINT32

uint 32-bit

ONNX_DATA_TYPE_UINT64

uint 64-bit

ONNX_DATA_TYPE_COMPLEX64

numeri complessi a 64-bit

ONNX_DATA_TYPE_COMPLEX128

numeri complessi a 128-bit

ONNX_DATA_TYPE_BFLOAT16

bfloat 16-bit (Brain Floating Point)

ENUM_ONNX_FLAGS #

L'enumerazione ENUM_ONNX_FLAGS definisce la modalità di esecuzione del modello

ID

Descrizione

ONNX_DEBUG_LOGS

Log di debug di output

ONNX_NO_CONVERSION

Disattiva la conversione automatica, utilizza i dati dell'utente come sono

ONNX_COMMON_FOLDER  

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

 

Conversione di array quando si lavora con i modelli ONNX

I compiti di apprendimento automatico non richiedono sempre una grande precisione computazionale. Per accelerare i calcoli, alcuni modelli utilizzano tipi di dati di precisione inferiore come Float16 e persino Float8. Per consentire agli utenti di inserire i dati rilevanti nei modelli, MQL5 fornisce quattro funzioni speciali che convertono i tipi standard MQL5 in tipi speciali FP16 e FP8.

Funzione

Azione

ArrayToFP16

Copia un array di tipo float o double in un array di tipo ushort con il formato specificato

ArrayToFP8

Copia un array di tipo float o double in un array di tipo uchar con il formato specificato

ArrayFromFP16

Copia un array di tipo ushort in un array di tipo float o double con il formato specificato

ArrayFromFP8

Copia un array di tipo uchar in un array di tipo float o double con il formato specificato

Queste funzioni di conversione degli array utilizzano formati speciali specificati nelle enumerazioni seguenti.

ENUM_FLOAT16_FORMAT #

L'enumerazione ENUM_FLOAT16_FORMAT descrive due formati di tipo FP16.

ID

Descrizione

FLOAT_FP16

Formato standard a 16 bit, noto anche come half

FLOAT_BFP16

Formato speciale brain float point

Ognuno di questi formati ha i suoi vantaggi e limitazioni. FLOAT16 fornisce una maggiore precisione, ma richiede più risorse di archiviazione e di calcolo. BFLOAT16, d'altra parte, fornisce maggiori prestazioni ed efficienza nell'elaborazione dei dati, ma può essere meno accurata.

ENUM_FLOAT8_FORMAT #

L'enumerazione ENUM_FLOAT8_FORMAT descrive quattro formati di tipo FP8.

FP8 (8-bit floating point) è uno dei tipi di dati utilizzati per rappresentare i numeri in virgola mobile. In FP8, ogni numero è rappresentato da 8 bit di dati, tipicamente divisi in tre componenti: segno, esponente e mantissa. Questo formato offre un equilibrio tra precisione ed efficienza di archiviazione, rendendolo attraente per le applicazioni che richiedono memoria ed efficienza computazionale.  

ID

Descrizione

FLOAT_FP8_E4M3FN

Numero in virgola mobile a 8 bit, 4 bit per l'esponente e 3 bit per la mantissa. Tipicamente utilizzato come coefficiente.

FLOAT_FP8_E4M3FNUZ

Numero in virgola mobile a 8 bit, 4 bit per l'esponente e 3 bit per la mantissa. Supporta Nan, non supporta zero negativo e Inf. Tipicamente utilizzato come coefficiente.

FLOAT_FP8_E5M2FN

Numero in virgola mobile a 8 bit, 5 bit per l'esponente e 2 bit per la mantissa. Supporta Nan e Inf. Tipicamente utilizzato per i gradienti.

FLOAT_FP8_E5M2FNUZ

Numero in virgola mobile a 8 bit, 5 bit per l'esponente e 2 bit per la mantissa. Supporta Nan, non supporta zero negativo e Inf. Utilizzato anche per i gradienti.

Uno dei principali vantaggi di FP8 è la sua efficienza nell'elaborazione di grandi set di dati. Con l'impiego della rappresentazione numerica compatta, FP8 riduce i requisiti di memoria e accelera i calcoli. Ciò è particolarmente importante nelle applicazioni di apprendimento automatico e di intelligenza artificiale che spesso elaborano grandi set di dati.