- 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_LOGLEVEL_VERBOSE |
Registrar todos los mensajes |
ONNX_LOGLEVEL_INFO |
Registrar los mensajes informativos, advertencias y errores (esta bandera sustituye ONNX_DEBUG_LOGS) |
ONNX_LOGLEVEL_WARNING |
Registrar las advertencias y errores (por defecto) |
ONNX_LOGLEVEL_ERROR |
Registrar solo los errores |
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 |
ONNX_USE_CPU_ONLY |
Al ejecutar un modelo ONNX, usar solo la CPU |
ONNX_GPU_DEVICE_0 |
Dispositivo CUDA con el número 0 (por defecto) |
ONNX_GPU_DEVICE_1 |
Dispositivo CUDA con el número 1 * |
ONNX_GPU_DEVICE_2 |
Dispositivo CUDA con el número 2 * |
ONNX_GPU_DEVICE_3 |
Dispositivo CUDA con el número 3 * |
ONNX_GPU_DEVICE_4 |
Dispositivo CUDA con el número 4 * |
ONNX_GPU_DEVICE_5 |
Dispositivo CUDA con el número 5 * |
ONNX_GPU_DEVICE_6 |
Dispositivo CUDA con el número 6 * |
ONNX_GPU_DEVICE_7 |
Dispositivo CUDA con el número 7 * |
ONNX_ENABLE_PROFILING |
Activa el perfilado del modelo ONNX |
* Las banderas como ONNX_GPU_DEVICE_N deben usarse en sistemas con dos o más GPU compatibles con CUDA. Si se especifican varias banderas de selección de GPU, se usará el dispositivo con el índice más bajo.
Si no se especifica un número de dispositivo, se realizará la selección automática.
Perfiles ONNX
La bandera ONNX_ENABLE_PROFILING habilita el perfilado de la ejecución del modelo ONNX. Al establecer esta bandera en el directorio <data_folder>/MQL5/Files/OnnxProfileReports se creará un archivo de tipo <module_name>_date_time.json.
Aquí <module_name> será el nombre del archivo EX5 del programa MQL.
El archivo contendrá un informe detallado del perfil de ejecución del modelo ONNX (en formato JSON), que incluirá:
- la hora de carga e inicialización de la sesión;
- la hora de ejecución de cada nodo del grafo (Conv, Relu, MaxPool, Gemm, etc.);
- el execution provider utilizado (p. ej., CUDAExecutionProvider);
- la información sobre el tamaño de los tensores de entrada y salida;
- las estadísticas de programación de flujos.
Ejemplo de datos del informe de perfilado:
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :698,"ts" :11,"ph" : "X","name" :"model_loading_array","args" : {}},
|
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.