Интересное что-то
517 subscribers
2.72K photos
253 videos
139 files
4.52K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.me/asisakov_channel
Чат: https://t.me/youknowds_chat
Download Telegram
💫 Spark для аналитика (ч.2.)

Собралось много реакций на предыдущем посте про Spark, делаю еще один!
Repartition в Spark. Зачем это вообще нужно?

В pandas не задумываешься про куски данных: читаете DataFrame и сразу работаешь с ним целиком. В Spark всё иначе: данные делятся на партиции (шарды), которые обрабатываются разными воркерами. Repartition позволяет управлять тем, как и насколько равномерно эти куски разбросаны по кластеру.

Зачем?

⚖️ Баланс нагрузки на кластер. Spark работает быстрее, если данные распределены по всем воркерам более-менее равномерно. Если партиций мало, часть узлов простаивает, остальные тянут всё на себе и теряется весь смысл распределённых вычислений.

🚤 Ускоряет джойны и агрегации. Самая частая боль в Spark - это медленные джойны или группировки. Причина часто в том, что данные по ключу раскиданы неравномерно. Если сделать .repartition("key") перед джойном Spark сможет склеить нужные куски локально, а не гонять данные по всему кластеру.

📝 Экономит память и снижает риск падений приложений. Иногда Spark после фильтрации или select делает ОЧЕНЬ перекошенные партиции: на одной куча данных, на другой почти ничего. Это может привести к OutOfMemory именно на одном воркере, при том что на других куча свободной памяти. Repartition выравнивает данные и размазывает нагрузку.

🗃️ Контроль количества файлов на выходе. Когда записываешь данные в parquet/csv, Spark по дефолту делает столько файлов, сколько партиций в DataFrame.
Если хочешь один файл — обязательно делайте .repartition(1) перед записью, иначе получишь кучу маленьких частей.

📝 Как это выглядит на практике

🔗 Джойны (делаем repartition по ключу объединения таблиц, так проще собрать ключи, разбросанные по кластеру)

df_left = df_left.repartition("user_id")
df_right = df_right.repartition("user_id")
df_joined = df_left.join(df_right, on="user_id", how="inner")


✍️ Запись (в примере ниже указано то, что на выходе мы получаем один файл).

df_result.repartition(1).write.parquet("result.parquet")


☝️ Изменяем количество партиций вручную.

df = df.repartition(50)  # вручную задаём 50 партиций


Обычно количество партиций автоматически подтягивается из конфига приложения, возможно, при настройке видели параметр spark.sql.shuffle.partitions

Самое важное в этом посте, что нужно искать размен между количеством партиций и размером задач на воркеры.
1️⃣
Слишком много партиций. Куча маленьких задач, и на маленьких данных становится только хуже, по скорости проседает.
2️⃣
Слишком мало партиций. Неэффективно, Spark теряет свою распределённость, одна нода делает всю работу.


Вообще в DA / DS / ML / DE мы всегда работаем с разменом (трейд-оффами) и все упирается в задачи, которые мы решаем)

Пишем дальше про Spark или нет?
🐳 — Пишем, давай еще, очень интересно
🤝 — Давай уже про что-то другое!
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from ML Baldini • Nikita Boyandin (Nikita Boyandin)
В этих постах я хочу обсудить архитектуры, которые не так часто встречаются в жизни, но при этом представляют собой достаточно интересные решения.

ELMO — это многослойная двунаправленная рекуррентная нейронная сеть c LSTM (рис. сверху). При использовании word2vec или fastText не учитывается семантическая неоднозначность слов. Так, word2vec назначает слову один вектор независимо от контекста. _ELMO_ решает эту проблему. В основе стоит идея использовать скрытые состояния языковой модели многослойной LSTM.

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

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

{xLMk,hLMk,j−→−,hLMk,j←−−|j=1,...,L}={hLMk,j|j=1,...,L}.


Здесь xLMk — входящий токен, а hLMk,j−→− и hLMk,j←−− — скрытые слои в одном и в другом направлении.

Тогда результат работы ELMO будет представлять из себя выражение: 

ELMOtaskk=γtaks∑Lj=0staskihLMk,j.


Обучаемый общий масштабирующий коэффициент γtask регулирует то, как могут отличаться друг от друга по норме векторные представления слов.

Коэффициенты staski — это обучаемые параметры, нормализованные функцией Softmax.

Модель применяют дообучая ее: изначально берут предобученную ELMO, а затем корректируют γ и si под конкретную задачу. Тогда вектор, который подается в используемую модель для обучения, будет представлять собой взвешенную сумму значений этого векторах на всех скрытых слоях ELMO.

Простое использование ELMO:

import torch
from allennlp.modules.elmo import Elmo, batch_to_ids


options_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_options.json"
weight_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_weights.hdf5"
elmo = Elmo(options_file, weight_file, 1, dropout=0)


sentences = [["I", "love", "to", "play", "soccer"], ["My", "favorite", "team", "is", "Barcelona"]]
character_ids = batch_to_ids(sentences)


elmo_embeddings = elmo(character_ids)


Использование ELMO с механизмом Attention:

import torch
import torch.nn as nn
import torch.nn.functional as F
from allennlp.modules.elmo import Elmo, batch_to_ids

class Attention(nn.Module):
def __init__(self, hidden_size):
super(Attention, self).__init__()
self.fc = nn.Linear(hidden_size, hidden_size)
self.tanh = nn.Tanh()
self.softmax = nn.Softmax(dim=1)

def forward(self, x):
out = self.fc(x)
out = self.tanh(out)
weights = self.softmax(out)
return weights


options_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_options.json"
weight_file = "https://allennlp.s3.amazonaws.com/models/elmo/2x4096_512_2048cnn_2xhighway/elmo_2x4096_512_2048cnn_2xhighway_weights.hdf5"
elmo = Elmo(options_file, weight_file, 1, dropout=0)


attention = Attention(1024)


sentences = [["I", "love", "to", "play", "soccer"], ["My", "favorite", "team", "is", "Barcelona"]]
character_ids = batch_to_ids(sentences)

weights = attention(elmo_embeddings['elmo_representations'][0])
weighted_elmo_embeddings = weights * elmo_embeddings['elmo_representations'][0]


Как вам такой формат постов и какую архитектуру вы хотите разобрать?) Обязательно ставьте реакции и пишите комментарии💗
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Жизнь и датка (Alexander Guschin)
Пока ребята пишут индивидуальный раунд (сегодня первый день - продолжение домашних задач), а мы следим за их результами, мы с Серёжей пособирали задачи разных национальных отборов и тренировок. Думаю на днях еще пообновляем и добавим как задач, так и разборов. Есть задачи разного уровня, и простые, и вполне любопытные. Можно посмотреть)

https://github.com/open-cu/awesome-ioai-tasks/
Продолжаем серию о создании надежных LLM-продуктов. Сегодня наконец говорим про метрики качества.

Тема 7. Оцениваем качество LLM

Зачем нам нужно оценивать качество? Не для того, чтобы запустить самый модный алгоритм Reinforcement Learning. Не для того, чтобы запихнуть ошибки в промпт, слезно просив LLM больше так не делать. И даже не для слайдов в презентации.

Хорошие метрики качества == быстрые итерации. В ИИ-разработке, как и в обычной продуктовой разработке, успех зависит от того, как быстро вы умеете итерироваться. В разработке есть тестирование. А у нас есть метрики качества.

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

Почему LLM сложно оценивать?

В ИИ есть 3 класса задач. В них по-разному делаются метрики качества.

1) Задачи, в которых есть точный ответ.
Тогда все ваши метрики качества это сравнение ответа модели с эталоном. Например, классификация, где вы сравниваете с правильным классом. Сравнивать можно не обязательно точным совпадением с эталоном. Можно, например, текстовыми метриками (BLEU, WER) или пускай сравнивает отдельная модель, например BERT (bert_score). В этом классе обычно проблем нет.

2) Задачи, в которых ответ можно проверить.
Ну тогда возьмите и проверьте :) Это, в первую очередь, код, который можно прогнать на тестах. Это математика, в которой можно проверить формальное доказательство. В этом классе раньше были проблемы, сейчас современный RL тут всех унижает. Посмотрите сколько компаний выигрывают одну и ту же олимпиаду по математике. Я уже сбился со счета.

3) Задачи, в которых правильный ответ хрен пойми какой.
С этим обычно самые трудности (интересно, блин, почему?)
Делаем RAG-ассистента, человек задает вопрос, мы что-то ответили. Ответить можно миллионом способов, верифицировать нельзя. Здесь обычно делают так:

а) Вырабатывают продуктовые критерии "а что такое хороший ответ"? Наш RAG-ответ должен быть релевантный, достоверный, актуальный.... Записывают эти критерии в виде инструкции.

б) Учат кого-то размечать ответы по этим критерии. Кого можно учить?

Размечаем людьми

Кто-то называет их ИИ-тренерами или асессорами. Популярно объясняете им ваши продуктовые критерии. Это объяснение может быть немного длинным: посмотрите пример 180-страничной инструкции оценки качества поиска Гугла. Дальше показываете им (запрос, ответ) и пускай пробуют разметить.

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

LLM-as-a-judge

У нас нет денег/времени работать с людьми. Делаем LLM, которая оценивает ответы другой LLM. Критиковать чужой труд всегда проще :)

Обычно делается в несколько этапов

1) Собираем датасет правильных оценок. Это когда у разных ответов LLM проставлены метки: релевантный ли там ответ, достоверный ли ответ и тд. Здесь важно получить не очень большой, (можно 100 примеров) но чистый набор данных.

2) Записываем все наши продуктовые критерии в виде промпта. Он может быть очень длинным, нестрашно.

3) Итеративно меняем модель, промпт, метод генерации и тд, чтобы сделать максимальную точность на датасете 1) Обычно используют максимально большие рассуждающие модели.

Для несложных разметок завести LLM-as-a-judge обычно получается. Для чего-то супер сложного/экспертного, лучше обращаться за помощью к людям.

Литература для обязательного изучения

- Подробный гайд методи оценки качества в LLM

- Наглядная статья с примерами кода для LLM-as-a-judge

- Туториал, как делать LLM-as-a-judge


Правильные метрики — залог вашей счастливой и активной LLM-разработки. Отнеситесь очень внимательно. А если в чем-то сомневаетесь — пишите в комментарии или в личные сообщения @seva_batareika

#llm_system_design
Forwarded from Dealer.AI
🤩🤩🤩
https://github.com/huggingface/transformers/releases/tag/v4.55.0

Верим? 🤨

Upd. Пока видим, что обе момзельки MoE с 3.6B и 5.1B активными параметрами, и конечно новый ускорятор на FlashAttention3.

Architecture.
- Token-choice MoE with SwiGLU activations. Классика 🚬
- When calculating the MoE weights, a softmax is taken over selected experts (softmax-after-topk). Тоже ничего нового. 🪨
- Each attention layer uses RoPE with 128K context. Не удивили.
- Alternate attention layers: full-context, and sliding 128-token window. Сам бы так сделал. 😘
- Attention layers use a learned attention sink per-head, where the denominator of the softmax has an additional additive value. Это интересное. 🧠
- It uses the same tokenizer as GPT-4o and other OpenAI API models. Ну ок че.
- Some new tokens have been incorporated to enable compatibility with the Responses API. Ожидаемо. 😏

P. S. Спасибо дорогому подписчику
@azik1725 😘
Please open Telegram to view this post
VIEW IN TELEGRAM
Гид по специализациям в Data Science

Как выбрать подходящее направление?
Прежде чем рассматривать конкретные роли, важно понять:
Вам интересна теоретическая или прикладная работа?
Предпочитаете ли вы работу с данными, моделями или бизнес-аналитикой?
Насколько для вас важна инженерная составляющая?
Data Analyst
Преобразуем данные в бизнес-инсайты, поддерживаем принятия решений
Стек:

построение отчетов и дашбордов (Tableau, Power BI)

проведение A/B тестов

анализ ключевых метрик (DAU, LTV, retention)

знание SQL и основ статистики

ML Researcher
Разрабатываем новые алгоритмы машинного обучения и совершенствовуем существующие подходы, ну и создаём архитектуры нейронок (трансформеры, GAN, RL)+публикация научных работ
Стек:

Python и фреймворки (PyTorch, TensorFlow)

принципы работы вычислительных систем (GPU/TPU)

высшмат (линейная алгебра, теория вероятностей)

умение формализовать исследовательские задачи

Data Engineer
Тут построение и поддержка инфраструктуры для хранения и обработки данных
Стек:

проектирование хранилищ данных (Data Lakes, DWH)

настройка ETL/ELT процессов

работа с распределенными системами (Spark, Kafka)

знание SQL и языков программирования (Python, Java, Scala)

ML Engineer
Переносим исследовательские модели в prod и на нас- их обеспечение стабильной работы в промышленной среде
Стек:

оптимизация моделей для production (квантование, дистилляция)

настройка CI/CD процессов для ML

работа с облачными платформами (AWS, GCP

Docker и Kubernetes

MLOps Engineer
Основная деятельность- обеспечить полный жизненный цикл ML-моделей в проде
Стек:

автоматизация процессов обучения и развертывания моделей

настройка мониторинга и алертинга

оптимизация использования вычислительных ресурсов

MLflow, Kubeflow

просуммируем, что имеем в ds: обычный ML — когда алгоритмы учатся на данных и делают прогнозы (как яндекс.Музыка угадывает, что вам хотелось бы послушать Пошлую Молли), статистический анализ — ищем скрытые закономерности и проверяем гипотезы, инженерия данных, прога — автоматизируем всё, что шевелится, и визуализация — превращаем циферкы в красивые графики

Для любителей фундаментальных исследований: ML Researcher
Для тех, кто хочет видеть практическое применение моделей: ML Enginee
Для специалистов по работе с данными: Data Engineer
Для аналитиков, ориентированных на бизнес: Data Analyst
Для инженеров, обеспечивающих надежность: MLOps Engineer

Полезные статьи по теме:
یک
ב
س
ד
پنج
ו
@zadachi_ds
Цикл прохождения: Middle WB MLops направления🍇
#wildberries
Вакансию нашёл в тгк канале при вузике(я еврейский мальчик из мгу)

В момент подачи на вакансию имелся годовой опыт работы с командами: 3 месяца стажки с альфа банке, 6 месяцев в Сбере джуном и месяц накручен

Написал по указаным в посте контактам. Эйчарка была страшненькой. Общался нехотя, перетерпел.. Назначили собес. Прошлись по общим вопросам, не углублялись

что такое Docker и зачем? платформа для создания или запуска контейнеров - изолированных сред с приложением и зависимостями, обеспечивает консистентность окружения и переносимость

ограничения Docker?
меньшая изоляция чем у VM (общее ядро, риски безопасности), нельзя запустить приложение под другое ядро ОС без доп. усилий, сложности с GUI, данные по умолчанию непостоянны (нужны volumes)

что такое манифест?
файл (YAML/JSON), декларативно описывающий желаемое состояние объекта в кластере (ex., Deployment с числом реплик и образом)

как k8s взаимодействует с Docker?
k8s командует container runtime (Docker/containerd/CRI-O) через CRI, где и когда запускать или останавливать контейнеры на нодах

зачем Ingress?
для управления входящим внешним трафиком: маршрутизация на основе хоста/пути (L7) и TLS-терминация (реализуется Ingress Controller'ами типа Nginx, Traefik)

зачем балансировщики?
распределять нагрузку между репликами сервиса и предоставлять единую точку входа для клиентов (внутри кластера - Service, снаружи - Service типа LoadBalancer или Ingress)

провайдеры k8s кластеров?
управляемые облачные (GKE, EKS, AKS), он-премис (kubeadm, OpenShift), дистрибутивы (RKE)

как взаимодействуют ML модели и k8s?
модель упаковывается в Docker-контейнер с serving-кодом; деплоится в k8s (Deployment для реплик и отказоустойчивости, Service для доступа); обеспечивает масштабируемость, отказоустойчивость и управление версиями моделей

разница многопоточность vs многопроцессорность?
потоки легковесны, делят память, но ограничены GIL
процессы тяжелее, изолированы, обходят блокировку


Airflow: платформа для оркестрации, планирования и мониторинга рабочих процессов, описываемых как код (DAG), состоящих из задач с зависимостями

MLflow- управление ML lifecycle: Tracking (логирование экспериментов), Projects (упаковка кода), Models (формат + Registry для управления версиями) и Serving

как Airflow и MLflow работают вместе?
Airflow задаёт пайплайн (запуск обучения, деплой), MLflow- отслеживает эксперименты и управляет моделями; задачи Airflow взаимодействуют с MLflow Tracking/Registry


Всё длилось в районе 1.5 часика, потом пошёл играть в цивилизацию🤓

От момента подачи до оффера прошло 2 недели, в целом, оперативно

@zadachi_ds
Нейронки для всего
Уже развёрнутые веб-сервисы
выбираешь задачу -> загружаешь данные
->получаешь ответ

@zadachi_ds
Изи стажка в OzonTech💙
#ozon
Недавно кончилась моя стажка в озоне, поэтому напишу кратко про сам отбор и впечатления...

Параллельно с учёбой на 3 курсе искал подработку, наткнулся на сайт с вакансиями, откликнулся на DS поиска и рекомендаций звучало хайпово.

Закинул резюме и оставил tg на сайте. Hr написала спустя месяц:^) я уж и забыл, что вообще подавался. В резюме были общие слова про место учёбы(финашка), ну и 2 курса по машинке, которые брал факультативно

Сначала был созвон с рекрутером(минут 20, тех вопросов не было)
Потом- тех собес; были теорвопросы по sql, простой quizz по видам ключей и joinов, терия ml и pytorch👇
1️⃣написать свёрточную сеть с одним свёрточным слоем и линейным
(параметры задавал тимлид в ходе интервью)
model = torch.nn.Sequential(
torch.nn.Conv2d(3, 16, 3),
torch.nn.ReLU(),
torch.nn.Flatten(),
torch.nn.Linear(16 * 30 * 30, 10)
)

2️⃣дан кусок кода. нужно отдебажить
for epoch in range(10):
y_pred = model(x)
loss = torch.nn.functional.mse_loss(y_pred, y)
loss.backward()
optimizer.step()
# тут надо вставить optimizer.zero_grad() перед backward

3️⃣написать класс логрегрессии
class LogisticRegression(nn.Module):
def __init__(self, input_dim):
super().__init__()
self.linear = nn.Linear(input_dim, 1)

def forward(self, x):
return torch.sigmoid(self.linear(x))

def fit(self, X, y, epochs=100, lr=0.01):
criterion = nn.BCELoss()
optimizer = torch.optim.SGD(self.parameters(), lr=lr)

for epoch in range(epochs):
optimizer.zero_grad()
outputs = self(X)
loss = criterion(outputs, y.unsqueeze(1))
loss.backward()
optimizer.step()

def predict(self, X, threshold=0.5):
with torch.no_grad():
return (self(X) >= threshold).float()

def predict_proba(self, X):
with torch.no_grad():
return self(X)

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

зп: 80к гросс фултайм, считаю, для начала карьерного пути- это хорошо🤓
@zadachi_ds
Please open Telegram to view this post
VIEW IN TELEGRAM