Bienvenue pour rejoindre le groupe d'échange technologique sur les grands modèles Firefly, suivez notre compte officiel et cliquez sur le bouton Rejoindre le groupe.
Bienvenue à suivre notre Zhihu pour la communication et la discussion : Red Rain is Pouring
Firefly est un projet open source de formation de grands modèles qui prend en charge la pré-formation, le réglage fin des instructions et le DPO pour les grands modèles grand public, notamment 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, etc. Ce projet prend en charge la formation complète des paramètres, LoRA, la formation efficace QLoRA et prend en charge la pré-formation, SFT et DPO . Si vos ressources de formation sont limitées, nous vous recommandons fortement d'utiliser QLoRA pour affiner l'enseignement, car nous avons vérifié l'efficacité de cette méthode sur l'Open LLM Leaderboard et obtenu de très bons résultats.
?Le contenu principal de ce projet est le suivant :
La version actuelle a été adaptée aux modèles de différents modèles de chat et des mises à jour majeures ont été apportées au code. Si vous préférez la version précédente, vous pouvez télécharger le code v0.0.1-alpha
Les résultats de l’évaluation proviennent du classement Open LLM de Hugging Face. Nos modèles sont formés à l'aide de scripts QLoRA, et seuls 1 à 2 V100 sont utilisés pour la formation.
Modèle | Moyenne | ARC | HellaSwag | MMLU | VéridiqueQA |
---|---|---|---|---|---|
luciole-mixtral-8x7b | 70.16 | 68.09 | 85,76 | 71.49 | 55.31 |
Yi-34B-Chat | 69,97 | 65.44 | 84.16 | 74,9 | 55.37 |
luciole-llama-30b | 64,83 | 64.25 | 83,64 | 58.23 | 53.2 |
falcon-40b-instruire | 63.47 | 61,6 | 84.31 | 55h45 | 52.52 |
guanaco-33b | 62,98 | 62.46 | 84.48 | 53,78 | 51.22 |
luciole-llama2-13b-v1.2 | 62.17 | 60,67 | 80.46 | 56.51 | 51.03 |
luciole-llama2-13b | 62.04 | 59.13 | 81,99 | 55.49 | 51.57 |
vigogne-13b-v1.5 | 61,63 | 56.57 | 81.24 | 56,67 | 51.51 |
mpt-30b-chat | 61.21 | 58,7 | 82,54 | 51.16 | 52.42 |
magicienlm-13b-v1.2 | 60,79 | 59.04 | 82.21 | 54,64 | 47.27 |
vigogne-13b-v1.3 | 60.01 | 54.61 | 80.41 | 52,88 | 52.14 |
lama-2-13b-chat | 59,93 | 59.04 | 81,94 | 54,64 | 44.12 |
vigogne-13b-v1.1 | 59.21 | 52,73 | 80.14 | 51,9 | 52.08 |
guanaco-13b | 59.18 | 57,85 | 83,84 | 48.28 | 46,73 |
? En utilisant le code de formation de ce projet et les données de formation ci-dessus, nous avons formé et open source les poids de modèle suivants.
Modèle chinois :
Modèle | modèle de base | durée de la formation |
---|---|---|
luciole-baichuan2-13b | baichuan-inc/Baichuan2-13B-Base | 1024 |
luciole-baichuan-13b | baichuan-inc/Baichuan-13B-Base | 1024 |
luciole-qwen-7b | Qwen/Qwen-7B | 1024 |
luciole-chatglm2-6b | THUDM/chatglm2-6b | 1024 |
luciole-internlm-7b | internelm/internlm-7b | 1024 |
luciole-baichuan-7b | baichuan-inc/baichuan-7B | 1024 |
luciole-ziya-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
luciole-bloom-7b1 | bigscience/bloom-7b1 | 1024 |
luciole-bloom-2b6-v2 | YeungNLP/bloom-2b6-zh | 512 |
luciole-bloom-2b6 | YeungNLP/bloom-2b6-zh | 512 |
luciole-fleur-1b4 | YeungNLP/bloom-1b4-zh | 512 |
Modèle anglais :
Modèle | modèle de base | durée de la formation |
---|---|---|
luciole-mixtral-8x7b | mistralai/Mixtral-8x7B-v0.1 | 1024 |
luciole-llama-30b | huggyllama/llama-30b | 1024 |
luciole-llama-13-v1.2 | NousResearch/Llama-2-13b-hf | 1024 |
luciole-llama2-13b | NousResearch/Llama-2-13b-hf | 1024 |
luciole-llama-13b-v1.2 | huggyllama/llama-13b | 1024 |
luciole-llama-13b | huggyllama/llama-13b | 1024 |
? À l'heure actuelle, ce projet organise principalement les ensembles de données d'instructions suivants et les organise dans un format de données unifié :
Ensemble de données | introduire |
---|---|
luciole-train-1.1M | Nous avons collecté des données sur 23 tâches courantes de PNL chinoise et construit de nombreuses données liées à la culture chinoise, telles que les distiques, la poésie, la traduction chinoise classique, la prose, les romans de Jin Yong, etc. Pour chaque tâche, plusieurs modèles d'instructions sont rédigés manuellement pour garantir la haute qualité et la richesse des données. La quantité de données est de 1,15 million. |
moss-003-sft-données | Données de dialogue multi-tours en chinois et en anglais open source par l'équipe MOSS de l'Université de Fudan, contenant plus d'un million de données |
ultrachat | Données de conversation multi-tours en anglais open source de l'Université Tsinghua, contenant plus de 1,4 million de données |
WizardLM_evol_instruct_V2_143k | L'ensemble de données de réglage fin des instructions en anglais open source du projet WizardLM utilise la méthode Evol-Instruct pour faire évoluer les instructions et améliorer la complexité des instructions afin d'améliorer la capacité du modèle à suivre des instructions complexes. Contient 143 000 éléments de données. |
school_math_0.25M | Les données d'instructions d'opérations mathématiques open source de l'équipe du projet BELLE contiennent 250 000 éléments de données. |
partagerAI/CodeChat | Il comprend principalement des échantillons de corpus liés au raisonnement logique, aux questions et réponses de code et à la génération de code. |
shareAI/ShareGPT-chinois-anglais-90k | Ensemble de données de questions et réponses homme-machine bilingue parallèle de haute qualité en chinois et en anglais, couvrant les questions des utilisateurs dans des scénarios réels complexes. |
ultrachat_200k | Les données de réglage fin de la commande anglaise open source du projet Zephyr sont nettoyées sur la base des données ultrachat. |
ultrafeedback_binarisé | Ensemble de données de préférence en anglais, peut être utilisé pour la formation DPO |
Les données ci-dessus peuvent être sélectionnées, échantillonnées ou combinées selon les besoins. Si vous entraînez un modèle chinois, il est recommandé d'essayer d'utiliser les données Moss. En anglais, vous pouvez essayer les données Ultrachat et WizardLM.
Les données de formation sont au format jsonl. Le format des données de chaque ligne est le suivant Le champ de conversation est obligatoire et d'autres champs peuvent être ajoutés ou supprimés selon les besoins réels. Vous pouvez vous référer au fichier data/dummy_data.jsonl dans le projet.
{
"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总之,学习编程需要耐心和坚持,并需要不断学习和实践。通过以上方法可以帮助你避免陷入困境和放弃。"
}
],
}
La distribution des données de firefly-train-1.1M est présentée dans la figure ci-dessous :
Pour le format des données, veuillez vous référer au fichier data/pretrain/dummy_pretrain.jsonl dans le projet.
Pour le format des données, veuillez vous référer au fichier data/dummy_dpo.jsonl dans le projet.
Si une erreur est signalée lors de la formation, vous pouvez d'abord consulter la FAQ.
Nous extrayons divers composants utilisés dans la formation pour une expansion et une optimisation ultérieures. Pour plus de détails, voir l'implémentation dans le répertoire des composants. La configuration des paramètres pendant la formation est stockée dans le répertoire train_args pour faciliter une gestion et des modifications unifiées. Vous pouvez afficher les configurations de formation de différents modèles dans le répertoire train_args et les modifier ou les ajouter si nécessaire.
Les versions de plusieurs packages Python majeurs sont corrigées sous conditions.txt. Exécutez simplement le script suivant. Avis:
pip install requirements.txt
Si vous devez activer Unsloth, il est recommandé d'installer ou de mettre à jour les packages Python suivants :
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
Si vous devez utiliser Unsloth pour entraîner Qwen1.5, installez les packages suivants :
pip install git+https://github.com/yangjianxin1/unsloth.git
Lors du pré-entraînement, nous utilisons la perte autorégressive classique, c'est-à-dire que le jeton à chaque position participera au calcul de la perte.
Lors de la mise au point de la consigne, on calcule uniquement la perte de la partie récupération de l'assistant.
Le répertoire train_args stocke les fichiers de configuration pour différents modèles utilisant différentes méthodes de formation. Les principaux paramètres sont décrits comme suit :
Les paramètres suivants doivent être définis lors de l'utilisation de la formation QLoRA :
Concernant la configuration des paramètres de deepspeed, vous pouvez le modifier selon vos besoins.
Pré-entraînement complet des paramètres, remplacez {num_gpus} par le nombre de cartes graphiques :
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json
Affinement de toutes les instructions de paramètres, en remplaçant {num_gpus} par le nombre de cartes graphiques :
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json
Pré-formation QLoRA à carte unique :
python train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Mise au point des instructions QLoRA à carte unique :
python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Pré-formation Doka QLoRA :
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Mise au point des instructions Doka QLoRA :
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Carte unique QLoRA pour la formation DPO :
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
Si vous utilisez LoRA ou QLoRA pour la formation, ce projet enregistre uniquement les poids et les fichiers de configuration de l'adaptateur, et vous devez fusionner les poids de l'adaptateur avec le modèle de base. Pour le script, voir script/merge_lora.py
Nous fournissons un script interactif pour plusieurs cycles de dialogue. Veuillez consulter le répertoire script/chat pour plus de détails. Ce script est compatible avec tous les modèles formés dans ce projet pour l'inférence. Le nom_modèle défini dans le script doit être cohérent avec le nom_modèle lors de la formation du modèle.
cd script/chat
python chat.py
Les paramètres top_p, température, repetition_penalty, do_sample et autres dans le script de génération ont un grand impact sur l'effet de génération du modèle et peuvent être débogués et modifiés selon vos propres scénarios d'utilisation.
Le script d'inférence prend en charge l'utilisation du modèle de base et de l'adaptateur pour l'inférence. L'inconvénient est qu'à chaque démarrage du script, les pondérations doivent être fusionnées, ce qui prend beaucoup de temps.
Prend en charge l'utilisation de 4 bits pour l'inférence, les besoins en mémoire faibles et l'effet sera légèrement réduit.
Si un MOO se produit, des paramètres tels que per_device_train_batch_size et max_seq_length peuvent être réduits pour l'atténuer. Vous pouvez également définir gradient_checkpointing=true, ce qui peut réduire considérablement l'utilisation de la mémoire, mais la vitesse d'entraînement sera plus lente.
Il existe des versions de chaque package Python dans exigences.txt
pip install -r requirements.txt
Vous pouvez préciser l'utilisation des cartes n°0 et n°1 pour la formation des manières suivantes :
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
La formation Baichuan2 nécessite l'installation de torch==2.0 et la désinstallation de xformers et apex, sinon une erreur sera signalée
RuntimeError: No such operator xformers::efficient_attention_forward_generic - did you forget to build xformers with `python setup.py develop`?
Qwen doit désinstaller flash-attn pour la formation QLoRA, sinon une erreur sera signalée :
assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
Après enquête, ce problème existe largement dans les problèmes de la base de code officielle de Qwen. Si vous entraînez Qwen-Base et Yi-Base, il est recommandé de définir template_name="default" pour éviter ce problème. Si vous effectuez SFT sur les modèles Qwen-Chat et Yi-Chat, ce problème ne se produira pas. Vous pouvez définir template_name sur "qwen" et "yi" respectivement.
Remarque : ce problème n'existe pas dans Qwen1.5
En raison de facteurs tels que la limitation des paramètres du modèle et le degré de nettoyage des données de formation, le modèle open source de ce projet peut avoir les limitations suivantes :
Sur la base des limites du modèle ci-dessus, nous exigeons que le code, les données et les modèles de ce projet ne soient pas utilisés à des fins préjudiciables à la société et soient conformes à la licence commerciale du modèle de base.
Si vous utilisez des données, du code ou des modèles de ce projet, veuillez citer ce projet.
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流萤): 中文对话式大语言模型},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/yangjianxin1/Firefly}},
}