Estruturas de dados

As seguintes estruturas de dados são usadas para trabalhar com modelos ONNX:

OnnxTypeInfo #

A estrutura descreve o tipo de parâmetro de entrada ou saída do modelo ONNX

struct OnnxTypeInfo
  {
   ENUM_ONNX_TYPE         type;           // tipo de parâmetro
   OnnxTensorTypeInfo     tensor;         // descrição do tensor
   OnnxMapTypeInfo        map;            // descrição do mapa
   OnnxSequenceTypeInfo   sequence;       // descrição da sequência
  };

Somente o tensor (ONNX_TYPE_TENSOR) pode ser usado como parâmetro de entrada; nesse caso, somente o campo OnnxTypeInfo::tensor é preenchido com valores; os outros campos (mapa e sequência) permanecem indefinidos.

Apenas um dos três tipos OnnxTypeInfo (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP ou ONNX_TYPE_SEQUENCE) pode ser usado como parâmetro de saída, dependendo do tipo, será preenchida a subestrutura apropriada (OnnxTypeInfo::tensor, OnnxTypeInfo::map ou OnnxTypeInfo::sequence).

 

OnnxTensorTypeInfo

A estrutura descreve o tensor no parâmetro de entrada ou saída do modelo ONNX

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

OnnxMapTypeInfo #

A estrutura descreve o mapa que é obtido no parâmetro de saída do modelo ONNX

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

OnnxSequenceTypeInfo #

A estrutura descreve a sequência que resulta no parâmetro de saída do modelo ONNX

struct OnnxSequenceTypeInfo
  {
   const OnnxTypeInfo&          value_type;     // tipo de dados da sequência
  };

 

ENUM_ONNX_TYPE #

A enumeração ENUM_ONNX_TYPE descreve o tipo de parâmetro do modelo

Identificador

Descrição

ONNX_TYPE_UNKNOWN

Desconhecido

ONNX_TYPE_TENSOR

Tensor

ONNX_TYPE_SEQUENCE

Sequência

ONNX_TYPE_MAP

Mapa

ONNX_TYPE_OPAQUE

Abstrato

ONNX_TYPE_SPARSETENSOR

Tensor esparso

ENUM_ONNX_DATA_TYPE #

A enumeração ENUM_ONNX_DATA_TYPE descreve o tipo de dados usados

Identificador

Descrição

ONNX_DATA_TYPE_UNDEFINED

Não 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 complexo de 64 bits

ONNX_DATA_TYPE_COMPLEX128

Número complexo de 128 bits

ONNX_DATA_TYPE_BFLOAT16

bfloat de 16 bits (Brain Floating Point)

ENUM_ONNX_FLAGS #

A enumeração ENUM_ONNX_FLAGS descreve o modo de inicialização do modelo

Identificador

Descrição

ONNX_DEBUG_LOGS

Saída de registros de depuração

ONNX_NO_CONVERSION

Proibir a autoconversão, usar os dados do usuário como estão

ONNX_COMMON_FOLDER  

Carga do arquivo do modelo a partir da pasta Common/Files, igual em valor ao sinalizador FILE_COMMON

 

Conversão de arrays ao trabalhar com modelos ONNX

Em tarefas de aprendizado de máquina, nem sempre é necessária uma grande precisão nos cálculos. Para acelerar os cálculos, alguns modelos utilizam tipos de dados com menor precisão, como Float16 e até mesmo Float8. Para que os usuários possam fornecer esses dados de entrada aos modelos, no MQL5 foram adicionadas 4 funções especiais que convertem os tipos padrões do MQL5 para os tipos especiais FP16 e FP8.

Função

Ação

ArrayToFP16

Realiza a cópia de um array do tipo float ou double para um array do tipo ushort com o formato especificado.

ArrayToFP8

Realiza a cópia de um array do tipo float ou double para um array do tipo uchar com o formato especificado.

ArrayFromFP16

Realiza a cópia de um array do tipo ushort para um array do tipo float ou double com um formato especificado.

ArrayFromFP8

Realiza a cópia de um array do tipo uchar para um array do tipo float ou double com um formato especificado.

Essas funções para conversão de arrays utilizam formatos especiais, definidos nas enumerações abaixo.

ENUM_FLOAT16_FORMAT #

Enumeração ENUM_FLOAT16_FORMAT descreve 2 formatos do tipo FP16.

Identificador

Descrição

FLOAT_FP16

Formato padrão de 16 bits, também conhecido como half

FLOAT_BFP16

Formato especial brain float point

Ambos os formatos têm suas vantagens e limitações. FLOAT16 oferece maior precisão, mas requer mais recursos para armazenamento e cálculos. BFLOAT16, por outro lado, oferece maior desempenho e eficiência no processamento de dados, mas pode ser menos preciso.

ENUM_FLOAT8_FORMAT #

Enumeração ENUM_FLOAT8_FORMAT descreve 4 formatos do tipo FP8.

O formato FP8 (número de ponto flutuante de 8 bits) é um dos tipos de dados usados para representar números de ponto flutuante. No FP8, cada número é representado por 8 bits de dados, que geralmente são divididos em três componentes: sinal, expoente e mantissa. Este formato oferece um compromisso entre precisão e eficiência de armazenamento de dados, tornando-o atraente para uso em aplicativos onde a economia de memória e recursos computacionais é necessária.  

Identificador

Descrição

FLOAT_FP8_E4M3FN

Número de ponto flutuante de 8 bits, 4 bits de ordem e 3 bits de mantissa. Geralmente usado como coeficientes.

FLOAT_FP8_E4M3FNUZ

Número de ponto flutuante de 8 bits, 4 bits de ordem e 3 bits de mantissa. Suporta NaN, não suporta zero negativo e Inf. Geralmente usado como coeficientes.

FLOAT_FP8_E5M2FN

Número de ponto flutuante de 8 bits, 5 bits de ordem e 2 bits de mantissa. Suporta NaN e Inf. Geralmente usado para gradientes.

FLOAT_FP8_E5M2FNUZ

Número de ponto flutuante de 8 bits, 5 bits de ordem e 2 bits de mantissa. Suporta NaN e Inf, não suporta zero negativo. Também utilizado para gradientes.

Uma das principais vantagens do FP8 é sua eficiência no processamento de grandes volumes de dados. Graças à representação compacta de números, FP8 permite reduzir os requisitos de memória e acelerar os cálculos. Isso é especialmente importante em aplicações de aprendizado de máquina e inteligência artificial, onde o processamento de grandes conjuntos de dados é comum.