#tensorflow #neural-network #anaconda #gpu
#tensorflow #нейронная сеть #анаконда #графический процессор
Вопрос:
У меня есть одна проблема, мой ноутбук jupyter не работает на графическом процессоре. Я обновил свой драйвер (Nvidia GTX 1660 Ti), установил CUDA 11, поместил cuDNN-файлы в папки и указал правильный путь в переменных среды. После этого я добавил новую среду в Anaconda, включая ядро GPU, и установил tensorflow-gpu (версия 2.4, потому что для CUDA 11 требуется версия> = 2.4.0), как описано в этом видео.
После этого я открыл jupyter notebook с новым ядром. Итак, я могу запускать свой код и до определенного шага, который работает, но загрузка моего графического процессора в диспетчере задач ниже 1%, а объем оперативной памяти составляет 60% -99%. Итак, я думаю, что мой код не работает на графическом процессоре. Я провел несколько тестов:
import tensorflow.keras
import tensorflow as tf
print(tf.__version__)
print(tensorflow.keras.__version__)
print(tf.test.is_built_with_cuda())
print(tf.config.list_physical_devices('GPU'))
print(tf.test.is_gpu_available())
приводит к (что я считаю правильным):
2.4.0
2.4.0
True
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
True
Следующий тест:
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
Что приводит к:
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 9334837591848971536
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 4837251481
locality {
bus_id: 1
links {
}
}
incarnation: 2660164806064353779
physical_device_desc: "device: 0, name: GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5"
]
Итак, в этом ядре есть CPU и GPU, не так ли?
Что я могу сделать, чтобы моя нейронная сеть работала на графическом процессоре, а не на процессоре?
Мой код выполняется до тех пор, пока я не попытаюсь обучить свою нейронную сеть. Это код и возникающая ошибка:
model.fit([np.asarray(X_train).astype(np.float32), np.asarray(X_train_zusatz).astype(np.float32)],
y_train, epochs=10, batch_size=10)
Это объединенная нейронная сеть, если вам интересно узнать о вводе, и она отлично работает с обычным tensorflow (не tensorflow-gpu). Но на обучение нужно очень и очень много времени.
Epoch 1/10
---------------------------------------------------------------------------
ResourceExhaustedError Traceback (most recent call last)
<ipython-input-27-10813edc74c8> in <module>
3
4 model.fit([np.asarray(X_train).astype(np.float32), np.asarray(X_train_zusatz).astype(np.float32)],
----> 5 y_train, epochs=10, batch_size=10)#,
6 #validation_data=[[X_test, X_test_zusatz], y_test], class_weight=class_weight)
~.condaenvstf-gpulibsite-pac
kagestensorflowpythonkerasenginetraining.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
1098 _r=1):
1099 callbacks.on_train_batch_begin(step)
-> 1100 tmp_logs = self.train_function(iterator)
1101 if data_handler.should_sync:
1102 context.async_wait()
~.condaenvstf-gpulibsite-packagestensorflowpythoneagerdef_function.py in __call__(self, *args, **kwds)
826 tracing_count = self.experimental_get_tracing_count()
827 with trace.Trace(self._name) as tm:
--> 828 result = self._call(*args, **kwds)
829 compiler = "xla" if self._experimental_compile else "nonXla"
830 new_tracing_count = self.experimental_get_tracing_count()
~.condaenvstf-gpulibsite-packagestensorflowpythoneagerdef_function.py in _call(self, *args, **kwds)
886 # Lifting succeeded, so variables are initialized and we can run the
887 # stateless function.
--> 888 return self._stateless_fn(*args, **kwds)
889 else:
890 _, _, _, filtered_flat_args =
~.condaenvstf-gpulibsite-packagestensorflowpythoneagerfunction.py in __call__(self, *args, **kwargs)
2941 filtered_flat_args) = self._maybe_define_function(args, kwargs)
2942 return graph_function._call_flat(
-> 2943 filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access
2944
2945 @property
~.condaenvstf-gpulibsite-packagestensorflowpythoneagerfunction.py in _call_flat(self, args, captured_inputs, cancellation_manager)
1917 # No tape is watching; skip to running the function.
1918 return self._build_call_outputs(self._inference_function.call(
-> 1919 ctx, args, cancellation_manager=cancellation_manager))
1920 forward_backward = self._select_forward_and_backward_functions(
1921 args,
~.condaenvstf-gpulibsite-packagestensorflowpythoneagerfunction.py in call(self, ctx, args, cancellation_manager)
558 inputs=args,
559 attrs=attrs,
--> 560 ctx=ctx)
561 else:
562 outputs = execute.execute_with_cancellation(
~.condaenvstf-gpulibsite-packagestensorflowpythoneagerexecute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
58 ctx.ensure_initialized()
59 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
---> 60 inputs, attrs, num_outputs)
61 except core._NotOkStatusException as e:
62 if name is not None:
ResourceExhaustedError: 2 root error(s) found.
(0) Resource exhausted: OOM when allocating tensor with shape[300,300] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[{{node model/lstm/while/body/_1/model/lstm/while/lstm_cell/split}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
[[gradient_tape/model/embedding/embedding_lookup/Reshape/_74]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
(1) Resource exhausted: OOM when allocating tensor with shape[300,300] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
[[{{node model/lstm/while/body/_1/model/lstm/while/lstm_cell/split}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
0 successful operations.
0 derived errors ignored. [Op:__inference_train_function_4691]
Function call stack:
train_function -> train_function
Почему возникает эта ошибка?
-Обновление — Вот как выглядит мой «nvidia-smi» во время обучения моей модели (примерно через 20 секунд обучения).
Спасибо и с наилучшими пожеланиями, Дэниел
Комментарии:
1. 1660ti имеет 6 ГБ памяти или что-то еще? И вы, вероятно, используете еще 1 ГБ для запуска вашей системы. Опубликованные вами сценарии показывают, что ваше обучение gpu работает нормально, но не хватает памяти. Попробуйте вырезать фрагменты вашей модели, уменьшить размеры слоев или количество нейронов в слоях, уменьшить размер пакета, заменить оптимизатор старым добрым SGD, использовать контрольные точки градиента, разместить несколько слоев на процессоре — некоторые из них помогут
2. Спасибо за ваш ответ. Да, 1660 ti имеет 6 ГБ памяти. Я уменьшил размер пакета до 10, и он по-прежнему не работает. Уменьшение размеров слоев и изменение оптимизатора на sgd приводит к той же ошибке. Как может быть, что программа работает на процессоре (без ошибок, но медленно), а на графическом процессоре она не работает? Графический процессор должен быть быстрее, не так ли? У меня есть вторая графическая карта (Intel (R) UHD Graphics 630), может ли это быть проблемой? Но CUDA устанавливается на графическую карту nvidia автоматически, не так ли?
3. вы можете запустить nvidia-smi во время обучения, чтобы убедиться, что используется графический процессор nvidia. Попробуйте установить размер пакета равным 1
4. при запуске nvidia-smi вы должны ожидать, что почти вся ваша память 1660ti будет выделена TF
5. Должен ли я смотреть на GPU-Util? Если да, то это 0%, все обучение. Это означает, что программа не запущена на графическом процессоре? Графическая карта имеет 1536 ядер, возможно, используется только одно. Возможно ли это?