Update README.md
Browse files
README.md
CHANGED
|
@@ -1,3 +1,111 @@
|
|
| 1 |
-
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## Домашнее задание 3: Обучение LLaMA
|
| 2 |
+
|
| 3 |
+
__Мягкий дедлайн: 11.11.2024 23:59__
|
| 4 |
+
__Жесткий дедлайн: 14.11.2024 23:59__
|
| 5 |
+
|
| 6 |
+
Как не сложно догадаться, в этом задании вам предлагается написать и обучить собственную [LLaMA](https://arxiv.org/abs/2302.13971) модель. Пожалуйста, внимательно прочитайте этот текст перед выполнением задания, это поможет вам избежать глупых ошибок.
|
| 7 |
+
|
| 8 |
+
### О задании
|
| 9 |
+
|
| 10 |
+
LLaMA (Large Language Model Meta AI) – это большая языковая модель, занимающаяя на данный момент лидирующие позиции по качеству генерации. Как и у всех современных моделей, оригинальные слои Трансформера в ней заменены на улучшенные. Мы разбирали их всех на 5-ой лекции. Ваша задача будет состоять в том, чтобы самостоятельно реализовать архитектуру LLaMA, обучить ее на предложенных данных и замерить качество с помощью бенчмарка. При написании кода __нельзя__ пользоваться сторонними ресурсами (даже с указанием источника). По итогам работы вам нужно будет написать отчет о том, что у вас получилось, а что нет, с какими сложностями вы столкнулись в процессе выполнения задания и как вы с ними справились.
|
| 11 |
+
Это задание сложнее всех предыдущих, поэтому на него дается больше времени. Мы настоятельно рекомендуем не откладывать его на потом. Мы не запрещаем оформлять код в ноутбуке, однако уверяем, что вам будет гораздо проще, если вы оформите задание в виде проекта.
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
### Данные
|
| 15 |
+
|
| 16 |
+
Для обучения вам предлагается использоваться часть датасета [`OpenWebText`](https://skylion007.github.io/OpenWebTextCorpus/). Это один из самых популярных датасетов для обучения трансформерных моделей. На нем обучались GPT-2, RoBERTa и многие другие. Полная его версия состоит из 8-ми миллионов текстов (38 GB), собранных по ссылкам из постов на Reddit. Все тексты уже почищены, поэтому делать с ними ничего не надо.
|
| 17 |
+
|
| 18 |
+
Так как у вас нет ни времени, ни ресурсов, чтобы учиться на всем корпусе, мы сократили его в 8 раз. Размер датасета рассчитан таким образом, чтобы вам не пришлось обучаться больше одной эпохи. Загрузить его можно следующим образом:
|
| 19 |
+
|
| 20 |
+
```
|
| 21 |
+
from datasets import load_dataset
|
| 22 |
+
|
| 23 |
+
dataset = load_dataset("ashaba1in/small_openwebtext")
|
| 24 |
+
```
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
### Задания
|
| 28 |
+
|
| 29 |
+
Сформулируем все задания более подробно.
|
| 30 |
+
|
| 31 |
+
1. Внимательно прочитайте оригинальную статью [LLaMA](https://arxiv.org/abs/2302.13971), особенно части про архитектуру и обучение.
|
| 32 |
+
1. Реализуйте модель по описанию со всеми архитектурными изменениями: _RoPE_, _SwiGLU_, _RMSNorm_, _Pre-normalization_. Опционально вы так же можете добавить ускорение attention c помощью [xformers](https://github.com/facebookresearch/xformers) ([гайд](https://huggingface.co/docs/diffusers/optimization/memory#memory-efficient-attention)). Гиперпараметры вы можете подбирать по своему усмотрению, однако общий размер модели должен быть не меньше 100М параметров, не считая эмбеддингов. Ваша модель должна быть интегрирована в hugging face, чтобы ее можно было загружать и скачивать из Hub (об этом ниже).
|
| 33 |
+
1. Обучите модель на задачу безусловной генерации. В идеале ошибка на обучении должна опуститься ниже 4. Вы можете обучить свой токенизатор, но лучше взять готовый от MistralAI.
|
| 34 |
+
```
|
| 35 |
+
tokenizer = AutoTokenizer.from_pretrained('mistralai/Mistral-7B-v0.1')
|
| 36 |
+
```
|
| 37 |
+
4. Замерьте качество на бенчмарке tinyMMLU (об этом ниже).
|
| 38 |
+
__Важно__: в бенчмарке, который мы будем использовать, длина текстов лежит в диапазоне 512-1024 токенов. Поэтому вам надо сделать так, чтобы модель могла работать с такой длиной. У вас есть два варианта:
|
| 39 |
+
1. Обучить модель с длиной 1024 (_Медленно, затратно по памяти_)
|
| 40 |
+
1. Обучить модель с длиной 256 и дофайнтюнить с [Position Interpolation](https://arxiv.org/abs/2306.15595). (_Быстро, круто, чуть сложнее реализовать_)
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
### Тестирование
|
| 44 |
+
|
| 45 |
+
Для тестирования LLM обычно используются специально сконструированные бенчмарки. Бенчмарк – это сборник различных задач, проверяющих умение модели понимать текст и отвечать на вопросы. Наиболее популярные бенчмарки – [MMLU](https://arxiv.org/abs/2009.03300), [HellaSwag](https://arxiv.org/abs/1905.07830), [WinoGrande](https://winogrande.allenai.org/), [Arc](https://arxiv.org/abs/1803.05457v1) и так далее. Посмотреть на полный список всех бенчмарков для разных задач можно [тут](https://huggingface.co/collections/open-llm-leaderboard/the-big-benchmarks-collection-64faca6335a7fc7d4ffe974a), а почитать про то, чем они отличаются, [тут](https://medium.com/alan/benchmarking-large-language-models-1e1ab5b809ac).
|
| 46 |
+
Главная проблема всех этих бенчмарков в том, что они огромны. Всего лишь одно тестирование модели может стоить [больше $10.000](https://arxiv.org/abs/2211.09110). Для действительно крупных моделей такие бенчмарки необходимы для точной и всесторонней оценки качества. Однако мы, очевидно, не можем позволить себе тестировать свои модели на них. Поэтому мы возьмем [бенчмарк поменьше](https://research.ibm.com/blog/efficient-llm-benchmarking), а именно [tinyMMLU](https://huggingface.co/datasets/tinyBenchmarks/tinyMMLU). Он состоит всего из 100 вопросов, в которых модели предлагается выбрать один из 4 вариантов ответа. Для оценки вероятности ответа в модель подаются все 4 варианта по очереди с вопросом в виде префикса. По итогу оценивается метрика IRT (очень похожа на обычную точность). Подробнее можно прочитать в [статье](https://arxiv.org/abs/2402.14992).
|
| 47 |
+
|
| 48 |
+
#### Как бенчить модель
|
| 49 |
+
|
| 50 |
+
Для запуска модели на бенчмарке мы будем использовать библиотеку [lm-eval-harness](https://github.com/EleutherAI/lm-evaluation-harness/tree/main). По ссылке можно найти все инстукции по установке. Для запуска теста удобнее всего использовать команду:
|
| 51 |
+
```
|
| 52 |
+
lm_eval --model hf --model_args pretrained=<hf_model_path> --tasks tinyMMLU --batch_size 4 --output_path <output_path> --log_samples --device cuda:0 --trust_remote_code
|
| 53 |
+
```
|
| 54 |
+
После ее вызова в `<output_path>` сохранится файл с выходами модели. Имея его, нужно запустить следующий код.
|
| 55 |
+
|
| 56 |
+
```
|
| 57 |
+
import json
|
| 58 |
+
import numpy as np
|
| 59 |
+
import tinyBenchmarks as tb
|
| 60 |
+
|
| 61 |
+
|
| 62 |
+
file_name = "<output_path>/<hf_model_name>/<file>.jsonl"
|
| 63 |
+
|
| 64 |
+
results = []
|
| 65 |
+
with open(file_path, 'r') as file:
|
| 66 |
+
for i, line in enumerate(file):
|
| 67 |
+
results.append(json.loads(line))
|
| 68 |
+
|
| 69 |
+
# Ensuring correct order of outputs
|
| 70 |
+
results = sorted(results, key=lambda x: x['doc_id'])
|
| 71 |
+
|
| 72 |
+
y = np.array([float(item['acc_norm']) for item in results])
|
| 73 |
+
|
| 74 |
+
metric_results = tb.evaluate(y, 'mmlu')
|
| 75 |
+
print(metric_results)
|
| 76 |
+
```
|
| 77 |
+
|
| 78 |
+
__Важно__: Для запуска первой команды вам надо положить вашу модель на Hugging Face Hub. Для этого модель должна иметь определенный вид. Подробный гайд написан [здесь](https://huggingface.co/docs/transformers/custom_models). Обратите внимание, что все файлы вашей модел�� должны лежать в отдельной папке проекта. Без этого работать не будет. После загрузки модели на Hub, она должна подтягиваться с помощью следующего кода без ошибок.
|
| 79 |
+
```
|
| 80 |
+
model = AutoModelForCausalLM.from_pretrained(<model_name>, trust_remote_code=True)
|
| 81 |
+
```
|
| 82 |
+
`trust_remote_code=True` тут обязателен, так как код для модели лежит на хабе, а не в репозитории `transformers`. Если модель никак не хочет загружаться, то можно посмотреть на то, как выглядит формат [GPT-2](https://github.com/huggingface/transformers/blob/main/src/transformers/models/gpt2/modeling_gpt2.py).
|
| 83 |
+
|
| 84 |
+
Мы не ждем от вас высоких значений метрик (все таки модель относительно маленькая и учится не очень долго). Хорошим достижением будет, если вы получите IRT > 0.3.
|
| 85 |
+
|
| 86 |
+
|
| 87 |
+
### Подсказки
|
| 88 |
+
|
| 89 |
+
Обучать LLM не бывает легко, особенно в первый раз. Обучение занимает много времени (примерно, одну ночь), поэтому обратите внимание на следующие моменты.
|
| 90 |
+
|
| 91 |
+
1. Во время обучения логируйте все, что можете (ошибку, нормы градиентов, число токенов в батче, ...). Это поможет вам заметить, если что-то идет не так.
|
| 92 |
+
1. Не жгите ресурсы просто так. Перед запуском обучения тщательно проверьте, что все компоненты кода ведут себя так, как надо. Если модель не учится совсем, то у вас точно ошибка в коде, а не плохие гиперпараметры.
|
| 93 |
+
1. Не забывайте периодически сохранять модель и оптимизатор, чтобы можно было перезапустить обучение с последнего чекпойнта в случае чего.
|
| 94 |
+
1. Перед запуском долгого обучения проверьте, что все в порядке, обучив маленькую модель на маленькой выборке. Лосс должен падать, градиенты не взрываться и тд.
|
| 95 |
+
1. Не забывайте стандартные методы ускорения: `accelerate`, `mixed-precision` и тд. Подробный гайд [тут](https://huggingface.co/docs/transformers/perf_train_gpu_one).
|
| 96 |
+
1. При формировании батча регулируйте число токенов, а не число текстов. Лучше всего вытягивать все тексты батча в строку и нарезать на куски максимальной длины, чтобы не было паддингов. Тексты будут начинаться не сначала, но это повысит эффективность.
|
| 97 |
+
1. При тестировании гипотез старайтесь совершать одно изменение за раз. Постарайтесь, чтобы это изменение было обдуманным.
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
### Оценивание
|
| 101 |
+
|
| 102 |
+
При оценивании мы будем смотреть на несколько факторов:
|
| 103 |
+
1. Ваш отчет. Опишите в нем подробно процесс выполнения задания. По отчету мы будем понимать, как вы думали и какие выводы делали из наблюдений.
|
| 104 |
+
1. Удалось ли обучить модель хоть как-то. Не забудьте добавить в отчет графики, в первую очередь лосс.
|
| 105 |
+
1. Организация кода. Код должен быть написан аккуратно, без дублирований и хардкода переменных.
|
| 106 |
+
|
| 107 |
+
Оценка = 0.5 * [правильность реализации модели и обучения] + 0.3 * [отчет] + 0.2 * [качество модели]
|
| 108 |
+
|
| 109 |
+
---
|
| 110 |
+
license: openrail
|
| 111 |
+
---
|