Deeplearning4j теперь работает и на GeForce 30** видеокартах!

Ранее нам удалось зафиксировать значительный прирост производительности в процессе обучения искусственных нейронных сетей с использованием новой видеокарты GeForce 3090. Видеокарту удалось запустить в Keras, используя только что вышедшее обновление TensorFlow в версии для GPU.

Однако эти решения используют Python, который при всех его положительных качествах (возможность быстрого прототипирования нейронных сетей, развитые библиотеки для работы с данными, простота и скорость разработки приложений) плохо подходит для многопоточных задач, когда в пределах одного приложения надо получать данные с устройства в реальном масштабе времени, обрабатывать их, подавать на вход INN, сохранять в файл, управлять внешними устройствами, рисовать данные на экране и т.д.

Поэтому необходимо было получить возможность работать с INN в Java-приложениях, но с этим из-за использования слишком нового «железа» возникли трудности. Описанными в мануалах способами GPU никак не хотел подключаться, и решения на тематических форумах на сайте разработчиков и GitHub не было, а те рецепты решения проблемы, которые советовали разработчики, не помогали.

Возникло понимание, что причина проблемы — в несовместимости ряда библиотек, компонентов фреймфорка, с новыми библиотеками CUDA от NVIDIA.

Пришлось скачивать исходники и пытаться собирать библиотеки под необходимые платформы: CUDA 11.* и CuDNN 8.*, что оказалось нетривиальной задачей: имелось несколько тысяч файлов и масса условий окружения для нормальной сборки, а мануалы описывали сборки устаревших версий и не работали с новыми.

Кроме того, в исходных кодах возникали некоторые ошибки компиляции, одинаковые как для компиляции из Windows 10 (VS2019), так и из Ubuntu (gcc).

Удалось скомпилировать, после правки исходных кодов, часть зависимых библиотек проекта — libnd4j, а затем уже с ними библиотеку nd4j-cuda-11.1.

Ранее поддержка проекта рекомендовала использовать snapshots — версии библиотек из специального репозитория:

«@RkVladimir @mouradski we’ll be releasing a version with 11.0 in a bit, for now you can use snapshots and see if that works? https://deeplearning4j.konduit.ai/config/config-snapshots«

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

https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=org.nd4j&a=nd4j-cuda-11.0&v=1.0.0-SNAPSHOT&e=jar&c=windows-x86_64
404 — Not Found
Path /org/nd4j/nd4j-cuda-11.0/1.0.0-SNAPSHOT/nd4j-cuda-11.0-1.0.0-20201117.023522-181-windows-x86_64.jar not found in local storage of repository «Snapshots» [id=snapshots]

Что и обусловило компиляцию недостающих файлов. К счастью, версия deeplearniung4j для 11.0 версии CUDA импортировалась, и, добавив в проект в виде отдельных jar и dll файлов скомпилированные библиотеки, удалось запустить приложение на видеокарте!

Часть POM файла работоспособного проекта:

<groupId>org.example</groupId>
    <artifactId>dl4jCuda</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>

        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-cuda-11.0</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-core</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.deeplearning4j</groupId>
            <artifactId>deeplearning4j-ui</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
  </dependencies>


Скомпилированные библиотеки добавлены в зависимости вручную:



Использование GPU в задаче обучения рекуррентной нейронной сети. Исходные данные — временные ряды — данные ЭЭГ исследований. Видна небольшая загрузка GPU (10-15%) и низкая загрузка ресурсов CPU.


25 секунд, сильно зависит от программной реализации, объема данных и может сильно варьировать в зависимости от архитектуры сети.

В данном случае — обучение на сравнительном не большом объеме данных заняло 42 минуты 37 секунд, на CPU эта же задача выполнялась более 2500 минут.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *