記事「float16およびfloat8形式のONNXモデルを扱う」についてのディスカッション

 

新しい記事「float16およびfloat8形式のONNXモデルを扱う」はパブリッシュされました:

機械学習モデルの表現に使用されるデータ形式は、その有効性に決定的な役割を果たします。近年、深層学習モデルを扱うために特別に設計された新しい型のデータがいくつか登場しています。この記事では、現代のモデルで広く採用されるようになった2つの新しいデータ形式に焦点を当てます。

この記事では、最新のONNXモデルで積極的に使われ始めているfloat16とfloat8という2つの新しいデータ形式に焦点を当てます。これらの形式は、より正確だがリソースを大量に消費する浮動小数点データ形式の代替オプションとなっています。また、パフォーマンスと精度の最適なバランスを提供し、さまざまな機械学習タスクに特に魅力的なものとなっています。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.floatとfloat16のESRGANモデル結果の比較" alt="" Fig.16.floatとfloat16のESRGANモデル結果の比較"/ translate="no">
.
右側に同じ大きさの写真をもう1枚追加してください。元の写真を4倍に拡大したものです(1ピクセルの代わりに、同じ色で4枚(2x2))。
 
fxsaber #:
右側に同じ大きさの別の画像を追加してください - 4倍(1ピクセルの代わりに、同じ色の4つ(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);
//+------------------------------------------------------------------+
| 画像を表示する|
//+------------------------------------------------------------------+
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分の1に縮小し、オリジナルと同じ画像を得る。

この変換でfloat16/32がオリジナルに近くなると思った。しかし、明らかに良くなっている!つまり、UpScale+DownScale >> オリジナル。


ZY 驚いた。すべての古い画像/動画をこのようなonnx-modelにかけるのは合理的だと思う。

 

onnx-modelの入力に同じデータが与えられた場合、出力は常に同じになるのでしょうか?

onnx-modelの中にランダムな要素はありますか?

 
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


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

これらの例では、浮動小数点数は2進数で表されます。符号ビット、指数、仮数を含む。

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だけである。
クールだ!しかし、取引や気配値での作業には使えません。