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 секунд

Программатор для ESP8266 esp-01

Последнее время в процессе разработки каплемера приходится постоянно перезаливать в вайфай модуль прошивки.

Поскольку на макетнице собрана рабочая схема каплемера, крайне не удобно, как оказалось, каждый раз, когда возникает необходимость внести изменения в прошивку модуля пересобирать схему программатора, который был реализован, на макетнице, согласно приведенной ниже схеме:


Схема программатора для ESP8266

Данная схема предполагала использование в процессе прошивки двух кнопок, RESET и BURN. И что бы перевести схему в режим заливки прошивки надо было нажать и удерживать BURN, после чего нажать и отпустить RESET и после перезагрузки модуль оказывался в режиме заливки программы.

Так как я использовал в схеме программатора USB-TTL конвертер Silicon Labs CP210x USB to UART Bridge, отличительной особенностью которого было наличие дополнительных выходов, в том числе DTR и RTS, появилась возможность собрать программатор без использования кнопок, с автоматическим переходом в режим прошивки и рестартом после прошивки.
Его принципиальная схема приведена ниже, поскольку вай-фай модули, которые я использую — esp-01, лишние цепи удалены.

Кроме того, поскольку Silicon Labs CP210x USB to UART Bridge имеет 5 вольтовые выходы, а ESP8266 построен на 3.3В логике, в схему добавлен модуль конвертера уровней напряжения цифровых сигналов 5/3.3 В.

На фото ниже — собранный программатор после проверки работоспособности

Мы появились на глобальной карте международной сети ФабЛабов!

Наша лаборатория завершила регистрацию в международной сети ФабЛабов и появились на глобальной карте!

Мы зажгли новую звезду! :)

Orange 4G-IOT

В парке одноплатных компьютеров пополнение, прибыла с Китая новая платка, на фото ниже:

На борту 4 ядерный 64 битный процессор, 1 ГБ ОЗУ, 8 ГБ встроенной флеш памяти, разъем под SD карту, и главное — разъем под симку мобильной сети поддерживающей стандарт 4G!!!

Собственно вот он, на тыльной стороне платы.


Во внутреннюю память залит образ с 6 версией Android, однако на сайте производителя можно скачать, образ диска более новой, 8 версии.

Однако, главная неприятность была в том, что разъем HDMI, установленный на плате, выдает видеосигнал с частотой 48 гц, вместо 60, и с этой частотой не могут работать большинство телевизоров и мониторов. В любом случае планировалась покупка совместимого сенсорного 5.5 дисплея, а по поводу HDMI разъема есть идея попробовать переходник HDMI-VGA для подключения обычного монитора.

Но тем не менее, плата имеет широкие коммуникационные возможности и будет использоваться в цифровом творчестве в проектах ФАБЛАБа.

Подключение считывателя беспроводных радиометок RFID-RC522 к Arduino

Что такое RFID

RFID (радиочастотная идентификация) – это метод обеспечения передачи, записи и хранения данных при помощи радиосигналов. Каждая RFID-система включает в себя считыватель/ридер и RFID-метку, в которой хранятся данные. Метки состоят из двух частей – интегральной схемы и антенны. Интегральная схема позволяет хранить и обрабатывать данные, антенна – принимать и передавать информацию.

Все RFID-системы можно разделить по дальности действия:

  • Ближней идентификации – расстояние не более 20 см;
  • Средней идентификации – расстояние от 20 см до 5 м;
  • Дальней идентификации – максимум 300 м.

С точки зрения частот можно выделить:

  • Системы, работающие в низкочастотном диапазоне (125 кГц, 134 кГц);
  • Работающие в среднечастотном диапазоне (13,56 МГц);
  • Работающие в высокочастотном диапазоне (800 МГц – 2, 4 ГГц).

Наиболее популярным диапазоном является среднечастотным – он широко используется в транспортных приложениях и других проектах, где требуется перезаписывание карт.

Преимущества RFID

  • Не требуется прямая видимость;
  • Практически 100% идентификация сигнала;
  • Возможность применения в агрессивной среде;
  • Долгий срок службы;
  • RFID-метку трудно подделать;
  • Возможность хранения и передачи большого объема информации.

Области применения RFID идентификации

RFID-технология часто используется в розничной торговле, библиотеках и архивах, логистике, системах контроля и управления доступом (СКУД), инициализации людей, удостоверении подлинности товаров.

Для идентификации персонала самым популярным форматом являются пластиковые бесконтактные карты и бесконтактные брелки. С их помощью можно регистрировать вход/выход объектов на территории через точки прохода – ворота, КПП. Основной задачей СКУД является управление доступом — например, ограничение в доступе на какую-либо территорию, идентификация лиц, которые могут попадать на территорию. Также могут решаться и дополнительные задачи – контроль рабочего времени для персонала, ведение базы посетителей, работа с системами безопасности, расчет заработной платы.

Сегодня мы более подробно рассмотрим бесконтактные смарт карты Mifare Classic 1K, поскольку данная технология планируется использоваться сотрудниками ФАБЛАБа в своих проектах.

Бесконтактная RFID карта Mifare Classic 1K содержит энергонезависимую память 1 КБайт для хранения информации. Они могут использоваться в финансовых, платежных системах в качестве электронного кошелька. Одним из примеров использование Mifare карт является бесконтактный проездной документ в метро. В этом случае для персонализации смарт -карт служит считыватель с функцией чтения и записи информации.

Структура памяти.

EEPROM память организована в 16 секторов по 4 блока. Каждый блок содержит 16 байт.

Модуль RFID-RC522 выполнен на микросхеме MFRC522 фирмы NXP. Эта микросхема обеспечивает двухстороннюю беспроводную (до 6 см) коммуникацию на частоте 13,56 МГц.

Способы и протоколы подключения

Интерфейс Скорость передачи
SPI (Serial Peripheral Interface, последовательный интерфейс для связи периферийных устройств) до 10 Мбит/сек;
двухпроводной интерфейс I2C до 3400 кбод в режиме High-speed,
до 400 кбод в режиме Fast;
последовательный UART (аналог RS232) до 1228,8 кбод.

С помощью данного модуля можно записывать и считывать данные с различных RFID-меток: брелоков от домофонов, пластиковых карточек-пропусков и билетов на метро и наземный транспорт, а также набирающих популярность NFC-меток.

Микросхема MFRC522 имеет достаточно обширную функциональность. Познакомиться со всеми возможностями можно изучив её паспорт (datasheet). Мы же для знакомства с возможностями данного устройства воспользуемся одной из готовых библиотек,( https://github.com/miguelbalboa/rfid/archive/master.zip ) написанных для работы Arduino с RC522. Скачайте её и распакуйте в директорию Arduino IDE\libraries\

После этого запустите среду разработки Arduino IDE.

Теперь давайте откроем скетч из примеров: Файл Образцы MFRC522 DumpInfo и загрузим его в память Arduino.

Данный скетч определяет тип приложенного к считывателю устройства и считывает данные, записанные на RFID-метке или карте, а затем выводит их в последовательный порт.

#include <SPI.h>
#include <MFRC522.h>

const int RST_PIN = 9; // пин RST
const int SS_PIN = 10; // пин SDA (SS)

MFRC522 mfrc522(SS_PIN, RST_PIN); // создаём объект MFRC522

void setup() {
	Serial.begin(9600); // инициализация послед. порта
	SPI.begin(); // инициализация шины SPI
	mfrc522.PCD_Init(); // инициализация считывателя RC522
}

void loop() {
	// Ожидание прикладывания новой RFID-метки:
	if ( ! mfrc522.PICC_IsNewCardPresent()) {
		return; // выход, если не приложена новая карта
	}

	// Считываем серийный номер:
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return; // выход, если невозможно считать сер. номер
	}

	// Вывод дампа в послед. порт:
	mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}

Текст скетча достаточно хорошо прокомментирован.

Запустим монитор последовательного порта сочетанием клавиш Ctrl+Shift+M, через меню Инструменты или кнопкой с изображением лупы. Теперь приложим к считывателю билет метро или любую другую RFID-метку. Монитор последовательного порта покажет данные, записанные на RFID-метку или билет.

Подключение датчика угарного газа к arduino

В этом практикуме мы рассмотрим как спроектировать детектор газа CO. Показания
снимаются с датчика MQ7 (MQ-7), который специально разработан, для измерения
окиси углерода (CO) в воздухе в пределах 10 до 1000 ppm. Регулировка чувствительности изменяется с помощью встроенного потенциометра.

Датчик MQ7 (MQ-7), состоит из керамической трубки AL2O3 (оксида алюминия) и нанесенного на нее тонкого слоя SnO2 (диоксид олова). Внутри трубки находится нагревательный элемент, который осуществляет нагрев чувствительного слоя. Сам датчик состоят из пластмассового корпуса и сетки, изготовлено из нержавеющий стали, в нижней части расположены шесть выводов, четыре из которых используются для снятия показаний, а другие два, для нагрева.

Датчик установлен на печатную плату (30 мм х 19 мм) с синий маской, с другой стороны платы, расположено четыре вывода (шаг 2.54 мм),  два контакта для подключения питания и два для считывания показаний (аналоговый и цифровой). Показания, аналогового сигнала «Вывод AO» , снимаются непосредственно с одного из вывода датчика MQ7, значение от 0 В . . . 5 В, а цифровой сигнал  «Вывод DO»,  может устанавливается в лог «0» или лог «1» («0 В» или «5 В»), в зависимости от концентрации газа, чувствительность выхода, можно регулировать с помощью поворотного потенциометра. За преобразовании аналогового сигнала в цифровой отвечает встроенный компаратор LM393, который может выдать ток до 15 мА и дает возможность подключать модули реле без контроллеров. Для визуализации, на плате расположены два светодиода, один светится при подачи питания, второй  светится, когда на «Вывод DO», логическая «0» , то-есть сработал порог включения. Принципиальная схема и назначение каждого вывода датчика MQ7 (MQ-7), показана ниже.

Группа контактов
► +5 — Питание модуля «+»
► GND — Питание модуля «-»
► DOUTЦифровой вывод
► AOUTАналоговый вывод

Подключение датчика MQ7 (MQ-7) к Arduino

Необходимые детали:
► Датчик угарного газа MQ7 (MQ-7) x 1 шт.
► Arduino (nano)x 1 шт.
► Провод DuPont 10x, 2,54 мм, 20 см, F-F (Female — Female) x 1 шт.

Подключение:
В данном примере используем датчик MQ-7 и плату Arduino NANO, все получение показания, отправляем на Serial-порт, а также отображается на семисегментном модуле индикатора. Для сборки схемы, необходимо всего три провода, сначала подключаем аналоговой вывод A1 (MQ7) в A5 (Arduino UNO), затем подключаем питание GND к GND и VCC к 5V. Схема собрана, теперь надо подготовить программную часть.

Запускаем среду разработки Arduino IDE и копируем скетч

#include <TM74HC595Display.h>//поключаем библиотеку семисегментного индикатора
int SCLK = 7;
int RCLK = 6;
int DIO = 5;
TM74HC595Display disp(SCLK, RCLK, DIO);// создаем экземпляр класса индикатора
int AnalogPin=A1;
int AnalogValue=0;

void setup() 
{
Serial.begin(9600);
}
void loop() 
{  
  AnalogValue=analogRead(AnalogPin);
  disp.digit4(AnalogValue, 50);
Serial.println(“CO = “ +AnalogValue); 
delay(20); 
  }

В окне мониторинг порта, можно увидеть показания от 0 до 1023 (от 0 до 5В).

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

В дальнейшем научимся отправлять эти данные в сеть интернет, для организации удаленного мониторирования помещений.

Восстановление сайта после сбоя!

К сожалению в университетском датацентре произошла крупная авария в результате которой полностью удалилось содержимое многих ресурсов, в том числе и KVM сервер, который был выделен под проект и сайт лаборатории. Все наработки потеряны и их приходится восстанавливать, поскольку в большинстве случаев я их создавал просто на сайте…. Но я постараюсь, в ближайшем времени восстановить старый контент и регулярно добавлять новый, поскольку работа идет ежедневно! :)