歡迎加入Firefly大模型技術交流群,追蹤我們的公眾號,點選加群按鈕即可。
歡迎關注我們的知乎進行交流討論:紅雨瓢潑
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上驗證了該方法的有效性,並且取得了非常不錯的成績。
? 本項目主要內容如下:
目前版本針對不同的chat模型的template進行了適配,程式碼存在較大的更新。若你喜歡先前的版本,可下載代碼v0.0.1-alpha
評測結果來自Hugging Face的Open LLM Leaderboard。我們的模型均採用QLoRA腳本進行訓練,訓練僅使用1~2張V100。
模型 | Average | ARC | HellaSwag | MMLU | TruthfulQA |
---|---|---|---|---|---|
firefly-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 |
firefly-llama-30b | 64.83 | 64.25 | 83.64 | 58.23 | 53.2 |
falcon-40b-instruct | 63.47 | 61.6 | 84.31 | 55.45 | 52.52 |
guanaco-33b | 62.98 | 62.46 | 84.48 | 53.78 | 51.22 |
firefly-llama2-13b-v1.2 | 62.17 | 60.67 | 80.46 | 56.51 | 51.03 |
firefly-llama2-13b | 62.04 | 59.13 | 81.99 | 55.49 | 51.57 |
vicuna-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 |
wizardlm-13b-v1.2 | 60.79 | 59.04 | 82.21 | 54.64 | 47.27 |
vicuna-13b-v1.3 | 60.01 | 54.61 | 80.41 | 52.88 | 52.14 |
llama-2-13b-chat | 59.93 | 59.04 | 81.94 | 54.64 | 44.12 |
vicuna-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 |
? 使用本專案的訓練程式碼,以及上述訓練數據,我們訓練並開源了以下模型權重。
中文模型:
模型 | 基座模型 | 訓練長度 |
---|---|---|
firefly-baichuan2-13b | baichuan-inc/Baichuan2-13B-Base | 1024 |
firefly-baichuan-13b | baichuan-inc/Baichuan-13B-Base | 1024 |
firefly-qwen-7b | Qwen/Qwen-7B | 1024 |
firefly-chatglm2-6b | THUDM/chatglm2-6b | 1024 |
firefly-internlm-7b | internlm/internlm-7b | 1024 |
firefly-baichuan-7b | baichuan-inc/baichuan-7B | 1024 |
firefly-ziya-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
firefly-bloom-7b1 | bigscience/bloom-7b1 | 1024 |
firefly-bloom-2b6-v2 | YeungNLP/bloom-2b6-zh | 512 |
firefly-bloom-2b6 | YeungNLP/bloom-2b6-zh | 512 |
firefly-bloom-1b4 | YeungNLP/bloom-1b4-zh | 512 |
英文模型:
模型 | 基座模型 | 訓練長度 |
---|---|---|
firefly-mixtral-8x7b | mistralai/Mixtral-8x7B-v0.1 | 1024 |
firefly-llama-30b | huggyllama/llama-30b | 1024 |
firefly-llama-13-v1.2 | NousResearch/Llama-2-13b-hf | 1024 |
firefly-llama2-13b | NousResearch/Llama-2-13b-hf | 1024 |
firefly-llama-13b-v1.2 | huggyllama/llama-13b | 1024 |
firefly-llama-13b | huggyllama/llama-13b | 1024 |
? 目前本專案主要整理瞭如下指令資料集,並將其整理成統一的資料格式:
數據集 | 介紹 |
---|---|
firefly-train-1.1M | 我們收集了23種常見的中文NLP任務的數據,並且建構了許多與中華文化相關的數據,如對聯、作詩、文言文翻譯、散文、金庸小說等。對於每個任務,由人工書寫若干種指令模板,保證資料的高品質與豐富度,資料量為115萬 |
moss-003-sft-data | 由復旦大學MOSS團隊開源的中英文多輪對話數據,包含100萬+數據 |
ultrachat | 由清華大學開源的英文多輪對話數據,包含140萬+數據 |
WizardLM_evol_instruct_V2_143k | 由WizardLM專案開源的英文指令微調資料集,透過Evol-Instruct方法讓指令進化,加強指令的複雜度,以提升模型對複雜指令的遵循能力。包含143k條數據。 |
school_math_0.25M | 由BELLE計畫組開源的數學運算指令數據,包含25萬個數據。 |
shareAI/CodeChat | 主要包含邏輯推理、程式碼問答、程式碼產生相關語料樣本。 |
shareAI/ShareGPT-Chinese-English-90k | 中英文平行雙語優質人機問答資料集,涵蓋真實複雜場景下的使用者提問。 |
ultrachat_200k | 由Zephyr專案開源的英文指令微調數據,在ultrachat資料基礎上進行清洗 |
ultrafeedback_binarized | 英文偏好資料集,可用於DPO訓練 |
可按需選擇、採樣或組合上述資料。若是訓練中文模型,建議嘗試使用moss數據,英文可嘗試ultrachat和WizardLM數據。
訓練資料為jsonl格式,每一行的資料格式如下,其中conversation欄位是必需的,可以根據實際需求添加或刪除其他欄位。 可以參考專案中的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。
我們將訓練中使用的各種組件抽取出來,以便後續的擴展和優化,詳見component目錄下的實現。訓練時的參數配置儲存在train_args目錄下,方便統一管理與變更。大家可以在train_args目錄下查看不同模型的訓練配置,依需求修改或新增。
在requirements.txt下固定了幾個主要的python套件的版本,執行如下腳本即可。注意:
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
預訓練時,我們採用經典的自回歸損失,即每個位置的token都會參與loss計算。
指令微調時,我們只計算assistant回覆部分的loss。
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
多卡QLoRA預訓練:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
多卡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進行訓練,本專案僅保存adapter的權重和設定文件,需要將adapter權重與base model進行合併。腳本見script/merge_lora.py
我們提供了多輪對話的互動腳本,詳見script/chat目錄,可同時相容於本項目訓練的所有模型進行推理。腳本中設定的template_name,需要與模型訓練時的template_name一致。
cd script/chat
python chat.py
產生腳本中的top_p、temperature、repetition_penalty、do_sample等參數對模型的產生效果影響較大,可依照自己的使用場景進行偵錯修改。
推理腳本中支援使用base model和adapter進行推理,缺點是每次啟動腳本都需要合併一次權重,等待時間較長。
支援使用4bit進行推理,顯存要求低,效果會略有下降。
如果發生OOM,可以縮小per_device_train_batch_size、max_seq_length等參數來緩解。也可以設gradient_checkpointing=true,可以大幅降低顯存佔用,但訓練速度會變慢一些。
requirements.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進行QLoRA訓練需要卸載flash-attn,否則會報錯:
assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
經查詢,此問題廣泛存在於Qwen官方程式碼庫的issue中,如果訓練Qwen-Base和Yi-Base,建議設template_name="default",可以避免該問題。 如果對Qwen-Chat和Yi-Chat模型進行SFT,則不會產生該問題,可將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}},
}