Firefly大型モデル技術交流グループへようこそ。公式アカウントをフォローして、グループに参加ボタンをクリックしてください。
コミュニケーションとディスカッションのために Zhihu をフォローすることを歓迎します:赤い雨が降り注いでいます
Fireflyは、Qwen2、Yi-1.5、Llama3、Gemma、Qwen1.5、MiniCPM、MiniCPM3、Lla を含むがこれらに限定されない、主流の大規模モデルの事前トレーニング、命令の微調整、DPO をサポートするオープンソースの大規模モデル トレーニング プロジェクトです。 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 をダウンロードできます。
評価結果は、Hugging Face の Open LLM Leaderboard から取得されます。私たちのモデルは QLoRA スクリプトを使用してトレーニングされており、トレーニングには 1 ~ 2 台の V100 のみが使用されます。
モデル | 平均 | アーク | ヘラスワッグ | MMLU | 真実の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 |
ファルコン-40b-命令 | 63.47 | 61.6 | 84.31 | 55.45 | 52.52 |
グアナコ-33b | 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 |
ウィザードlm-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 |
? このプロジェクトのトレーニング コードと上記のトレーニング データを使用して、次のモデルの重みをトレーニングし、オープンソース化しました。
中国モデル:
モデル | ベースモデル | トレーニングの長さ |
---|---|---|
ホタルバイチュアン2-13b | baichuan-inc/baichuan2-13B-Base | 1024 |
ホタル-白川-13b | baichuan-inc/baichuan-13B-Base | 1024 |
ホタルクウェン-7b | クウェン/クウェン-7B | 1024 |
ファイアフライチャットglm2-6b | THUDM/チャットglm2-6b | 1024 |
ファイアフライインターンlm-7b | internlm/internlm-7b | 1024 |
ホタルバイチュアン-7b | baichuan-inc/baichuan-7B | 1024 |
ホタル-ジヤ-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
ホタルブルーム 7b1 | ビッグサイエンス/ブルーム-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/ラマ-2-13b-hf | 1024 |
ホタルラマ2-13b | NousResearch/ラマ-2-13b-hf | 1024 |
ファイアフライラマ-13b-v1.2 | ハギラマ/ラマ-13b | 1024 |
ホタル-ラマ-13b | ハギラマ/ラマ-13b | 1024 |
現在、このプロジェクトでは主に以下の指示データセットを整理し、統一したデータ形式にまとめています。
データセット | 導入 |
---|---|
ホタルトレイン-1.1M | 私たちは 23 の一般的な中国語 NLP タスクに関するデータを収集し、対句、詩、漢文の翻訳、散文、金庸の小説など、中国文化に関連する多くのデータを構築しました。データの高品質と豊富さを確保するために、タスクごとにいくつかの指示テンプレートが手動で作成されます。データ量は 115 万件です。 |
moss-003-sft-データ | 復旦大学の MOSS チームがオープンソース化した中国語と英語のマルチラウンド対話データ (100 万件以上のデータを含む) |
ウルトラチャット | 清華大学がオープンソース化した英語のマルチターン会話データ (140 万以上のデータを含む) |
WizardLM_evol_instruct_V2_143k | WizardLM プロジェクトによってオープンソース化された英語の命令微調整データ セットは、Evol-Instruct メソッドを使用して命令を進化させ、命令の複雑さを強化して、複雑な命令に従うモデルの能力を向上させます。 143k 個のデータが含まれます。 |
学校_数学_0.25M | BELLEプロジェクトチームがオープンソース化した算術演算指示データには25万件のデータが含まれています。 |
シェアAI/コードチャット | 主に、論理的推論、コードの質問と回答、コード生成に関連するコーパス サンプルが含まれています。 |
shareAI/ShareGPT-中国語-英語-90k | 中国語と英語の対訳の高品質なヒューマン マシンの質問と回答のデータ セットで、実際の複雑なシナリオにおけるユーザーの質問をカバーします。 |
ウルトラチャット_200k | Zephyr プロジェクトによってオープンソース化された英語コマンドの微調整データは、ウルトラチャット データに基づいてクリーンアップされています。 |
ウルトラフィードバック_バイナリ化 | 英語の好みのデータセット、DPO トレーニングに使用可能 |
上記のデータは、必要に応じて選択、サンプリング、または結合できます。中国語のモデルをトレーニングしている場合は、moss データを使用してみることをお勧めします。英語では、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 パッケージのバージョンは、requirements.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
Qwen1.5 をトレーニングするために Unsloth を使用する必要がある場合は、次のパッケージをインストールします。
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
DPO トレーニング用のシングル カード QLoRA:
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
トレーニングに LoRA または QLoRA を使用する場合、このプロジェクトではアダプターの重みと構成ファイルのみが保存されるため、アダプターの重みをベース モデルとマージする必要があります。スクリプトについては、script/merge_lora.py を参照してください。
詳細については、スクリプト/チャット ディレクトリを参照してください。このスクリプトは、推論用にこのプロジェクトでトレーニングされたすべてのモデルと互換性があります。スクリプトで設定された template_name は、モデルのトレーニング中の template_name と一致している必要があります。
cd script/chat
python chat.py
生成スクリプト内の top_p、温度、repetition_penalty、do_sample およびその他のパラメーターは、モデルの生成効果に大きな影響を与え、独自の使用シナリオに応じてデバッグおよび変更できます。
推論スクリプトは、推論用のベース モデルとアダプターの使用をサポートしています。欠点は、スクリプトを開始するたびに重みをマージする必要があり、時間がかかることです。
推論に 4 ビットの使用をサポートし、メモリ要件が低いため、効果はわずかに軽減されます。
OOM が発生した場合は、per_device_train_batch_size や max_seq_length などのパラメータを削減して軽減できます。 gradient_checkpointing=true を設定することもできます。これにより、メモリ使用量を大幅に削減できますが、トレーニング速度は遅くなります。
各Pythonパッケージのバージョンはrequirements.txtにあります
pip install -r requirements.txt
カード No.0 と No.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 公式コード ベースの問題に広く存在します。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}},
}