Veri Yapıları

ONNX modelleriyle çalışmak için aşağıdaki veri yapıları kullanılır:

OnnxTypeInfo #

Yapı, ONNX modelinin girdi veya çıktı parametresinin türünü tanımlar.

struct OnnxTypeInfo
 {
  ENUM_ONNX_TYPE        type;          // parametre türü
  OnnxTensorTypeInfo    tensor;        // tensör tanımı
  OnnxMapTypeInfo       map;           // harita tanımı
  OnnxSequenceTypeInfo  sequence;      // sekans tanımı
 };

Girdi olarak yalnızca tensör (ONNX_TYPE_TENSOR) kullanılabilir. Bu durumda, yalnızca OnnxTypeInfo::tensor alanı değerlerle doldurulur, diğer alanlar (harita ve sekans) tanımlanmaz.

Üç OnnxTypeInfo türünden (ONNX_TYPE_TENSOR, ONNX_TYPE_MAP veya ONNX_TYPE_SEQUENCE) yalnızca biri girdi olarak kullanılabilir. Türe bağlı olarak ilgili altyapı (OnnxTypeInfo::tensor, OnnxTypeInfo::map veya OnnxTypeInfo::sequence) doldurulur.

 

OnnxTensorTypeInfo

Yapı, ONNX modelinin girdi veya çıktı parametresindeki tensörü tanımlar.

struct OnnxTensorTypeInfo
 {
  const ENUM_ONNX_DATA_TYPE  data_type;      // tensördeki veri türü
  const long                 dimensions[];   // tensördeki eleman sayısı
 };

OnnxMapTypeInfo #

Yapı, ONNX modelinin çıktı parametresinde elde edilen haritayı tanımlar.

struct OnnxMapTypeInfo
 {
  const ENUM_ONNX_DATA_TYPE   key_type;      // anahtar türü
  const OnnxTypeInfo&         value_type;    // değer türü
 };

OnnxSequenceTypeInfo #

Yapı, ONNX modelinin çıktı parametresinde elde edilen sekansı tanımlar.

struct OnnxSequenceTypeInfo
 {
  const OnnxTypeInfo        value_type;     // sekanstaki veri türü
 };

 

 

ENUM_ONNX_TYPE #

ENUM_ONNX_TYPE numaralandırması, model parametresinin türünü tanımlar.

Kimlik

Açıklama

ONNX_TYPE_UNKNOWN

Bilinmeyen

ONNX_TYPE_TENSOR

Tensör

ONNX_TYPE_SEQUENCE

Sekans

ONNX_TYPE_MAP

Harita

ONNX_TYPE_OPAQUE

Soyut (opak)

ONNX_TYPE_SPARSETENSOR

Seyrek tensör

ENUM_ONNX_DATA_TYPE #

ENUM_ONNX_DATA_TYPE numaralandırması, kullanılan veri türünü tanımlar.

Kimlik

Açıklama

ONNX_DATA_TYPE_UNDEFINED

Tanımsız

ONNX_DATA_TYPE_FLOAT

float

ONNX_DATA_TYPE_INT8

8-bit int

ONNX_DATA_TYPE_UINT16

16-bit uint

ONNX_DATA_TYPE_INT16

16-bit int

ONNX_DATA_TYPE_INT32

32-bit int

ONNX_DATA_TYPE_INT64

64-bit int

ONNX_DATA_TYPE_STRING

string

ONNX_DATA_TYPE_BOOL

bool

ONNX_DATA_TYPE_FLOAT16

16-bit float

ONNX_DATA_TYPE_DOUBLE

double

ONNX_DATA_TYPE_UINT32

32-bit uint

ONNX_DATA_TYPE_UINT64

64-bit uint

ONNX_DATA_TYPE_COMPLEX64

64-bit complex

ONNX_DATA_TYPE_COMPLEX128

128-bit complex

ONNX_DATA_TYPE_BFLOAT16

16-bit bfloat (Brain Floating Point)

ENUM_ONNX_FLAGS #

ENUM_ONNX_FLAGS numaralandırması model çalışma modunu tanımlar.

Kimlik

Açıklama

ONNX_LOGLEVEL_VERBOSE

Tüm mesajları günlüğe yazdırır

ONNX_LOGLEVEL_INFO

Bilgi mesajlarını, uyarıları ve hataları günlüğe yazdırır (bu bayrak ONNX_DEBUG_LOGS'un yerini alır)

ONNX_LOGLEVEL_WARNING

Uyarıları ve hataları günlüğe yazdırır (varsayılan)

ONNX_LOGLEVEL_ERROR

Yalnızca hataları günlüğe yazdırır

ONNX_NO_CONVERSION

Otomatik dönüştürmeyi devre dışı bırakır, kullanıcı verilerini olduğu gibi kullanır

ONNX_COMMON_FOLDER  

Common\Files klasöründen model dosyası yükler; değer FILE_COMMON bayrağına eşittir

ONNX_USE_CPU_ONLY

ONNX modelini yalnızca CPU kullanarak yürütür

ONNX_GPU_DEVICE_0

İndeksi 0 olan CUDA cihazı (varsayılan)

ONNX_GPU_DEVICE_1

İndeksi 1 olan CUDA cihazı *

ONNX_GPU_DEVICE_2

İndeksi 2 olan CUDA cihazı *

ONNX_GPU_DEVICE_3

İndeksi 3 olan CUDA cihazı *

ONNX_GPU_DEVICE_4

İndeksi 4 olan CUDA cihazı *

ONNX_GPU_DEVICE_5

İndeksi 5 olan CUDA cihazı *

ONNX_GPU_DEVICE_6

İndeksi 6 olan CUDA cihazı *

ONNX_GPU_DEVICE_7

İndeksi 7 olan CUDA cihazı *

ONNX_ENABLE_PROFILING

ONNX model profillemeyi etkinleştirir

* ONNX_GPU_DEVICE_N biçimindeki bayraklar, iki veya daha fazla CUDA özellikli GPU'ya sahip sistemlerde kullanılmalıdır. Birden fazla GPU seçim bayrağı belirtilirse, en düşük indekse sahip cihaz kullanılır.

Var olmayan bir cihaz indeksi belirtilirse, GPU otomatik olarak seçilecektir.

 

ONNX profilleme

ONNX_ENABLE_PROFILING bayrağı, ONNX model çalışmasının profillenmesini sağlar. Bu bayrak ayarlandığında, <veri_klasörü>/MQL5/Files/OnnxProfileReports dizininde <modül_adı>_tarih_saat.json adlı bir dosya oluşturulur.

Burada <modül_adı> MQL programı EX5 dosyasının adıdır.

Dosya, JSON formatında ayrıntılı bir ONNX model çalışması profilleme raporu içerir:

  • Oturum yükleme ve başlatma zamanı;
  • Bireysel grafik düğümlerinin (Conv, Relu, MaxPool, Gemm vb.) yürütme zamanı;
  • Kullanılan yürütme sağlayıcısı (örneğin, CUDAExecutionProvider);
  • Girdi ve çıktı tensör büyüklüğü bilgileri;
  • İş parçacığı zamanlama istatistikleri.

 

Profilleme raporu verilerine bir örnek:

{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :698,"ts" :11,"ph" : "X","name" :"model_loading_array","args" : {}},
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :15496,"ts" :869,"ph" : "X","name" :"session_initialization","args" : {}},
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :66055,"ts" :16800,"ph" : "X","name" :"Convolution28_kernel_time","args" : {"parameter_size" : "832","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,1,28,28]},{"float
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :775,"ts" :82867,"ph" : "X","name" :"ReLU32_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,8,28,28]}],"node_index" : "3
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :8818,"ts" :83647,"ph" : "X","name" :"Pooling66_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,8,28,28]}],"node_inde
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :1120,"ts" :92476,"ph" : "X","name" :"Convolution110_kernel_time","args" : {"parameter_size" : "12864","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,8,14,14]},{"flo
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :23,"ts" :93603,"ph" : "X","name" :"ReLU114_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,16,14,14]}],"node_index" : "
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :21,"ts" :93629,"ph" : "X","name" :"Pooling160_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,16,14,14]}],"node_inde
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :16,"ts" :93654,"ph" : "X","name" :"Times212_reshape0_kernel_time","args" : {"parameter_size" : "16","provider" : "CUDAExecutionProvider","op_name" : "Reshape","input_type_shape" : [{"float":[1,16,4,4]},{"int
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :32264,"ts" :93673,"ph" : "X","name" :"Times212/MatMulAddFusion_kernel_time","args" : {"parameter_size" : "10280","provider" : "CUDAExecutionProvider","op_name" : "Gemm","input_type_shape" : [{"float":[1,256]
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :109165,"ts" :16794,"ph" : "X","name" :"SequentialExecutor::Execute","args" : {}},
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :109600,"ts" :16433,"ph" : "X","name" :"model_run","args" : {}},
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :87,"ts" :126313,"ph" : "X","name" :"Convolution28_kernel_time","args" : {"parameter_size" : "832","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,1,28,28]},{"float":
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :23,"ts" :126403,"ph" : "X","name" :"ReLU32_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,8,28,28]}],"node_index" : "3
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :31,"ts" :126431,"ph" : "X","name" :"Pooling66_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,8,28,28]}],"node_index
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :35,"ts" :126466,"ph" : "X","name" :"Convolution110_kernel_time","args" : {"parameter_size" : "12864","provider" : "CUDAExecutionProvider","op_name" : "Conv","input_type_shape" : [{"float":[1,8,14,14]},{"floa
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :15,"ts" :126505,"ph" : "X","name" :"ReLU114_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "Relu","input_type_shape" : [{"float":[1,16,14,14]}],"node_index" : 
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :22,"ts" :126523,"ph" : "X","name" :"Pooling160_kernel_time","args" : {"parameter_size" : "0","provider" : "CUDAExecutionProvider","op_name" : "MaxPool","input_type_shape" : [{"float":[1,16,14,14]}],"node_ind
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :12,"ts" :126548,"ph" : "X","name" :"Times212_reshape0_kernel_time","args" : {"parameter_size" : "16","provider" : "CUDAExecutionProvider","op_name" : "Reshape","input_type_shape" : [{"float":[1,16,4,4]},{"in
{"cat" : "Node","pid" :34368,"tid" :39520,"dur" :40,"ts" :126562,"ph" : "X","name" :"Times212/MatMulAddFusion_kernel_time","args" : {"parameter_size" : "10280","provider" : "CUDAExecutionProvider","op_name" : "Gemm","input_type_shape" : [{"float":[1,256]},

 

ONNX profilleme hakkında daha fazla bilgiye şu linkten ulaşabilirsiniz: https://onnxruntime.ai/docs/performance/tune-performance/profiling-tools.html

 

ONNX modelleriyle çalışırken dizi dönüştürme

Makine öğrenimi görevleri her zaman daha yüksek hesaplama doğruluğu gerektirmez. Hesaplamaları hızlandırmak için bazı modeller Float16 ve hatta Float8 gibi daha düşük hassasiyetli veri türleri kullanır. Kullanıcıların ilgili verileri modellere girebilmelerini sağlamak için MQL5, standart MQL5 türlerini özel FP16 ve FP8 türlerine dönüştüren dört özel fonksiyon sağlar.

Fonksiyon

Eylem

ArrayToFP16

float veya double türündeki bir diziyi istenilen formatta ushort türünde bir diziye kopyalar

ArrayToFP8

float veya double türündeki bir diziyi istenilen formatta uchar türünde bir diziye kopyalar

ArrayFromFP16

ushort türündeki bir diziyi istenilen formatta float veya double türünde bir diziye kopyalar

ArrayFromFP8

uchar türündeki bir diziyi istenilen formatta float veya double türünde bir diziye kopyalar

Bu dizi dönüştürme fonksiyonları aşağıdaki numaralandırmalarda belirtilen özel formatları kullanır.

ENUM_FLOAT16_FORMAT #

ENUM_FLOAT16_FORMAT numaralandırması iki FP16 format türü tanımlar.

Kimlik

Açıklama

FLOAT_FP16

Half olarak da bilinen standart 16 bit format

FLOAT_BFP16

Özel brain float point formatı

Bu formatların her birinin avantajları ve sınırlamaları vardır. FLOAT16 daha yüksek doğruluk sağlar ancak daha fazla depolama ve hesaplama kaynağı gerektirir. BFLOAT16 ise veri işlemede daha yüksek performans ve verimlilik sağlar, ancak daha az doğruluk sergileyebilir.

ENUM_FLOAT8_FORMAT #

ENUM_FLOAT8_FORMAT numaralandırması dört FP8 format türü tanımlar.

FP8 (8-bit floating point), ondalıklı sayıları temsil etmek için kullanılan veri türlerinden biridir. FP8'de her sayı 8 veri biti ile temsil edilir ve tipik olarak üç bileşene ayrılır: işaret, üs ve mantis. Bu format, doğruluk ve depolama verimliliği arasında bir denge sunarak bellek ve hesaplama verimliliği gerektiren uygulamalar için ideal hale gelir.  

Kimlik

Açıklama

FLOAT_FP8_E4M3FN

8 bit ondalıklı sayı, üs için 4 bit ve mantis için 3 bit. Genellikle katsayı olarak kullanılır.

FLOAT_FP8_E4M3FNUZ

8 bit ondalıklı sayı, üs için 4 bit ve mantis için 3 bit. NaN'ı destekler, negatif sıfır ve Inf'i desteklemez. Genellikle katsayı olarak kullanılır.

FLOAT_FP8_E5M2FN

8 bit ondalıklı sayı, üs için 5 bit ve mantis için 2 bit. NaN ve Inf'i destekler. Genellikle gradyanlar için kullanılır.

FLOAT_FP8_E5M2FNUZ

8 bit ondalıklı sayı, üs için 5 bit ve mantis için 2 bit. NaN'ı destekler, negatif sıfır ve Inf'i desteklemez. Genellikle gradyanlar için kullanılır.

FP8'in en önemli avantajlarından biri, büyük veri kümelerini işlemedeki verimliliğidir. FP8, kompakt sayı temsili kullanarak bellek gereksinimlerini azaltır ve hesaplamaları hızlandırır. Bu, özellikle genellikle büyük veri kümelerini işleyen makine öğrenimi ve yapay zeka uygulamalarında önemlidir.