У меня довольно маленькая нейронная сеть с двумя полностью подключенными сигмовидными подсетями 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 градиентных обновлений каждую секунду? Есть ли еще какая-то проверка, которую мне нужно выполнить?
, что я перестраивает код для того, чтобы сделать возможным minibatches. С размером микросхемы 64 я получил примерно 40-кратное ускорение. Я могу попробовать ваши предложения рано или поздно. – fstab
Поскольку на графическом процессоре матричные умножения намного быстрее, чем матричный вектор, я предлагаю вам установить оптимальный размер мини-партии, который позволит вам использовать почти полную память GPU, чтобы вы могли быстрее вычислять градиент и более эффективный способ – Sentient07
Правда, есть уловка жесткая: размер мини-барабана влияет и на обучение: чем больше мини-патч, тем меньше «стохастический» эффект от стохастического градиентного спуска. – fstab