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 |
+
---
|