2022-02-15 18:44:48
Инженерная задача
Есть у меня чисто инженерная задача, над которой я думаю в последнее время, может в комментариях предложите интересные решения.
Представим что мы гугл, который собирает огромную базу разметки с Re-Capcha и мы хотим обучить классификатор на этих данных.
Предположим что данных за все время набралось порядка 10тб, как же нам обучаться в таких объемах?
Основные проблемы здесь это:
* Хранить копию данных на каждой машине кластера на котором мы учимся - расточительно, особенно при условии, что датасет может регулярно обновляться
* Любая работа по декодированию картинки в float32 тензор и последующие аугментации занимают много процессорного времени, от чего наши гпушки могут простаивать
* Хочется делать максимально скелбл пайплан
Мое решение:
Скорее всего мы не захотим хранить картинки где-то на локальном диске, т.к. на нем просто не будет хватать места, давайте будем делать это в неком s3 подобном облаке.
Поскольку выгрузка и декодирование картинки с аугментациями это сильно CPU bound задача, то мы разделим наш кластер на две части.
1 - GPU тачки с кучей видеокарт
2 - Мощные CPU воркеры с десятком процессорных ядер
Вторые будут молотить картинки для первых и если гпушки будут простаивать, мы просто будем добавлять CPU воркеров до оптимума.
Но как теперь доставлять данные от первых ко вторым? Можно поднять базу по типу кафки и пусть CPU воркеры кладут в нее сразу готовые батчи в виде последовательности байт.
Тогда GPU машины вообще не будут тратить время на формирование батча, а будут копировать набор байт по сети и сразу класть их в сегмент памяти на видеокарте.
Проведя некоторые расчеты с заданными размерами картинок, батча и то, сколько батчей в секунду может обработать одна машина, получается что скорость доступа до данных по сети должна быть как минимум 32 гигабита в секунду.
И тут мне уже не понятно на сколько сложно добиться таких скоростей
625 viewsAlexander Mamaev, 15:44