Глава 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_maxx_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 квантует предварительно обученную модель без повторного обучения. Это самый простой подход:
- Калибровка: Пропуск репрезентативного набора данных через модель для сбора статистики активаций (минимум, максимум или гистограммы)
- Вычисление параметров: Определение масштаба и нулевой точки для каждого слоя
- Квантование: Преобразование весов в целевую точность
- Валидация: Измерение деградации точности на тестовом наборе
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%)
- Заметки для торговли: Экспериментально; потенциально полезно для задач бинарной классификации (сигналы покупки/продажи), где скорость важнее точности
Сводная таблица сравнения точности
| Точность | Размер/параметр | Сжатие | Типичная потеря точности | Лучше для |
|---|---|---|---|---|
| FP32 | 4 байта | 1x | 0% (базовая) | Обучение |
| FP16 | 2 байта | 2x | <0.1% | Инференс на GPU |
| INT8 | 1 байт | 4x | <1% | FPGA, инференс на CPU |
| INT4 | 0.5 байта | 8x | 1-5% | Ограниченная память |
| Бинарное | 1 бит | 32x | 10-30% | Сверхбыстрые сигналы |
5. Торговые приложения
5.1 Развертывание на FPGA с INT8
FPGA (программируемые логические интегральные схемы) широко используются в торговой инфраструктуре благодаря детерминированной задержке и параллелизму. Квантование INT8 является естественной точностью для развертывания на FPGA, потому что:
- Целочисленные АЛУ на FPGA меньше и быстрее блоков с плавающей запятой
- Детерминированная задержка: Нет вариаций режимов округления с плавающей запятой
- Параллелизм: Больше блоков INT8 умножения-накопления помещается на той же FPGA
- Глубина конвейера: Более короткие конвейеры для целочисленных операций означают меньшую задержку
Типичный конвейер торговли на FPGA:
- Рыночные данные поступают через сетевой интерфейс
- Извлечение признаков с использованием арифметики с фиксированной запятой
- Инференс квантованной модели INT8 менее чем за 1 микросекунду
- Генерация ордеров и проверка рисков
- Отправка ордеров
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 Bybitexamples/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. Ключевые выводы
-
Квантование необходимо для продакшн торговых моделей. Ускорение в 2-4 раза от квантования INT8 сопровождается минимальной потерей точности (<1% для большинства архитектур) и напрямую снижает задержку инференса.
-
INT8 — практический оптимум. Для большинства торговых приложений INT8 обеспечивает лучший компромисс между сжатием (4x), ускорением (2-4x) и сохранением точности. Он нативно поддерживается CPU, GPU и FPGA.
-
Квантование после обучения обычно достаточно для INT8. PTQ с калибровкой мин-макс или перцентилями хорошо сохраняет точность при точности INT8. QAT нужен в основном для INT4 и ниже.
-
Поканальное квантование улучшает точность. Вычисление отдельных масштабных коэффициентов для каждого выходного канала тензоров весов значительно уменьшает ошибку квантования с минимальными накладными расходами.
-
Симметричное квантование предпочтительно для весов; асимметричное для активаций. Веса обычно центрированы около нуля (симметричные), тогда как активации после ReLU неотрицательны (асимметричные).
-
Выбор точности зависит от торговой стратегии. Стратегии, чувствительные к задержке (маркет-мейкинг), получают наибольшую выгоду от агрессивного квантования, тогда как стратегии, чувствительные к точности (стат арб), должны быть более консервативными.
-
Пропускная способность памяти часто является реальным узким местом. Квантование снижает не только вычислительные требования, но и трафик памяти, который часто является ограничивающим фактором в мультимодельных торговых системах.
-
Всегда валидируйте квантованные модели на реалистичных рыночных данных. Ошибка квантования может накапливаться через слои и взаимодействовать с конкретными рыночными режимами. Тестируйте в различных рыночных условиях перед развертыванием.
-
Rust предоставляет отличную платформу для квантованного инференса. Абстракции с нулевой стоимостью, отсутствие пауз сборки мусора и прямой доступ к оборудованию делают Rust идеальным для реализации квантованных торговых моделей в продакшне.
-
Квантование дополняет другие техники оптимизации. Комбинируйте с прунингом, дистилляцией знаний и поиском архитектуры для максимальной эффективности инференса.