Discusión sobre el artículo "Trabajamos con modelos ONNX en formato float16 y float8"

 

Artículo publicado Trabajamos con modelos ONNX en formato float16 y float8:

Los formatos de datos usados para representar modelos de aprendizaje automático desempeñan un papel clave en su eficacia. En los últimos años, se han desarrollado varios tipos de datos nuevos específicamente para trabajar con modelos de aprendizaje profundo. En este artículo nos centraremos en dos nuevos formatos de datos que se han generalizado en los modelos modernos.

En este artículo, nos centraremos en dos de estos nuevos formatos de datos, float16 y float8, que están empezando a utilizarse activamente en los modelos ONNX modernos. Estos formatos suponen una alternativa a los formatos de datos con coma flotante, más precisos pero que consumen más recursos. Ofrecen una combinación óptima de rendimiento y precisión, lo cual los hace especialmente atractivos para diversas tareas de aprendizaje automático. Hoy estudiaremos las principales características y ventajas de los formatos float16 y float8, y presentaremos funciones para convertirlos en float y double estándar.



Esto ayudará a los desarrolladores e investigadores a comprender mejor cómo utilizar estos formatos de forma eficaz en sus proyectos y modelos. Como ejemplo, analizaremos el rendimiento del modelo ESRGAN de ONNX, que se utiliza para la mejora de imágenes.

Autor: MetaQuotes

 
<img width="750" height="469" src="https://c.mql5.com/2/70/lenna-ESRGAN-compare__1.png" loading="lazy" title=""Fig.16. Comparación de los resultados del modelo ESRGAN para float y float16" alt="" Fig.16. Comparación de los resultados del modelo ESRGAN para float y float16"/ translate="no">
.
Por favor, añada una imagen más del mismo tamaño a la derecha - la imagen original ampliada cuatro veces (en lugar de un píxel - cuatro (2x2) del mismo color).
 
fxsaber #:
Por favor, añada otra imagen del mismo tamaño a la derecha - cuadruplicado (en lugar de un píxel - cuatro (2x2) del mismo color) imagen original.

Lenna-ESRGAN-ESRGAN_float y original a escala 4x

Puede reemplazar el código para mostrarlo:

   //ShowImage(canvas_original, "original_image",new_image_width,0,image_width,image_height,image_data);
   ShowImage4(canvas_original,"original_image",new_image_width,0,image_width,image_height,image_data);
//+------------------------------------------------------------------+
//| MostrarImagen4|
//+------------------------------------------------------------------+
bool ShowImage4(CCanvas &canvas,const string name,const int x0,const int y0,const int image_width,const int image_height, const uint &image_data[])
  {
   if(ArraySize(image_data)==0 || name=="")
      return(false);
//--- preparar lienzo
   canvas.CreateBitmapLabel(name,x0,y0,4*image_width,4*image_height,COLOR_FORMAT_XRGB_NOALPHA);
//--- copiar imagen al lienzo
   for(int y=0; y<4*image_height-1; y++)
      for(int x=0; x<4*image_width-1; x++)
      {
         uint  clr =image_data[(y/4)*image_width+(x/4)];
         canvas.PixelSet(x,y,clr);
         }
//--- listo para dibujar
   canvas.Update(true);
   return(true);
  }
 
Quantum #:

Puede sustituir el código para darle salida:

¡Gracias! Reducido por un factor de dos en cada coordenada, obteniendo la imagen correcta como el original.

Pensé que float16/32 se acercaría al original con esta transformación. ¡Pero son notablemente mejores! Es decir, UpScale+DownScale >> Original.


ZY Sorprendido. Parece razonable pasar todas las imágenes/vídeos antiguos por este modelo onnx.

 

Si a la entrada del modelo onnx se le dan los mismos datos, ¿la salida será siempre la misma?

¿Existe algún elemento de aleatoriedad en el modelo onnx?

 
fxsaber #:

Si el modelo onnx recibe los mismos datos como entrada, ¿pero la salida tendrá siempre el mismo resultado?

¿Existe un elemento de aleatoriedad en el modelo onnx?

En general, depende de los operadores que se utilicen dentro del modelo ONNX.

Para este modelo el resultado debería ser el mismo, contiene operaciones deterministas (1195 en total)

 

Описание float16

https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%BE_%D0%BF%D0%BE%D0%BB%D0%BE%D0%B2%D0%B8%D0%BD%D0%BD%D0%BE%D0%B9_%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D0%B8


Примеры чисел половинной точности

En estos ejemplos, los números en coma flotante se representan en binario. Incluyen el bit de signo, el exponente y la mantisa.

0 01111 0000000000 = +1 *215-15 = 1
0 01111 0000000001 = +1.0000000001 2 *215-15=1+ 2-10 = 1.0009765625 (el número inmediatamente superior después de 1)

Es decir, para números con 5 decimales (la mayoría de las divisas) sólo se puede aplicar 1,00098 después de 1,00000.
¡Genial! Pero no para operar y trabajar con cotizaciones.