Bem-vindo ao grupo de intercâmbio de tecnologia de modelos grandes da Firefly, siga nossa conta oficial e clique no botão ingressar no grupo.
Bem-vindo a seguir nosso Zhihu para comunicação e discussão: Red Rain is Pouring
Firefly é um projeto de treinamento de grandes modelos de código aberto que suporta pré-treinamento, ajuste fino de instrução e DPO para grandes modelos convencionais, incluindo, mas não limitado a, 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. Este projeto oferece suporte a treinamento completo de parâmetros, LoRA, treinamento eficiente QLoRA e oferece suporte a pré-treinamento, SFT e DPO . Se seus recursos de treinamento forem limitados, é altamente recomendável usar QLoRA para ajuste fino de instrução, porque verificamos a eficácia deste método no Open LLM Leaderboard e alcançamos resultados muito bons.
?O conteúdo principal deste projeto é o seguinte:
A versão atual foi adaptada aos templates de diferentes modelos de chat, e há grandes atualizações no código. Se preferir a versão anterior, você pode baixar o código v0.0.1-alpha
Os resultados da avaliação vêm do Open LLM Leaderboard da Hugging Face. Nossos modelos são treinados usando scripts QLoRA e apenas 1 a 2 V100s são usados para treinamento.
Modelo | Média | ARCO | HellaSwag | MMLU | Controle de qualidade verdadeiro |
---|---|---|---|---|---|
vaga-lume-mixtral-8x7b | 70,16 | 68.09 | 85,76 | 71,49 | 55,31 |
Yi-34B-Bate-papo | 69,97 | 65,44 | 84,16 | 74,9 | 55,37 |
vaga-lume-lhama-30b | 64,83 | 64,25 | 83,64 | 58,23 | 53,2 |
falcon-40b-instruir | 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 |
vaga-lume-lhama2-13b | 62.04 | 59.13 | 81,99 | 55,49 | 51,57 |
vicunha-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 |
assistentelm-13b-v1.2 | 60,79 | 59.04 | 82,21 | 54,64 | 47,27 |
vicunha-13b-v1.3 | 60.01 | 54,61 | 80,41 | 52,88 | 52.14 |
lhama-2-13b-chat | 59,93 | 59.04 | 81,94 | 54,64 | 44.12 |
vicunha-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 |
? Usando o código de treinamento deste projeto e os dados de treinamento acima, treinamos e abrimos o código-fonte dos seguintes pesos de modelo.
Modelo chinês:
Modelo | modelo básico | duração do treinamento |
---|---|---|
vaga-lume-baichuan2-13b | Baichuan-inc/Baichuan2-13B-Base | 1024 |
vaga-lume-baichuan-13b | Baichuan-inc/Baichuan-13B-Base | 1024 |
vaga-lume-qwen-7b | Qwen/Qwen-7B | 1024 |
firefly-chatglm2-6b | THUDM/chatglm2-6b | 1024 |
firefly-internlm-7b | internolm/internlm-7b | 1024 |
vaga-lume-baichuan-7b | baichuan-inc/baichuan-7B | 1024 |
vaga-lume-ziya-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
vaga-lume-bloom-7b1 | bigscience/bloom-7b1 | 1024 |
vaga-lume-bloom-2b6-v2 | YeungNLP/bloom-2b6-zh | 512 |
vaga-lume-bloom-2b6 | YeungNLP/bloom-2b6-zh | 512 |
vaga-lume-bloom-1b4 | YeungNLP/bloom-1b4-zh | 512 |
Modelo inglês:
Modelo | modelo básico | duração do treinamento |
---|---|---|
vaga-lume-mixtral-8x7b | mistralai/Mixtral-8x7B-v0.1 | 1024 |
vaga-lume-lhama-30b | huggyllama/lhama-30b | 1024 |
vaga-lume-lhama-13-v1.2 | NousResearch/Llama-2-13b-hf | 1024 |
vaga-lume-lhama2-13b | NousResearch/Llama-2-13b-hf | 1024 |
vaga-lume-lhama-13b-v1.2 | huggyllama/lhama-13b | 1024 |
vaga-lume-lhama-13b | huggyllama/lhama-13b | 1024 |
?No momento, este projeto organiza principalmente os seguintes conjuntos de dados de instruções e os organiza em um formato de dados unificado:
Conjunto de dados | introduzir |
---|---|
trem-vaga-lume-1.1M | Coletamos dados sobre 23 tarefas comuns da PNL chinesa e construímos muitos dados relacionados à cultura chinesa, como dísticos, poesia, tradução clássica chinesa, prosa, romances de Jin Yong, etc. Para cada tarefa, vários modelos de instruções são escritos manualmente para garantir a alta qualidade e riqueza dos dados. A quantidade de dados é de 1,15 milhão. |
moss-003-sft-dados | Dados de diálogo multi-rodada em chinês e inglês, de código aberto, fornecidos pela equipe MOSS da Universidade Fudan, contendo mais de 1 milhão de dados |
ultrachat | Dados de conversação multiturno em inglês de código aberto da Universidade de Tsinghua, contendo mais de 1,4 milhão de dados |
WizardLM_evol_instruct_V2_143k | O conjunto de dados de ajuste fino de instruções em inglês de código aberto do projeto WizardLM usa o método Evol-Instruct para evoluir as instruções e aumentar a complexidade das instruções para melhorar a capacidade do modelo de seguir instruções complexas. Contém 143 mil dados. |
escola_matemática_0,25M | Os dados de instruções de operação matemática de código aberto da equipe do projeto BELLE contêm 250.000 dados. |
shareAI/CodeChat | Inclui principalmente amostras de corpus relacionadas ao raciocínio lógico, perguntas e respostas de código e geração de código. |
shareAI/ShareGPT-Chinês-Inglês-90k | Conjunto de dados paralelos de perguntas e respostas homem-máquina de alta qualidade em chinês e inglês, cobrindo perguntas do usuário em cenários reais complexos. |
ultrachat_200k | Os dados de ajuste fino do comando em inglês de código aberto do projeto Zephyr são limpos com base em dados de ultrachat. |
ultrafeedback_binarizado | Conjunto de dados de preferência em inglês, pode ser usado para treinamento de DPO |
Os dados acima podem ser selecionados, amostrados ou combinados conforme necessário. Se você estiver treinando um modelo chinês, é recomendável tentar usar dados do moss. Em inglês, você pode tentar os dados do ultrachat e do WizardLM.
Os dados de treinamento estão no formato jsonl. O formato dos dados de cada linha é o seguinte. O campo de conversação é obrigatório e outros campos podem ser adicionados ou excluídos de acordo com as necessidades reais. Você pode consultar o arquivo data/dummy_data.jsonl no projeto.
{
"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总之,学习编程需要耐心和坚持,并需要不断学习和实践。通过以上方法可以帮助你避免陷入困境和放弃。"
}
],
}
A distribuição de dados do firefly-train-1.1M é mostrada na figura abaixo:
Para o formato dos dados, consulte o arquivo data/pretrain/dummy_pretrain.jsonl no projeto.
Para o formato dos dados, consulte o arquivo data/dummy_dpo.jsonl no projeto.
Se um erro for relatado durante o treinamento, você pode verificar primeiro o FAQ.
Extraímos vários componentes usados no treinamento para posterior expansão e otimização. Para detalhes, consulte a implementação no diretório de componentes. A configuração dos parâmetros durante o treinamento é armazenada no diretório train_args para facilitar o gerenciamento e as alterações unificadas. Você pode visualizar as configurações de treinamento de diferentes modelos no diretório train_args e modificá-las ou adicioná-las conforme necessário.
As versões de vários pacotes python principais são corrigidas em requisitos.txt. Basta executar o seguinte script. Perceber:
pip install requirements.txt
Se você precisar habilitar o Unsloth, é recomendado instalar ou atualizar os seguintes pacotes 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
Se você precisar usar o Unsloth para treinar Qwen1.5, instale os seguintes pacotes:
pip install git+https://github.com/yangjianxin1/unsloth.git
Durante o pré-treinamento, utilizamos a clássica perda autorregressiva, ou seja, o token em cada posição participará do cálculo da perda.
Ao ajustar a instrução, calculamos apenas a perda da parte de recuperação do assistente.
O diretório train_args armazena arquivos de configuração para diferentes modelos usando diferentes métodos de treinamento. Os parâmetros principais são descritos a seguir:
Os seguintes parâmetros precisam ser definidos ao usar o treinamento QLoRA:
Em relação à configuração dos parâmetros de deepspeed, você pode modificá-los conforme necessário.
Pré-treinamento completo de parâmetros, substitua {num_gpus} pelo número de placas gráficas:
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json
Ajuste fino de todas as instruções de parâmetros, substituindo {num_gpus} pelo número de placas gráficas:
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json
Pré-treinamento QLoRA de cartão único:
python train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Ajuste fino da instrução QLoRA de cartão único:
python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Pré-treinamento Doka QLoRA:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Ajuste fino da instrução Doka QLoRA:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
QLoRA de cartão único para treinamento de DPO:
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
Se você usar LoRA ou QLoRA para treinamento, este projeto salva apenas os pesos e arquivos de configuração do adaptador, e você precisa mesclar os pesos do adaptador com o modelo base. Para o script, consulte script/merge_lora.py
Fornecemos um script interativo para múltiplas rodadas de diálogo. Consulte o diretório script/chat para obter detalhes. Este script é compatível com todos os modelos treinados neste projeto para inferência. O template_name definido no script precisa ser consistente com o template_name durante o treinamento do modelo.
cd script/chat
python chat.py
Os parâmetros top_p, temperatura, repetição_penalty, do_sample e outros parâmetros no script de geração têm um grande impacto no efeito de geração do modelo e podem ser depurados e modificados de acordo com seus próprios cenários de uso.
O script de inferência suporta o uso do modelo base e do adaptador para inferência. A desvantagem é que cada vez que o script é iniciado, os pesos precisam ser mesclados, o que leva muito tempo.
Suporta o uso de 4 bits para inferência, poucos requisitos de memória e o efeito será ligeiramente reduzido.
Se ocorrer OOM, parâmetros como per_device_train_batch_size e max_seq_length podem ser reduzidos para aliviá-lo. Você também pode definir gradiente_checkpointing=true, o que pode reduzir bastante o uso de memória, mas a velocidade de treinamento será mais lenta.
Existem versões de cada pacote python em requisitos.txt
pip install -r requirements.txt
Você pode especificar o uso dos cartões nº 0 e nº 1 para treinamento das seguintes maneiras:
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
O treinamento do Baichuan2 requer a instalação do torch==2.0 e a desinstalação do xformers e do apex, caso contrário, um erro será relatado
RuntimeError: No such operator xformers::efficient_attention_forward_generic - did you forget to build xformers with `python setup.py develop`?
Qwen precisa desinstalar o flash-attn para treinamento QLoRA, caso contrário, um erro será relatado:
assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
Após investigação, esse problema existe amplamente em problemas na base de código oficial do Qwen. Se você treinar Qwen-Base e Yi-Base, é recomendável definir template_name = "default" para evitar esse problema. Se você executar SFT nos modelos Qwen-Chat e Yi-Chat, esse problema não ocorrerá. Você pode definir template_name como "qwen" e "yi" respectivamente.
Nota: Este problema não existe em Qwen1.5
Devido a fatores como a limitação dos parâmetros do modelo e o grau de limpeza dos dados de treinamento, o modelo de código aberto deste projeto pode ter as seguintes limitações:
Com base nas limitações do modelo acima, exigimos que o código, os dados e os modelos deste projeto não sejam utilizados para fins que causem danos à sociedade, devendo estar de acordo com a licença comercial do modelo base.
Se você usar dados, código ou modelos deste projeto, cite este projeto.
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流萤): 中文对话式大语言模型},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/yangjianxin1/Firefly}},
}