Русский
Русский
English
Статистика
Реклама

Дешевый сервер

Чем поживиться айтишнику на барахолке?

28.05.2021 10:14:13 | Автор: admin


Приезжая в Питер, нужно обязательно посетить Эрмитаж, Русский музей и блошиный рынок на Уделке. Я бываю там не менее пары раз в год и хожу в это уникальное место, как в музей. Там можно найти не просто всё, а вообще всё, даже то, чего искать не собирался. Антикварную посуду и копаные старинные монеты, советские документы и виниловые пластинки, самовары и пионерские горны, а еще кучу всевозможного барахла, которое слегка помятые граждане продают прямо с разложенных на земле клеёнок.

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




В очередной свой визит на Уделку я вдруг подумал: а отчего бы не взглянуть на этот блошиный рынок глазами айтишника? И я стал целенаправленно высматривать среди разложенного под ногами прохожих барахла всевозможные компьютерные девайсы, интересоваться ценами, торговаться. Понятно, что покупка любой техники сложнее лопаты на барахолке это всегда лотерея. Работает устройство, или нет большой вопрос, проверить обычно не представляется возможным, остается только верить на слово продавцам. Но тем интереснее. Я люблю приятные сюрпризы. Итак, чем же может поживиться айтишник на блошином рынке, кроме кучи анонимных сим-карт от основных операторов, что продаются там на каждом углу?



Среди стареньких видях форм-фактора PCI и AGP, а также разбросанных тут и там модулей памяти иногда попадаются почти целые устройства. Например, вот за этот очаровательный Acer Aspire 5030 на AMD Turion 64 продавец попросил 1000 рублей, но ноут оказался без блока питания, нижней крышки и со снятым кулером. Потому покупать его я отказался. Цена тут же упала до 700 рублей, но я остался непреклонен.



Нетбук Samsung выглядит так, словно по нему долго топтался Камаз. Без аккумулятора и винта продавец оценил его в 500 рублей, материнку отдавал за полтиник.



Поблизости обнаружилась целая коробка роутеров выбирай на любой вкус: от 50 до 150 рублей. Работоспособность, ясное дело, величина неизвестная.



Обалденная вещь винтажный механический арифмометр, жутко тяжёлый, но очень атмосферный. Неисправен, но можно отреставрировать, либо просто поставить на полку как есть и пугать им гостей. 150 рублей.



Китайские 3D-ручки по 300 рублей: где-то неисправен двигатель подачи пластика, где-то нагревательный элемент. При желании можно собрать из двух одну рабочую.



Планшет Samsung Galaxy Tab 3 с треснутым экраном, 300 рублей. Включать, по словам продавца, не пробовали. Когда, повертев в руках, я положил его на место, владелец вкрадчиво спросил: Что, дорого? А за сколько возьмешь?.



Материнка ASUS P5GDC-V на 915-м чипсете с каким-то камнем на борту, по уверениям хозяина, исправная. Стольник. Платы серии P5 у ASUS вообще практически вечные, так что на ее базе вполне можно собрать какую-нибудь пишущую машинку. За дополнительный стольник продавец предложил выбрать из обувной коробки для нее какой-нибудь оперативки там была представлена целая куча россыпью.



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



Системник в сборе от несуществующей уже ныне фирмы Кей. Характеристики неизвестны. Степень исправности неизвестна. Населена вирусами. Цена? Триста (шутка про тракториста). В принципе, один блок питания там стоит примерно столько же. Если он работает, конечно.



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



Единственное стопроцентно работающее вычислительное устройство на рынке счеты канцелярские деревянные. 150 рублей. Всю жизнь мечтал научиться с ними обращаться, да так и не удосужился.



Мониторов разной размерности и калибров на рынке продается уйма, прайс, опять таки, начинается от 300 рублей. При желании можно купить и слегка побитый телевизор во всю стену для просмотра любимых сериальчиков. На вопрос сколько стоит? продавец лукаво поинтересовался: а сколько дашь?. Да нисколько: я это чудовище на себе просто не утащу.



Среди покоцаных и не очень планшетов я внезапно обнаружил первый iPad на 64 гига, модель А1337. Айпэд явно летал углом на твердую поверхность, но экран и тач не пострадали, корпус тоже оказался не слишком сильно затерт аппарат определенно берегли и носили в чехле. Купил за 300 рублей.



Вскрытие показало, что в результате падения на шлейфе зарядки отлетел один из навесных элементов, из-за чего аккумулятор оказался высажен в нуль и больше не заряжается. Так что залочен планшет, или нет, проверить не удалось. После замены шлейфа узнаем :).

Понятно, что какую-то серьезную выгоду от путешествий на блошиный рынок получить трудно: продают там, в основном, хлам, да и тот в сильно убитом состоянии. Ну, например, тот же iPad можно загнать на Авите по запчастям примерно за 1500 (один дисплейный модуль легко уйдет за 1000), но это, признаться, так себе бизнес. Я посещаю барахолки по иной причине. Там нужно наслаждаться атмосферой, неторопливо прогуливаясь меж рядами, а потом купить какой-нибудь старый винрарный девайс, чтобы отремонтировать его и радоваться полученному результату.

Так я отреставрировал несколько старых ноутбуков родом из 90-х (включая великолепный Apple PowerBook), классическую букашку БК 0010-01 А еще исполнил детскую мечту приобрел на рынке и привел в порядок редкую игру от завода Электроника, родственницу знаменитой Ну, погоди!. Правда, в моей Электронике с романтическим названием Тайны океана главным героем выступает не Волк с корзинкой, собирающий куриные яйца, а осьминог, который ловит водолазов.



В целом, прогулка по барахолке позволяет не просто хорошо провести время, но и поностальгировать: где еще вы найдете такой же очаровательный развал с фильмами и музыкой разных эпох? Можно приобрести на соседнем лотке плеер Квазар, вставить в него батарейки, взять за стольник аудиокассету, и под залихватские аккорды Юры Хоя отправляться на поиски приключений. Я здоровый, как кабан, я имею свой баян Годы идут, а вечные ценности остаются!



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Швейцарский нож науки как методы Computer Science используются в других дисциплинах

28.05.2021 16:10:14 | Автор: admin

Математику часто называют языком науки. Она хорошо приспособлена для количественной обработки практически любой научной информации, независимо от ее содержания. А при помощи математического формализма ученые из разных областей могут в какой-то степени понимать друг друга. Сегодня похожая ситуация складывается с Computer Science. Но если математика это язык науки, то CS её швейцарский нож. Действительно, трудно представить современные исследования без анализа и обработки огромных объемов данных, сложных вычислений, компьютерного моделирования, визуализации, применения специального ПО и алгоритмов. Разберем несколько интересных сюжетов, когда разные дисциплины используют методы CS для решения своих задач.

Биоинформатика: от чашек Петри к биологии In silico


Биоинформатику можно назвать одним из самых ярких примеров стыка CS и других дисциплин. Эта наука занимается анализом молекулярно-биологических данных при помощи компьютерных методов. Биоинформатика как отдельное научное направление появилась в начале 70-х годов прошлого века, когда впервые были опубликованы нуклеотидные последовательности малых РНК и созданы алгоритмы предсказания их вторичной структуры (пространственного расположения атомов в молекуле).

С проекта Геном человека по определению последовательности нуклеотидов в ДНК человека и идентификации генов в геноме началась новая эра биоинформатики. Стоимость секвенирования ДНК (определение последовательности нуклеотидов) упала на несколько порядков. Это привело к колоссальному увеличению числа последовательностей в публичных базах данных. На графике ниже изображен рост количества последовательностей в публичной базе данных GenBank с декабря 1982 года по февраль 2017 в полулогарифмическом масштабе. Чтобы накопленные данные стали полезными их нужно каким-то образом проанализировать.


Рост числа последовательностей в GenBank c декабря 1982 по февраль 2017. Источник: www.ncbi.nlm.nih.gov/genbank/statistics

Одним из методов анализа последовательностей в биоинформатике является их выравнивание. Суть метода заключается в том, что последовательности мономеров ДНК, РНК или белков размещаются друг под другом таким образом, чтобы увидеть сходные участки. Сходство первичных структур (то есть последовательностей) двух молекул может отразить их функциональную, структурную или эволюционную связь. Так как последовательность можно представить в виде строки с определенным алфавитом (4 нуклеотида для ДНК и 20 аминокислот для белка), то выравнивание оказывается комбинаторной задачей из CS (например, выравнивание строк также используется в обработке естественного языка NLP). Однако контекст биологии добавляет в задачу некоторую специфику.

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


Пример выравнивания аминокислотных последовательностей двух белков. Синим цветом выделены лейцин (L) и изолейцин (I), являющиеся изомерами такая замена в большинстве случаев не отражается на структуре белка

Однако, как определить, оптимальное ли получилось выравнивание? Первое, что приходит в голову, это оценить количество совпадений: чем больше совпадений, тем лучше. Однако в контексте биологии это не совсем так. Замены (замещения одной аминокислоты другой) неравноценны: некоторые замены (например, S и T, D и E остатки, отличающиеся по структуре ровно на один атом углерода) практически не отражаются на структуре белков. А вот замена серина на триптофан сильно изменит структуру молекулы. Для определения, является ли выравнивание лучшим из всех возможных, вводят количественный критерий (вес или счет). Для оценки замен используют так называемые матрицы замены, основанные на статистике замены аминокислот в белках с известной структурой. Чем больше число на пересечении сопоставленных букв, тем больше счет.


Периодически появляются новые матрицы замен. Здесь представлена матрица BLOSUM62

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


Теперь о самих алгоритмах выравнивания. Выделяют два вида парного выравнивания (нахождение сходных участков двух последовательностей): глобальное и локальное. Глобальное выравнивание подразумевает, что последовательности гомологичны (схожи) по всей длине. В него включаются обе последовательности целиком. Однако при таком подходе не всегда хорошо определяются схожие участки, если их мало. Локальное выравнивание применяют, если последовательности содержат как гомологичные (например, из-за рекомбинации), так и неродственные участки. Но оно не всегда может попасть в интересующий участок, к тому же существует вероятность встречи случайного схожего участка. Для получения парного выравнивания используют методы динамического программирования (решение задачи путем её разбиения на несколько одинаковых подзадач, связанных рекуррентно). В программах для глобального выравнивания часто используют алгоритм Нидлмана-Вунша, а для локального алгоритм Смита-Ватермана. Подробней о них можно прочитать по ссылкам.


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

Как видим, биологическую задачу вполне можно свести к задаче из CS. При парном выравнивании с использованием упомянутых алгоритмов требуется порядка m*n дополнительной памяти (m, n длины последовательностей), с чем легко справятся современные домашние компьютеры. Однако в биоинформатике существуют и более нетривиальные задачи, например множественное выравнивание (выравнивание нескольких последовательностей) для реконструкции филогенетических деревьев. Даже если сравнить 10 очень маленьких белков с длиной последовательности около 100 символов, то потребуется непозволительно много дополнительной памяти (размерность массива 100^10). Поэтому в таком случае выравнивание строится на базе различных эвристик.

Моделирование крупномасштабной структуры Вселенной


В отличие от биологии, физика идет бок о бок с Computer Science со времен появления первых ЭВМ. До создания первых компьютеров словом computer (вычислитель) называлась специальная должность это были люди, выполнявшие на калькуляторах математические вычисления. Так в ходе Манхэттенского проекта физик Ричард Фейнман был управляющим целой команды вычислителей, которые обрабатывали дифференциальные уравнения на арифмометрах.


Вычислительная комната Лётно-исследовательского центра им. Армстронга. США, 1949 год

На данный момент методы CS широко применяются в различных областях физики. Например, вычислительная физика изучает численные алгоритмы решения физических задачи, для которых количественная теория уже разработана. В ситуациях, когда непосредственное наблюдение объектов затруднено (такое часто бывает в астрономии), на помощь ученым приходит компьютерное моделирование. Именно таким случаем является изучение крупномасштабной структуры Вселенной: наблюдения далеких объектов затруднены из-за поглощения электромагнитного излучения в плоскости Млечного Пути, поэтому основным методом исследования стало моделирование.


Крупномасштабная структура Вселенной напоминает систему прожилок и волокон, разделенных пустотами

Одна из задач современной космологии объяснение наблюдаемой картины многообразия галактик и их эволюции. На качественном уровне физические процессы, происходящие в галактиках, сейчас известны, поэтому усилия ученых направлены на получение количественных предсказаний. Это позволит ответить на ряд фундаментальных вопросов, например о свойствах темной материи. Но, прежде чем выделить наблюдаемые проявления темной материи, необходимо разобраться с поведением обычной материи. На огромных масштабах (несколько миллионов световых лет) обычная материя эффективно ведет себя так же, как и темная: она подвержена одной силе гравитации, про давление газа можно забыть. Это позволяет сравнительно просто моделировать эволюцию крупномасштабной структуры Вселенной (Численные методы, содержащие только темную или пылевидную материю и хорошо воспроизводящие крупномасштабную структуру распределения галактик, начали развиваться с 1980-х годов).

Моделирование темной материи происходит следующим образом. Виртуальный куб, имеющий размеры в сотни миллионов световых лет, почти равномерно заполняют пробными частицами телами. С самого начала во Вселенной присутствовали малые неоднородности, из которых и возникла вся наблюдаемая структура, поэтому заполнение почти равномерное. Затем частицы начинают жить собственной жизнью под действием силы тяготения: решается задача N тел. Вылетевшие за границу куба частицы переносятся на противоположную грань, силы тяготения также распространяется с переносом. Благодаря этому куб становится как бы бесконечным, как и Вселенная.


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

Одной из самых известных численных моделей такого типа Millenium, имеющая размер куба более 1.5 млрд световых лет и около 10 млрд частиц. В последующие годы было выполнено несколько моделей большего объема: Horizon Run с размером стороны куба в 4 раза больше, чем Millenium, и Dark Sky с размером в 16 раз больше Millenium. Эти и подобные модели сыграли ключевую роль в проектах по проверке общепризнанной сейчас модели Лямбда-CDM (Вселенная, содержащая около 70% темной энергии, 25% темной материи и 5% обычной материи).


В верхнем ряду показано распределение галактик в модели Millenium: слева моделирование для скопления галактик, где их можно увидеть по отдельности; справа для очень больших масштабов. Верхнее правое изображение представляет крупномасштабное распределение света во Вселенной. Для сравнения на изображениях в нижнем ряду приведены соответствующие распределения темной материи

При уменьшении масштабов возникают проблемы в соответствии наблюдений и численных моделей с одной темной материей. На более малых масштабах (масштабы распространения ударных волн от сверхновых) материю уже нельзя считать пылевидной. Необходимо учитывать гидродинамику, остывание и нагревание газа излучением и много чего еще. Для учета всех законов физики в моделировании делают некоторые упрощения: например, можно разбить модельный куб на решетку из ячеек (субрешёточная физика), и считать, что при достижении в ячейке некоторый плотности и температуры часть газа мгновенно превратится в звезду. К такому классу моделей относятся проекты EAGLE и illustris. Один из результатов этих проектов воспроизведение соотношения Талли-Фишера между светимостью галактики скоростью вращения диска.

Лингвистика и машинное обучение: на один шаг ближе к разгадке 4000-летней тайны


Методы CS находят применения и в более неожиданных сферах, например в изучении древних языков и систем письма. Так исследование группы ученых под руководством Раджеша П. Н. Рао, профессора Вашингтонского университета, пролило свет на тайну письменности долины Инда.

Письменность Инда, использовавшаяся между 2600-1900 года до нашей эры на территории нынешнего Восточного Пакистана и северо-западной Индии, принадлежала цивилизации не менее сложной и загадочной, чем ее месопотамские и египетские современники. От нее осталось чрезвычайно мало письменных источников: археологи обнаружили лишь около 1500 уникальных надписей на фрагментах керамики, табличек и печатей. Длина самой длинной надписи составляет всего 27 знаков.


Надписи на печатях из долины Инда

В научной среде существовали разные гипотезы насчет загадочных символов. Некоторые специалисты считали символы не более, чем просто красивыми картинками. Так в 2004 году лингвист Стив Фармер опубликовал статью, в которой утверждалось, что письменность Инда является не чем иным, как политическими и религиозными символами. Его версия, хоть и являлась спорной, но все-таки нашла своих сторонников.

Раджеша П. Н. Рао, специалист по машинному обучению, читал о письменности Инда в старшей школе. Группа ученых под его руководством решила провести статистический анализ существующих достоверных документов. В ходе исследований при помощи цепей Маркова (одна из первых дисциплин, в которой цепи Маркова нашли практическое применения, стала текстология) сравнивалась условная энтропия символов из письменности Инда с энтропией лингвистических и нелингвистических последовательностей знаков. Условная энтропия это энтропия для алфавита, для которого известны вероятности появления одной буквы после другой. Для сравнения было выбрано несколько систем. В лингвистические системы входили: шумерское логографическое письмо, старо-тамильская абугида, санскрит Риг-веды, современный английский (слова и буквы исследовались отдельно) и язык программирования Фортран. Нелингвистические системы разделили на две группы. К первой относились системы с жёстким порядком знаков (искусственный набор знаков 1), ко второй системы с гибким порядком (белки бактерий, ДНК человека, искусственный набор знаков 2). В результате выяснилось, что протоиндийская письменность оказалась умеренно упорядоченной, как письменность разговорных языков: энтропия существующих документов сходна с энтропией шумерской и тамильской письменности.


Условная энтропия для различных лингвистических и нелингвистических систем

Такой результат опроверг гипотезы об орнаментальном использовании знаков. И хотя методы CS помогли подтвердить версию о том, что символы из долины Инда скорее всего являются системой письма, до расшифровки дело пока не дошло.

Заключение


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



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Перевод Альтернатива ML-Agents интегрируем нейросети в Unity-проект с помощью PyTorch C API

05.06.2021 10:15:16 | Автор: admin


Кратко объясню, что будет происходить в этой статье:

  • покажу, как использовать PyTorch C++ API для интеграции нейросети в проект на движке Unity;
  • сам проект я подробно описывать не буду, это не имеет значения для данной статьи;
  • использую готовую модель нейросети, преобразовав её трассировку в бинарник, который будет подгружаться в рантайме;
  • покажу, что такой подход существенно облегчает деплой сложных проектов (например, нет проблем с синхронизацией сред Unity и Python).

Добро пожаловать в реальный мир


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

Другими словами, мне нужно превратить исследовательский проект на PyTorch в готовое решение, способное вместе с движком Unity работать в боевых условиях.

Можно несколькими способами интегрировать нейронную сеть в Unity. Я предлагаю использовать C++ API для PyTorch (под названием libtorch) для создания нативной разделяемой библиотеки, которую затем можно будет подключить к Unity как плагин. Существуют и другие подходы (например, использовать ML-Agents), которые в определённых случаях могут быть проще и эффективнее. Но преимущество моего подхода заключается в том, что он обеспечивает большую гибкость и даёт больше возможностей.

Допустим, у вас есть какая-то экзотическая модель и вы просто хотите использовать существующий PyTorch-код (который был написан без намерения общаться с Unity); или ваша команда разрабатывает собственную модель и не хочет отвлекаться на мысли о Unity. В обоих случаях код модели может быть сколь угодно сложным и использовать все возможности PyTorch. А если вдруг дело дойдёт до интеграции, в игру вступит C++ API и завернёт всё в библиотеку без малейшего изменения изначального PyTorch-кода модели.

Итак, мой подход сводится к четырём ключевым шагам:

  1. Настройка окружения.
  2. Подготовка нативной библиотеки (C++).
  3. Импорт функций из библиотеки / подключение плагина (Unity / C#).
  4. Сохранение / развёртывание модели.


ВАЖНО: поскольку я делал проект, сидя под Linux, некоторые команды и настройки отталкиваются от этой ОС; но не думаю, что здесь что-либо должно слишком зависеть от неё. Поэтому вряд ли подготовка библиотеки под Windows вызовет трудности.

Настройка окружения


Прежде чем устанавливать libtorch, убедитесь, что у вас есть

  • CMake

А если хотите использовать GPU, вам потребуются:


С CUDA могут возникнуть сложности, потому что драйвер, библиотеки и прочая хурма должны дружить между собой. И вам придётся поставлять эти библиотеки вместе с Unity-проектом чтобы всё работало из коробки. Так что для меня это самая неудобная часть. Если вы не планируете использовать GPU и CUDA, то знайте: вычисления замедлятся в 50100 раз. И даже если у пользователя довольно слабый графический процессор лучше с ним, чем без него. Даже если ваша нейросеть включается в работу довольно редко, эти редкие включения приведут к задержке, которая будет раздражать пользователя. Возможно, в вашем случае всё будет иначе, но нужен ли вам этот риск?

После того, как вы установили означенное выше ПО, пора загрузить и (локально) установить libtorch. Необязательно устанавливать для всех пользователей: можно просто поместить её в каталог своего проекта и обратиться к нему при запуске CMake.

Подготовка нативной библиотеки


Следующий шаг конфигурирование CMake. Я взял за основу пример из документации PyTorch и изменил его так, чтобы после сборки мы получали библиотеку, а не исполняемый файл. Положите этот файл в корневой каталог вашего проекта с нативной библиотекой.

CMakeLists.txt

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)project(networks)find_package(Torch REQUIRED)set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS})add_library(networks SHARED networks.cpp)target_link_libraries(networks ${TORCH_LIBRARIES})set_property(TARGET networks PROPERTY CXX_STANDARD 14)if (MSVC)file(GLOB TORCH_DLLS ${TORCH_INSTALL_PREFIX}/lib/*.dll)add_custom_command(TARGET networksPOST_BUILDCOMMAND ${CMAKE_COMMAND} -E copy_if_different${TORCH_DLLS}$<TARGET_FILE_DIR:example-app>)endif (MSVC)

Исходный код библиотеки будет размещён в networks.cpp.

В этом подходе есть ещё одна приятная особенность: нам пока не нужно думать, какую именно нейронную сеть мы хотим использовать с Unity. Причина (немного забегая вперед) заключается в том, что мы в любой момент можем запустить сеть в Python, получить её трассировку и просто сказать libtorch применить эту трассировку для этих входов. Поэтому, можно сказать, что наша нативная библиотека просто обслуживает некий чёрный ящик, работая с вводом-выводом.

Но если вы хотите усложнить задачу и, например, реализовать обучение сети прямо во время работы среды Unity, то вам придётся написать на C++ архитектуру сети и обучающий алгоритм. Однако это выходит за рамки данной статьи, поэтому для получения дополнительной информации я отсылаю вас к соответствующему разделу документации PyTorch и репозиторию с примерами кода.

В любом случае, в network.cpp нам нужно определить внешнюю функцию для инициализации сети (загрузка с диска) и внешнюю функцию, которая запускает сеть с входными данными и возвращает результаты.

networks.cpp

#include <torch/script.h>#include <vector>#include <memory>extern C{// This is going to store the loaded networktorch::jit::script::Module network;

Чтобы вызывать функции нашей библиотеки непосредственно из Unity, нужно передать информацию об их точках входа. В Linux я использую для этого __attribute__((visibility(default))). В Windows для этого существует спецификатор __declspec( dllexport ), но, честно говоря, я не проверял, работает ли он там.

Итак, начнём с функции загрузки трассировки нейросети с диска. Файл имеет относительный путь он лежит в корневом каталоге проекта Unity, а не в Assets/. Так что будьте внимательны. Вы также можете просто передать имя файла из Unity.
extern __attribute__((visibility(default))) void InitNetwork(){network = torch::jit::load(network_trace.pt);network.to(at::kCUDA); // If we're doing this on GPU}

Теперь перейдём к функции, которая кормит сеть входными данными. Напишем на С++ код, который использует указатели (ими управляет Unity) для перегонки данных туда и обратно. В этом примере я полагаю, что моя сеть имеет входы и выходы фиксированной размерности и запрещаю Unity менять это. Здесь, например, я возьму Tensor {1,3,64,64} и Tensor {1,5,64,64} (например, такая сеть нужна для сегментации пикселей RGB-изображений на 5 групп).

В общем случае вам придётся передать информацию о размерности и объёме данных, чтобы избежать переполнения буфера.

Чтобы преобразовать данные в формат, с которым работает libtorch, мы используем функцию torch::from_blob. Она принимает массив чисел с плавающей запятой и описание тензора (с указанием размерности) и возвращает созданный Тензор.

Нейросети могут принимать несколько входных аргументов (например, вызов forward () принимает x, y, z в качестве входных данных). Чтобы справиться с этим, все входные тензоры упаковываются в вектор стандартной библиотеки шаблонов torch::jit::IValue (даже если аргумент только один).

Чтобы получить данные из тензора, проще всего обработать их поэлементно, но если из-за этого упадёт скорость обработки, для оптимизации процесса чтения данных можно использовать Tensor::accessor. Хотя лично мне это не понадобилось.

В результате для моей нейросети получается вот такой простой код:

extern __attribute__((visibility(default))) void ApplyNetwork(float *data, float *output){Tensor x = torch::from_blob(data, {1,3,64,64}).cuda();std::vector<torch::jit::IValue> inputs;inputs.push_back(x);Tensor z = network.forward(inputs).toTensor();for (int i=0;i<1*5*64*64;i++)output[i] = z[0][i].item<float>();}}

Чтобы скомпилировать код, следуйте указаниям в документации, создайте подкаталог build/ и запустите следующие команды:

cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch <strong>..</strong>cmake --build <strong>.</strong> --config Release

Если всё пойдёт хорошо, будут созданы файлы libnetworks.so или networks.dll, которые вы сможете разместить в Assets/Plugins/ вашего Unity-проекта.

Подключение плагина к Unity


Для импорта функций из библиотеки используем DllImport. Первая функция, которая нам понадобится, это InitNetwork(). При подключении плагина Unity вызовет именно её:

using System.Runtime.InteropServices;public class Startup : MonoBehaviour{...[DllImport(networks)]private static extern void InitNetwork();void Start(){...InitNetwork();...}}

Чтобы движок Unity (С#) мог обмениваться данными с библиотекой (C++), я поручу ему всю работу по управлению памятью:

  • выделю память под массивы нужного размера на стороне Unity;
  • передам адрес первого элемента массива в функцию ApplyNetwork (её тоже перед этим нужно импортировать);
  • просто позволю адресной арифметике C++ обращаться к этой памяти при получении или отправке данных.

В коде библиотеки (С++) я должен избегать какого-либо выделения или освобождения памяти. С другой стороны, если я передаю адрес первого элемента массива из Unity в функцию ApplyNetwork, я должен сохранять этот указатель (и соответствующий участок памяти) до тех пор, пока нейросеть не завершит обработку данных.

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

[DllImport(networks)]private static extern void ApplyNetwork(ref float data, ref float output);void SomeFunction() {float[] input = new float[1*3*64*64];float[] output = new float[1*5*64*64];// Load input with whatever data you want...ApplyNetwork(ref input[0], ref output[0]);// Do whatever you want with the output...}

Сохранение модели


Статья близится к концу, а мы так и обсудили, какую нейронную сеть я выбрал для моего проекта. Это простая свёрточная нейросеть, которую можно использовать для сегментации изображений. Я не включил в модель сбор данных и обучение: моя задача рассказать про интеграцию с Unity, а не про заморочки с трассировкой сложных нейросетей. Не обессудьте.

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

Так может выглядеть Python-код для нашей простой модели:

import torchimport torch.nn as nnimport torch.nn.functional as Fclass Net(nn.Module):def __init__(self):super().__init__()self.c1 = nn.Conv2d(3,64,5,padding=2)self.c2 = nn.Conv2d(64,5,5,padding=2)def forward(self, x): z = F.leaky_relu(self.c1(x)) z = F.log_softmax(self.c2(z), dim=1)return zКод не очень красивый, конечно, но, думаю, идея понятна.Сохранить (экспортировать) модель с текущими значениями коэффициентов можно так:network = Net().cuda()example = torch.rand(1, 3, 32, 32).cuda()traced_network = torch.jit.trace(network, example)traced_network.save(network_trace.pt)

Развёртывание модели


Мы сделали статическую библиотеку, но для развёртывания этого недостаточно: в проект нужно включить дополнительные библиотеки. К сожалению, у меня нет 100-процентной уверенности в том, какие именно библиотеки нужно включить обязательно. Я выбрал libtorch, libc10, libc10_cuda, libnvToolsExt и libcudart. В сумме они добавляют 2 Гб к изначальному размеру проекта.

LibTorch vs ML-Agents


Я считаю, что для многих проектов, особенно в области исследований и прототипирования, действительно стоит выбрать ML-Agents, плагин, созданный специально для Unity. Но когда проекты становятся более сложными, нужно подстраховаться на случай, если что-то пойдёт не так. А такое случается нередко

Пару недель назад я как раз использовал ML-Agents для взаимодействия между демо-игрой на Unity и парой нейронных сетей, написанных на Python. В зависимости от игровой логики Unity вызывал одну из этих сетей с разными наборами данных.

Мне пришлось основательно покопаться в Python API для ML-Agents. Некоторые операции, которые я использовал в моих нейросетях, например 1d свёртка и операции транспонирования, не поддерживались в Barracuda (это библиотека трассировки, которую в настоящее время использует ML-Agents).

Проблема, с которой я столкнулся, заключалась в том, что ML-Agents собирает запросы от агентов в течение некого временного интервала, а затем для оценки отправляет, к примеру, в Jupyter notebook. Однако некоторые из моих нейросетей зависели от результатов работы других моих сетей. И, чтобы получить оценку всей цепочки моих нейронных сетей, мне пришлось бы каждый раз, делая запрос, ждать какое-то время, получать результат, делать другой запрос, ждать, получать результат и так далее. Кроме того, порядок включения этих сетей в работу нетривиально зависел от ввода данных пользователем. А это означало, что я не мог просто последовательно запускать нейросети.

Кроме того, в некоторых случаях объём данных, который мне нужно было отправить, должен был варьироваться. А ML-Agents больше рассчитан на фиксированную размерность для каждого агента (вроде бы её можно менять на лету, но я отношусь к этому скептически).

Я мог бы сделать что-то вроде вычисления последовательности вызова нейросетей по запросу, отправляя соответствующие входные данные для Python API. Но из-за этого мой код, как на стороне Unity, так и на стороне Python, стал бы слишком сложным, или вовсе избыточным. Поэтому я решил изучить подход с использованием libtorch и не прогадал.

Если бы раньше кто-нибудь попросил меня встроить в Unity-проект предсказательную модель GPT-2 или MAML, я бы посоветовал ему постараться обойтись без этого. Реализация такой задачи с использованием ML-Agents слишком сложна. Но теперь я могу найти или разработать любую модель с PyTorch, а потом завернуть её в нативную библиотеку, которая подключается к Unity как обычный плагин.



Облачные серверы от Маклауд быстрые и безопасные.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru