Estructura de los datos

Para trabajar con modelos ONNX se usan las siguientes estructuras de datos:

OnnxTypeInfo #

La estructura describe el tipo del parámetro de entrada o salida del modelo ONNX

struct OnnxTypeInfo
  {
   ENUM_ONNX_TYPE         type;           // tipo de parámetro
   OnnxTensorTypeInfo     tensor;         // descripción del tensor
   OnnxMapTypeInfo        map;            // descripción de map
   OnnxSequenceTypeInfo   sequence;       // descripción de la secuencia
  };

Solo el tensor (ONNX_TYPE_TENSOR) puede usarse como parámetro de entrada, en cuyo caso solo el campo OnnxTypeInfo::tensor se rellenará con valores, los otros campos (map y sequence) serán indefinidos.

Solo uno de los tres tipos de OnnxTypeInfo (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP o ONNX_TYPE_SEQUENCE) se puede utilizar como parámetro de salida, dependiendo del tipo se rellenará la subestructura correspondiente (OnnxTypeInfo::tensor, OnnxTypeInfo::map u OnnxTypeInfo::sequence).

 

OnnxTensorTypeInfo

La estructura describe el tensor en el parámetro de entrada o salida del modelo ONNX

struct OnnxTensorTypeInfo
  {
   const ENUM_ONNX_DATA_TYPE    data_type;      // tipo de datos en el tensor
   const long                   dimensions[];   // número de elementos en el tensor
  };

OnnxMapTypeInfo #

La estructura describe map, que se obtiene en el parámetro de salida del modelo ONNX

struct OnnxMapTypeInfo
  {
   const ENUM_ONNX_DATA_TYPE    key_type;       // tipo de clave
   const OnnxTypeInfo&          value_type;     // tipo de valor
  };

OnnxSequenceTypeInfo #

La estructura describe la sencuencia, que se obtiene en el parámetro de salida del modelo ONNX

struct OnnxSequenceTypeInfo
  {
   const OnnxTypeInfo&          value_type;      // tipo de datos en la secuencia
  };

 

ENUM_ONNX_TYPE #

La enumeración ENUM_ONNX_TYPE describe el tipo del parámetro del modelo

Identificador

Descripción

ONNX_TYPE_UNKNOWN

Desconocido

ONNX_TYPE_TENSOR

Tensor

ONNX_TYPE_SEQUENCE

Secuencia

ONNX_TYPE_MAP

Mapa

ONNX_TYPE_OPAQUE

Abstracto

ONNX_TYPE_SPARSETENSOR

Tensor disperso

ENUM_ONNX_DATA_TYPE #

La enumeración ENUM_ONNX_DATA_TYPE describe el tipo de datos utilizados

Identificador

Descripción

ONNX_DATA_TYPE_UNDEFINED

No definido

ONNX_DATA_TYPE_FLOAT

float

ONNX_DATA_TYPE_INT8

int de 8 bits

ONNX_DATA_TYPE_UINT16

uint de 16 bits

ONNX_DATA_TYPE_INT16

int de 16 bits

ONNX_DATA_TYPE_INT32

int de 32 bits

ONNX_DATA_TYPE_INT64

int de 64 bits

ONNX_DATA_TYPE_STRING

string

ONNX_DATA_TYPE_BOOL

bool

ONNX_DATA_TYPE_FLOAT16

float de 16 bits

ONNX_DATA_TYPE_DOUBLE

double

ONNX_DATA_TYPE_UINT32

uint de 32 bits

ONNX_DATA_TYPE_UINT64

uint de 64 bits

ONNX_DATA_TYPE_COMPLEX64

número complejo de 64 bits

ONNX_DATA_TYPE_COMPLEX128

número complejo de 128 bits

ONNX_DATA_TYPE_BFLOAT16

bfloat de 16 bits (Brain Floating Point)

ENUM_ONNX_FLAGS #

La enumeración ENUM_ONNX_FLAGS describe el modo de inicio del modelo  

Identificador

Descripción

ONNX_DEBUG_LOGS

Muestra de logs de depuración

ONNX_NO_CONVERSION

Prohibición de conversión automática, use los datos del usuario tal cual

ONNX_COMMON_FOLDER  

Carga del archivo del modelo desde la carpeta Common\Files, el valor es igual al indicador FILE_COMMON

 

Conversión de arrays al trabajar con modelos ONNX

En las tareas de aprendizaje automático, no siempre se necesita una alta precisión en los cálculos. Para acelerar los cálculos, algunos modelos utilizan tipos de datos con menor precisión, como Float16 e incluso Float8. Para permitir a los usuarios introducir dichos datos en la entrada de los modelos, MQL5 ha añadido 4 funciones especiales que convierten los tipos estándar de MQL5 en tipos especiales FP16 y FP8.

Función

Acción

ArrayToFP16

Permite copiar un array de tipo float o double en un array de tipo ushort con el formato establecido

ArrayToFP8

Permite copiar un array de tipo float o double en un array de tipo uchar con el formato establecido

ArrayFromFP16

Permite copiar un array de tipo ushort en un array de tipo float o double con el formato establecido

ArrayFromFP8

Permite copiar un array de tipo uchar en un array de tipo float o double con el formato establecido

Estas funciones utilizan los formatos especiales definidos en las enumeraciones siguientes para convertir arrays.

ENUM_FLOAT16_FORMAT #

La enumeración ENUM_FLOAT16_FORMAT describe 2 formatos del tipo FP16.

Identificador

Descripción

FLOAT_FP16

Formato estándar de 16 bits, también conocido como half

FLOAT_BFP16

Formato especial brain float point

Ambos formatos tienen sus ventajas y sus limitaciones. FLOAT16 ofrece una mayor precisión, pero requiere más recursos de almacenamiento y cálculo. BFLOAT16, por su parte, ofrece un mayor rendimiento y eficiencia en el procesamiento de datos, pero puede ser menos preciso.

ENUM_FLOAT8_FORMAT #

La enumeración ENUM_FLOAT8_FORMAT describe 4 formatos del tipo FP8.

El formato FP8 (coma flotante de 8 bits) es uno de los tipos de datos usados para representar números en coma flotante. En FP8, cada número se representa con 8 bits de datos, que suelen dividirse en tres componentes: signo, exponente y mantisa. Este formato ofrece un compromiso entre precisión y eficiencia de almacenamiento, lo cual lo hace atractivo para su uso en aplicaciones en las que es necesario ahorrar memoria y recursos computacionales.  

Identificador

Descripción

FLOAT_FP8_E4M3FN

Un número de coma flotante de 8 bits, 4 bits de orden y 3 bits de mantisa. Se utiliza normalmente como coeficientes.

FLOAT_FP8_E4M3FNUZ

Un número de coma flotante de 8 bits, 4 bits de orden y 3 bits de mantisa. Soporta NaN, cero negativo e Inf no están soportados. Se utiliza normalmente como coeficientes.

FLOAT_FP8_E5M2FN

Un número de coma flotante de 8 bits, 5 bits de orden y 2 bits de mantisa. Soporta NaN y Inf. Normalmente se usa para gradientes.

FLOAT_FP8_E5M2FNUZ

Un número de coma flotante de 8 bits, 5 bits de orden y 2 bits de mantisa. Soporta NaN e Inf, no soporta cero negativo. También se utiliza para gradientes.

Una de las principales ventajas de FP8 es su eficiencia en el procesamiento de grandes cantidades de datos. Con su representación compacta de los números, el FP8 puede reducir los requisitos de memoria y acelerar los cálculos. Esto es especialmente importante en las aplicaciones de aprendizaje automático e inteligencia artificial, donde el procesamiento de grandes conjuntos de datos es habitual.