Размышляя о 1,5 годах работы инженером по машинному обучению и компьютерному зрению

В августе 2018 года я начал свою работу в качестве инженера-исследователя по программному обеспечению в IBM Research в Кембридже, Массачусетс. Приступая к работе, я понятия не имел, что буду там, где я сейчас. Трудно поверить, сколько я вырос и чему научился с тех пор. От посещения моей первой CVPR (Конференция по компьютерному зрению и распознаванию образов) до предоставления моей работы открытого исходного кода, мне пришлось сделать и испытать так много вещей, о которых я даже не подумал бы, что смогу сделать, пока моя карьера.

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

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

Как я сюда попал

Сразу после учебы в Университете Флориды (с коротким летним перерывом) я начал работать в Кембридже в начале августа 2018 года. Я пришел на работу с хорошим объемом знаний в области машинного обучения и компьютерного зрения от себя. изучение и исследования, которые я проводил во время учебы в колледже.

Я узнал, что большая часть моей команды находится в Йорктаун-Хайтс, штат Нью-Йорк, поэтому я в основном работал удаленно, за исключением одного товарища по команде в офисе Кембриджа. Приступая к работе, я думал, что в основном сосредоточусь на том, чтобы помогать своим коллегам, создавая для них инструменты, которые помогут им в их исследованиях, а также помогу в проектах любыми способами. Я определенно этим занимаюсь до сих пор, но моя роль значительно выросла с того момента, когда я только начал. Моя команда состоит в основном из исследователей, поэтому у них не было опыта в некоторых современных практиках разработки программного обеспечения. В то время как я работал, я пытался помочь развить навыки моих товарищей по команде, обучая их некоторым практикам, которые я знаю и изучил сам за это время. Не все прилипает, но даже небольшое улучшение того, как они пишут свое программное обеспечение, может иметь большое значение.

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

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

Что я делаю

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

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

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

Система обнаружения активности

Когда я присоединился к своей команде, наша система представляла собой смесь нескольких компонентов, которые разработала моя команда, но не было базовой архитектуры того, как они собираются вместе. Каждый компонент обрабатывал входные данные в пакетном режиме, а затем сохранял набор соответствующих выходных данных в файлы. Это означало, что каждый компонент должен был пройти через все видео, прежде чем следующий компонент мог начать работать с ним. Например, если посмотреть на рисунок выше, в предыдущей версии нашей системы обнаружение объектов Mask-RCNN должно было выполняться для всех кадров в видео, прежде чем SORT Object Tracker сможет начать их обработку.

Когда мы начали Фазу 2 программы, вступили в силу требования к представлению в реальном времени и системе. Раньше мы просто отправляли полученные результаты в таблицу лидеров, чтобы наша система могла работать в нескольких компонентах, и мы могли изменить один компонент, а затем запустить результаты. Теперь нам нужно было создать систему, которая, например, могла бы работать непрерывно, но также могла бы соответствовать этим требованиям в реальном времени и соответствовать API, предоставленному правительством. Из-за этих требований я выбрал архитектуру Pub / Sub с использованием Apache Kafka в качестве основы. Вы можете увидеть схему ниже:

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

Разработка компонентов системы

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

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

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

В следующий раз

В следующем посте этой серии я подробнее расскажу о работе с открытым исходным кодом, над которой мне довелось поработать (Frater), а также об исследованиях, которые я провел. Я также расскажу о некоторых уроках, которые я извлек в процессе работы над этими разными проектами.

использованная литература