Однако обратите внимание, что у мини-пакетирования есть свои преимущества (например, лучшая обработка локальных минимумов), поэтому вам, вероятно, следует подумать о выборе batch_size где-то посередине.

аюсь обучить мою модель на графическом процессоре вместо процессора на экземпляре AWS p2.xlarge из моего ноутбука Jupyter. Я использую бэкэнд тензор-gpu (толькоtensorflow-gpu был установлен и упомянут вrequirements.txt и нетtensorflow).

Я не вижу каких-либо улучшений скорости при обучении моделей в этих случаях по сравнению с использованием ЦП. Фактически, я получаю скорость тренировок за эпоху почти такую ​​же, как и на моем 4-ядерном ЦП ноутбука (p2.xlarge также имеет 4 виртуальных ЦП). с графическим процессором Tesla K80). Я не уверен, что мне нужно внести некоторые изменения в мой код, чтобы обеспечить более быструю / параллельную обработку, которую может предложить GPU. Я вставляю ниже свой код для моей модели:

model = Sequential()
model.add(recurrent.LSTM(64, input_shape=(X_np.shape[1], X_np.shape[2]),
                        return_sequences=True))
model.add(recurrent.LSTM(64, return_sequences = False))
model.add(core.Dropout(0.1))
model.add(core.Dense(3, activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer = 'rmsprop', metrics=['accuracy'])

model.fit(X_np, y_np, epochs=100, validation_split=0.25)

Интересно также, что кажется, что GPU использует от 50% до 60% своей вычислительной мощности и почти всю свою память каждый раз, когда я проверяю состояние GPU, используяnvidia-smi (но оба падают до 0% и 1 МБ соответственно, когда не тренируются):

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.81                 Driver Version: 384.81                    |
|-------------------------------+----------------------+----------------------+
| 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 K80           On   | 00000000:00:1E.0 Off |                    0 |
| N/A   47C    P0    73W / 149W |  10919MiB / 11439MiB |     52%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1665      C   ...ubuntu/aDash/MLenv/bin/python 10906MiB |
+-----------------------------------------------------------------------------+

Также, если вы хотите увидеть мои журналы об использовании графического процессора из Jupyter Notebook:

[I 04:21:59.390 NotebookApp] Kernel started: c17bc4d1-fa15-4b0e-b5f0-87f90e56bf65
[I 04:22:02.241 NotebookApp] Adapting to protocol v5.1 for kernel c17bc4d1-fa15-4b0e-b5f0-87f90e56bf65
2017-11-30 04:22:32.403981: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2017-11-30 04:22:33.653681: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:892] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2017-11-30 04:22:33.654041: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1030] Found device 0 with properties:
name: Tesla K80 major: 3 minor: 7 memoryClockRate(GHz): 0.8235
pciBusID: 0000:00:1e.0
totalMemory: 11.17GiB freeMemory: 11.10GiB
2017-11-30 04:22:33.654070: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7)
2017-11-30 04:22:34.014329: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7)
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7
2017-11-30 04:22:34.015339: I tensorflow/core/common_runtime/direct_session.cc:299] Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7

2017-11-30 04:23:22.426895: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: Tesla K80, pci bus id: 0000:00:1e.0, compute capability: 3.7)

Пожалуйста, предложите, в чем может быть проблема. Спасибо огромное за то, что посмотрели на это в любом случае!

 Abderrahim Kitouni04 дек. 2017 г., 15:36
Каков размер вашего набора данных (форма X_np и y_np)?
 Ishaan Sejwal05 дек. 2017 г., 06:08
@AbderrahimKitouni 34000x7x5 (образцы x временных шагов x функций) для ввода и цели 34000x1
 dgumo02 дек. 2017 г., 18:04
Можете ли вы также опубликовать информацию о загрузке вашего процессора? Может случиться так, что ваше узкое место - это та часть, которая передает данные в вашу модель.

Ответы на вопрос(3)

batch_size вmodel.fitпотому что по умолчанию32, Увеличивайте его, пока не получите 100% загрузку процессора.

Следуя предложению @dgumo, вы также можете поместить свои данные в/run/shm, Это файловая система в памяти, которая позволяет получить доступ к данным максимально быстрым способом. Кроме того, вы можете убедиться, что ваши данные хранятся как минимум на SSD. Например в/tmp.

 Coolness02 дек. 2017 г., 18:51
Согласовано. LSTM медленен в обучении, но увеличение размера партии должно сильно помочь. Вы также можете попробовать другие типы повторяющихся слоев, такие как GRU или недавно выпущенныйSRU
Решение Вопроса

Реализация Tensorflow для слоев LSTM не так уж велика. Возможно, причина в том, что периодические вычисления не являются параллельными вычислениями, а графические процессоры отлично подходят для параллельной обработки.

Я подтвердил это на собственном опыте:

Получил ужасную скорость, используя LSTM в моей моделиРешил протестировать модель, удалив все LSTM (получил чисто сверточную модель)Получающаяся скорость была просто удивительной !!!

Эта статья об использовании графических процессоров и тензорного потока также подтверждает, что:

http://minimaxir.com/2017/07/cpu-or-gpu/Возможное решение?

Вы можете попробовать использовать новыйCuDNNLSTMКажется, что он подготовлен специально для использования графических процессоров.

Я никогда не проверял это, но вы, скорее всего, получите лучшую производительность с этим.

Еще одна вещь, которую я не проверял, и я не уверен, что она разработана по этой причине, но я подозреваю, что это так: вы можете поставитьunroll=True в ваших слоях LSTM. При этом я подозреваю, что текущие вычисления будут преобразованы в параллельные.

 Ishaan Sejwal05 дек. 2017 г., 06:12
Некоторое время я не просматривал документы keras, а проверенные слои cudnn были добавлены в октябре. Я провел тест-драйв своих данных и сократил количество тренировок на треть, не внося никаких других изменений. Проверьте это больше через день или два.

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

model.fit(X_np, y_np, epochs=100, validation_split=0.25, batch_size=X_np.shape[0])

(Вы должны также, вероятно, увеличить количество эпох при этом).

Однако обратите внимание, что у мини-пакетирования есть свои преимущества (например, лучшая обработка локальных минимумов), поэтому вам, вероятно, следует подумать о выборе batch_size где-то посередине.

Ваш ответ на вопрос