Про CUDA, часть 1.
Многим очень нравится, когда то, что работало медленно — начинает работать в несколько раз быстрее. В ML/DL области время работы алгоритма — очень часто ограничивающий фактор. Каждая проверка гипотезы может затянуться на 3 часа, на весь рабочий день, на 3 дня. Конечно, если вы не работаете в OpenAI — проверку гипотезы вы можете ждать несколько месяцев, чисто машинного времени.
Deep Learning — это про неимоверно тяжёлые (с точки зрения количества требуемых операций над числами) вычисления, которые запускаются... из очень медленного языка. Интерпретируемого. До недавнего времени — однопоточного (есть concurrency, но нет parallelism). Если вы только обучаете глубокие нейросети, вам это должно быть не особо важно — импортируем торч, берём нужные классы и функции, в которых уже всё векторизировано и распараллелено на все транзисторы, которые у вас только есть в ПК. В этом случае объём используемых операций небольшой, они за десятки лет доведены до совершенства и реализованы на C++/CUDA за нас, как говорится, бери и пользуйся.
Надо отметить, что ML/DL области соседствует с гораздо более общей областью — обработка данных. И в большей части практических задач, которые мне приходилось решать, существенное время тратилось не только на обучение, но и на сопутствующую обработку данных.
Пример. OCR, маленький датасет, нужно получить максимальную точность. Кастомные аугментации дают прирост качества ввиду небольшого объема данных. Нейросеть маленькая, питоновская реализация аугментаций съедает 80% времени обучения. Sad. Переписываем нетривиальным образом на numpy, получаем ускорение аугментации в десятки раз.
Пример. Обучаем распознавание речи на карточках H100, обучение занимает 2 часа. На текущих данных проведено много экспериментов, оставшиеся улучшения несущественные. Есть много гипотез по предобработке аудиоданных, но пайплайн подготовки датасета занимает 1.5 часа. Грустно, пришлось оптимизировать подготовку данных.
Пример. Обработка облака с 3D эллипсоидами, нужно равномерно семплировать точки из объединённого объема всех эллипсоидов. Их десятки миллионов. Любые наивные решения — не работают. Конвертация эллипсоидов в меш — меш не грузится. Семплирование по одной точке из всего объема — ждём несколько дней. Вокселизация? Ждём день. Вопрос решила батчевая вокселизация с помощью битового массива на pytorch...
Тимофей Науменко