Forwarded from Тимлид Очевидность | Евгений Антонов
Второй месяц. Принятие решений и конструктивные конфликты
Прошла вторая трехдневка, и я продолжаю документировать происходящее на курсе Стратоплана «Руководитель отдела».
В этот раз были две темы. Принятие решений и конструктивная конфронтация.
Принятие решений
Тут было много знакомых мне из разных докладов, книг и статей техник и идей, типа когнитивных искажений (привет, Канеман) или аргументации решений по квадрату Декарта.
А еще хорошо скомпонованная и понятная пятиступенчатая система принятия решений:
1. Оценить своевременность.
2. Оценить полноту своей информированности.
3. Сгенерить план.
4. Понять заинтересованность компании/руководителя (в реальной жизни я неоднократно видел, как люди пропускали мимо эту мысль и потом страдали от того, что «их работу никто не ценит»).
5. Прислушаться к себе физически и морально. Тут, на мой взгляд, опять же привет Канеману с его понятием интуиции. Хотя некоторые трактуют это несколько иначе.
А главное, конечно, что я для себя отмечал ранее и тут лишний раз намотал на ус – учитывать информированность о вопросе, требующем решения.
Я человек импульсивный и иногда в порыве каких-то эмоций могу начать решать то, что не требует решения, или не тем способом, который следовало бы применить после детального анализа.
Стараюсь над собой работать в этом аспекте, и это напоминание было не лишним.
Конструктивная конфронтация
Тут я тоже был несколько подкован. Читал про это книги, смотрел кучу докладов, подкаст с Александром Орловым и Славой Панкратовым записал.
Однако есть интересный момент, который не самый очевидный. Идея в том, что у человека в подавляющем большинстве случаев есть некое позитивное намерение в его словах и действиях.
То есть даже говоря и делая что-то, что нам кажется деструктивным или обидным, на самом деле человек пытается чего-то хорошего/полезного достичь. И вот если попробовать переобуться в тапки своего оппонента, попытаться найти и понять это позитивное намерение, то можно быстро и конструктивно договориться, а не ругаться днями напролет, уперевшись в стену обиды и непонимания.
Практика
Ну а практика была традиционно интересна. Поконфликтовали, попринимали решения в сложных ситуациях, провоцирующих яркие эмоции, проанализировали всё это на рациональность и убедительность.
Так что продолжаю систематизировать накопленный опыт и знания, сверху присыпая новыми идеями или своевременными напоминаниями о том, где мне надо над собой поработать. И практикуюсь с коллегами из разных совершенно областей. Кто-то аутсорс делает, кто-то классической софтверной разработкой занимается, кто-то SSD-накопители изготавливает.
Это разный контекст и бэкграунд интересным образом расширяет кругозор)
Пост про первый месяц тут
Прошла вторая трехдневка, и я продолжаю документировать происходящее на курсе Стратоплана «Руководитель отдела».
В этот раз были две темы. Принятие решений и конструктивная конфронтация.
Принятие решений
Тут было много знакомых мне из разных докладов, книг и статей техник и идей, типа когнитивных искажений (привет, Канеман) или аргументации решений по квадрату Декарта.
А еще хорошо скомпонованная и понятная пятиступенчатая система принятия решений:
1. Оценить своевременность.
2. Оценить полноту своей информированности.
3. Сгенерить план.
4. Понять заинтересованность компании/руководителя (в реальной жизни я неоднократно видел, как люди пропускали мимо эту мысль и потом страдали от того, что «их работу никто не ценит»).
5. Прислушаться к себе физически и морально. Тут, на мой взгляд, опять же привет Канеману с его понятием интуиции. Хотя некоторые трактуют это несколько иначе.
А главное, конечно, что я для себя отмечал ранее и тут лишний раз намотал на ус – учитывать информированность о вопросе, требующем решения.
Я человек импульсивный и иногда в порыве каких-то эмоций могу начать решать то, что не требует решения, или не тем способом, который следовало бы применить после детального анализа.
Стараюсь над собой работать в этом аспекте, и это напоминание было не лишним.
Конструктивная конфронтация
Тут я тоже был несколько подкован. Читал про это книги, смотрел кучу докладов, подкаст с Александром Орловым и Славой Панкратовым записал.
Однако есть интересный момент, который не самый очевидный. Идея в том, что у человека в подавляющем большинстве случаев есть некое позитивное намерение в его словах и действиях.
То есть даже говоря и делая что-то, что нам кажется деструктивным или обидным, на самом деле человек пытается чего-то хорошего/полезного достичь. И вот если попробовать переобуться в тапки своего оппонента, попытаться найти и понять это позитивное намерение, то можно быстро и конструктивно договориться, а не ругаться днями напролет, уперевшись в стену обиды и непонимания.
Практика
Ну а практика была традиционно интересна. Поконфликтовали, попринимали решения в сложных ситуациях, провоцирующих яркие эмоции, проанализировали всё это на рациональность и убедительность.
Так что продолжаю систематизировать накопленный опыт и знания, сверху присыпая новыми идеями или своевременными напоминаниями о том, где мне надо над собой поработать. И практикуюсь с коллегами из разных совершенно областей. Кто-то аутсорс делает, кто-то классической софтверной разработкой занимается, кто-то SSD-накопители изготавливает.
Это разный контекст и бэкграунд интересным образом расширяет кругозор)
Пост про первый месяц тут
Forwarded from Записки MLEшника
Слушайте, а неплохой этот ваш vLLM для сервинга llm и vllm
Нужно было поднять мой джентельменский набор из qwen2-vl и florence2. Получилось почти без боли
Есть готовый запуск с докера
У меня, чуток устаревшие драйвера видеокарты 🫠, и докер не завелся. Кажись, тут можно поменять версию куды, но не хотел ждать сборку. Поставил в весьма венв с помощью uv (чтобы нормально зависимости зарезолвилсиь), и всё заработало
Вообще там куча оптимизаций (всякие кеши), а также квантизация. Выглядит здорово
#tool
Нужно было поднять мой джентельменский набор из qwen2-vl и florence2. Получилось почти без боли
Есть готовый запуск с докера
У меня, чуток устаревшие драйвера видеокарты 🫠, и докер не завелся. Кажись, тут можно поменять версию куды, но не хотел ждать сборку. Поставил в весьма венв с помощью uv (чтобы нормально зависимости зарезолвилсиь), и всё заработало
Вообще там куча оптимизаций (всякие кеши), а также квантизация. Выглядит здорово
#tool
Forwarded from Pattern Guru. Шаблоны проектирования. Архитектура ПО
#паттерны
Введение
Сегодня мы рассмотрим паттерн проектирования "Абстрактная фабрика".
Классификация
Тип: Порождающий
Определение: Абстрактная фабрика - это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
Грубо говоря, абстрактная фабрика - это "фабрика фабрик", данный паттерн позволяет решить проблему создания целых семейств связанных объектов, без указания конкретных классов продуктов.
С помощью абстрактной фабрики вы можете предоставить библиотеку объектов не расскрывая их реализацию.
Из чего состоит и как работает данный паттерн
1. Абстрактного класса/Интерфейса абстрактной фабрики. Содержит абстрактные методы которые возвращают абстрактные продукты, связанные одной конпцецией.
2. Конретные фабрики. Конкретные фабрики реализут операции которые создают конкретные продукты.
3. Абстрактные классы продуктов. Реализуют интерфейс для всех конретных продуктов своего семейства.
4. Конкретные продукты. Реализуют абстрактные продукты. Продукты одного семейства не могут взаимодействовать, с продуктами другого семейства.
5. Клиент. Клиентский код работает исключительно с абстрактной фабрикой и абстрактными продуктами.
Плюсы данного паттерна
1. Реализует принцип открытости/закрытости.
2. Упращает поддержку кода.
3. Выделяет код производства продуктов в одно место, упрощая поддержку кода.
Минусы данного паттерна
1. Снижает читаемость программы из-за введения множества дополнительных классов.
Пример и задача
Дед Мороз и Пасхальный кролик не успевают сделать игрушки к празднику, которые они будут дарить детям.
Все существует 3 вида игрушек:
1. Лошадка
2. Зайчик
3. Шарик
Всё было бы просто однако Деду Морозу нужны игрушки в новогоднем стиле, а пасхальному кролику в пасхальном.
Создайте абстрактную фабрику игрушек и спасите эти праздники!
Пример из реального кода
Пример из реального кода предоставил @Tishka17. Он разработал замечательный фреймворк aiogram_dialog для разработки интерактивных диалогов и меню в телеграмм ботах, как обычное приложение с графическим интерфейсом.
Вот здесь он использует данный паттерн: https://github.com/Tishka17/aiogram_dialog/blob/develop/aiogram_dialog/manager/manager_middleware.py#L23
Вот его объяснение, какую задачу он решает в данном случае:
Введение
Сегодня мы рассмотрим паттерн проектирования "Абстрактная фабрика".
Классификация
Тип: Порождающий
Определение: Абстрактная фабрика - это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.
Грубо говоря, абстрактная фабрика - это "фабрика фабрик", данный паттерн позволяет решить проблему создания целых семейств связанных объектов, без указания конкретных классов продуктов.
С помощью абстрактной фабрики вы можете предоставить библиотеку объектов не расскрывая их реализацию.
Из чего состоит и как работает данный паттерн
1. Абстрактного класса/Интерфейса абстрактной фабрики. Содержит абстрактные методы которые возвращают абстрактные продукты, связанные одной конпцецией.
class AbstractFactory(ABC):
@abstractmethod
def create_product_a(self):
...
@abstractmethod
def create_product_b(self):
...
2. Конретные фабрики. Конкретные фабрики реализут операции которые создают конкретные продукты.
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ConcreteProductA1()
def create_product_b(self):
return ConcreteProductB1()
class ConcreteFactory2(AbstractFactory):
def create_product_a(self):
return ConcreteProductA2()
def create_product_b(self):
return ConcreteProductB2()
3. Абстрактные классы продуктов. Реализуют интерфейс для всех конретных продуктов своего семейства.
class AbstractProductA(ABC):
@abstractmethod
def very_important_super_function_a(self) -> str:
...
class AbstractProductB(ABC):
@abstractmethod
def very_important_super_function_b(self) -> str:
...
4. Конкретные продукты. Реализуют абстрактные продукты. Продукты одного семейства не могут взаимодействовать, с продуктами другого семейства.
class ConcreteProductA1(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A1"
class ConcreteProductA2(AbstractProductA):
def very_important_super_function_a(self) -> str:
return "Product A2"
class ConcreteProductB1(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B1"
class ConcreteProductB2(AbstractProductB):
def very_important_super_function_b(self) -> str:
return "Product B2"
5. Клиент. Клиентский код работает исключительно с абстрактной фабрикой и абстрактными продуктами.
def client(factory: AbstractFactory) -> str:
return factory.create_product_a().very_important_super_function_a()
for factory in (ConcreteFactory1, ConcreteFactory2, ...):
client(factory)
Плюсы данного паттерна
1. Реализует принцип открытости/закрытости.
2. Упращает поддержку кода.
3. Выделяет код производства продуктов в одно место, упрощая поддержку кода.
Минусы данного паттерна
1. Снижает читаемость программы из-за введения множества дополнительных классов.
Пример и задача
Дед Мороз и Пасхальный кролик не успевают сделать игрушки к празднику, которые они будут дарить детям.
Все существует 3 вида игрушек:
1. Лошадка
2. Зайчик
3. Шарик
Всё было бы просто однако Деду Морозу нужны игрушки в новогоднем стиле, а пасхальному кролику в пасхальном.
Создайте абстрактную фабрику игрушек и спасите эти праздники!
Пример из реального кода
Пример из реального кода предоставил @Tishka17. Он разработал замечательный фреймворк aiogram_dialog для разработки интерактивных диалогов и меню в телеграмм ботах, как обычное приложение с графическим интерфейсом.
Вот здесь он использует данный паттерн: https://github.com/Tishka17/aiogram_dialog/blob/develop/aiogram_dialog/manager/manager_middleware.py#L23
Вот его объяснение, какую задачу он решает в данном случае:
Forwarded from Pattern Guru. Шаблоны проектирования. Архитектура ПО
В библиотеке aiogram dialog есть диалог менеджер, он реализует базовую функциональность управления диалогами: старт разным способом, доступ к контексту и т.п.
Также есть менеджер - это временный объект. Он создаётся на время обработки конкретного события. Соответственно, его надо постоянно пересоздавать.
В какой-то момент я решил что неплохо дать возможность что-то в менеджере переопределить, соответственно нужно и фабрику менять.
Для решения этой проблемы абстрактная фабрика подошла лучше всего.
Также есть менеджер - это временный объект. Он создаётся на время обработки конкретного события. Соответственно, его надо постоянно пересоздавать.
В какой-то момент я решил что неплохо дать возможность что-то в менеджере переопределить, соответственно нужно и фабрику менять.
Для решения этой проблемы абстрактная фабрика подошла лучше всего.
Forwarded from Аналитика. Это просто
Иногда (не сказать, что редко) ко мне приходят с вопросом типа "как стать продуктовым аналитиком". Простого ответа не него нет, каждый раз он разный. Это зависит от текущей профессии, опыта, в т.ч. "жизненного", тех. скиллов, типа мышления, желания, в конце концов, и т.д и т.п.
Автор статьи делает неплохой подход к построению данного пути, хотя бы в общих чертах. Другие его статьи тоже рекомендую почитать, жаль, что их мало.
Автор статьи делает неплохой подход к построению данного пути, хотя бы в общих чертах. Другие его статьи тоже рекомендую почитать, жаль, что их мало.
Хабр
План самообразования по профессии продуктового аналитика
Привет, я работаю в сфере уже около 10 лет, преимущественно по специальности чистой продуктовой аналитики. Иногда я оглядываюсь назад и думаю — с текущим пониманием что и как устроено в работе, как бы...
Forwarded from Аналитика. Это просто
А тут список популярных вопросов с продуктовых собеседований в крупных западных кампаниях. На некоторые подобные мне приходилось отвечать на продуктовых секциях.
Нужно понимать, что правильных ответов нет и их ни к чему ботать. А пройти по вопросам, проработать их, чтобы, когда придется отвечать на что-то подобное, уже понимать, в какую сторону думать, очень даже поможет в будущем. Еще больше пригодится тем, у кого не так много опыта.
"Предугадывай, не импровизируй".
Нужно понимать, что правильных ответов нет и их ни к чему ботать. А пройти по вопросам, проработать их, чтобы, когда придется отвечать на что-то подобное, уже понимать, в какую сторону думать, очень даже поможет в будущем. Еще больше пригодится тем, у кого не так много опыта.
"Предугадывай, не импровизируй".
vc.ru
Самый большой в Рунете список вопросов, которые вам могут задать на продуктовом собесе
Я потратил 5 вечеров, около двух литров кофе, и собрал 250+ вопросов‑кейсов, которые задают менеджерам продукта на интервью. В моем списке примеры, которые используют Uber, Spotify, Google, Amazon, Netflix, Microsoft и прочие крутые зарубежные коллеги.
Forwarded from Artem Ryblov’s Data Science Weekly
How to Win a Kaggle Competition by Darek Kłeczek
Darek Kłeczek:
In this essay, author starts by providing a quick overview of the process he uses to collect data. He then presents several insights from analyzing datasets. The focus is to understand what the community has learned over the past 2 years of working and experimenting with Kaggle competitions. Finally, he mentions some ideas for future research.
Link: Kaggle
Navigational hashtags: #armknowledgesharing #armtutorials
General hashtags: #kaggle #competitions
Darek Kłeczek:
When I join a competition, I research winning solutions from past similar competitions. It takes a lot of time to read and digest them, but it's an incredible source of ideas and knowledge. But what if we could learn from all the competitions? We've been given a list of Kaggle writeups in this competition, but there are so many of them! If only we could find a way to extract some structured data and analyze it... Well, it turns out that large language models (LLMs) [1] can help us extract structured data from unstructured writeups.
In this essay, author starts by providing a quick overview of the process he uses to collect data. He then presents several insights from analyzing datasets. The focus is to understand what the community has learned over the past 2 years of working and experimenting with Kaggle competitions. Finally, he mentions some ideas for future research.
Link: Kaggle
Navigational hashtags: #armknowledgesharing #armtutorials
General hashtags: #kaggle #competitions
Forwarded from Evgeny
Вот похоже про нее
https://www.youtube.com/watch?v=Wa1uK2O_TkE
https://www.youtube.com/watch?v=Wa1uK2O_TkE
YouTube
Кирилл Данилов — Как мы строили высокопроизводительную систему на Akka с нуля
Подробнее о Java-конференциях:
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
. . . Кирилл расскажет про опыт создания платежной системы с использованием Akka от обучения с нуля до построения кластера и интеграции этой…
— весной — JPoint: https://jrg.su/gTrwHx
— осенью — Joker: https://jrg.su/h7yvG4
— —
. . . Кирилл расскажет про опыт создания платежной системы с использованием Akka от обучения с нуля до построения кластера и интеграции этой…
Forwarded from Evgeny
Итого мои заметки
https://codimite.ai/blog/horizontal-scaling-of-websockets/ - здесь описана pub/sub модель
Наверняка вы у Su видели, что-то типа WebSocket server + session server(где хранится какой клиент и куда присоединен)
Выше ссылка, как можно избавиться от session server(опять же pub/sub RabbitMQ поддерживает до 100к сообщений, если вы любите Redis, то можете поставить Redis + streams)
Как скалировать сокеты на LB:
https://ably.com/blog/websockets-horizontal-vs-vertical-scaling
https://nooptoday.com/why-websockets-are-hard-to-scale/
Pubnub использует в основном long polling over websockets
https://www.pubnub.com/guides/websockets/
Также нужно всеми силами уменьшать количество открытых сокетов через keep-alive(пользователь закрыл телефон/браузер -разрываем соединение)
Цитата как делают сетевики для огромного количества открытых сокетов:
Alexander Gorodnev
Чуть по-другому покажу:
(front) nginх
1M clients <-> f5 <-> VIPs
Вот слева у тебя может быть условно хоть миллион. А вот справа ограничение есть, это правда. Потому что у тебя может получиться открыть 65к коннектов до какого то одного сервера за virtual IP. Тогда так получится
Evgeny,
Тогда получается придется создавать Ephemeral адреса на nginх все-равно для обслуживание 1M?
Alexander Gorodnev
Не совсем. Нужно понять, сколько у тебя реплик сидит до nginx/f5. Что бы 1М обработать надо или 16+ машин, или на серверы вешать несколько сетевых интерфейсов. Если две сетевые, то надо будет 8+ машин (ну и нужно, что бы им памяти/цпу хватило)
Делают виртуальные интерфейсы на основе vlan. Получается, что на одном физическом интерфейсе можно сделать 4096 виртуальных, со своими ip и прочей херней.
Сам gateway на 50к сокетов жрет 1gb оперативы, 5кк сокетов ~ 100gb Ram на все инстансы
https://codimite.ai/blog/horizontal-scaling-of-websockets/ - здесь описана pub/sub модель
Наверняка вы у Su видели, что-то типа WebSocket server + session server(где хранится какой клиент и куда присоединен)
Выше ссылка, как можно избавиться от session server(опять же pub/sub RabbitMQ поддерживает до 100к сообщений, если вы любите Redis, то можете поставить Redis + streams)
Как скалировать сокеты на LB:
https://ably.com/blog/websockets-horizontal-vs-vertical-scaling
https://nooptoday.com/why-websockets-are-hard-to-scale/
Pubnub использует в основном long polling over websockets
https://www.pubnub.com/guides/websockets/
Также нужно всеми силами уменьшать количество открытых сокетов через keep-alive(пользователь закрыл телефон/браузер -разрываем соединение)
Цитата как делают сетевики для огромного количества открытых сокетов:
Alexander Gorodnev
Чуть по-другому покажу:
(front) nginх
1M clients <-> f5 <-> VIPs
Вот слева у тебя может быть условно хоть миллион. А вот справа ограничение есть, это правда. Потому что у тебя может получиться открыть 65к коннектов до какого то одного сервера за virtual IP. Тогда так получится
Evgeny,
Тогда получается придется создавать Ephemeral адреса на nginх все-равно для обслуживание 1M?
Alexander Gorodnev
Не совсем. Нужно понять, сколько у тебя реплик сидит до nginx/f5. Что бы 1М обработать надо или 16+ машин, или на серверы вешать несколько сетевых интерфейсов. Если две сетевые, то надо будет 8+ машин (ну и нужно, что бы им памяти/цпу хватило)
Делают виртуальные интерфейсы на основе vlan. Получается, что на одном физическом интерфейсе можно сделать 4096 виртуальных, со своими ip и прочей херней.
Сам gateway на 50к сокетов жрет 1gb оперативы, 5кк сокетов ~ 100gb Ram на все инстансы
Codimite
Horizontal scaling of WebSockets - Codimite
Websockets are a communication protocol that enables real-time, full-duplex communication between a client (such as a web browser) and a server. Understanding websockets is crucial because they facilitate efficient and persistent communication between clients…
Forwarded from Душный NLP
Алаймент LlaMA 3.1
Возвращаемся к LlaMA 3.1 и продолжаем разбираться, как она устроена. В этот раз речь пойдёт об алайменте модели.
По сравнению с LLaMA 2 у третьей версии изменилась разметка пар. Помимо стандартных chosen и rejected добавилась ещё метка edited. Она ставится в тех случаях, когда победивший объект не слишком хорош и его переписывают. Ответы оцениваются по семибалльной шкале.
SFT происходит в шесть раундов. Если в LLaMA 2 использовался PPO, то в LlaMA 3 — DPO. Разработчики отмечают, что это связано с тем, что PPO требует больше вычислительных ресурсов, а качество выходит хуже.
Ещё одно важное отличие — это специализация. На претрейне модель доучивают для решения специальных задач. Потом делают отдельный алаймент, полученную специализированную модель используют для генерации новых обучающих данных стадии алайнмента, а также мержат веса нескольких специализированных модель в единую модель.
Reward-модель обучается над претрейном. Margin term, который был в Llama 2, в третьей версии отсутствует, так как, по словам разработчиков, он не даёт никакого прироста в качестве. Как и в DPO, оставляют только те ответы, которые помечены как «сильно лучше» и «лучше». Кроме того, в reward-модели есть отдельные награды для полезности и безопасности.
За один раунд SFT 405B-модель суммарно проходит 576 тысяч сэмплов. В DPO используют сэмплы от моделей с последних раундов (а в reward-модели — все). Служебные токены, такие как EOS или токены для вызовов функций, маскируют для стабилизации обучения. Кроме того, к DPO добавляют NLL (CE) с коэффициентом 0,2. Это нужно, чтобы повысить вероятность chosen-ответов. Промпты для обучения пишут люди, а ответы — модели. На один промпт выбирают лучший ответ из 10-30 поступивших.
В LlaMA 3.1 есть четыре уровня фильтрации данных:
1. Rule-based — удаляет дисклеймеры, смайлики и восклицания;
2. Quality — качественными считаются 25% ответов с наибольшим скором. Кроме того, используется LLM-as-judge. Ответы оцениваются по трём критериям для обычных данных и двум — для кодинга. Ответ считается качественным, если все критерии выполнены. Сэмпл попадает в обучение, если хотя бы один из методов показал, что ответ качественный;
3. Difficulty — оценивается по числу интентов в запросе: чем их больше, тем сложнее запрос. Также модель оценивает сложность по трёхбальной шкале;
4. SemDedup — этот метод используется для удаления похожих данных, при отборе отдается предпочтение семплам с максимальным значением quality * difficulty.
Алаймент для каждой из функциональных возможностей (Capabilities) LLaMA 3.1 имеет свои особенности. Например, в коде есть много синтетических данных, используется execution feedback и перевод на редкие языки программирования. А для математики берут тексты из претрейна и уже к ним генерируют инстракты.
Что касается фактологичности, то разработчики не добавляют новых знаний поверх претрейна. Для этого модель обучают отвечать только на те вопросы, на которые она может выдать ответ, согласованный с документом из претрейна. А для чувствительных тем, по которым в датасете много некорректной информации, используют ручную разметку.
Разбор подготовил❣ Алексей Зотов
Душный NLP
Возвращаемся к LlaMA 3.1 и продолжаем разбираться, как она устроена. В этот раз речь пойдёт об алайменте модели.
По сравнению с LLaMA 2 у третьей версии изменилась разметка пар. Помимо стандартных chosen и rejected добавилась ещё метка edited. Она ставится в тех случаях, когда победивший объект не слишком хорош и его переписывают. Ответы оцениваются по семибалльной шкале.
SFT происходит в шесть раундов. Если в LLaMA 2 использовался PPO, то в LlaMA 3 — DPO. Разработчики отмечают, что это связано с тем, что PPO требует больше вычислительных ресурсов, а качество выходит хуже.
Ещё одно важное отличие — это специализация. На претрейне модель доучивают для решения специальных задач. Потом делают отдельный алаймент, полученную специализированную модель используют для генерации новых обучающих данных стадии алайнмента, а также мержат веса нескольких специализированных модель в единую модель.
Reward-модель обучается над претрейном. Margin term, который был в Llama 2, в третьей версии отсутствует, так как, по словам разработчиков, он не даёт никакого прироста в качестве. Как и в DPO, оставляют только те ответы, которые помечены как «сильно лучше» и «лучше». Кроме того, в reward-модели есть отдельные награды для полезности и безопасности.
За один раунд SFT 405B-модель суммарно проходит 576 тысяч сэмплов. В DPO используют сэмплы от моделей с последних раундов (а в reward-модели — все). Служебные токены, такие как EOS или токены для вызовов функций, маскируют для стабилизации обучения. Кроме того, к DPO добавляют NLL (CE) с коэффициентом 0,2. Это нужно, чтобы повысить вероятность chosen-ответов. Промпты для обучения пишут люди, а ответы — модели. На один промпт выбирают лучший ответ из 10-30 поступивших.
В LlaMA 3.1 есть четыре уровня фильтрации данных:
1. Rule-based — удаляет дисклеймеры, смайлики и восклицания;
2. Quality — качественными считаются 25% ответов с наибольшим скором. Кроме того, используется LLM-as-judge. Ответы оцениваются по трём критериям для обычных данных и двум — для кодинга. Ответ считается качественным, если все критерии выполнены. Сэмпл попадает в обучение, если хотя бы один из методов показал, что ответ качественный;
3. Difficulty — оценивается по числу интентов в запросе: чем их больше, тем сложнее запрос. Также модель оценивает сложность по трёхбальной шкале;
4. SemDedup — этот метод используется для удаления похожих данных, при отборе отдается предпочтение семплам с максимальным значением quality * difficulty.
Алаймент для каждой из функциональных возможностей (Capabilities) LLaMA 3.1 имеет свои особенности. Например, в коде есть много синтетических данных, используется execution feedback и перевод на редкие языки программирования. А для математики берут тексты из претрейна и уже к ним генерируют инстракты.
Что касается фактологичности, то разработчики не добавляют новых знаний поверх претрейна. Для этого модель обучают отвечать только на те вопросы, на которые она может выдать ответ, согласованный с документом из претрейна. А для чувствительных тем, по которым в датасете много некорректной информации, используют ручную разметку.
Разбор подготовил
Душный NLP
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from gonzo-обзоры ML статей
Накатал большой пост в жанре мемуаров про нейросетевые фреймворки.
https://gonzoml.substack.com/p/deep-learning-frameworks
Обычно революцию диплёнинга объясняют тремя основными факторами: 1) большими датасетами, 2) GPU и 3) алгоритмами. Датасеты с GPU при этом основные, а алгоритмические улучшения так, есть, конечно, но и без них типа сработало бы.
Мне кажется, в этой революции несправедливо забыты нейросетевые фреймворки. Без них мы бы сейчас по-прежнему долго и с ошибками считали производные вручную, собирали бы сети из базовых матричных операций, делали бы всё это очень долго и нас было бы мало. Появление современных фреймворков сродни появлению высокоуровневых языков программирования.
Вот, восстанавливаю справедливость :)
https://gonzoml.substack.com/p/deep-learning-frameworks
Обычно революцию диплёнинга объясняют тремя основными факторами: 1) большими датасетами, 2) GPU и 3) алгоритмами. Датасеты с GPU при этом основные, а алгоритмические улучшения так, есть, конечно, но и без них типа сработало бы.
Мне кажется, в этой революции несправедливо забыты нейросетевые фреймворки. Без них мы бы сейчас по-прежнему долго и с ошибками считали производные вручную, собирали бы сети из базовых матричных операций, делали бы всё это очень долго и нас было бы мало. Появление современных фреймворков сродни появлению высокоуровневых языков программирования.
Вот, восстанавливаю справедливость :)
Gonzo ML
Deep Learning Frameworks
The Fourth Pillar of Deep Learning Revolution