Перейти к содержимому
Compvision.ru
maxfashko

Параллельная обработка файлов caffe

Recommended Posts

Добрый день.

Как реализовать параллельную классификацию на развернутой в памяти сети используя Caffè. 

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

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

На процессоре это оказалось не возможно, поток ждет, пока не завершиться предыдущий.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Что то я сомневаюсь, что это невозможно на CPU, другой вопрос, что скорее это просто сделать скопировав сеть(но плохо по памяти), а если не копировать, то скорее всего что то надо лочить.

А так самый простой вариант это отправлять на сеть изображения пачками(батчами), что на CPU, что на GPU, но тут есть вопрос про подгрузку данных, по идее этим должен заниматься 1 процесс в бэкграунде.

 

Тут у меня есть код на питоне:

https://github.com/mrgloom/kaggle-dogs-vs-cats-solution/blob/master/create_kaggle_submission_probability.py#L74

Но проблема в том, что я не заметил ускорения при процессинге батчами (возможно из-за вышеописанной проблемы про подгрузку в бэкграунде).

 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, mrgloom сказал:

Что то я сомневаюсь, что это невозможно на CPU

Про процессор. Я пробовал запустить 2 процесса ( 2 скрипта ), каждый разворачивал сеть и принимал данные на классификацию. Так вот, время обработки одного изображения при одном запущенном процессе ~2.5 sec., при двух запущенных процессах ~ 5-6 sec.

Я подозреваю, что виной всему openblas. В bash_profile я выставил export OPENBLAS_NUM_THREADS=(16).

Когда я собирал caffe с blas - такого эффекта не наблюдалось. Время обработки одного изображения было ~9 sec. И при запуске двух процессов замедления не было обнаружено.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возможно для вас самый простой вариант будет распараллелить по данным.

Можно прямо на bash, если на linux(учитывая, что run_script.sh запускает single threaded версию на 1 изображение):

ls -v *.jpg | xargs --max-procs=`nproc` -n 1 ./run_script.sh > /dev/null

Вопрос только сколько памяти будет на один поток тратится.

 

p.s. с openblas у меня не получилось собрать Caffe так чтобы юзались все ядра, то ли неправильно собрал, то ли сам openblas не хочет в каких то условиях на всех ядрах работать (например может быть сеть маленькая).

p.p.s. свёртки в Caffe работают через BLAS так что по идее должно хорошо ложится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю не подходит. Не обязательно делать привязку к cpu. Идея вообще такая:

На сервер стучится до 100 пользователей, которым необходимо обработать данные, пропустив их через нейронку. Новые данные поступают в очередь, и worker распределяет их по "потокам". С gpu, это возможно сделать? Что если у каждого юзера имеется до 200 файлов? Здесь необходима параллельная обработка, чтобы не было задержки у конкретного юзера.

Причем запускать несколько экземпляров процесса тоже не рационально в связи с нехваткой памяти железа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю, что можно, во всяком случае тренировка нескольких сетей работает на 1 GPU. По идее даже не нужно управлять потоками внутри GPU, просто задать максимальное число одновременных потоков на которые используют этот GPU снаружи исходя из ограничений по памяти.

По идее вам надо написать scheduler у которого с одной стороны есть pool задач от пользователей, а с другой стороны набор железа, по идее можно запускать и на K задач одновременно на GPU и по одной задаче на CPU (минус сколько то CPU для загрузки данный на GPU, 1 CPU на GPU или 1 CPU на процесс который использует GPU).

Думаю для scheduler'а есть какие то готовые решения, что то типа, но скорее это будет целая экосистема, если делать не велосипед.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, это я понял:). Ожидал чуда вроде:

Обработка одного файла равна 0.1 с. на  gpu 4 gb ram. Сеть ест 3 gb ram. Запускаем сразу 100 потоков, каждый обрабатывает 1 файл, и вуаля - 100 файлов обратнаны за 0.1 с.:ph34r:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хм, мне тут сказали, что forward pass блокирует GPU (где найти подтверждение или опровержение?), т.е. второй поток будет ждать пока первый поток не сделает forward pass, но даже в таком случае выгода по идее есть, т.к. мы пока 1 поток работает загрузили батч со второго на GPU.

 

А вот кстати по теме:

https://habrahabr.ru/post/307140/

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Занятно, спасибо за статью. Нужно в общем пробовать это дело пока стандартными питоновскими методами пытаться решить, для понимая возможностей. Но как я понимаю flask и вообще питон тут не к месту. Реалтайм который мне необходим питон не обеспечит. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×