partially unsupervised – Telegram
partially unsupervised
9.43K subscribers
26 photos
2 files
198 links
@arsenyinfo пишет про software engineering и machine learning
Download Telegram
Когда-то я работал в Яндексе, и на каком-то этапе наша команда по внутренним политическим причинам начала разваливаться. Часть коллег пошла делать новый продукт про карты, а я уволился и пошел применять ML к картам в другую компанию (но это уже совсем другая история).

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

Кстати, это хороший пример продукта для той самой "цифровой трансформации", менее очевидного и потенциально более полезного, чем just another project management SaaS.
К чему может привести избыток свободного времени в карантине: vim cubed.

Кстати, код настолько компактен и читабелен, что прям самому хочется что-нибудь написать на Nim. Делать этого я, конечно, не буду.
Мой приятель Володя написал пост для людей из академической ML среды, как им приблизить свой традиционно плохой код к стандартам индустрии. А я его хочу раскритиковать, ведь с такими советами можно не увидеть лес за деревьями.

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

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

Отдельно добавлю, что внедрять CI до написания тестов - это телега впереди лошади 🐴
В нашем ods.ai чате недавно появился и активно используется специальный эмодзи :quarantine_durka: для тех случаев, когда в условиях изоляции люди слегка теряют связь с реальностью.

Хороший пример такого безумия с уклоном в нашу профессиональную сферу обнаружился на Реддите, хотя я бы не удивился увидеть такое на ebanoe.it.
😁1
Когда программисты видят, что в интернете кто-то не прав.

TL;DR: "В этом вашем академическом проекте нет нормальных тестов, потому давайте считать невалидными все результаты, полученные на базе этого проекта".

А вопрос на самом деле неоднозначный.
С одной стороны, приходить со своим уставом в чужой монастырь и провозглашать "вы тут все дураки" - как минимум непродуктивно.
С другой стороны, тесты стали хорошей инженерной практикой не просто так, а отзыв статьи из-за обнаруженного в коде бага (иногда довольно банального) - не самое редкое явление.
Why we at $FAMOUS_COMPANY Switched to $HYPED_TECHNOLOGY

История n% технологических миграций и шаблон для k% статей на hackernews
Заметил, что айтишников можно разделить на классы почти также, как в классических РПГ.

Lawful Good - Я написал юниттесты, прогнал их у себя, провел с соседом ревью, убедился, что покрытие тестов полное, прогнал интеграционные тесты, закоммитил код, помог товарищу, протер стол, навел порядок у соседа - пойду-ка я обновлю документацию!

Lawful Neutral - тэксь, код соответствует гайдлайнам, юниттесты есть, прекоммит процедуру прогнали - можно и по чайку. Баг? Ну ок, баг. Ща допью только.

Lawful Evil - Код спеке соответствует? Соответствует. Подтверждающие это тесты есть? Есть. Ревью пройдено? Пройдено. Не работает? Идите в жопу.

Neutral Good - Вообще, эти две либы вместе нормально не работают. Но я придумал шикарный костыль...

True Neutral - Глобальные переменные - зло? Зло. Паттерн "обсервер" добро? Добро. Вот и держите оба в одном коммите, как раз норм.

Neutral Evil - Заказчики - пидоры, команда - пидоры, один я тут солнышко!

Chaotic Good - Мужики! Я тут на последний рилиз глобальный код ревью сделал, 255 комментов написал! Что значит "кто такой"? Я в соседней конторе работаю. Сантехником. В говне копаюсь. А тут ваш код нашел - такой интересный!

Chaotic Neutral - Кто играл в "викингов" и смотрел видосики целый день, я? Ну и что, важна эффективность! Смотри, чо написал!

Chaotic Evil - пока вы спали, я все спортировал на линукс и постгре, сменил облачного провайдера, доменное имя и офис-менеджера. Зачем? Но ведь так наш код будет на 1.5% эффективнее!
😁1
Карантин заставил большое количество людей и компаний впервые попробовать удаленку, что спровоцировало вал статей в духе "Как мы успешно практикуем удаленную работу". Большая часть этих людей практикует эту самую удаленку 1-2 месяца, но разве это преграда для того, чтобы делиться мудростью?

Мне эта задача досталась в усложненном варианте со звездочкой: за день до объявления локдауна в Калифорнии я улетел обратно в Минск, а потому последние пару месяцев работаю удаленно (что для меня совсем не в новинку), с десятичасовой разницей во времени (такое тоже бывало), будучи единственным человеком в команде в этом или близком часовом поясе (а это уже что-то новенькое).

Вместо того, чтобы делиться инновационными подходами (у меня их нет), расскажу о впечатлениях.
TL;DR: это охуенно!

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

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

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

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

If you’re not looking but know someone who may be interested please do pass on my contacts - we plant 5 trees in your name for every introduction.

🌳🌲🌳🌲🌳
😁1
Технология трекинга ног, которой я занимался с лета 2018 по лето 2019, а дорогие бывшие коллеги продолжают улучшать по сей день, добралась до Snapchat в качестве линзы и шаблона для пользовательских линз.

Google выложил свой аналог еще три месяца назад. Впрочем, в Snap-линзе побольше фичей (например, есть occlusions), да и сделать на ее основе что-то свое, кажется, проще.
Постепенное снятие карантинов порождает новый холивар: может ли компания оставаться на удаленке навсегда и оставаться продуктивной. С одной стороны кричат "все пробовали fully remote, и никто толком не смог!", с другой - тыкают примерами Gitlab, Basecamp и прочих HashiCorp.

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

P.S. Еще вспомнился такой актуальный в наше время комикc от Oatmeal.
Узнал новое для себя слово HARKing - hypothesizing after the results are known. Иными словами, подгонять задачу под ответ.

Наткнулся на это слово в отличной статье HARK Side of Deep Learning - From Grad Student Descent to Automated Machine Learning, в которой авторы критикуют современные проблемы академического ML ресерча вроде отсутствия воспроизводимости или мнимой генерализации (авторы прикручивают трюки, чтобы побить метрику на популярном датасете, но эти трюки оказываются бесполезны вне этого датасета).

---

Вообще, HARKing свойственен далеко не только академическому миру - в бизнесах этого не меньше.

Слабые маркетологи объясняют локальные успехи флуктуации своими кампаниями, плохие продакт-менеджеры репортят наверх результаты некорректно посчитанных A/B тестов, премии выдаются, почти все счастливы. Даже если босс знает словосочетание "статистическая значимость" по книжке "Статистика для успешных менеджеров", метод "сделать 20+ A/B тестов без поправки Бонферрони и найти ложноположительный результат" в целом работает.

Ну и больше всего уязвимы средние и большие нетехнологические компании: в маленьких компаниях обычно некому ездить по ушам, все слишком на поверхности, а технологические гиганты могут позволить себе построить инструментарий, который слегка защищает от слишком наглых попыток незаслуженно присвоить себе какие-то полуслучайные улучшения метрики.
Я в меру интересуюсь темой беспилотных автомобилей (с удовольствием катался и посещал тематический митап Яндекса, но за новостями не слежу). Но выступление Андрея Карпатого с последнего CVPR не мог не посмотреть - он отличный спикер, на его лекциях с CS231n выросло немало CV инженеров, включая меня.

Как и любой человек, склонный к confirmation bias, я вынес такие основные тезисы:
- маленькая R&D команда с хорошей инфраструктурой лучше, чем толпа R&D чуваков без инфраструктуры;
- если что-то можно выучить end-to-end вместо эвристик поверх сырых данных (или результатов моделей попроще), это надо делать;
- метрики - это новые юнит-тесты (при этом важно покрыть метриками все кейсы, а не выдрачивать одно число);
- алгоритм подбора новых семплов для обучения и прочий active learning важны.
Люблю хвастаться багами, которые сам же и сделал.

Недавно я обновил одну AWS Lambda функцию, которая делала инференс некой модели. И, внезапно, скорость выполнения просела вдвое.

Расследование показало, что виноват пулл реквест с рефакторингом, который состоял из кучи тестов и двух строк в основном коде. Одна из строк была довольно безобидной на вид, вроде logger.info('Loading model from {}'.format(model_weights)).

Если копнуть чуть глубже, оказалось, что конструктор модели был примерно таким:

class Model:
def __init__(self,
model_weights: Union[str, BytesIO],
...
)

Т.е. конструктор иногда принимал путь к весам, а иногда - собственно веса (потому что в случае лямбды как раз удобнее сразу прочитать веса из S3). Ну и соответственно это значение model_weights приходило в логгер, который вместо пути к файлу пытался вывести много мегабайт весов.
CTO ставит задачу Head of ML: нужно сделать так, чтобы сейлзы могли хвастаться такой-то фичей.
Head of ML немного думает и ставит задачу ML инженеру: нужно улучшить метрики такого-то классификатора.
ML инженер скребет бритую голову и ставит задачу интерну: нужно починить вот этот баг в сторонней библиотеке.
Интерн создает issue на гитхабе, мейнтейнер из Некой Гигантской Корпорации фиксит баг в течение трех дней.
😁1
Меня начала раздражать малорелевантная реклама на Youtube, и потому я полез смотреть, что там Google нахимичил в определении моих интересов. Если кто не в курсе, по этой ссылке можно найти список ваших интересов и прочих атрибутов, используемый в таргетинге.

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

- Age. На работе мне 18-44, а вне работы - гораздо точнее, 25-34 (на самом деле мне 31);
- Education status. На работе у меня как будто "Bachelor's Degree", а вне работы - Advanced Degree (на самом деле меня отчислили со второго курса). Кажется, это сигнал, что можно быть поамбициознее в работе!
- Marital status. "Старый" аккаунт все еще считает, что я married, а новый - что я in a relationship (как будто старый аккаунт давно не пересчитывал фичи!)
- Rental status. Оба аккаунта сходятся в том, что я renter, т.е. мою квартиру в Минске как будто недвижимостью назвать сложно :(
- Относительно узкие профессиональные интересы типа Machine Learning and Artificial Intelligence и Distributed & Cloud Computing есть в основном аккаунте, но отсутствуют в рабочем. Наверное, это следствие того, что я стал реже гуглить всякое типа deep learning for dummies.

Оба аккаунта ожидаемо достаточно хорошо поняли, что я работаю в Technology Industry, интересуюсь компьютерами, нон-фикшеном, экономикой, видеоиграми и жратвой.

В общем, рекомендую покопаться, довольно забавно. А причину нерелевантной рекламы я так и не нашел :(
👍1😁1