Ранее нам удалось зафиксировать значительный прирост производительности в процессе обучения искусственных нейронных сетей с использованием новой видеокарты 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>
Скомпилированные библиотеки добавлены в зависимости вручную:
В данном случае — обучение на сравнительном не большом объеме данных заняло 42 минуты 37 секунд, на CPU эта же задача выполнялась более 2500 минут.