Jump to content
Compvision.ru
Sign in to follow this  
maxfashko

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

Recommended Posts

Добрый день.

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

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

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

 

  • Like 1

Share this post


Link to post
Share on other sites
3 часа назад, mrgloom сказал:

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Можно прямо на 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 так что по идее должно хорошо ложится.

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×