Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 3298|Ответ: 0

Двойная точность (FP64), Одинарная точность (P32, TF32), Полуточность (FP16, BF16)

[Скопировать ссылку]
Опубликовано 2025-3-10 14:22:34 | | | |
Обучение и рассуждение больших моделей часто связаны с понятием точности, существует множество типов, которые также делятся на разные форматы при одинаковом уровне точности. Кроме того, существуют концепции многоточной и смешанной точности в практических сценариях.

Распространённая точность

Точность с плавающей запятой: двойная точность (FP64), одинарная (FP32, TF32), половинная точность (FP16, BF16), 8-битная точность (FP8), 4-битная точность (FP4, NF4)
Точность количественной оценки: INT8, INT4 (также INT3/INT5/INT6)

Число с плавающей запятой состоит из трёх частей: знака, экспоненциального и битов мантиссы. Чем больше экспоненциальный бит, тем шире диапазон чисел, которые можно представить. Чем больше цифра мантиссы, тем выше точность числа.



Таблица резюмирует это следующим образом

форматБит символаЭкспоненциальный битдесятичный разрядОбщее количество цифр
FP641115264
FP32182332
TF32181019
BF1618716
FP16151016
FP8 E4M31438
FP8 E5M21528
FP41214


FP32: 32-битное число с плавающей запятой, 4 байта на данные
TF32: 19-битное число с плавающей точкой, каждое число — 2 байта
FP16: 16-битное число с плавающей точкой, 2 байта на каждый данный
BF16: 16-битное число с плавающей запятой, каждое число — 2 байта
Int8: 8-битное целое число, каждое число данных составляет 1 байт
Int4: 4-битные целые числа, каждое из них имеет размер 0,5 байта

Почему такая точность

Из-за стоимости и точности. Мы все знаем, что высокая точность определённо более точна, но при этом она приведёт к более высоким затратам на вычисления и хранение. Низкая точность снижает точность вычислений, но может повысить вычислительную эффективность и производительность. Поэтому разнообразие точности позволяет выбрать наиболее подходящий вариант в разных ситуациях.
Двойная точность точнее, чем выражение с одинарной точностью, но занимает вдвое больше памяти и требует больше времени на вычисление.

Почему крупные модели нужно количественно оценивать?

1. Сократить использование памяти
Крупные модели обычно используют 32-битные числа с плавающей запятой (FP32) или 16-битные числа с плавающей запятой (FP16) для представления весов и активационных значений. Путём квантизации эти высокоточные значения могут быть преобразованы в представления с меньшей точностью (например, 8-битные целые числа, INT8), значительно уменьшая объём памяти модели. Это важно для развертывания на устройствах с ограниченными ресурсами, таких как мобильные устройства, встроенные системы и т.д.

2. Ускорить рассуждение
Квантизированные модели могут работать эффективнее на аппаратном обеспечении. Многие современные аппаратные устройства (такие как GPU, TPU, NPU и др.) имеют специализированную поддержку оптимизации для низкоточных вычислений, что позволяет ускорять операции квантования. Кроме того, низкоточные вычисления часто требуют меньше битовых операций, что снижает вычислительную сложность и, следовательно, ускоряет вывод.

3. Снизить энергопотребление
Квантизированная модель не только снижает потребность в вычислительных ресурсах, но и снижает энергопотребление. Это особенно важно для устройств на батарейках, таких как смартфоны, IoT-устройства и др., где низкое энергопотребление означает более длительный срок службы батареи.

4. Простые в развертывании edge-устройства
Многие крупные модели изначально обучались и внедрялись в облаке, но с развитием периферийных вычислений всё больше сценариев приложений требуют развертывания моделей на периферийных устройствах. При ограниченных вычислительных мощностях и ресурсах хранения на периферийных устройствах квантование может помочь этим моделям работать более эффективно на периферийных устройствах.

5. Снижение требований к пропускной способности
В процессе распределённого вывода или обновления модели квантование может уменьшить пропускную способность, необходимую для передачи моделей. Это полезно для сред с ограниченной пропускной способностью, например, для устройств IoT в удалённых районах.

6. Поддерживать производительность модели
Хотя квантование приводит к определённой потере точности, исходная производительность модели в значительной степени сохраняется с помощью соответствующих методов квантования (таких как квантование смешанной точности, квантование после обучения, обучение количественному восприятию и др.). Таким образом, на практике количественная оценка может обеспечить хороший баланс между производительностью и эффективностью.

Справочник памяти

типКаждый миллиард параметров должен занимать память
float324G
FP16/BF162G
int81G
int40,5G


FP64 (Двойная точность)

64-битный формат с плавающей запятой, обычно двойной точности с бинарным форматом с плавающей точкой, определённый IEEE 754, обладает:

Однозначный символ
11-значный индекс
52 знака после запятой



Дальность: ~2.23e-308 ... ~1.80e308 с полной точностью 15-17.

Употребление:

Этот формат используется для научных расчётов, требующих высокой точности.
Обычно он не используется для вычислений в области глубокого обучения.
Поддержка программного обеспечения:
Представляет двойной тип на большинстве систем C/C++.
Поддерживается в TensorFlow (например, tf.float64) / PyTorch (например, torch.float64 или torch.double).
Аппаратная поддержка:
Обычно поддерживается в процессорах x86.
Большинство видеокарт, особенно игровых, включая серию RTX, сильно ограничены по производительности FP64 (обычно 1/32 производительности FP32 вместо 1/2).
Недавние неограниченные видеокарты с поддержкой FP64 включают GP100/100/102/104 в Tesla P40/P4 и Quadro GP100, GV100 в Tesla V100/Quadro GV100/Titan V, а также недавно анонсированный GA100 в версии A100 (интересно, что новая архитектура Ampere имеет третье поколение) по сравнению с ядрами Tensor с поддержкой FP64 Теперь включена новая процессорная система FP64, совместимая с требованиями IEEE, которая обеспечивает производительность FP64 в 2,5 раза выше, чем V100.

FP32 (полная точность)

Этот формат давно является рабочей лошадкой для глубокого обучения. Другой формат IEEE 754, с одной точностью с плавающей точкой, имеет следующие методы:

Однозначный символ
8-значный индекс
23 знака после запятой
В идеале в FP32 должны выполняться и тренировки, и выводы, но FP32 вдвое медленнее FP16/BF16, поэтому на практике часто применяются методы смешанной точности, где веса FP32 используются как точный «главный вес», веса FP16/BF16 применяются для расчёта прямого и обратного распространения с целью повышения скорости обучения, и, наконец, суверенные веса FP32 обновляются градиентами FP16/BF16 на этапе обновления градиента.

Во время тренировок суверенный вес всегда составляет FP32. На практике веса с половинной точностью часто обеспечивают такую же точность, как и FP32 при выводе — поскольку точные веса FP32 нужны только при обновлении градиента модели. Это означает, что при выводе можно использовать веса с половинной точностью, то есть получить тот же результат с половиной памяти GPU.



Дальность: ~1.18e-38 ... ~3.40e38 с точностью 6-9 значимых десятичных.

Употребление:

Стандартный тип нейронных вычислений долгое время. Веса, активации и другие значения в нейронных сетях давно по умолчанию установлены на FP32.
Для многих научных расчётов, особенно итеративных, точности недостаточно, что приводит к накоплению ошибок.
Поддержка программного обеспечения:
Представляет тип float в большинстве систем C/C++.
Поддерживается в TensorFlow (например, tf.float32) / PyTorch (например, torch.float32 или torch.float).
Аппаратная поддержка:
Обычно поддерживается в процессорах x86.
Обычно поддерживается NVIDIA/AMD GPU.

FP16 (Половинная точность)

Аналогично, стандартный формат IEEE 754, формат с плавающей запятой с половинной точностью, имеет следующее:

Однозначный символ
5-значный индекс
10 знаков после запятой
Номер FP16 имеет гораздо меньший числовой диапазон, чем FP32. Таким образом, FP16 подвержен риску переполнения (когда используется для обозначения очень больших чисел) и недостаточного переполнения (при представлении очень малых чисел). Например, если вы делаете 10k * 10k, конечный результат должен быть 100M, что FP16 не может представить, потому что максимальное число FP16 — 64k. В итоге в нейронных сетевых расчетах получается NaN (не число), потому что вычисления выполняются в слоевом и пакетном порядке, и как только появляется NaN, все предыдущие вычисления уничтожаются. В целом, это можно компенсировать масштабированием потерь, но этот подход не всегда работает.



Дальность: ~5.96e−8 (6.10e−5) ... 65504, с точностью 4 значимых десятичных цифр.

Употребление:

Глубокое обучение обычно использует FP16 вместо FP32, так как вычисления с низкой точностью, похоже, не имеют значения для нейронных сетей. Дополнительная точность ничего не даёт, и при этом она медленнее, требует больше памяти и замедляет коммуникацию.
Может использоваться для тренировок, обычно с использованием смешанной точности (TensorFlow/PyTorch).
Может использоваться для квантования после обучения с целью ускорения вывода (TensorFlow Lite). Другие форматы, используемые для квантования после обучения, включают целые числа INT8 (8-битные целые числа), INT4 (4-битные) и даже INT1 (бинарные значения).
Поддержка программного обеспечения:
В настоящее время это не входит в стандарт C/C++ (но есть короткое предложение по плавающей платформе). Некоторые системы C/C++ поддерживают __fp16 типы. В противном случае его можно использовать с помощью специальных библиотек.
Поддерживается в TensorFlow (например, tf.float16) / PyTorch (например, torch.float16 или torch.half).
Аппаратная поддержка:
x86-процессоры не поддерживаются (как уникальный тип).
Поддержка старых игровых видеокарт слабая (производительность 32/1 для FP64, подробности см. пост о видеокартах). В настоящее время он хорошо поддерживается на современных видеокартах, таких как серия NVIDIA RTX.

BFLOAT16 (Полуточность)

Другой 16-битный формат, изначально разработанный Google, называется «Brain Floating Point Format» или сокращённо «bfloat16». Название происходит от Google Brain.

Оригинальный IEEE FP16 был разработан без учёта приложений для глубокого обучения, и его динамический диапазон был слишком узким. BFLOAT16 решает эту проблему, обеспечивая тот же динамический диапазон, что и FP32.

Следовательно, BFLOAT16 имею:

Однозначный символ
8-значный индекс
7 знаков после запятой



Формат bfloat16 урезан до IEEE 754 FP32, что позволяет быстро конвертировать IEEE 754 FP32 и обратно. При конвертации в формат bfloat16 сохраняются экспоненциальные биты, а поля мантиссы можно уменьшить с помощью усечения.



Диапазон: ~1.18e-38 ... ~3.40e38 с тремя значимыми десятичными знаками.
Употребление:

Теперь, похоже, он заменяет FP16. В отличие от FP16, которая часто требует специальной обработки с помощью таких методов, как масштабирование потерь, BF16 практически является прямой заменой FP32 при обучении и работе с глубокими нейронными сетями.
Поддержка программного обеспечения:
Не в стандарте C/C++. Можно использовать со специальными библиотеками.
Поддерживается в TensorFlow (например, tf.bfloat16) / PyTorch (например, torch.bfloat16).

TF32

TensorFloat-32 или TF32 — это новый математический режим в видеокартах NVIDIA A100.

Используя те же 10-битные мантиссы, что и в математике с половинной точностью (FP16), TF32 доказывает, что обладает достаточным запасом для выполнения требований к точности задач ИИ. А TF32 использует тот же 8-битный индекс, что и FP32, поэтому может поддерживать тот же числовой диапазон.

Технически это 19-битный формат. Думайте об этом как о расширенном BFLOAT16 точности, например, в «BFLOAT19», или как о снижении точности, как в FP32.

Итак, в TF32 есть:

Однозначный символ
8-значный индекс
10 знаков после запятой
Преимущество TF32 в том, что он имеет тот же формат, что и FP32. При вычислении второго произведения с TF32 мантисса входного операнда округляется с 23 до 10 бит. Операнды округления умножаются точно и накапливаются в нормальном FP32.

Тензорное ядро TF32 работает на входах FP32 и генерирует результаты FP32 без изменений кода. Нематричные операции продолжают использовать FP32. Это обеспечивает простой способ ускорить обработку данных ввода/вывода FP32 в фреймворках глубокого обучения и HPC.

Дальность: ~1.18e-38 ... ~3.40e38 с точностью 4 значимых знака после запятой.
Употребление:

Одно из замечательных преимуществ TF32 — поддержка компилятора только на самом глубоком уровне, то есть внутри компилятора CUDA. Остальная часть кода просто видит FP32 с меньшей точностью, но с тем же динамическим диапазоном. Использование TF32 в основном направлено на вызовы в библиотеку, чтобы проверить, работает ли она корректно. Наличие TF32 позволяет быстро устанавливать плагины, используя скорость тензорных ядер без особых усилий.
Форматы вроде FP16 и BFLOAT16 требуют дополнительных доработок, так как они включают разные расположения битов. Но использование этих форматов снижает пропускную способность памяти, что позволяет быстрее выполнять.
Для сравнения, пиковые характеристики A100 следующие:

FP32 без тензорных ядер: 19,5 TFLOPS
Тензорные ядра TF32: 156 TFLOPS (поэтому использование TF32 вместо FP32 облегчает увеличение скорости).
Тензорные ядра FP16/BF16: 312 TFLOPS (поэтому разумный переход на FP16/BF16 может дать больше скорости, но за более высокие затраты).
Поддержка программного обеспечения:
Не в стандарте C/C++.
Поддерживается CUDA 11.
Аппаратная поддержка:
GPU: NVIDIA A100 — первая модель, поддерживаемая

FP8

Введённый GPU H100, он обеспечивает большее умножение и свёртку матриц, но с меньшей точностью.

Типы данных FP100, поддерживаемые H8, на самом деле представляют собой два разных типа данных, которые могут использоваться для различных частей обучения нейронных сетей:

E4M3 — состоит из 1 символического бита, 4 экспоненциальных битов и 3 десятичных знаков. Он может хранить до +/-448 и NAN.
E5M2 — состоит из 1 знакового бита, 5 экспоненциальных битов и 2 десятичных знаков. Он может хранить значения до +/-57344, +/-inf и nan. Компромисс при увеличении динамического диапазона заключается в том, что хранящиеся значения становятся менее точными.



Структура типов данных с плавающей точкой. Все отображаемые значения (в FP16, BF16, FP8 E4M3 и FP8 E5M2) являются ближайшим отображением значения 0,3952.

Оба типа могут использоваться при обучении нейронных сетей. В целом, прямая активация и утяжеления требуют более высокой точности, поэтому лучше использовать тип данных E4M3 при прямом проходе. Однако при обратном распространении градиент, проходящий через сеть, обычно менее подвержен потере точности, но требует большего динамического диапазона. Поэтому лучше хранить их в формате данных E5M2. H100 TensorCore поддерживает любую комбинацию этих типов в качестве входных данных, позволяя хранить каждый тензор с его желаемой точностью.

Ссылка:

Вход по гиперссылке виден.
Вход по гиперссылке виден.




Предыдущий:Сеть — устройства под основным маршрутом и подмаршрутом соединены между собой
Следующий:[ИИ] (10) LLM, большая модель, вывод GPU, память, оценка VRAM
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com