Перейти к содержимому

Глава 204: Квантование торговых моделей

1. Введение

В высокочастотной и алгоритмической торговле скорость инференса модели может определять разницу между захватом альфы и упущенной сделкой. Модели нейронных сетей, используемые для прогнозирования цен, генерации сигналов и оценки рисков, часто содержат миллионы параметров, хранящихся в виде 32-битных чисел с плавающей запятой. Хотя такая точность полезна при обучении, она создает значительные вычислительные накладные расходы при инференсе — накладные расходы, которые напрямую преобразуются в задержку.

Квантование — это процесс снижения числовой точности весов и активаций модели с высокоточных форматов (FP32) до представлений с пониженной точностью (FP16, INT8, INT4 или даже бинарных). Эта техника значительно уменьшает размер модели, требования к пропускной способности памяти и задержку инференса, сохраняя при этом большую часть предсказательной точности модели.

Для торговых приложений квантование обеспечивает несколько критических возможностей:

  • Развертывание на FPGA с целочисленной арифметикой для инференса за доли микросекунды
  • Мобильная и граничная торговля на устройствах с ограниченными ресурсами
  • Снижение пропускной способности памяти, позволяющее размещать более крупные ансамблевые модели в кэше
  • Снижение энергопотребления для серверов, расположенных рядом с биржей

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

2. Математические основы

2.1 Равномерное квантование

Равномерное квантование отображает непрерывный диапазон значений с плавающей запятой в конечный набор равномерно распределенных дискретных уровней. Для значения с плавающей запятой x квантованное значение x_q вычисляется как:

x_q = clamp(round(x / S + Z), q_min, q_max)

где:

  • Sмасштабный коэффициент (положительное вещественное число)
  • Zнулевая точка (целочисленное смещение)
  • q_min и q_max определяют диапазон квантованного представления
  • round() отображает в ближайшее целое число
  • clamp() ограничивает значения допустимым диапазоном

Для квантования INT8:

  • Без знака: q_min = 0, q_max = 255
  • Со знаком: q_min = -128, q_max = 127

Деквантование восстанавливает приближение исходного значения:

x_approx = S * (x_q - Z)

2.2 Вычисление масштаба и нулевой точки

Метод мин-макс

Простейший подход вычисляет масштаб и нулевую точку из наблюдаемого диапазона значений:

S = (x_max - x_min) / (q_max - q_min)
Z = q_min - round(x_min / S)

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

Перцентильный метод

Для повышения устойчивости к выбросам перцентильный метод обрезает диапазон:

x_min_clipped = percentile(x, p)
x_max_clipped = percentile(x, 100 - p)

где p обычно составляет от 0.1% до 1%. Значения за пределами этого диапазона обрезаются, жертвуя точностью выбросов ради лучшего разрешения большинства значений.

2.3 Симметричное и асимметричное квантование

Симметричное квантование устанавливает нулевую точку в ноль (Z = 0), отображая диапазон [-alpha, alpha], где alpha = max(|x_min|, |x_max|):

S = alpha / q_max
x_q = clamp(round(x / S), -q_max, q_max)

Это упрощает вычисления (нет смещения нулевой точки) и предпочтительно для весов, которые обычно центрированы около нуля.

Асимметричное квантование использует полный диапазон [q_min, q_max] с ненулевой нулевой точкой, что лучше захватывает асимметричные распределения, типичные для активаций (например, после ReLU, где все значения неотрицательны).

2.4 Поэлементное и поканальное квантование

Поэлементное квантование (per-tensor) использует единый масштаб и нулевую точку для всего тензора. Это просто, но неоптимально, когда разные каналы имеют существенно различные диапазоны значений.

Поканальное квантование (per-channel) вычисляет отдельные значения масштаба и нулевой точки для каждого выходного канала тензора весов. Это значительно улучшает точность с минимальными накладными расходами, поскольку параметры квантования вычисляются один раз и повторно используются при инференсе.

2.5 Анализ ошибки квантования

Ошибка квантования для одного значения ограничена половиной размера шага:

|error| <= S / 2

Для тензора мы измеряем качество квантования, используя:

Среднеквадратичная ошибка (MSE):

MSE = (1/n) * sum((x_i - x_approx_i)^2)

Отношение сигнал-шум (SNR):

SNR = 10 * log10(signal_power / noise_power)

где signal_power = mean(x^2) и noise_power = MSE.

Более высокий SNR указывает на лучшее качество квантования. Типичные целевые значения:

  • INT8: SNR > 30 дБ (отлично для большинства торговых моделей)
  • INT4: SNR > 15 дБ (приемлемо для менее чувствительных приложений)

2.6 Неравномерное квантование

Неравномерное квантование использует неравномерно распределенные уровни квантования, которые могут лучше соответствовать фактическому распределению значений. Распространенные подходы включают:

  • Логарифмическое квантование: Уровни распределены логарифмически, обеспечивая более высокое разрешение вблизи нуля, где значения весов плотные
  • K-средних квантование: Уровни квантования выбираются путем кластеризации значений весов
  • Обучаемое квантование: Размеры шагов оптимизируются во время обучения

Хотя неравномерное квантование может достичь лучшей точности, оно обычно требует таблиц поиска для деквантования, что делает его менее подходящим для FPGA и аппаратно-ускоренного инференса.

3. Типы квантования

3.1 Квантование после обучения (PTQ)

PTQ квантует предварительно обученную модель без повторного обучения. Это самый простой подход:

  1. Калибровка: Пропуск репрезентативного набора данных через модель для сбора статистики активаций (минимум, максимум или гистограммы)
  2. Вычисление параметров: Определение масштаба и нулевой точки для каждого слоя
  3. Квантование: Преобразование весов в целевую точность
  4. Валидация: Измерение деградации точности на тестовом наборе

PTQ быстро и требует минимум данных помимо небольшого калибровочного набора. Для квантования INT8 PTQ обычно сохраняет >99% точности FP32. Для INT4 деградация точности может быть более значительной.

Преимущества для торговли:

  • Быстрый оборот — квантование и развертывание за минуты
  • Не требуется инфраструктура для повторного обучения
  • Подходит для моделей, которые часто переобучаются на новых рыночных данных

3.2 Квантование с учетом обучения (QAT)

QAT имитирует квантование во время обучения, вставляя узлы «фиктивного квантования», которые округляют значения при прямом проходе, но пропускают градиенты через оценщик прямого прохождения (STE):

Прямой проход: x_q = quantize(x)
Обратный проход: d_loss/d_x = d_loss/d_x_q (градиент проходит без изменений)

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

Торговые соображения:

  • Более длительное время обучения (обычно 10-20% накладных расходов)
  • Должно быть интегрировано в конвейер обучения
  • Обеспечивает наилучшие результаты квантования INT4 и бинарного квантования

3.3 Динамическое и статическое квантование

Статическое квантование предварительно вычисляет параметры квантования активаций во время калибровки. Те же масштаб и нулевая точка используются для всех входных данных инференса.

Динамическое квантование вычисляет параметры квантования активаций во время выполнения для каждого входа. Это адаптируется к фактическому распределению данных, но добавляет вычислительные накладные расходы.

Для торговых моделей выбор зависит от варианта использования:

  • Статическое: Предпочтительно для развертывания на FPGA и критичных к задержке путей, где распределение входных данных стабильно
  • Динамическое: Лучше для моделей, обрабатывающих разнообразные рыночные режимы, где распределения активаций значительно смещаются

4. Уровни точности

4.1 FP32 (32-битная с плавающей запятой)

  • Размер: 4 байта на параметр
  • Диапазон: +/-3.4e38 с ~7 десятичными знаками точности
  • Применение: Обучение, эталонный инференс
  • Заметки для торговли: Стандартная точность обучения; слишком медленно для продакшн HFT

4.2 FP16 (16-битная с плавающей запятой)

  • Размер: 2 байта на параметр (сжатие 2x)
  • Диапазон: +/-65504 с ~3.3 десятичными знаками точности
  • Ускорение: 1.5-2x на GPU с Tensor Cores
  • Заметки для торговли: Хороший баланс для инференса на GPU; нативная поддержка на современных GPU

4.3 INT8 (8-битное целое)

  • Размер: 1 байт на параметр (сжатие 4x)
  • Диапазон: от -128 до 127 (со знаком) или от 0 до 255 (без знака)
  • Ускорение: 2-4x по сравнению с FP32; отлично на CPU и FPGA
  • Точность: Обычно <1% деградации при PTQ
  • Заметки для торговли: Оптимальная точка для большинства торговых приложений. Подходит для FPGA, эффективен на CPU, минимальная потеря точности

4.4 INT4 (4-битное целое)

  • Размер: 0.5 байта на параметр (сжатие 8x)
  • Диапазон: от -8 до 7 (со знаком) или от 0 до 15 (без знака)
  • Ускорение: 4-8x по сравнению с FP32
  • Точность: Деградация 1-5%; настоятельно рекомендуется QAT
  • Заметки для торговли: Полезно для ансамблевых моделей, где память является узким местом; приемлемо для генерации сигналов, где точная величина менее важна

4.5 Бинарное (1-битное)

  • Размер: 0.125 байта на параметр (сжатие 32x)
  • Значения: -1 или +1
  • Операции: XNOR и popcount заменяют умножение-сложение
  • Точность: Значительная деградация (10-30%)
  • Заметки для торговли: Экспериментально; потенциально полезно для задач бинарной классификации (сигналы покупки/продажи), где скорость важнее точности

Сводная таблица сравнения точности

ТочностьРазмер/параметрСжатиеТипичная потеря точностиЛучше для
FP324 байта1x0% (базовая)Обучение
FP162 байта2x<0.1%Инференс на GPU
INT81 байт4x<1%FPGA, инференс на CPU
INT40.5 байта8x1-5%Ограниченная память
Бинарное1 бит32x10-30%Сверхбыстрые сигналы

5. Торговые приложения

5.1 Развертывание на FPGA с INT8

FPGA (программируемые логические интегральные схемы) широко используются в торговой инфраструктуре благодаря детерминированной задержке и параллелизму. Квантование INT8 является естественной точностью для развертывания на FPGA, потому что:

  • Целочисленные АЛУ на FPGA меньше и быстрее блоков с плавающей запятой
  • Детерминированная задержка: Нет вариаций режимов округления с плавающей запятой
  • Параллелизм: Больше блоков INT8 умножения-накопления помещается на той же FPGA
  • Глубина конвейера: Более короткие конвейеры для целочисленных операций означают меньшую задержку

Типичный конвейер торговли на FPGA:

  1. Рыночные данные поступают через сетевой интерфейс
  2. Извлечение признаков с использованием арифметики с фиксированной запятой
  3. Инференс квантованной модели INT8 менее чем за 1 микросекунду
  4. Генерация ордеров и проверка рисков
  5. Отправка ордеров

5.2 Мобильные торговые приложения

Розничные трейдеры все чаще требуют сложной аналитики на мобильных устройствах. Квантованные модели обеспечивают:

  • Запуск моделей прогнозирования непосредственно на устройстве (без сетевой задержки для инференса)
  • Энергоэффективное выполнение моделей
  • Локальный инференс с сохранением конфиденциальности (не нужно отправлять данные портфеля на серверы)
  • Автономная работа для базовой генерации сигналов

Модели INT8 уменьшают объем памяти в 4 раза, что позволяет запускать несколько моделей на смартфоне.

5.3 Снижение пропускной способности памяти

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

  • Эффективность кэша: Модели INT8 в 4 раза чаще помещаются в кэш L2/L3
  • Использование шины памяти: В 4 раза больше параметров передается за цикл доступа к памяти
  • Пакетная обработка: Запуск в 4 раза больше моделей в том же объеме памяти

Для торговой системы с 10 моделями, каждая по 50 МБ в FP32:

  • FP32: 500 МБ всего (превышает большинство кэшей L3)
  • INT8: 125 МБ всего (помещается во многие кэши L3)
  • INT4: 62.5 МБ всего (помещается в L2 на некоторых серверных CPU)

5.4 Компромиссы задержка-точность в торговле

Оптимальный уровень квантования зависит от торговой стратегии:

  • Маркет-мейкинг: INT8 идеален — задержка чрезвычайно важна, модели предсказывают динамику спреда, где высокая точность менее критична
  • Статистический арбитраж: INT8 или FP16 — модели должны точно обнаруживать небольшие ценовые расхождения
  • Оптимизация портфеля: FP16 или FP32 — числовая точность ковариационных матриц важна; задержка инференса менее критична (решения на минутной/часовой частоте)
  • Следование за трендом: INT4 приемлем — направленные сигналы устойчивы к шуму квантования

6. Пошаговая реализация

Реализация на Rust в этой главе предоставляет полный набор инструментов квантования для торговых моделей. Вот обзор ключевых компонентов:

6.1 Схемы квантования

Реализация поддерживает четыре схемы квантования:

  • Симметричное поэлементное: Единый масштабный коэффициент, нулевая точка фиксирована на 0
  • Асимметричное поэлементное: Масштаб и нулевая точка вычисляются из мин/макс
  • Симметричное поканальное: Поканальные масштабные коэффициенты для тензоров весов
  • Асимметричное поканальное: Поканальные масштаб и нулевая точка

6.2 Конвейер квантования

Исходная модель FP32
|
v
Калибровка (сбор статистики мин/макс)
|
v
Вычисление масштаба и нулевой точки
|
v
Квантование весов (FP32 → INT8/INT4)
|
v
Квантованный инференс (целочисленная арифметика)
|
v
Деквантование выхода (INT32 → FP32)

6.3 Квантованное матричное умножение

Основная операция в инференсе нейронной сети — матричное умножение. С квантованными весами и активациями:

Y_fp32 = X_fp32 * W_fp32
становится:
Y_int32 = (X_int8 - Zx) * (W_int8 - Zw)
Y_fp32 = Sx * Sw * Y_int32

Это заменяет дорогостоящие умножения FP32 на умножения INT8, за которыми следует одно масштабирование FP32 на выходе — значительное ускорение на оборудовании с блоками целочисленного умножения-накопления.

6.4 Структура кода

Крейт Rust организован следующим образом:

  • lib.rs — Основные функции квантования, слои нейронной сети, клиент API Bybit
  • examples/trading_example.rs — Полный пример получения данных в реальном времени и сравнения точностей

Ключевые типы:

  • QuantizationScheme — Перечисление поддерживаемых стратегий квантования
  • QuantizationParams — Вычисленные масштаб и нулевая точка
  • QuantizedTensor — Данные INT8 с параметрами квантования
  • QuantizedLinearLayer — Полносвязный слой, работающий с квантованной точностью
  • TradingModel — Многослойный перцептрон для прогнозирования цен

7. Интеграция данных Bybit

Реализация подключается к публичному API Bybit для получения данных kline (свечных графиков) в реальном времени:

GET https://api.bybit.com/v5/market/kline?category=linear&symbol=BTCUSDT&interval=5&limit=200

Это возвращает данные OHLCV, которые преобразуются в признаки для торговой модели:

  • Ценовая доходность: (close - open) / open
  • Диапазон high-low: (high - low) / open
  • Изменение объема: Нормализованный объем относительно скользящего среднего

Признаки нормализуются в диапазон [-1, 1] перед квантованием, что улучшает точность INT8 и INT4, обеспечивая полное использование диапазона квантования.

Примечания по интеграции

  • API не требует аутентификации для публичных рыночных данных
  • Лимиты запросов щедрые для эндпоинтов kline (10 запросов/секунду)
  • Данные возвращаются в виде строковых массивов и парсятся в значения f32
  • Пример получает 200 свечей 5-минутных данных, достаточных для обучения простой модели и демонстрации эффектов квантования

8. Ключевые выводы

  1. Квантование необходимо для продакшн торговых моделей. Ускорение в 2-4 раза от квантования INT8 сопровождается минимальной потерей точности (<1% для большинства архитектур) и напрямую снижает задержку инференса.

  2. INT8 — практический оптимум. Для большинства торговых приложений INT8 обеспечивает лучший компромисс между сжатием (4x), ускорением (2-4x) и сохранением точности. Он нативно поддерживается CPU, GPU и FPGA.

  3. Квантование после обучения обычно достаточно для INT8. PTQ с калибровкой мин-макс или перцентилями хорошо сохраняет точность при точности INT8. QAT нужен в основном для INT4 и ниже.

  4. Поканальное квантование улучшает точность. Вычисление отдельных масштабных коэффициентов для каждого выходного канала тензоров весов значительно уменьшает ошибку квантования с минимальными накладными расходами.

  5. Симметричное квантование предпочтительно для весов; асимметричное для активаций. Веса обычно центрированы около нуля (симметричные), тогда как активации после ReLU неотрицательны (асимметричные).

  6. Выбор точности зависит от торговой стратегии. Стратегии, чувствительные к задержке (маркет-мейкинг), получают наибольшую выгоду от агрессивного квантования, тогда как стратегии, чувствительные к точности (стат арб), должны быть более консервативными.

  7. Пропускная способность памяти часто является реальным узким местом. Квантование снижает не только вычислительные требования, но и трафик памяти, который часто является ограничивающим фактором в мультимодельных торговых системах.

  8. Всегда валидируйте квантованные модели на реалистичных рыночных данных. Ошибка квантования может накапливаться через слои и взаимодействовать с конкретными рыночными режимами. Тестируйте в различных рыночных условиях перед развертыванием.

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

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