🚀 Небольшие оптимизации в adept: Linear layer и sum()
Привет! Наконец-то после 3х недель написания документации в виде статей удалось вернуться к разработке. Сделал ряд улучшений в библиотеке, которые немного улучшили производительность операций обратного распространения градиента.
1. Обобщённая операция sum(dim)
Раньше операция суммирования работала только для всего тензора или только по первой оси (sum_dim0). И по оси была наивная реализация которая в цикле суммировала все значения по 0му измерению, что приводило к существенным задержкам при большом пакете. Теперь:
- sum(dim) — суммирование по любой оси
- Поддержка отрицательных индексов
- Оптимизированные шейдеры для на основе subgroups
- Работает с тензорами до 4D включительно
2. Небольшая оптимизация Linear layer backward
В обратном проходе линейного слоя убрал одно матричное транспонирование. Что сокращает количество операций с памятью и немного ускоряет расчёт градиентов.
3. Тестирование через naive implementation
Добавлена эталонная реализация линейного слоя для валидации точности вычислений в тестах. Это гарантирует, что оптимизации не влияют на корректность вычислений.
Что дальше?
Есть задел для дальнейшего ускорения (~10%) — реализация поддержки смещений(strides) в тензоре. Это позволит избежать реальных транспонирований матриц в некоторых случаях, работая с данными “на лету”. Дальнейшие оптимизации matmul должны уже наверное использовать специальные матричные расширения, например Tensor Cores в NVIDIA.
Реализация смещений в тензоре для работы с памятью также позволит реализовать функциональность срезов(slices). Что откроет возможность для импортирования уже реальных моделей, например YOLO.
#adept #deeplearning #performance #vulkan #cpp
Post #34
305
- 👍 2