Bienvenido a unirse al grupo de intercambio de tecnología de modelos grandes de Firefly, siga nuestra cuenta oficial y haga clic en el botón unirse al grupo.
Bienvenido a seguir nuestro Zhihu para comunicación y discusión: Red Rain is Pouring
Firefly es un proyecto de capacitación de modelos grandes de código abierto que admite capacitación previa, ajuste de instrucciones y DPO para modelos grandes convencionales, incluidos, entre otros, 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 proyecto admite capacitación con parámetros completos, LoRA, capacitación eficiente QLoRA y admite capacitación previa, SFT y DPO . Si sus recursos de capacitación son limitados, le recomendamos encarecidamente utilizar QLoRA para perfeccionar la instrucción, porque hemos verificado la efectividad de este método en Open LLM Leaderboard y hemos logrado muy buenos resultados.
?Los principales contenidos de este proyecto son los siguientes:
La versión actual se ha adaptado a las plantillas de diferentes modelos de chat y existen importantes actualizaciones en el código. Si prefieres la versión anterior, puedes descargar el código v0.0.1-alpha
Los resultados de la evaluación provienen de la tabla de clasificación Open LLM de Hugging Face. Nuestros modelos se entrenan utilizando scripts QLoRA y solo se utilizan de 1 a 2 V100 para el entrenamiento.
Modelo | Promedio | ARCO | HellaSwag | MMLU | VerazQA |
---|---|---|---|---|---|
luciérnaga-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 |
luciérnaga-llama-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 |
luciérnaga-llama2-13b-v1.2 | 62.17 | 60,67 | 80,46 | 56,51 | 51.03 |
luciérnaga-llama2-13b | 62.04 | 59.13 | 81,99 | 55,49 | 51,57 |
vicuña-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 |
magolm-13b-v1.2 | 60,79 | 59.04 | 82.21 | 54,64 | 47,27 |
vicuña-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 |
vicuña-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 |
Utilizando el código de entrenamiento de este proyecto y los datos de entrenamiento anteriores, entrenamos y abrimos los siguientes pesos del modelo.
modelo chino:
Modelo | modelo base | duración del entrenamiento |
---|---|---|
luciérnaga-baichuan2-13b | baichuan-inc/Baichuan2-13B-Base | 1024 |
luciérnaga-baichuan-13b | baichuan-inc/Baichuan-13B-Base | 1024 |
luciérnaga-qwen-7b | Qwen/Qwen-7B | 1024 |
luciérnaga-chatglm2-6b | THUDM/chatglm2-6b | 1024 |
luciérnaga-internlm-7b | interno/interno-7b | 1024 |
luciérnaga-baichuan-7b | baichuan-inc/baichuan-7B | 1024 |
luciérnaga-ziya-13b | YeungNLP/Ziya-LLaMA-13B-Pretrain-v1 | 1024 |
floración-de-luciérnaga-7b1 | ciencia grande/bloom-7b1 | 1024 |
floración-de-luciérnaga-2b6-v2 | YeungNLP/bloom-2b6-zh | 512 |
floración-de-luciérnaga-2b6 | YeungNLP/bloom-2b6-zh | 512 |
floración-de-luciérnaga-1b4 | YeungNLP/bloom-1b4-zh | 512 |
Modelo inglés:
Modelo | modelo base | duración del entrenamiento |
---|---|---|
luciérnaga-mixtral-8x7b | mistralai/Mixtral-8x7B-v0.1 | 1024 |
luciérnaga-llama-30b | huggyllama/llama-30b | 1024 |
luciérnaga-llama-13-v1.2 | NousResearch/Llama-2-13b-hf | 1024 |
luciérnaga-llama2-13b | NousResearch/Llama-2-13b-hf | 1024 |
luciérnaga-llama-13b-v1.2 | huggyllama/llama-13b | 1024 |
luciérnaga-llama-13b | huggyllama/llama-13b | 1024 |
En la actualidad, este proyecto organiza principalmente los siguientes conjuntos de datos de instrucciones y los organiza en un formato de datos unificado:
conjunto de datos | introducir |
---|---|
tren-luciérnaga-1.1M | Recopilamos datos sobre 23 tareas comunes de PNL en chino y construimos muchos datos relacionados con la cultura china, como coplas, poesía, traducción al chino clásico, prosa, novelas de Jin Yong, etc. Para cada tarea, se escriben manualmente varias plantillas de instrucciones para garantizar la alta calidad y riqueza de los datos. La cantidad de datos es 1,15 millones. |
moss-003-sft-datos | Datos de diálogo de múltiples rondas en chino e inglés de fuente abierta obtenidos por el equipo MOSS de la Universidad de Fudan, que contienen más de 1 millón de datos |
ultrachat | Datos de conversaciones de varios turnos en inglés de código abierto de la Universidad de Tsinghua, que contienen más de 1,4 millones de datos |
AsistenteLM_evol_instruct_V2_143k | El conjunto de datos de ajuste fino de instrucciones en inglés de código abierto del proyecto WizardLM utiliza el método Evol-Instruct para evolucionar las instrucciones y mejorar la complejidad de las instrucciones para mejorar la capacidad del modelo para seguir instrucciones complejas. Contiene 143.000 datos. |
escuela_matemáticas_0.25M | Los datos de instrucciones de operaciones matemáticas de fuente abierta por el equipo del proyecto BELLE contienen 250.000 datos. |
compartirAI/CodeChat | Incluye principalmente muestras de corpus relacionadas con razonamiento lógico, preguntas y respuestas de código y generación de código. |
shareAI/ShareGPT-chino-inglés-90k | Conjunto de datos de preguntas y respuestas hombre-máquina bilingües de alta calidad en paralelo en chino e inglés, que cubre preguntas de los usuarios en escenarios reales complejos. |
ultrachat_200k | Los datos de ajuste fino del comando en inglés abiertos por el proyecto Zephyr se limpian en función de los datos de ultrachat. |
ultrafeedback_binarizado | Conjunto de datos de preferencia de inglés que se puede utilizar para la formación de DPO |
Los datos anteriores se pueden seleccionar, muestrear o combinar según sea necesario. Si está entrenando un modelo chino, se recomienda intentar usar datos de Moss. En inglés, puede probar los datos de UltraChat y WizardLM.
Los datos de entrenamiento están en formato jsonl. El formato de datos de cada fila es el siguiente. El campo de conversación es obligatorio y se pueden agregar o eliminar otros campos según las necesidades reales. Puede consultar el archivo data/dummy_data.jsonl en el proyecto.
{
"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 distribución de datos de firefly-train-1.1M se muestra en la siguiente figura:
Para conocer el formato de datos, consulte el archivo data/pretrain/dummy_pretrain.jsonl en el proyecto.
Para conocer el formato de datos, consulte el archivo data/dummy_dpo.jsonl en el proyecto.
Si se informa un error durante la capacitación, primero puede consultar las preguntas frecuentes.
Extraemos varios componentes utilizados en la capacitación para su posterior expansión y optimización. Para obtener más detalles, consulte la implementación en el directorio de componentes. La configuración de parámetros durante la capacitación se almacena en el directorio train_args para facilitar la administración y los cambios unificados. Puede ver las configuraciones de entrenamiento de diferentes modelos en el directorio train_args y modificarlas o agregarlas según sea necesario.
Las versiones de varios paquetes importantes de Python están fijadas en requisitos.txt. Simplemente ejecute el siguiente script. Aviso:
pip install requirements.txt
Si necesita habilitar Unsloth, se recomienda instalar o actualizar los siguientes paquetes de 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
Si necesita utilizar Unsloth para entrenar Qwen1.5, instale los siguientes paquetes:
pip install git+https://github.com/yangjianxin1/unsloth.git
Durante el preentrenamiento, utilizamos la pérdida autorregresiva clásica, es decir, el token en cada posición participará en el cálculo de la pérdida.
Al ajustar las instrucciones, solo calculamos la pérdida de la parte de recuperación del asistente.
El directorio train_args almacena archivos de configuración para diferentes modelos utilizando diferentes métodos de entrenamiento. Los parámetros principales se describen a continuación:
Es necesario configurar los siguientes parámetros cuando se utiliza el entrenamiento QLoRA:
En cuanto a la configuración de parámetros de deepspeed, puedes modificarla según sea necesario.
Preentrenamiento completo de parámetros, reemplace {num_gpus} con la cantidad de tarjetas gráficas:
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/pretrain/full/bloom-1b1-pretrain-full.json
Ajuste de todas las instrucciones de parámetros, reemplazando {num_gpus} con la cantidad de tarjetas gráficas:
deepspeed --num_gpus={num_gpus} train.py --train_args_file train_args/sft/full/bloom-1b1-sft-full.json
Preentrenamiento QLoRA de tarjeta única:
python train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Ajuste fino de instrucciones QLoRA de tarjeta única:
python train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Entrenamiento previo de Doka QLoRA:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/pretrain/qlora/yi-6b-pretrain-qlora.json
Ajuste de instrucciones Doka QLoRA:
torchrun --nproc_per_node={num_gpus} train.py --train_args_file train_args/sft/qlora/yi-6b-sft-qlora.json
Tarjeta única QLoRA para formación de DPO:
python train.py --train_args_file train_args/sft/qlora/minicpm-2b-dpo-qlora.json
Si usa LoRA o QLoRA para la capacitación, este proyecto solo guarda los pesos y los archivos de configuración del adaptador, y debe fusionar los pesos del adaptador con el modelo base. Para ver el script, consulte script/merge_lora.py
Proporcionamos un script interactivo para múltiples rondas de diálogo. Consulte el directorio de script/chat para obtener más detalles. Este script es compatible con todos los modelos entrenados en este proyecto para realizar inferencias. El nombre_plantilla establecido en el script debe ser coherente con el nombre_plantilla durante el entrenamiento del modelo.
cd script/chat
python chat.py
Top_p, Temperature, repetition_penalty, do_sample y otros parámetros en el script de generación tienen un gran impacto en el efecto de generación del modelo y se pueden depurar y modificar de acuerdo con sus propios escenarios de uso.
El script de inferencia admite el uso del modelo base y el adaptador para la inferencia. La desventaja es que cada vez que se inicia el script, es necesario fusionar los pesos, lo que lleva mucho tiempo.
Admite el uso de 4 bits para inferencia, bajos requisitos de memoria y el efecto se reducirá ligeramente.
Si se produce OOM, parámetros como per_device_train_batch_size y max_seq_length se pueden reducir para aliviarlo. También puede configurar gradient_checkpointing=true, lo que puede reducir en gran medida el uso de memoria, pero la velocidad de entrenamiento será más lenta.
Hay versiones de cada paquete de Python en requisitos.txt
pip install -r requirements.txt
Puedes especificar el uso de las tarjetas N° 0 y N° 1 para entrenamiento de las siguientes maneras:
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
El entrenamiento de Baichuan2 requiere instalar torch==2.0 y desinstalar xformers y apex; de lo contrario, se informará un error
RuntimeError: No such operator xformers::efficient_attention_forward_generic - did you forget to build xformers with `python setup.py develop`?
Qwen necesita desinstalar flash-attn para el entrenamiento de QLoRA; de lo contrario, se informará un error:
assert all((i.dtype in [torch.float16, torch.bfloat16] for i in (q, k, v)))
Después de la consulta, este problema existe ampliamente en los problemas del código base oficial de Qwen. Si entrena Qwen-Base y Yi-Base, se recomienda configurar template_name="default" para evitar este problema. Si realiza SFT en los modelos Qwen-Chat y Yi-Chat, este problema no ocurrirá. Puede configurar template_name en "qwen" y "yi" respectivamente.
Nota: este problema no existe en Qwen1.5
Debido a factores como la limitación de los parámetros del modelo y el grado de limpieza de los datos de entrenamiento, el modelo de código abierto de este proyecto puede tener las siguientes limitaciones:
Con base en las limitaciones del modelo anterior, requerimos que el código, los datos y los modelos de este proyecto no se utilicen con fines que causen daño a la sociedad y deben cumplir con la licencia comercial del modelo base.
Si utiliza datos, códigos o modelos de este proyecto, cite este proyecto.
@misc{Firefly,
author = {Jianxin Yang},
title = {Firefly(流萤): 中文对话式大语言模型},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {url{https://github.com/yangjianxin1/Firefly}},
}