Добро пожаловать в группу обмена технологиями крупных моделей Firefly. Подпишитесь на нашу официальную учетную запись и нажмите кнопку «Присоединиться к группе».
Приглашаем вас подписаться на нашу Zhihu для общения и обсуждения: «Льет красный дождь»
Firefly — это проект обучения крупным моделям с открытым исходным кодом, который поддерживает предварительное обучение, точную настройку инструкций и DPO для основных крупных моделей, включая, помимо прочего, Qwen2, Yi-1.5, Llama3, Gemma, Qwen1.5, MiniCPM, MiniCPM3, Lla. ma, InternLM, Baichuan, ChatGLM, Yi, Deepseek, Qwen, Orion, Ziya, Xverse, Mistral, Mixtral-8x7B, Zephyr, Vicuna, Bloom и др. Этот проект поддерживает полное обучение параметров, эффективное обучение LoRA, QLoRA , а также предварительное обучение, SFT и DPO . Если ваши ресурсы обучения ограничены, мы настоятельно рекомендуем использовать QLoRA для тонкой настройки инструкций, поскольку мы проверили эффективность этого метода на Open LLM Leaderboard и добились очень хороших результатов.
?Основное содержание этого проекта заключается в следующем:
Текущая версия адаптирована под шаблоны разных моделей чатов, а также имеются серьезные обновления кода. Если вы предпочитаете предыдущую версию, вы можете скачать код v0.0.1-alpha.
Результаты оценки взяты из таблицы лидеров Open LLM компании Hugging Face. Наши модели обучаются с использованием сценариев QLoRA, при этом для обучения используются только 1–2 V100.
Модель | Средний | АРК | HellaSwag | ММЛУ | ПравдивыйQA |
---|---|---|---|---|---|
светлячок-микстраль-8x7b | 70.16 | 68.09 | 85,76 | 71,49 | 55.31 |
Yi-34B-Чат | 69,97 | 65,44 | 84,16 | 74,9 | 55,37 |
Светлячок-лама-30b | 64,83 | 64,25 | 83,64 | 58,23 | 53,2 |
falcon-40b-инструктировать | 63,47 | 61,6 | 84,31 | 55,45 | 52,52 |
гуанако-33б | 62,98 | 62,46 | 84,48 | 53,78 | 51,22 |
светлячок-лама2-13b-v1.2 | 62,17 | 60,67 | 80,46 | 56,51 | 51.03 |
светлячок-лама2-13b | 62.04 | 59.13 | 81,99 | 55,49 | 51,57 |
викунья-13b-v1.5 | 61,63 | 56,57 | 81,24 | 56,67 | 51,51 |
mpt-30b-чат | 61,21 | 58,7 | 82,54 | 51,16 | 52,42 |
Wizardlm-13b-v1.2 | 60,79 | 59.04 | 82,21 | 54,64 | 47,27 |
викунья-13b-v1.3 | 60.01 | 54,61 | 80,41 | 52,88 | 52.14 |
лама-2-13b-чат | 59,93 | 59.04 | 81,94 | 54,64 | 44.12 |
викунья-13b-v1.1 | 59,21 | 52,73 | 80.14 | 51,9 | 52.08 |
гуанако-13b | 59,18 | 57,85 | 83,84 | 48,28 | 46,73 |
? Используя обучающий код этого проекта и приведенные выше данные обучения, мы обучили и открыли исходный код следующих весов модели.
Китайская модель:
Модель | базовая модель | продолжительность тренировки |
---|---|---|
светлячок-baichuan2-13b | baichuan-inc/Baichuan2-13B-Base | 1024 |
светлячок-baichuan-13b | baichuan-inc/Baichuan-13B-Base | 1024 |
светлячок-qwen-7b | Квен/Квен-7B | 1024 |
светлячок-chatglm2-6b | THUDM/chatglm2-6b | 1024 |
светлячок-internlm-7b | стажер/стажер-7b | 1024 |
светлячок-baichuan-7b | Байчуань-Инк/Байчуань-7B | 1024 |
Светлячок-зия-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
светлячок-цветение-7b1 | bigscience/блум-7b1 | 1024 |
светлячок-цветение-2b6-v2 | YeungNLP/bloom-2b6-zh | 512 |
светлячок-цветение-2b6 | YeungNLP/bloom-2b6-zh | 512 |
светлячок-цветение-1b4 | YeungNLP/bloom-1b4-zh | 512 |
Английская модель:
Модель | базовая модель | продолжительность тренировки |
---|---|---|
светлячок-микстраль-8x7b | мистралай/Mixtral-8x7B-v0.1 | 1024 |
светлячок-лама-30b | хугиллама/лама-30b | 1024 |
светлячок-лама-13-v1.2 | NousResearch/Llama-2-13b-hf | 1024 |
светлячок-лама2-13b | NousResearch/Llama-2-13b-hf | 1024 |
светлячок-лама-13b-v1.2 | хугиллама/лама-13b | 1024 |
светлячок-лама-13b | хугиллама/лама-13b | 1024 |
? В настоящее время этот проект в основном организует следующие наборы данных инструкций и объединяет их в единый формат данных:
Набор данных | представлять |
---|---|
светлячок-поезд-1.1М | Мы собрали данные по 23 распространенным китайским задачам НЛП и построили множество данных, связанных с китайской культурой, таких как куплеты, поэзия, классический китайский перевод, проза, романы Цзинь Юна и т. д. Для каждой задачи вручную пишется несколько шаблонов инструкций, чтобы обеспечить высокое качество и насыщенность данных. Объем данных — 1,15 миллиона. |
мосс-003-sft-данные | Данные многораундового диалога на китайском и английском языках, открытые командой MOSS Фуданьского университета, содержат более 1 миллиона данных. |
ультрачат | Данные о многооборотных разговорах на английском языке из открытых источников Университета Цинхуа, содержащие более 1,4 миллиона данных. |
WizardLM_evol_instruct_V2_143k | Набор данных для точной настройки инструкций на английском языке, открытый в рамках проекта WizardLM, использует метод Evol-Instruct для развития инструкций и повышения сложности инструкций, чтобы улучшить способность модели следовать сложным инструкциям. Содержит 143 тыс. фрагментов данных. |
school_math_0.25M | Данные инструкций по математическим операциям, полученные командой проекта BELLE с открытым исходным кодом, содержат 250 000 фрагментов данных. |
поделитьсяAI/CodeChat | В основном он включает образцы корпуса, связанные с логическими рассуждениями, вопросами и ответами по коду, а также генерацией кода. |
поделитьсяAI/ShareGPT-китайский-английский-90k | Параллельный двуязычный набор высококачественных человеко-машинных вопросов и ответов на китайском и английском языках, охватывающий вопросы пользователей в реальных сложных сценариях. |
ультрачат_200к | Данные тонкой настройки английской команды с открытым исходным кодом проекта Zephyr очищаются на основе данных ультрачата. |
ultrafeedback_binarized | Набор данных о предпочтениях английского языка, можно использовать для обучения DPO. |
Вышеуказанные данные могут быть выбраны, взяты из выборки или объединены по мере необходимости. Если вы тренируете китайскую модель, рекомендуется попробовать использовать данные Мосса. На английском языке можно попробовать данные Ultrachat и WizardLM.
Данные обучения представлены в формате jsonl. Формат данных каждой строки является обязательным. Другие поля можно добавлять или удалять в соответствии с фактическими потребностями. Вы можете обратиться к файлу data/dummy_data.jsonl в проекте.
{
"conversation_id" : 44 ,
"category" : " Brainstorming " ,
"conversation" :[
{
"human" : "怎么能够有效地提升个人能力? " ,
"assistant" : "提升个人能力可以通过以下几个方面实现: nn 1. 学习新知识和技能:阅读相关书籍、参加课程和工作坊、观看教育视频等学习方式,可以帮助你掌握新的知识和技能,从而提升个人能力。 nn 2. 持续练习和实践:不断地练习和实践所学的知识和技能,可以帮助你更好地掌握和应用这些技能,提高你的表现和效率。 nn 3. 寻求反馈和改进:寻求他人的反馈和建议可以帮助你发现自己的不足之处,进一步完善和改进自己的能力。 nn 4. 建立良好的工作和生活习惯:建立良好的工作和生活习惯,如合理安排时间、注意健康、保持积极态度等,可以提高你的工作效率和生活品质,从而提升个人能力。 nn 5. 社交和交流:与他人交流和合作,可以帮助你更好地了解他人的观点和经验,从而提升自己的能力和见识。 "
},
{
"human" : "对于初学者来说,如何快速掌握编程技能? " ,
"assistant":"以下是几个建议,可以帮助初学者快速掌握编程技能:nn1. 学习基础知识:建议先学习编程语言的基础知识和语法,例如变量、数据类型、控制结构、函数等。可以通过在线课程、编程书籍、视频教程等方式学习。nn2. 实践编程:进行实际的编程练习是非常重要的,可以通过参加编程挑战、编写小项目等方式来进行实践。nn3. 寻求反馈:可以寻求他人的反馈和建议,例如在线编程社区、编程导师等,他们可以帮助你发现问题并及时纠正。nn4. 阅读优秀代码:阅读和分析优秀的代码可以帮助你学习其他程序员的编程思路和技巧,从而提高自己的编程能力。nn5. 不断学习和更新:编程技术和工具在不断更新和发展,因此需要不断学习新的知识和技能,例如学习新的编程语言、框架、工具等,以跟上技术的发展和变化。nn总之,学习编程需要耐心和坚持,并且需要不断地实践和学习。通过以上建议,可以帮助初学者快速掌握编程技能。"
},
{
"human" : "除了参加编程挑战和阅读代码,还有哪些方式可以提升自己的编程能力呢? " ,
"assistant":"除了参加编程挑战和阅读代码,还有以下几种方式可以提升自己的编程能力:nn1. 参与开源项目:加入一个开源项目,可以让你了解到实际的软件开发流程和团队合作方式,并且可以与其他开发人员合作,学习和分享编程技巧和经验。nn2. 进行代码重构:对已经编写的代码进行重构,可以帮助你了解更好的编程实践和设计模式,从而提高代码的可读性和可维护性。nn3. 练习算法和数据结构:算法和数据结构是编程中的重要基础,练习算法和数据结构可以帮助你了解不同的数据结构和算法,从而更好地解决实际问题。nn4. 学习软件工程和架构:学习软件工程和架构的知识,可以帮助你了解如何设计和构建可靠、可扩展和可维护的软件系统。nn5. 参加编程社区和论坛:参加编程社区和论坛可以让你与其他开发人员分享和讨论编程经验和技巧,了解最新的技术趋势和解决方案。nn总之,提升编程能力需要不断地学习和实践,并与其他开发人员和编程专家进行交流和合作,以获取更多的经验和知识。"
},
{
"human" : "你有没有推荐的编程挑战网站? " ,
"assistant":"当然,以下是一些值得推荐的编程挑战网站:nn1. HackerRank:HackerRank 是一个全球领先的技术招聘平台,提供数百种编程挑战和比赛,包括算法、数据结构、数学、SQL、AI 等多个技术领域。nn2. LeetCode:LeetCode 是一个在线编程学习和实践平台,提供数千道编程题目,主要涵盖算法和数据结构。nn3. Codeforces:Codeforces 是一个全球知名的编程竞赛网站,提供数百个比赛和练习题目,主要涵盖算法和数据结构。nn4. Codewars:Codewars 是一个在线编程学习和实践平台,提供数千道编程题目,主要涵盖算法、数据结构、面向对象编程等多个技术领域。nn5. Project Euler:Project Euler 是一个非营利性的在线编程挑战平台,提供一系列数学和计算机科学问题,需要用编程语言进行解答。nn以上这些编程挑战网站可以帮助你提高编程能力,并且可以与其他编程爱好者进行交流和竞争。"
},
{
"human" : "在学习编程的过程中,如何避免陷入困境和放弃呢? " ,
"assistant":"学习编程是一个需要长期坚持和不断学习的过程,以下是一些避免陷入困境和放弃的方法:nn1. 制定合理的学习计划:制定合理的学习计划,包括学习时间、学习内容、目标等,可以帮助你更好地管理时间和精力,避免学习过程中的松懈和分心。nn2. 寻找合适的学习资源:选择适合自己的学习资源,例如在线课程、编程书籍、视频教程等,可以让你更好地了解和掌握编程知识和技能。nn3. 寻求帮助和支持:在学习过程中,遇到问题和困难是很正常的,可以寻求他人的帮助和支持,例如参加编程社区、找到编程导师等。nn4. 进行实践和项目:实践和项目是学习编程的重要组成部分,可以帮助你更好地了解和掌握编程技能,同时也可以提高学习的兴趣和动力。nn5. 坚持并保持兴趣:坚持学习和保持兴趣是学习编程的关键。可以通过参加编程社区、参加编程竞赛、与其他编程爱好者交流等方式来保持兴趣和动力。nn总之,学习编程需要耐心和坚持,并需要不断学习和实践。通过以上方法可以帮助你避免陷入困境和放弃。"
}
],
}
Распределение данных Firefly-train-1.1M показано на рисунке ниже:
Формат данных указан в файле data/pretrain/dummy_pretrain.jsonl в проекте.
Формат данных указан в файле data/dummy_dpo.jsonl в проекте.
Если во время обучения сообщается об ошибке, вы можете сначала просмотреть FAQ.
Извлекаем различные компоненты, используемые в обучении, для последующего расширения и оптимизации. Подробности смотрите в каталоге компонентов. Конфигурация параметров во время обучения сохраняется в каталоге train_args для упрощения унифицированного управления и внесения изменений. Вы можете просмотреть конфигурации обучения различных моделей в каталоге train_args и при необходимости изменить или добавить их.
Версии нескольких основных пакетов Python исправлены в файле require.txt. Просто выполните следующий скрипт. Уведомление:
pip install requirements.txt
Если вам нужно включить Unsloth, рекомендуется установить или обновить следующие пакеты Python:
pip install git+https://github.com/unslothai/unsloth.git
pip install bitsandbytes==0.43.1
pip install peft==0.10.0
pip install torch==2.2.2
pip install xformers==0.0.25.post1
Если вам нужно использовать Unsloth для обучения Qwen1.5, установите следующие пакеты:
pip install git+https://github.com/yangjianxin1/unsloth.git
Во время предварительного обучения мы используем классический авторегрессионный убыток, то есть в расчете убытка будет участвовать токен на каждой позиции.
При доработке инструкции мы рассчитываем только потери части восстановления помощника.
В каталоге train_args хранятся файлы конфигурации для разных моделей с использованием разных методов обучения. Основные параметры описаны следующим образом:
При использовании обучения QLoRA необходимо установить следующие параметры:
Что касается конфигурации параметров DeepSpeed, вы можете изменить их по мере необходимости.
Полное предварительное обучение параметров, замените {num_gpus} на количество видеокарт:
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json
Точная настройка всех инструкций параметров, замена {num_gpus} на количество видеокарт:
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json
Предварительное обучение QLoRA по одной карте:
python train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Точная настройка инструкции QLoRA для одной карты:
python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Предварительное обучение Doka QLoRA:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Доработка инструкции Doka QLoRA:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Одна карта QLoRA для обучения DPO:
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
Если вы используете LoRA или QLoRA для обучения, этот проект сохраняет только веса и файлы конфигурации адаптера, и вам необходимо объединить веса адаптера с базовой моделью. Сценарий см. в script/merge_lora.py.
Мы предоставляем интерактивный сценарий для нескольких раундов диалога. Подробную информацию см. в каталоге сценариев/чата. Этот сценарий совместим со всеми моделями, обученными в этом проекте. Имя_шаблона, заданное в скрипте, должно соответствовать имени_шаблона во время обучения модели.
cd script/chat
python chat.py
Top_p, температура, повторение_пенальти, do_sample и другие параметры в сценарии генерации оказывают большое влияние на эффект генерации модели и могут быть отлажены и изменены в соответствии с вашими собственными сценариями использования.
Скрипт вывода поддерживает использование базовой модели и адаптера для вывода. Недостаток заключается в том, что каждый раз при запуске сценария необходимо объединять веса, что занимает много времени.
Поддерживает использование 4-битного вывода, низкие требования к памяти, и эффект будет немного уменьшен.
Если возникает OOM, для его устранения можно уменьшить такие параметры, как per_device_train_batch_size и max_seq_length. Вы также можете установить градиент_checkpointing=true, что может значительно сократить использование памяти, но скорость обучения будет медленнее.
В файле require.txt есть версии каждого пакета Python.
pip install -r requirements.txt
Указать использование карточек №0 и №1 для обучения можно следующими способами:
CUDA_VISIBLE_DEVICES=0,1 torchrun --nproc_per_node={num_gpus} train_qlora.py --train_args_file train_args/qlora/baichuan-7b-sft-qlora.json
Для обучения Baichuan2 необходимо установить torch==2.0 и удалить xformers и apex, в противном случае будет выдано сообщение об ошибке.
RuntimeError: No such operator xformers::efficient_attention_forward_generic - did you forget to build xformers with `python setup.py develop`?
Qwen необходимо удалить flash-attn для обучения QLoRA, иначе будет сообщено об ошибке:
assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
После запроса эта проблема широко распространена в официальной базе кода Qwen. Если вы тренируете Qwen-Base и Yi-Base, рекомендуется установить template_name="default", чтобы избежать этой проблемы. Если вы выполняете SFT на моделях Qwen-Chat и Yi-Chat, эта проблема не возникнет. Вы можете установить для параметра template_name значения «qwen» и «yi» соответственно.
Примечание. Эта проблема не существует в Qwen1.5.
Из-за таких факторов, как ограничение параметров модели и степень очистки обучающих данных, модель с открытым исходным кодом этого проекта может иметь следующие ограничения:
Исходя из ограничений вышеуказанной модели, мы требуем, чтобы код, данные и модели этого проекта не использовались в целях, наносящих вред обществу, и соответствовали коммерческой лицензии базовой модели.
Если вы используете данные, код или модели из этого проекта, укажите этот проект.
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流萤): 中文对话式大语言模型},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/yangjianxin1/Firefly}},
}