Практика у Таврического колледжа

Мы снова с удовольствием принимаем на производственную практику студентов 3 курса Таврического колледжа КФУ.

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

Ранее я описывал, что удалось зафиксировать значительный прирост производительности в процессе обучения искусственных нейронных сетей с использованием новой видеокарты GeForce 3090! Тогда новую видеокарту удалось запустить в KERAS, используя в качестве BACKEND только что вышедшее обновление tensorflow в версии для gpu.

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

По этому, все таки хотелось иметь возможность, работать с ИНН в 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 секунд