somedeadinsidespy commited on
Commit
bd6bfef
·
verified ·
1 Parent(s): fa8d890

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +111 -3
README.md CHANGED
@@ -1,3 +1,111 @@
1
- ---
2
- license: openrail
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
+ ---