Firefly 대형 모델 기술 교류 그룹에 오신 것을 환영합니다. 공식 계정을 팔로우하고 그룹 가입 버튼을 클릭하세요.
의사소통과 토론을 위해 Zhihu를 팔로우하는 것을 환영합니다: Red Rain is Pouring
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 리더보드에서 이 방법의 효율성을 검증하고 매우 좋은 결과를 얻었기 때문입니다.
?본 프로젝트의 주요 내용은 다음과 같습니다.
현재 버전은 다양한 채팅 모델의 템플릿에 맞게 조정되었으며 코드가 크게 업데이트되었습니다. 이전 버전을 선호하는 경우 v0.0.1-alpha 코드를 다운로드할 수 있습니다.
평가 결과는 Hugging Face의 Open LLM Leaderboard에서 가져옵니다. 우리 모델은 QLoRA 스크립트를 사용하여 훈련되며, 훈련에는 1~2개의 V100만 사용됩니다.
모델 | 평균 | 호 | HellaSwag | MMLU | 진실한QA |
---|---|---|---|---|---|
반딧불이-mixtral-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 |
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 |
반딧불-바이촨-13b | baichuan-inc/Baichuan-13B-Base | 1024 |
반딧불-qwen-7b | Qwen/Qwen-7B | 1024 |
반딧불-chatglm2-6b | THUDM/chatglm2-6b | 1024 |
반딧불-인턴LM-7b | 인턴/인턴-7b | 1024 |
반딧불-바이촨-7b | baichuan-inc/baichuan-7B | 1024 |
반딧불-지야-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
반딧불이-7b1 | 빅사이언스/블룸-7b1 | 1024 |
반딧불-꽃-2b6-v2 | 영NLP/bloom-2b6-zh | 512 |
반딧불-꽃-2b6 | 영NLP/bloom-2b6-zh | 512 |
반딧불-꽃-1b4 | 영NLP/bloom-1b4-zh | 512 |
영어 모델:
모델 | 기본 모델 | 훈련 기간 |
---|---|---|
반딧불이-mixtral-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.1M | 우리는 23개의 일반적인 중국어 NLP 과제에 대한 데이터를 수집하고 대련, 시, 한문 번역, 산문, 진용 소설 등 중국 문화와 관련된 많은 데이터를 구축했습니다. 각 작업마다 데이터의 높은 품질과 풍부함을 보장하기 위해 여러 지침 템플릿이 수동으로 작성됩니다. |
이끼-003-sft-데이터 | 푸단대학교 MOSS 팀이 오픈소스로 제공한 중국어 및 영어 다단계 대화 데이터, 100만 개 이상의 데이터 포함 |
울트라챗 | 140만개 이상의 데이터를 포함하는 칭화대학교에서 오픈소스로 제공되는 영어 다단계 대화 데이터 |
WizardLM_evol_instruct_V2_143k | WizardLM 프로젝트에서 오픈 소스로 제공되는 영어 명령어 미세 조정 데이터 세트는 Evol-Instruct 방법을 사용하여 명령어를 발전시키고 명령어의 복잡성을 향상시켜 복잡한 명령어를 따르는 모델의 능력을 향상시킵니다. 143,000개의 데이터가 포함되어 있습니다. |
school_math_0.25M | BELLE 프로젝트팀이 오픈소스로 공개한 수학적 연산 지시 데이터는 250,000개에 달합니다. |
shareAI/코드챗 | 주로 논리적 추론, 코드 질문과 답변, 코드 생성과 관련된 말뭉치 샘플이 포함되어 있습니다. |
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 패키지의 버전은 요구사항.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
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, 온도, 반복_페널티, do_sample 및 기타 매개변수는 모델의 생성 효과에 큰 영향을 미치며 사용자 고유의 사용 시나리오에 따라 디버깅하고 수정할 수 있습니다.
추론 스크립트는 추론을 위한 기본 모델과 어댑터의 사용을 지원합니다. 단점은 스크립트가 시작될 때마다 가중치를 병합해야 하며 시간이 오래 걸린다는 것입니다.
추론을 위해 4비트 사용을 지원하고 메모리 요구 사항이 낮으며 효과가 약간 감소합니다.
OOM이 발생하는 경우 per_device_train_batch_size 및 max_seq_length와 같은 매개변수를 줄여 이를 완화할 수 있습니다. Gradient_checkpointing=true를 설정할 수도 있습니다. 이렇게 하면 메모리 사용량을 크게 줄일 수 있지만 훈련 속도는 느려집니다.
요구사항.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 공식 코드베이스의 문제에 널리 존재합니다. 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}},
}