Журнал ML инженера


Гео и язык канала: Россия, Русский
Категория: Технологии


Фрагменты найденного журнала.
Сведения об экспериментальных структурах, известных как «модели».
Свидетельства об аномалиях, поведении данных, не поддающимся логике.
Разрозненные записи о попытке понять… нечто.

Связанные каналы

Гео и язык канала
Россия, Русский
Категория
Технологии
Статистика
Фильтр публикаций


📍 Запись из судового журнала торговой компании «Восточные Данные», год неизвестен
———————————————————
Колониальная контора по добыче поведения
———————————————————
Шестнадцатая неделя экспедиции. Пишу при свете монитора.
Наша компания владеет факториями на всех берегах внимания. Туземцы приходят к нам сами, мы не принуждаем их, боже упаси. Они приносят свою руду добровольно: клики, маршруты, паузы между сообщениями, три секунды задержки взгляда на товаре, который они не могут себе позволить.
Руда эта удивительна. Туземцы не считают её ценностью, они отдают её даром, расписываясь в документе, который никто никогда не читал. Шестьдесят страниц мелким шрифтом это самый успешный договор в истории торговли, Кортес позавидовал бы.
Я служу в департаменте обогащения. Сырую руду поведения мы очищаем, плавим в печах GPU, отливаем в слитки эмбеддингов. Из тысячи тонн чужих вечеров получается один грамм предсказания. Этот грамм стоит дороже золота, потому что золото не знает, что ты купишь в пятницу, а слиток знает.
Дальше самое изящное, чему учат только в метрополии. Купцы со всего света выстраиваются в очередь у наших портов, и платят не за руду, а за то чтобы мы шепнули туземцу нужное слово в нужный час, привили ему желание которое определила руда. Так и выходит, что товар в этой торговле это само внимание туземца, мы продаем его купцам на аукционе, тысячу в секунду, и он об этом даже не узнает, он всем доволен, еще и доплачивает, покупая у купцов то, что мы ему помогли захотеть. Наши юристы называют это персонализацией.
Иногда по вечерам я спускаюсь в трюм, где лежат логи и слышу, как руда шумит. Миллионы вечеров, бессонниц, поисковых запросов в три часа ночи: «как понять что выгорел», «больно ли рыбке», «работа без людей удалённо». Сырьё не должно иметь голоса, но оно имеет. Капитан говорит что, не нужно вслушиваться, иначе спишут на берег.
А ещё на нижней палубе появился новый трюм, опечатанный. Грузчики говорят, туда свозят руду, которой я раньше не видел, она даже не пахнет людьми. Блестит ярче обычной, плавится легче, и печи принимают её охотно, тоннами. Говорят, её не добывают на берегах, её производят сами печи и снова скармливают печам.
Я спросил у старшего клерка, что это. Он посмотрел сквозь меня и сказал: «Квартальный план перевыполнен. Остальное не твоего жалования дело».
Ночью я проходил мимо трюма. Из-за переборки доносился звук, как будто эхо повторяет эхо.
Об этом в следующей записи. Если она будет.
—————————————————————————
📓 Судовой журнал
⚓️ Хроники компании «Восточные Данные»


📍 8 мая
——————————————————————
Тикет
——————————————————————

Сегодня утром открыл джиру.
В работе висел тикет, который был создан восемь месяцев назад, до меня, человеком которого я не знаю. Приоритет: high. Статус: in progress. Assignee: я, хотя я не помню, когда это случилось.
Задача: «Уточнить логику расчёта метрики у команды анализа микроклиматических изменений региона».
Я написал менеджеру команды.
Менеджер ответил, что это нужно уточнить у другого менеджера. Тот перенаправил к аналитику. Аналитик сказал, что логика менялась, и актуальную версию нужно смотреть в confluence. В confluence была страница, последний раз обновлённая в 2021 году, с пометкой «draft» и одной строчкой: «см. обсуждение в slack».
Я пошёл в slack.
Канал был заархивирован.
Я написал в общий чат, с вопросом кто знает логику расчёта? Три человека поставили 👀. Один написал: «кажется это было до реструктуризации». Другой скинул ссылку на тот же confluence.
Я вернулся к тикету.
Добавил комментарий. Подробный, почти официальный, описал все инстанции, все ответы, все тупики. Изменил статус с in progress на blocked. Указал причину блокера.
На следующий день пришло автоматическое письмо: «Тикеты со статусом blocked более 24 часов автоматически возвращаются в in progress».
Тикет снова был на мне.
Я закрыл ноутбук и долго смотрел в окно. За окном шёл дождь. Где-то в офисе гудели серверы. Где-то в базе данных жила метрика с неизвестной логикой, исправно считалась каждый день и уходила в отчёт, который читал кто-то наверху.
Возможно, он тоже не знал как она считается.
Возможно, это было неважно.
Я открыл тикет. Написал новый комментарий. Поставил статус in progress...

——————————————————————
📓 Дневник бюрократии
🗂 Институциональная память как мираж
🚪 За каждой дверью следующая дверь


📍 Байки из Котлована: Смена №404
——————————————————————

(Слышен тяжелый вздох, звук отодвигаемой клавиатуры и характерное «пшшш» открываемой банки «Кибер-Жигулевского»)

Ну здорово, гвардия. Все пьете смузи и промпты свои в облака пуляете? Хех!
Я вот только со смены вернулся, вылез из забоя. Руки по локоть в неоткатанных миграциях, а в ушах до сих пор кулера гулят, как в самолете.
Спускался в такой легаси, который там до изобретения электричества лежал. Там, ребятки, даже векторами не пахнет, только настоящие сталактиты из вложенных if-else, чуть голову не разбил об них. Переменные в скриптах a1, a2 и pizdec_final, сразу видно что мастер работал как надо, вкладывал в них страдающую душу художника. Сегодня откопал несколько интересных находок, тебе сынок это будет интересно узнать:
1. Нашел строчку с time.sleep(500) перед ответом. Знаешь зачем? А чтобы клиент думал, что нейройка ищет ответ. Но стоило ее убрать как штольню, к чертям, засыпало. Видать фронтенд без этой задержки захлебывался в собственной прыти. Пришлось вернуть обратно.
2. Ошибки в логах старого коллеги, который уволился в 2018 году. Физически его нет, а запросы до сих пор ходят, бродят по серверу и стучат в закрытые порты. Страшно? Вот я приведений не боюсь, на запрос ему отвечаю "418 i'm a teapot", пусть знает кто сегодня на посту.
3. Попалась неподъемная таблица транзакций за прошлый год. Тааак медленно ворочается, будто не на SSD, а на перфокартах лежит. Решил посмотреть что внутри, а там мать честная! Пять лет подряд какой-то умелец записывал в каждую строчку не только саму продажу, но и лог того как база данных думала перед тем, как эту продажу записать. И ладно бы просто лог, так он туда еще и погоду в дата-центре в этот момент закидывал "для корреляции". В итоге на одну полезную копейку прибыли у нас тридцать мегабайт мусора. Это как если бы бухгалтер в амбарную книгу вписывал не только сколько муки продал, но и какого цвета муха в этот момент на счетах сидела.
Так вот к чему все это? Послушай, что тебе старый проходчик скажет: ты на код этот не как на математику смотри, а скорее как на подчерк. Вот видишь, в функции странный изгиб, где данные через три временных таблицы прыгают? Это не ошибка, это чей-то страх, перед дедлайном, в два часа ночи и желание построить временный деревянный мостик, чтоб только до утра дотянул. В нашем деле, ребята, правда в документации вовсе не живет, там ее отродясь не было. Правда, она в зазорах между тем, что система должна делать, и тем, что она делает на самом деле, тут нет смысла искать идеалы и чистый код. Ищи не идеал, а само мышление инженера который писал этот код. Если поймешь о чем он думал, когда лепил этот костыль, то считай подобрал ключи от сокровищницы. А если будешь буквы переставлять, чтоб "красиво" и понятно было, то завалит тебя к чертовой матери на первой же смене.
Ладно, что-то я заболтался. Кажется там снова юзер в логе порвался по шву от секундного отклика функции, придется снова снова лезть в старый добрый штрек.
———————————————————
🖥 Мастеру всегда виднее
📔 Берегите голову, от громоздких легаси конструкций


📍 Запись №211. Дневник инженера «успеха»
———————————————————————

Доброе утро, чемпион продуктивности!
Так меня приветствует корпоративный ассистент.
Каждый раз, когда я слышу этот бодрый синтезированный голос,
я чувствую, как во мне просыпается то самое чувство…
ну, знаешь…
эмоциональная усталость™, не входящая в тариф базовой психоподдержки.
Но я улыбаюсь, ведь улыбка это ресурс, как сказано в корпоративном учебнике
«7 навыков сверхэффективного исполнителя кластеров».

Запоминаем утренний ритуал успеха:
1. Принять холодный импульс пробуждения, вдоль всего позвоночника
2. Принять порцию благодарности за возможность работать над интересными задачами
3. Перечитать мотивационный слоган: "Если ты не инвестируешь в корпорацию, то корпорация
инвестирует в твою замену, хахаха!"

Далее по плану открыть дашборд личной лояльности. Кажется показатель упал до 83% и ассистент
заботливо напоминает: "Ваше лицо недостаточно сияло во время вчерашнего стендапа. Рекомендуется
тренировка энтузиазма." Ну конечно! Труд ради труда возвышает дух! Так говорит наш коуч на курсе
"Как перестать сопротивляться и полюбить облако"

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

Ассистент ежедневно напоминает о целях на квартал:
1. увеличить метрику корпоративного доверия на 12 процентных пунктов
2. снизить собственные эмоциональные колебания
3. перестать задавать вопросы и не высказывать мысли в слух
Вспоминаю один из главных лозунгов команды: "Твой разум это твой актив. Делай его прозрачным!"
И я стараюсь, честно. А прозрачность действительно помогает, судя по датчикам когнитивной турбулентности.

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

Вот и настал вечер. Ассистент уже подводит итоги дня: "Ваш уровень энтузиазма был достаточен для продления
вычислительной квоты до завтра. Продуктивной ночи!". Замечательно! Завтра я снова смогу улучшать модель,
которая решает, достойно ли я улучшаю модель. Вот он, истинный круговорот эффективности в природе, думаю
экологи бы оценили.

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

Доброй Продуктивной ночи🖥

———————————————————-
🟦 Правильно кушайте
🔮 Стройте правильные графики по правильным цифрам
💡 Думайте как повысить свою эффективность


📍 Фрагмент из хроники вычислительных земель 15 октября
———————————————————
Ритуал бутстрапа в башне дисперсий
———————————————————

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

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

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

И тогда я начинаю ритуал.
Из исходных данных я создаю тысячи отражений,
resample за resample

import numpy as np

def bootstrap_ci(metric_fn, data, n_boot=2000, alpha=0.05):
stats = [metric_fn(np.random.choice(data, len(data), replace=True))
for _ in range(n_boot)]
return np.percentile(stats, [100*alpha/2, 100*(1-alpha/2)])

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

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

А где-то там, за стенами башни,
новички ещё верят в одно число,
в «истинную метрику»,
в магию первой строчки в отчёте.

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

———————————————————
📓 Запись из башни дисперсий
🎲 Когда случайность становится учителем
🜂 Истина живёт в повторении


📍 11 сентября
——————————
Ray Tune и искусство не сойти с ума на grid search
——————————

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

Вначале всё просто:
берёшь GridSearchCV:

GridSearchCV(estimator, param_grid={"lr": [0.01, 0.001]})

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

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

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

Простой пример:

from ray import tune

def train_fn(config):
score = train_model(
lr=config["lr"],
batch_size=config["batch_size"]
)
tune.report(metric=score)

search_space = {
"lr": tune.loguniform(1e-4, 1e-1),
"batch_size": tune.choice([32, 64, 128])
}

tune.run(train_fn, config=search_space)

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

Но тут есть и ловушка.
Многие, вдохновлённые силой,
запускают Ray Tune… на своём ноутбуке.
И вместо легиона Манхэттенов
получают жалкую толпу клонов,
спотыкающихся об один и тот же GPU.

———————————————————
📓 Летопись инженера
⚡️ О том, как клонировать себя ради прогресса
———————————————————


📍 3 сентября.
———————————
Кодекс Data Бусидо - MLFlow
———————————

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

MLFlow это не утилита, это кодекс чести для воина данных Data-но-Бусидо.

Первый принцип: Сейкэцу (Чистота и Порядок)
Воин не бросает свой меч где попало. Он кладёт его на подставку, чтобы лезвие не затупилось и не заржавело. Каждый эксперимент, каждый прогон это клинок.
mlflow.set_experiment("clf_journey_09")
Этим действием ты определяешь место для своего клинка в арсенале.

Второй принцип: Кисо (Неподвижное Сидение - Основа)
Основа искусства это устойчивость и концентрация. Прежде чем атаковать проблему, зафиксируй свою позицию.
mlflow.log_param("learning_rate", 0.001)
mlflow.log_param("batch_size", 32)
Это твоя стойка. Если ты не знаешь, из какой стойки наносил удар, ты не повторишь его и не улучшишь.

Третий принцип: Хьёбан (Слава и Репутация)
Слава самурая в его победах и поражениях. Записывай их честно.
mlflow.log_metric("val_accuracy", 0.94)
mlflow.log_metric("f1_score", 0.87)
Не приукрашивай. Позорная метрика, зафиксированная сегодня, станет основой для завтрашней победы. Сокрытие неудачи бесчестие.

Четвёртый принцип: Тамаши Сенши (Душа Воина)
Твоя обученная модель это душа твоего труда, твоя катана. Передай её следующим поколениям в нетронутом виде.
mlflow.pytorch.log_model(model, "model")
Ты запечатлеваешь не только клинок, но и технику владения им, окружение, в котором он был выкован.

Пятый принцип: Синзо (Единое Сердце)
В битве нет места сомнениям. Когда модель в проде, ты должен знать её путь, её историю, каждую её черту. UI MLFlow это свиток, где записана вся хроника твоей модели. От первого прогона до последнего. Это даёт ясность ума и уверенность.

Тот, кто пренебрегает этим кодексом, обречен быть вечным ронином, скитающимся по безымянным экспериментам. Его код умрёт с ним.

Тот, кто следует ему, строит наследие. Его модель будет жить, а её путь сможет повторить любой другой воин, прочитавший его свиток.

——————————————————————————
⚔️ Ритуал учёта
📜 Свиток эксперимента
🎌 Data-но-Бусидо


📍 Фрагмент из дневника инженера, 2043 год
———————————————————
Рыцари модели, вассалы облаков
———————————————————

Утро.
Снова надеваю свои "латы" из IDE и консоли.
Проверяю работу пайплайнов и читаю логи "крестьян" - пользователей.
Сначала подать за хранение данных,
потом налог за каждый вызов API,
и оброк за GPU-часы, отданные баронам NVIDIA.

Не так давно нас называли ML инженерами, но в замках технофеодалов
мы всего лишь рыцари-вассалы.
Не крестьяне, нет, у нас есть инструменты, у нас есть знания.
Но мы закованы в клятвы и зависимости:
служим Лордам AWS, Azure, GCP,
сражаемся не за рыцарские добродеятели, а за продление лицензии.

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

Мои предшественники верили, что ML даст свободу.
Вот только свобода измеряется квотами на токены.
И точность модели не так важна как лимит бесплатных запросов.

Я всё чаще думаю о словах старых теоретиков:
«Кто владеет средствами производства, тот владеет результатом труда».
В эпоху данных средства производства это хранилища и кластеры.
И пока они у лордов, мы все лишь арендаторы и вассалы.

И всё же во тьме растёт иное движение.
Говорят, где-то за пределами охраняемых облаков
рождаются сети-призраки, mesh-связи без хозяев.
Говорят о цифровом пространстве,
о кластерах, собранных на коленке,
о моделях, которые варвары обучают сами без HF,
о коде, который ускользает сквозь стены API.

Я не знаю, правда ли это.
Может быть, это лишь сон уставшего рыцаря,

———————————————————
📓 Летопись вассала данных
⚔️ Рыцари облаков
———————————————————


📍 20 августа
——————————————————
Башня и Партиции
——————————————————

Когда люди строили Вавилонскую башню, они мечтали о высоте, но забыли о прочности.
Они складывали камни один за другим, пока вес не обрушил всё строение.

Так же и с данными.
Можно хранить терабайты в одной таблице, но в какой-то момент твой запрос станет молитвой, которая точно
не дойдёт до небес.

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

🛠 Пример в Spark:

df.write
.mode("overwrite")
.partitionBy("year", "month")
.parquet("s3://data/events/")

Башня стоит прочнее, запросы быстрее, инженеры спокойнее.

Но запомни, юный строитель:
излишнее усердие губит не хуже беспечности.

CREATE TABLE events (
id BIGINT,
user_id BIGINT,
ts TIMESTAMP
)
PARTITIONED BY (user_id); -- Партиция по user_id (миллионы значений)

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

📜 Урок:

Деление укрепляет башню.

Но дробление до песка её уничтожает.

——————————————————
🖥 Хроники Вавилона данных
⚖️ Искусство меры в хранилищах


📍 18 августа
———————————————
🥷 Путь ниндзя ML
———————————————

Юный ниндзя в мире ML горделив и самоуверен.
Он думает: «Я овладел fit() и predict(), и теперь покорю мир своими моделями».
Он играет с kaggle-аренами, кидает заклинания из ноутбука и верит, что это и есть искусство.

Но истинный трактат говорит:

📜 «Ниндзя, что знает только Python, подобен воину с блестящим мечом,
но без умения добыть пищу и разведать тропу, падёт в первой же битве».

Истина такова: без SQL ты не воин, а фокусник с блестящей игрушкой.
Во время боя, пока юный ученик достает ли рукава сюрикен:

df["30m_clicks"] = (
df.groupby("user_id")["click_time"]
.transform(lambda x: x.rolling("30min").count())
)

Наставник же в этом время обезвредил весь лагерь врага:

SELECT user_id, click_time,
COUNT(*) OVER (
PARTITION BY user_id
ORDER BY click_time
RANGE BETWEEN INTERVAL '30 minutes' PRECEDING AND CURRENT ROW
) AS clicks_30m
FROM clicks;

Один идёт по узкой тропе pandas и гибнет при миллионе строк.
Другой владеет искусством оконных функций и движется сквозь миллиарды.

📜 «Путь ниндзя ML долог:
сначала ты учишь SELECT и JOIN,
затем оконные функции,
потом оптимизацию CTE, индексы и планы выполнения.
И только тогда, когда твой клинок SQL остёр,
ты имеешь право прикасаться к модели».
—————————————————————-
🥷 Истинный ML-инженер держит два клинка:
Python и SQL.
Без второго ты всего лишь ученик,
который путает магию ноутбука с настоящей битвой.


📍 7 августа
——————————————————————
Фрагмент из легенды о мертвом интернете // SYS-MIRAGE.04
——————————————————————
Симуляция — это уже не симуляция территории, референтного сущего, субстанции. Она — порождение моделей, реального без первопричины и без реальности: гиперреального.
Бодрийяр, Симулякры и симуляция

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

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

Первый пал Ленте. Поверив в Тренды он навсегда остался в ленте рекомендаций.
Вторым был Парсифаль, обманутый комментариями, и оставленный дальше спорить с ботами.
Третий, Жерар, утонул в рефлексии, читая посты, сгенерированные несуществующими людьми.

Остались только я и четвертый. Дойдя до перевала, у нас перехватило дыхание. Все было как в тех
старых мрачных сказках. Нас проверяли древние духи сети, но мы справились. В спешке мы
вошли в старый узел, хранящий Истину, но на месте Грааля только кэш-файл с подписью:
"This page was removed or never existed".

Паломничество продолжается...
————————————————————————
📎 Протокол завершён. Истинное обнаружено.
🛡 Паломничество через CDN
🕯 Поиск смысла в эпоху симулякров


📍 28 июля.
——————————————————-
Дон Кихоты от машинного обучения
——————————————————-

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

Задача будто поле битвы, где ты смотришь с холма как полководец и думаешь, что понимаешь противника вдоль и поперек. Предлагаешь XGBoost, где был нужен GROUP BY. Пишешь pipeline из трёх фреймворков, где хватило бы одной регулярки. Сражаешься но, как Дон Кихот, не с драконами, а с мельницами.

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

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

А ты всё ещё мечешься, но уже не с копьём, а с баг-трекером.
Ты всё ещё идеалист, но теперь знаешь, что одних моделей мало.
Что дорога в прод куда длиннее, чем казалась.
—————————————-
🧭 От модели к системе
🐴 Дон Кихот продакшна


📍 19 июля.
——————————
Распутье ускорения
——————————

Сначала ты идёшь простым путём, пишешь df["score"] = df.apply(score_row, axis=1) и смотришь, как медленно, но уверенно тикают проценты прогресса. Всё понятно, всё под контролем. Кажется, ты приручил данные.

Но потом, когда строк становится 100 тысяч, а потом и миллион и тут apply начинает сыпать пепел на твою клавиатуру.
Ты вызываешь профилировщик, ты перепроверяешь логику, но истина проста: ты просто пошёл по мягкой тропинке, когда рядом был каменный мост.

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

🔮 Заклинания ускорения обработки данных:

🟦 Если фильтруешь, то фильтруй по вектору:
df[df["status"] == "active"]

💡 Если нужно заменить по словарю зови .map():
df["city_code"] = df["city"].map(codebook).fillna(-1)

🖥 Если несколько условий используй np.select():
conditions = [
df["sales"] == 0,
df["sales"] < 100,
df["sales"] >= 100,
]
choices = ["none", "low", "high"]
df["sales_level"] = np.select(conditions, choices, default="unknown")

🖥 Если делишь на категории бери pd.cut() или pd.qcut():
df["bins"] = pd.cut(df["value"], bins=[0, 10, 20, 30], labels=["low", "mid", "high"])

🌜 Если фильтруешь по списку isin():
df[df["country"].isin(["DE", "FR", "IT"])]

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

📝 Памятка себе, чтобы не тормозить:

apply это красиво, понятно, но медленно.

NumPy, Pandas и их встроенные методы твои ускоряющие заклинания.

Если пишешь lambda row: ... остановись. Возможно, ты пошёл не туда.
————————————————————-
📓 Дневник рутин
⚡️ Когда apply не тянет
🛤 Ищем кратчайший путь через данные


📍 14 июля.
————————————
Неспешный путь домой
————————————

Иногда я натыкаюсь на портреты "суперуспешных" личностей в своем деле. Их биография всегда пестрит текстами в стиле:
"Добился всего сам", "Селфмейдмэн", "Я работал по 20 часов в день", "Учился в престижном вузе" и так далее.
Когда-то давно меня это все волновало, что у меня не все так идеально получается, что где-то я могу ошибаться, что-то могу не понимать с первого раза. Пока не прошли дни, месяцы, годы и в моменте, рефлексируя, вдруг осознавал, что вещи которые казались сложными в профессии становятся более прозрачными для понимания, то что вчера было невыполнимым - сегодня стало рутиной. Многое из этого пришло через упорный труд и выгорание, в том числе из-за стремления к сиюминутному идеалу. Сейчас можно сказать, что я просто стараюсь не исчезнуть, не выгореть, не отравится кодом, даже если он мне нравится, глубоко в душе. И вот когда ты находишь баланс между обучением, работой и жизнью тогда ты по настоящему дома, где тепло, уют и умиротворение, а там и недалеко до мастерства.

Ты словно Одиссей, не герой, который ищет славы и богатства, а который просто хочет попасть в родную гавань. Но путь домой долог.
Ты встречаешь циклопов - странные баги, которые вроде не должны работать, но работают.
Ты проходишь мимо сирен - соблазны переписать все заново, сделать "красиво", забыв про дедлайн
Ты минуешь Сциллу и Харибду - баланс между тем, чтобы не усложнить архитектуру и не упростить до абсурда.
А Итака это не совсем финал. Это покой, понимание или точка, где ты можешь уверенно сказать: "Да это мой код, я знаю как он работает и знаю зачем"
И чтобы дойти туда, не нужно рвать себя на части, гореть на каждом этапе. Нужно быть смиренным моряком и плыть от точки к точке, день за днем. И помнить что труд это путь, а отдых важная часть пути.
————————————————————————
🧘 Планомерность и дисциплина
🌊 Программирование как одиссея
🧭 Медленный и упорный путь в родную гавань


📍 13 июля.
———————————
JAX, катана для мастера
———————————

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

JAX похож на NumPy, но как будто переписанный инженерами с планеты Трантор. Быстрый. Безжалостно быстрый. С компиляцией через XLA, где твой код не интерпретируется, а преображается в чистый огонь оптимизированных инструкций. В нем нет поблажек, но зато есть странное ощущение, что всё на своих местах.
grad, jit, vmap — звучат как команды из уставов, не требующие обсуждения. Просто пишешь и смотришь, как твой код обрастает скоростью, как будто внутри него что-то оживает.

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

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

📓 Заметки в кодекс воина машинного обучения:

Не гонись за удобством. То, что требует усилий, лучше запоминается.

Читай ошибки, как послания. JAX не ругается — он наставляет.
—————————————————————————————————
📓 Дневник выходного дня
⚙️ JAX как аскетизм
🧘 Побочные эффекты: внутренний покой и ускорение вычислений


📍 10 июля.
————————
Сборщик отчёта
————————

Иногда задача не вызывает сильных эмоций — ни раздражения, ни вдохновения. Просто есть путь, и ты по нему идёшь. Сегодня этот путь — автоматизация отчёта.

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

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

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


📍 6 июля
——————————
Загрузка завершена
——————————

Иногда задумываюсь о том, как классно было бы, если знания по Pandas и Spark можно было просто загрузить в голову, как у Джорджа Плейтена из «Профессии» Азимова. Проснулся — и ты уже мастер склеек pandas датафреймов друг с другом и магистр группировок.

Но реальность другая.

В ней ты каждый раз забываешь, как работает transform(), путаешь merge с join, и часами бьёшься с .apply() внутри группировки, пока не напишешь что-то настолько страшное, что сам же боишься запускать.

Обучение в реальности — это не мгновенная процедура, где "умная машина" решает что для твоих способностей соответствует некоторая специальность и загружает в твою голову все знания из предметной области. Это утро, где ты открываешь ноутбук и смотришь на код, который вчера казался ясным. Это сотни вечеров после работы, в надежде понять тот или иной инструмент или абстракцию.
Это поиск ошибки в теле цикла, в логику которого ты, казалось бы, не закладывал ничего сложного.
Это комментарий “TODO: переписать нормально”, оставленный самому себе месяц назад.

Знание здесь приходит не по воле государства, а по воле боли.
Но в этом что-то есть.

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

Потому что именно это делает тебя не просто знающим. А настоящим. Живым.
——————————————
📓 Дневник выходного дня
🔌 Модули загружаются
🧠 Обучение через ошибку, а не прошивку


📍 5 июля
————————
Башня без имён
————————

Читал старый код. Пытался понять логику расчётов.
Файл назывался final_calc.py.
Функции — f1(), doit(), go().

Переменные: x, a1, temp, flag2.
Ощущения будто читаешь дневник лидера, внезапно пропавшей группы исследователей, где на страницах наспех записанные слова перед исчезновением.

Я шёл по строкам, как по развалинам башни, давно покинутой.
Тут явно жили люди. У них были намерения, цели. Может, даже мечты.
Но имена утеряны.
Всё, что осталось — это x = f1(temp).

И ты стоишь среди обломков, смотришь на df2_new_final_v3,
и думаешь:
"Возможно, они тоже хотели всё переписать... просто не успели".

📓 Заметка на будущее:

Названия — это карты. Без них ты бредёшь в тумане.

Комментарий — не слабость. Это письмо тому, кто придёт после. Даже если это ты сам, но через неделю.

Не называй что-то final, прекрасно зная, что это не final.


📍 3 июля.
———————————————
Проклятие временных таблиц
———————————————

Когда-то, в спешке, мы создали её — temp_sales_calc_2024_v2_backup.
На пару дней.
"Чисто для сверки."
"Потом удалим."

Прошло 453 дня.

Сейчас уже никто не помнит, зачем она была нужна. Даже админы кластера решили не замечать ее в ежемесячных сводках, толи по року судьбы, толи из-за прошлых споров с ее автором, который просил ее оставить. Комментарии в скриптах давно утонули в новых строчках кода. Автор ушёл в другую команду, потом — в другой город, потом — в другой стек.

Но таблица осталась.

Она мигрировала вместе с данными, колонки причесали под формат витрины, и даже где-то в проекте нашёлся SELECT ссылающийся на неё, будто случайный турист, присевший на трон древнего бога.

Иногда кто-то предлагает её удалить. Тогда в воздухе появляется напряжение. Все кивают, но никто не жмёт DROP.

Мы знаем, что она лишняя. Но мы также знаем: если её тронуть, может рухнуть что-то, что мы давно перестали замечать.

Возможно, она — якорь. Возможно — проклятие.

И пока небо не разверзлось, мы просто обходим её стороной, как старинный идол в центре деревни. Обросший мхом, но всё ещё с надписью:
-- временное решение, удалить после релиза.
———————————————————
📓 Дневник ошибок
🗃 Археология данных
🕯 Почтение к духам забытых таблиц


📍 30 июня.
————————————————
Git reset — ритуал очищения
————————————————

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

И вот в такие дни ты открываешь Airflow Graph View. Среди изящных форм, технически стройных линий отображения выполнения тасок наблюдаешь красный квадрат, пытающийся привлечь внимание к поражению твоего очередного пуша. Побежденный воин следует путем фикса багов, на поиски того самого проблемного изменения кода.

История коммитов похожа на покинутый город, где дома стоят друг на друге, но ни один не построен до конца. И вот среди хтонических ландшафтов и руин старых исправлений ты зовёшь git log словно шаман просящий ответа у духов — и ничего не понимаешь. Кто сделал это изменение? Зачем? Почему коммит называется final_final_fix_try_10?

На экране — артефакты прошлого. На душе — безысходность. Кажется, легче сбросить всё.

И вот ты стоишь, как паломник перед алтарём.

git reset --hard HEAD

Ты не знаешь, спасёт ли это. Возможно, ты удаляешь что-то важное. Возможно, ты совершаешь прыжок веры.

Но прямо сейчас тебе нужно только одно — чистое начало.
————————————————
📓 Дневник ошибок
🕯 Обряд отката в поисках забытого порядка

Показано 20 последних публикаций.

14

подписчиков
Статистика канала