Пространство решений

Я тут почитал обсуждения вокруг моего прошлого поста по работе с регулярными выражениями и упоминания про FPGA и не только и вспомнился мне мой личный опыт по работе с FPGA и вообще решением сложных задач. К тому же NDA у меня давно уже истёк так что можно рассказывать.

Много лет тому назад я работал в отделе качества одной небольшой компании работающей в области биометрических технологий — конкретно идентификации и авторизации людей по отпечаткам пальцев. Причём работал я там практически с самой начальной позиции занимался поначалу банальным ручным тестированием и превращением юзкейсов в тесткейсы. Но будучи человеком ленивым и чрезмерно любопытным одновременно, довольно скоро я придумал способ как автоматизировать большую часть тесткейсов, вплоть до того, что после прихода нового билда продукта — старая версия автоматически деинсталлировалась, новая устанавливалась, прогонялись все тесты и рассылалось письмо с результатами тестирования пока я мирно попивал чай или читал какие-нибудь интересные книжки или автоматизируя ещё что-нибудь.

Как бы то ни было вероятно я и выглядел как наиболее незагруженный сотрудник поскольку когда возникла задача по приёмке и тестированию специально FPGS-девайса я и оказался тем кому это поручили.

Собственно что это было и какова предыстория. У компании существовало несколько продуктов по работе с отпечатками пальцев — клиентские приложения, сервер, библиотеки и так далее. Однако у всех из них были ограничение в виде числа отпечатков которые могли бы хранится в базе продукта. Ограничение это происходило от того что для сравнения отпечатков использовался специальный алгоритм, вернее семейство алгоритмов которые могли:

а. Преобразовать картинку отпечатка пальцев в специальную модель.

б. Проводить нечёткое сравнение одной модели с другими.

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

И как раз для этой цели компания заказала разработку специального FPGA-девайса который мог бы обрабатывать ну очень много отпечатков, до сотен тысяч и более.

Девайс этот был разработан и передан нам в отдел качества в формате «надо принять». А то есть было понятно что он как-то работает, но разработка извне никак не курировалась, документации было минимум, никаких тесткейсов и так далее.

Собственно что это было. Это был действительно мощный компьютер со встроенным Linux’ом с огромным числом спец-процессоров в которые заливалась специальная прошивка с алгоритмом, а далее заливались модели отпечатков пальцев, вплоть до миллиона отпечатков. Далее в девайс должны были отправлять отдельные отпечатки на сравнение и он возвращал ID’шники отпечатков ранее в него загруженных прогоняя задачу через все процессоры. Девайс был реально ОЧЕНЬ БЫСТРЫМ то есть возникни задача загрузить в него миллион настоящих отпечатков, то он мог бы в проводить аутентификацию по новым в течении нескольких секунд.  Те кто сталкивался с подобными задачами знают насколько это непросто.

Однако, были и свою нюансы и с избытком. Первый и ключевой нюанс в том что девайс работал через TCP/IP где у него был специальный демон через который загружались прошивки, модели отпечатков и модели на аутентификацию. Этот демон работал асинхронно, работать с ним было реально непросто и многих возможностей нехватало.

Второй нюанс был в том что при нагрузочном тестировании время от времени у него «отключались» отдельные процессоры, а то есть переставали по тем или иным причинам отвечать, видимо из-за каких-то внутренних программно-аппаратных проблем о которых могли знать только его разработчики.

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

И что делать? Особенно что делать мне как человеку весьма ленивому, а тут не не до лени — надо бы заставить эту штуку работать хоть как-то. Кроме того разработчиков тоже больше одного и у них тоже конфликты кто и как с устройством работает.

Моё решение было очень простым. Я хорошенько покопался в документации и клиентских библиотеках и написал свой эмулятор этого девайса на Python. Эмулятор мог быть установлен на любой компьютер и поддерживал  все команды этого девайса. Вплоть до того что к нему была прикручена библиотека для матчинга отпечатков от серверного продукта и он мог сравнивать небольшое число отпечатков, до тысячи. То есть это был не только полнофункциональный эмулятор, а практически сервер и с ним то мы все дружно и заработали. Далее последовательно по мере обнаружения я добавлял в эмулятор новые фичи по эмуляции известных багов девайса и опять же смог автоматизировать всё что только можно отработав все свои тесты на десятках эмуляторов одновременно.

Однако мою идею в том что можно использовать кластер из моих «эмуляторов» вместо одного FPGA-устройства тогда не поддержали. Увы и ах, а было бы интересно если бы было по другому.

К чему я обо всём этом пишу. У каждой задачи и у каждого решения есть своя специфика и пространство решений может быть куда шире чем оптимизация алгоритмов. В данном случае алгоритм был закрытым и был коммерческой тайной компании, возможности по его оптимизации были у единиц и то врядли, оставались только аппаратные и кластерные решения и они работали более чем успешно.

Лично я тогда приобрёл опыт в том что некоторые решения могут быть весьма некрасивыми, но объективно необходимыми и действенными. И каким-бы ни был тот самый FPGA-девайс с точки зрения его сопровождения, он был одним из немногих способных решать такие задачи.

About This Author

Яндекс.Метрика