Как использовать Tensorflow GPU в приложении C ++ UWP? - PullRequest
0 голосов
/ 15 января 2019


Я пытаюсь запустить tenorflow-gpu в моем приложении C ++ UWP, но, к сожалению, оно использует только процессор.

Моя настройка следующая:
Платформа ОС: Windows 10
Версия TensorFlow: 1.12.0
Версия CUDA / cuDNN: у меня есть две конфигурации (CUDA 10.0 / cuDNN 7.3 для CUDA 10.0) и (CUDA 9.0.17 и cuDNN 7.3 для CUDA 9.0)
Модель и память графического процессора: Nvidia GTX1060
Среда: Visual Studio 2017 15,9

Я установил тензор потока из разных источников:
https://github.com/Neargye/tensorflow/releases
https://github.com/fo40225/tensorflow-windows-wheel
https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-gpu-windows-x86_64-1.12.0.zip
а также скачал tenorflow-gpu для python с использованием anaconda (затем тензор потока в скрипте python использует GPU).

Я скопировал все файлы lib / dll в выходной каталог, установил конфигурацию компоновщика (я также добавил все возможные файлы CUDA / cuDNN и протестировал их комбинации), но ничего не работает.

Я проверяю, видит ли тензорный поток GPU, используя следующий код:

std::string getGPUDeviceName(TF_Session* session) 
{
    std::unique_ptr<TF_Status, decltype(&TF_DeleteStatus)> status(
        TF_NewStatus(), TF_DeleteStatus);

    std::unique_ptr<TF_DeviceList, decltype(&TF_DeleteDeviceList)> list(
        TF_SessionListDevices(session, status.get()), TF_DeleteDeviceList);
    auto device_list = list.get();

    auto num_devices = TF_DeviceListCount(device_list);
    for (auto i = 0; i < num_devices; ++i) {
        auto device_name = TF_DeviceListName(device_list, i, status.get());
        auto device_type = TF_DeviceListType(device_list, i, status.get());

        if (device_type == DEVICE_GPU)
        {
            return device_name;
        }
    }
    // No GPU device found.
    return "";
}

std::string getGPUDeviceName() 
{
    std::unique_ptr<TF_Status, decltype(&TF_DeleteStatus)> status(TF_NewStatus(), TF_DeleteStatus);
    std::unique_ptr<TF_Graph, decltype(&TF_DeleteGraph)> graph(TF_NewGraph(),
                                                                TF_DeleteGraph);

    std::unique_ptr<TF_SessionOptions, decltype(&TF_DeleteSessionOptions)> opts (TF_NewSessionOptions(), 
                                                                                    TF_DeleteSessionOptions);
    std::unique_ptr < TF_Session, std::function<void(TF_Session*)>> sess(
        TF_NewSession(graph.get(), opts.get(), status.get()),
        [statusPtr = status.get()](auto sess) {TF_DeleteSession(sess, statusPtr); });

    return getGPUDeviceName(sess.get());
}

Понятия не имею, что я могу сделать больше в этой теме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...