2016-10-06 2 views
0

У меня довольно маленькая нейронная сеть с двумя полностью подключенными сигмовидными подсетями 10-> 100-> 10, выход которых конкатенирован, а затем подается в другую сеть 20-> 100-> 1. Эта архитектура довольно мала, имеет только несколько весовых матриц с максимальным размером 20x100 = 2000 весов.theano: простая нейронная сеть с 6 слоями поездов всего с 132 датами в секунду. Почему это так медленно?

Даже если я использую theano со всеми флагами, установленными для использования ускорения gpu, система достигает только 132 итераций (datapoints!) В секунду. Я не использую мини-кавычки, потому что это не ваша типичная нейронная сеть, а матричная модель факторизации.

Система Я использую имеет следующие характеристики:

OS

uname -a 
Linux node081 2.6.32-358.18.1.el6.x86_64 #1 SMP Wed Aug 28 17:19:38 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 

ПО

  • Python 3.5.2 (составитель сам)
  • Theano 0.9.0dev2.dev-ee4c4e21b9e9037f2aa9626c3d779382840ea 2e3
  • NumPy 1.11.2

процессор

Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz 

с nproc, который возвращает 12, следовательно, может иметь 12 процессоров (или ядер?)

GPU

это выход из nvidia-smi (с моим процессом, запущенным):

+------------------------------------------------------+     
| NVIDIA-SMI 5.319.49 Driver Version: 319.49   |     
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 Tesla K20m   On | 0000:03:00.0  Off |     Off | 
| N/A 29C P0 49W/225W |  92MB/5119MB |  19%  Default | 
+-------------------------------+----------------------+----------------------+ 

+-----------------------------------------------------------------------------+ 
| Compute processes:            GPU Memory | 
| GPU  PID Process name          Usage  | 
|=============================================================================| 
| 0  5903 python3            77MB | 
+-----------------------------------------------------------------------------+ 

команды и окр вары параметры конфигурации

OMP_NUM_THREADS=8 THEANO_FLAGS=mode=FAST_RUN,device=gpu,init_gpu_device=gpu,floatX=float32,nvcc.flags=-D_FORCE_INLINES,print_active_device=True,enable_initial_driver_test=True,warn_float64=raise,force_device=True,assert_no_cpu_op=raise python3 [email protected] 

Theano установленные во время выполнения

theano.config.optimizer='fast_run' 
theano.config.openmp=True 
theano.config.openmp_elemwise_minsize=4 
theano.config.floatX='float32' 
theano.config.assert_no_cpu_op='raise' 

Я также пытался деактивировать openmp, и он работает немного медленнее.

Кажется, что я принял все меры предосторожности, чтобы убедиться, что у меня правильно установлено gpu-ускорение. Что может быть причиной получения только 132 градиентных обновлений каждую секунду? Есть ли еще какая-то проверка, которую мне нужно выполнить?

ответ

1

В Феано

  • Компиляция гораздо быстрее, чем с optimizer=fast_compileoptimizer=fast_run.
  • Использование новой базы данных с помощью нового оптимизатора, время компиляции увеличилось на 5X в определенных сетях. Я бы посоветовал вам всегда придерживаться нового бэкэнда. Вы можете использовать новый бэкэнд, используя флаг device=cuda.
  • Пока вы используете новый бэкэнд, я бы посоветовал вам использовать край кровотечения, если вы хотите скорость. Ежедневно проводится много оптимизаций, которые могут дать большие скорости.

  • Из документов, вы можете установить флаг allow_gc=False, чтобы получить более высокую скорость

  • Вы можете установить флаг config.nvcc.fastmath Истину, если вам потребуется некоторое скорость вверх от деления и умножения операций по стоимости точность.
  • Если у вас есть сверточные операции в вашей сети, вы можете установить флаги config.dnn в зависимости от вашей сети и потребностей. Кроме того, установка флага cnmem поможет.

  • Наконец, всякий раз, когда вы сообщаете код, чтобы быть медленным, пожалуйста, поделиться результатами профилирования для оказания помощи развитию :)

+0

, что я перестраивает код для того, чтобы сделать возможным minibatches. С размером микросхемы 64 я получил примерно 40-кратное ускорение. Я могу попробовать ваши предложения рано или поздно. – fstab

+0

Поскольку на графическом процессоре матричные умножения намного быстрее, чем матричный вектор, я предлагаю вам установить оптимальный размер мини-партии, который позволит вам использовать почти полную память GPU, чтобы вы могли быстрее вычислять градиент и более эффективный способ – Sentient07

+0

Правда, есть уловка жесткая: размер мини-барабана влияет и на обучение: чем больше мини-патч, тем меньше «стохастический» эффект от стохастического градиентного спуска. – fstab

Смежные вопросы