文章 "在 ONNX 模型中使用 float16 和 float8 格式"

 

新文章 在 ONNX 模型中使用 float16 和 float8 格式已发布:

用于表示机器学习模型的数据格式对其有效性起着至关重要的作用。近年来,出现了几种新类型的数据,专门为使用深度学习模型而设计。在本文中,我们将重点介绍两种新的数据格式,它们已在现代模型中广泛采用。

在本文中,我们将重点介绍两种新的数据格式float16和float8,它们正开始在现代ONNX模型中积极使用。这些格式代表了更精确但资源密集型浮点数据格式的替代选项。它们提供了性能和准确性之间的最佳平衡,使其对各种机器学习任务特别有吸引力。我们将探讨float16和float8格式的关键特性和优势,并介绍将它们转换为标准float和double格式的函数。


这将帮助开发人员和研究人员更好地了解如何在他们的项目和模型中有效地使用这些格式。例如,我们将探讨用于图像质量增强的ESRGAN ONNX模型的操作。

作者:MetaQuotes

 
<img width="750" height="469" src="https://c.mql5.com/2/70/lenna-ESRGAN-compare__1.png" loading="lazy" title=""图 16.浮标和浮标 16 的 ESRGAN 模型结果比较" alt="" 图 16.float 和 float16 的 ESRGAN 模型结果比较"/translate="no">
请在右侧再添加一张相同大小的图片--将原图放大四倍(而不是一个像素--四张(2x2)相同颜色的图片)。
 
fxsaber #:
请在右侧添加另一张相同大小的图片--原图片的四倍(而不是一个像素--四个(2x2)相同颜色的像素)。

Lenna-ESRGAN-ESRGAN_float 和原始的 4-x 比例

您可以替换代码来显示它:

   //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);
//+------------------------------------------------------------------+
//| 显示图像4|
//+------------------------------------------------------------------+
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);
//--- 准备画布
   canvas.CreateBitmapLabel(name,x0,y0,4*image_width,4*image_height,COLOR_FORMAT_XRGB_NOALPHA);
//--- 将图像复制到画布上
   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);
         }
//--- 准备绘制
   canvas.Update(true);
   return(true);
  }
 
Quantum #:

您可以替换代码进行输出:

谢谢!每个坐标都缩小了 2 倍,得到的图像与原始图像相同。

我原以为浮点 16/32 经过这样的转换后会变得接近原图。但它们的效果明显更好!即:UpScale+DownScale >> Original。


ZY 很惊讶。通过这种 onnx 模型运行所有旧图像/视频似乎是合理的。

 

如果给 onnx 模型输入相同的数据,输出是否总是相同的?

onnx 模型中是否存在随机因素?

 
fxsaber #:

如果输入相同的数据,onnx 模型的输出结果总是相同的吗?

onnx 模型中是否存在随机因素?

一般来说,这取决于 ONNX 模型内部使用了哪些运算符。

对于该模型,结果应该是相同的,因为它包含确定性运算(共 1195 个运算符)

 

Описание 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


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

在这些示例中,浮点数以二进制表示。它们包括符号位、指数和尾数。

0 01111 0000000000 = +1 *215-15= 1
0 01111 0000000001 = +1.0000000001 2 *215-15=1+ 2-10= 1.0009765625(1 之后的下一个高位数)

也就是说,对于有 5 位小数的数字(大多数货币),在 1.00000 之后只能应用 1.00098。
酷!但不适用于交易和报价工作。