- Soporte de ONNX
- Conversión de formatos
- Autoconversión de los datos
- Creación de un modelo
- Inicio del modelo
- Comprobación en el simulador
- OnnxCreate
- OnnxCreateFromBuffer
- OnnxRelease
- OnnxRun
- OnnxGetInputCount
- OnnxGetOutputCount
- OnnxGetInputName
- OnnxGetOutputName
- OnnxGetInputTypeInfo
- OnnxGetOutputTypeInfo
- OnnxSetInputShape
- OnnxSetOutputShape
- Estructura de los datos
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
|
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).
La estructura describe el tensor en el parámetro de entrada o salida del modelo ONNX
struct OnnxTensorTypeInfo
|
OnnxMapTypeInfo #
La estructura describe map, que se obtiene en el parámetro de salida del modelo ONNX
struct OnnxMapTypeInfo
|
OnnxSequenceTypeInfo #
La estructura describe la sencuencia, que se obtiene en el parámetro de salida del modelo ONNX
struct OnnxSequenceTypeInfo
|
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 |
---|---|
Permite copiar un array de tipo float o double en un array de tipo ushort con el formato establecido |
|
Permite copiar un array de tipo float o double en un array de tipo uchar con el formato establecido |
|
Permite copiar un array de tipo ushort en un array de tipo float o double con el formato establecido |
|
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.