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

С другой стороны, инженеры-программисты весьма сдержанны, когда речь идет о машинном обучении. Вся эта концепция довольно странна с их точки зрения, особенно когда большая часть так называемых моделей, которые создает их команда специалистов по работе с данными, – это короткие, хакерские скрипты со странными вызовами методов и нечитаемый код на незнакомом языке. Где же все модели планирования? Где чистый код? Где протоколирование или мониторинг? Почему этот код не может быть использован повторно? Разве код, решающий такую шикарную проблему, не должен быть длиной в 2 сотни строк? Это действительно уродливый скрипт, который может понять только один человек! Он вообще больше не программирует?

Слияние

С возникновением этого конфликта родилось требование. Требование к человеку, который может воссоединить двух бойцов. Один из них достаточно хорошо владеет обеими областями, чтобы подтолкнуть товар к работе. Кто-нибудь возьмёт код учёных по данным и сделает его более простым и масштабируемым. Представляя им различные правила программирования и передовой опыт. Абстрагирование частей кода, которые могут быть использованы в будущем. Объединение результатов от потенциально несвязанных задач для еще большего повышения производительности моделей. Объяснение архитектурных идей команде разработчиков. Избавлять разработчиков программного обеспечения от изучения концепций, выходящих за рамки их интересов.

Эта потребность была удовлетворена с появлением роли машиностроительного инженера.

Чего всегда не хватает во всех статьях, учебниках и книгах, касающихся ML, так это производственной среды. Ее буквально не существует. Данные загружаются из CSV, модели создаются в Jupyter, рисуются ROC-кривые и вуаля – ваш продукт обучения машин работает. Время для дополнительного раунда финансирования семян!

Подождите.

https://miro.medium.com/max/977/1*X5ZGVbZwkJkPfcH0h2BQQw.png

На самом деле большая часть вашего кода не связана с машинным обучением. На самом деле, код, относящийся к нему, всегда занимает всего пару процентов от всей Вашей кодовой базы! Ваш самописец дает только маленький JSON-ответ – есть тысячи строк кода, необходимых для того, чтобы действовать в соответствии с предсказанием. Или даже все, что вы получаете, может быть сгенерированной таблицей базы данных с информацией. Опять же, вся система должна быть построена на ней, чтобы сформировать ее полезную! Вы должны призывать информацию, преобразовывать и заряжать ее, автоматизировать свои задания, представлять свои озарения где-нибудь главному пользователю. Независимо от того, насколько это мало, количество работы, которое нужно проделать вокруг машины, чтобы научиться самому себе, огромно, хотя вы и загружаете свой проект с помощью таких технологий, как Apache Airflow или NiFi.

Тем не менее, кто-то должен склеить все части “науки о данных” и “программного обеспечения” вместе. Возьмите обученную модель и заставьте её работать в качественной производственной среде. Запланируйте пакетные задания, пересчитав таблицы понимания. Подавать модель в режиме реального времени и контролировать ее производительность в дикой природе. И часто это именно та область, в которой блистает инженер по обучению машиностроению.

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

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

Это всего лишь еще один API

https://miro.medium.com/max/1824/1*QLI2IgsNlRhDZ-oWmIO5Iw.png

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

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

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

Вы даже можете нести ответственность за выбор других инструментов и экосистем, всегда принимая во внимание весь жизненный цикл проекта (а не только его безрассудную исследовательскую часть) – например, Azure ML Workbench или IBM Watson могут быть отличными инструментами для загрузки проекта и проведения исследований, но не обязательно отвечать всем требованиям вашей окончательной версии, когда речь идет о пользовательском планировании и мониторинге.

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

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

Нерассказанные недостатки

Вы можете свободно общаться со всеми наиболее понравившимися технологиями в этой области. Keras, pyTorch, TensorFlow, H2O, scikit-learn, Apache Spark – выбери репутацию, ты наверняка воспользуешься ею. Апач Кафка! Пульсар! AWS! На каждой конференции, которую вы посещаете, вслух рассказывается о вашем технологическом стеке, как будто это был Избранный. Люди проверяют тебя ревниво, зная, что ты просто парень, использующий все хорошие вещи.

Всегда удобно пропустить тот неопровержимый факт, что эти классные вещи также не очень широко используются. А когда технология новая, все, что вам остается – это плохая документация и куча постов в блоге. То, что вы видите на конференциях и технических докладах, это просто счастливые зеленые пути (похожие на те ноутбуки Jupyter, которые вы получаете от команды DS). вы понимаете, что это не то, как работает программное обеспечение. Неоднократно, после долгих часов отладки интерьеров Apache Spark, я сомневался в своей воле продолжать карьеру программиста в области машинного обучения. Разве я не был бы счастливее без всего этого? Была ли веб-разработка действительно настолько скучной?

https://miro.medium.com/max/800/1*nBdPYqVieDtpv47SNQuj7Q.png

От вас ожидают понимания тонны концепций, как в разработке программного обеспечения, так и в информатике. самое главное, люди хотят, чтобы вы очень быстро осваивали новые знания. Я учусь тоннам, беря чужие фрагменты, меняя и ломая их и видя, что происходит. Ну, а что, если фрагментов не будет? Что, если полученная вами стековая трасса довольно бессмысленна и гугление названия исключения приводит только к коду на GitHub, бросающему его?

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