Обсуждение статьи "Работа с ONNX-моделями в форматах float16 и float8"

 

Опубликована статья Работа с ONNX-моделями в форматах float16 и float8:

Форматы данных, используемые для представления моделей машинного обучения, играют ключевую роль в их эффективности. В последние годы появилось несколько новых типов данных, разработанных специально для работы с моделями глубокого обучения. В данной статье мы обратим внимание на два новых формата данных, которые стали широко применяться в современных моделях.

В данной статье мы сосредоточимся на двух таких новых форматах данных — float16 и float8, которые начинают активно использоваться в современных ONNX-моделях. Эти форматы представляют собой альтернативные варианты более точных, но требовательных к ресурсам форматам даннных с плавающей точкой. Они обеспечивают оптимальное сочетание производительности и точности, что делает их особенно привлекательными для различных задач машинного обучения. Мы изучим основные характеристики и преимущества форматов float16 и float8, а также представим функции для их преобразования в стандартные float и double.

Это поможет разработчикам и исследователям лучше понять, как эффективно использовать эти форматы в своих проектах и моделях. В качестве примера мы рассмотрим работу ONNX-модели ESRGAN, которая применяется для улучшения качества изображений.

Автор: MetaQuotes

 
 Рис.16. Сравнение результатов работы модели ESRGAN для float и float16
Просьба добавить справа еще одну картинку того же размера - увеличенная в четыре раза (вместо одного пикселя - четыре (2x2) таких же по цвету) оригинальная картинка.
 
fxsaber #:
Просьба добавить справа еще одну картинку того же размера - увеличенная в четыре раза (вместо одного пикселя - четыре (2x2) таких же по цвету) оригинальная картинка.

Lenna-ESRGAN-ESRGAN_float and original 4-x-scaled

Для ее вывода можно заменить код:

   //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);
//+------------------------------------------------------------------+
//| ShowImage4                                                        |
//+------------------------------------------------------------------+
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);
//--- prepare canvas
   canvas.CreateBitmapLabel(name,x0,y0,4*image_width,4*image_height,COLOR_FORMAT_XRGB_NOALPHA);
//--- copy image to canvas
   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);
         }
//--- ready to draw
   canvas.Update(true);
   return(true);
  }
 
Quantum #:

Для ее вывода можно заменить код:

Спасибо! Уменьшил в два раза по каждой координате, получив правое изображение, как оригинальное.

Думал, что float16/32 при таком преобразовании станут близкими к оригиналу. Но и они заметно лучше! Т.е. UpScale+DownScale >> Original.


ЗЫ Удивили. Похоже, все старые снимки/видео целесообразно прогонять через подобную 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.
Круто! Но не для трейдинга и работы с котировками.

Причина обращения: