Tensorflow: используйте модель, обученную в CUDNNLSTM, в процессоре

Я обучил модель с использованием CUDNNLSTM в тензорном потоке с использованием графического процессора. Когда я пытаюсь использовать модель в ЦП для вывода, я получаю эту ошибку:

Invalid argument: No OpKernel was registered to support Op 'CudnnRNN' with these attrs.  Registered devices: [CPU], Registered kernels:
  <no registered kernels>

     [[Node: cudnn_lstm/CudnnRNN = CudnnRNN[T=DT_FLOAT, direction = "bidirectional", dropout=0, input_mode = "linear_input", is_training=false, rnn_mode = "lstm", seed=87654321, seed2=4567](Reshape_1, cudnn_lstm/zeros, cudnn_lstm/zeros_1, cudnn_lstm/opaque_kernel/read)]]

Итак, как мы можем использовать эту модель в процессоре?

Похоже, вам нужно запустить CUDNN на GPU. См. stackoverflow.com/questions/48086014/…. Возможно, вы могли бы просто сохранить веса из обученной модели, а затем прочитать их?

Emil H 02.05.2018 07:14
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
2
8 309
3

Ответы 3

Пожалуйста, посмотрите комментарии в исходном коде тензорного потока уровня CuDNN LSTM по адресу: https://github.com/tensorflow/tensorflow/blob/r1.6/tensorflow/contrib/cudnn_rnn/python/layers/cudnn_rnn.py

Они описали, как делать то, что вы хотите, начиная со строки 83 и далее. По сути, после использования слоев CuDNN для обучения вам необходимо перенести веса в модель, созданную с помощью ячеек LSTM, совместимых с CuDNN. Такая модель будет работать как на CPU, так и на GPU. Кроме того, насколько мне известно, слои CuDNN LSTM в тензорном потоке важны по времени, поэтому не забудьте транспонировать свои входные данные (я не уверен в этом в последней версии тензорного потока, пожалуйста, подтвердите это).

Для краткого полного примера, основанного на вышеизложенном, ознакомьтесь с сутью Мелгора:

https://gist.github.com/melgor/41e7d9367410b71dfddc33db34cba85f?short_path=29ebfc6

Вы знаете, как это сделать, используя слои Keras?

Antimony 27.02.2019 06:23

Пожалуйста, ознакомьтесь с этим обсуждением @ Yu-Yang и fchollet github.com/keras-team/keras/pull/8307. Кажется, действительно была проблема, и соответствующие изменения были объединены в последнюю ветку keras. Если после обновления keras он по-прежнему не работает, вы можете сделать одно из двух. 1. Скопируйте изменения (выделенные в PR выше) в свои локальные файлы Keras. ИЛИ 2. Получите все обновленное репозиторий Keras по той же ссылке. Надеюсь, поможет!

Tushar Agarwal 01.03.2019 00:43

@OP Примите ответ, если он решил вашу проблему.

Tushar Agarwal 18.05.2019 22:08

@Antimony, я сожалею об этом, и, возможно, я попытаюсь проверить ваш код. Но я прошу вас прояснить всем зрителям ответа, что ваша проблема связана с keras, а не с тем, что спросил OP. OP спросил, как это сделать в тензорном потоке, и я знаю, что это работает, и это способ сделать это.

Tushar Agarwal 19.05.2019 05:51
Reason: tensorflow doesn`t see your GPU

Исправление: установите CUDA Toolkit и cuDNN SDK (совместимый с вашей версией tf), запустите: 'pip uninstall tensorflow'; 'pip install tensorflow-gpu'

Summary:
    1. check if tensorflow sees your GPU (optional)
    2. check if your videocard can work with tensorflow (optional)
    3. find versions of CUDA Toolkit and cuDNN SDK, compatible with your tf version
        (https://www.tensorflow.org/install/source#linux)
    4. install CUDA Toolkit
        (https://developer.nvidia.com/cuda-toolkit-archive)
    5. install cuDNN SDK 
        (https://developer.nvidia.com/rdp/cudnn-archive)
    6. pip uninstall tensorflow; pip install tensorflow-gpu 
    7. check if tensorflow sees your GPU
    * source - https://www.tensorflow.org/install/gpu


Detailed instruction:
    1. check if tensorflow sees your GPU (optional)
        from tensorflow.python.client import device_lib
        def get_available_devices():
            local_device_protos = device_lib.list_local_devices()
            return [x.name for x in local_device_protos]
        print(get_available_devices()) 
        # my output was => ['/device:CPU:0']
        # good output must be => ['/device:CPU:0', '/device:GPU:0']
    2. check if your card can work with tensorflow (optional)
        * my PC: GeForce GTX 1060 notebook (driver version - 419.35), windows 10, jupyter notebook
        * tensorflow needs Compute Capability 3.5 or higher. (https://www.tensorflow.org/install/gpu#hardware_requirements)
        - https://developer.nvidia.com/cuda-gpus
        - select "CUDA-Enabled GeForce Products"
        - result - "GeForce GTX 1060    Compute Capability = 6.1"
        - my card can work with tf!
    3. find versions of CUDA Toolkit and cuDNN SDK, that you need
        a) find your tf version
            import tensorflow as tf
            print(tf.__version__)
            # my output was => 1.13.1
        b) find right versions of CUDA Toolkit and cuDNN SDK for your tf version
            https://www.tensorflow.org/install/source#linux
            * it is written for linux, but worked in my case
            see, that tensorflow_gpu-1.13.1 needs: CUDA Toolkit v10.0, cuDNN SDK v7.4
    4. install CUDA Toolkit
        a) install CUDA Toolkit 10.0
            https://developer.nvidia.com/cuda-toolkit-archive
            select: CUDA Toolkit 10.0 and download base installer (2 GB)
            installation settings: select only CUDA
                (my installation path was: D:\Programs\x64\Nvidia\Cuda_v_10_0\Development)
        b) add environment variables:
            system variables / path must have:
                D:\Programs\x64\Nvidia\Cuda_v_10_0\Development\bin
                D:\Programs\x64\Nvidia\Cuda_v_10_0\Development\libnvvp
                D:\Programs\x64\Nvidia\Cuda_v_10_0\Development\extras\CUPTI\libx64
                D:\Programs\x64\Nvidia\Cuda_v_10_0\Development\include
    5. install cuDNN SDK
        a) download cuDNN SDK v7.4
            https://developer.nvidia.com/rdp/cudnn-archive (needs registration, but it is simple)
            select "Download cuDNN v7.4.2 (Dec 14, 2018), for CUDA 10.0"
        b) add path to 'bin' folder into "environment variables / system variables / path":
            D:\Programs\x64\Nvidia\cudnn_for_cuda_10_0\bin
    6.  pip uninstall tensorflow
        pip install tensorflow-gpu 
    7. check if tensorflow sees your GPU
        restart your PC
        print(get_available_devices()) 
        # now this code should return => ['/device:CPU:0', '/device:GPU:0']

Причина, по которой это не работает, заключается в том, что ваш файл JSON с архитектурой вашей модели все еще настроен для CuDNNLSTM. Keras теперь может автоматически загружать веса CuDNNLSTM в архитектуру LSTM, но это не меняет архитектуру автоматически за вас.

Исправить это просто: откройте файл .json и измените каждый экземпляр CuDNNLSTM на LSTM. Сохраните файл JSON, тогда вы сможете загружать веса из файла .h5.

Другие вопросы по теме