У меня есть компьютер с небольшим количеством графических процессоров NVidia, я использую пакет 'segmentation_models' и собираю NN на основе Unet:
import segmentation_models as sm
import keras.backend as K
from keras import optimizers
from keras.utils import multi_gpu_model
lr = 2e-4
NUM_GPUS = 3
learning_rate = lr * NUM_GPUS
adam = optimizers.Adam(lr=learning_rate)
def dice_coef(y_true, y_pred, smooth=1):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
model = sm.Unet('efficientnetb3', encoder_weights='imagenet', classes=4, activation='softmax', encoder_freeze=False)
parallel_model = multi_gpu_model(model, gpus=NUM_GPUS)
model = parallel_model
model.compile(adam, 'categorical_crossentropy', [dice_coef])
history = model.fit_generator(
generator=train_gen, steps_per_epoch=len(train_gen), \
validation_data=validation_gen, \
epochs=50, callbacks=[clr, checkpoints, csv_logger],
initial_epoch=0)
, после обучения я сохраняю веса для будущего использования в режиме cpu:
single_gpu_model = model.layers[-2]
single_gpu_model.save(single_proc_model_path_1_kernel)
И я пытаюсь работать с этими весами:
import keras
model1 = keras.models.load_model(single_proc_model_path_1_kernel)
...
pr_mask = self.model1.predict(img_exp)
- Машина для обучения NN: Ubuntu 16.04.4 LTS, 3 x K80 GPU; python 3.6.7, тензор потока 1.12.0 - здесь работает весь код.
- Win10 с 1 GeForce GTX 1080 ; python 3.7.3, tenorflow-gpu 1.13.1 - здесь тоже работает код.
- Win10 без графического процессора NVidia; tenorflow-gpu 1.13.1 - ОШИБКА при загрузке модели:
tenorflow / stream_executor / cuda / cuda_driver. cc: 300] сбой вызова cuInit: CUDA_ERROR_NO_DEVICE: нет CUDA -обнаружено работоспособное устройство
- docker с Ubuntu 18.04.3 LTS; python 3.6.9, тензор потока 2.1.0.
Ошибка при загрузке модели:
тензор потока / stream_executor / platform / default / dso_loader. cc: 55] Не удалось загрузить динамическую c библиотеку 'libnvinfer.so.6'; dlerror: libnvinfer.so.6: не удается открыть общий объектный файл: такого файла или каталога нет тензор потока / stream_executor / platform / default / dso_loader. cc: 55] Не удалось загрузить динамическую c библиотеку 'libnvinfer_plugin.so.6' ; dlerror: libnvinfer_plugin.so.6: невозможно открыть общий объектный файл: такой файл или каталог не существует tenorflow / compiler / tf2tensorrt / utils / py_utils. cc: 30] Невозможно удалить некоторые библиотеки TensorRT. Если вы хотите использовать графический процессор Nvidia с TensorRT, убедитесь, что отсутствующие библиотеки, указанные выше, установлены правильно. Модели сегментации: с использованием keras
framework. tenorflow / stream_executor / platform / default / dso_loader. cc: 55] Не удалось загрузить Dynami c библиотека 'libcuda.so.1'; dlerror: libcuda.so.1: невозможно открыть общий объектный файл: такой файл или каталог не существует tenorflow / stream_executor / cuda / cuda_driver. cc: 351] сбой вызова cuInit: НЕИЗВЕСТНАЯ ОШИБКА (303) I tenorflow / stream_executor / cuda / cuda_diagnostics. cc: 156] драйвер ядра не работает на этом хосте (b36a4cf2df2e): / proc / driver / nvidia / version не существует
Что я должен изменить, чтобы принудительно ввести код работать на машине только с процессорами?