本文旨在帮助读者快速掌握使用Firefly项目微调Baichuan-13B模型,该教程同样适用于微调llama、ziya、bloom等模型,并且Firefly项目正在逐步适配更多开源大模型,包括InternLM、CPM-bee、ChatGLM2等。 本文是一个Step By Step的大模型训练教程,即使你是训练大模型的新手,通过本教程,也可以快速在一张显卡上训练自己的大模型。 Firefly项目链接: https://github.com/yangjianxin1/Firefly 如果Firefly项目对大家有帮助,欢迎大家 Star 我们的项目,也欢迎加入我们的技术交流群。 我们也正在基于Baichun-13B-Base权重,使用Firefly项目代码训练firefly-baichuan-13b模型,目前训了18k步左右,大约消耗了86万条指令数据。目前训练loss下降比较平滑,待训练完毕后,我们也将测试并开源该模型权重。 此前我们也使用Firefly项目对Baichuan-7B进行指令微调,并且发布了firefly-baichuan-7b模型,详见文章:Firefly|百川baichuan-7B实测,QLoRA+百万指令数据微调 01 模型简介 本章节主要对Baichuan-13B进行介绍,大部分内容主要引用于其官方代码仓库。 7月11日,百川智能发布了其首个百亿参数规模的大模型Baichuan-13B,该模型在MMLU、CMMLU和C-EVAL等榜单上都取得了非常不错的效果,引起了很大的反响。 由于之前Firefly项目已经支持对Baichuan-7B进行微调,经过简单的代码测试后,项目很快就无缝支持微调Baichuan-13B。 Baichuan-13B 是由百川智能继 Baichuan-7B 之后开发的包含 130 亿参数的开源可商用的大规模语言模型,在权威的中文和英文 benchmark 上均取得同尺寸最好的效果。本次发布包含有预训练 (Baichuan-13B-Base) 和对齐 (Baichuan-13B-Chat) 两个版本。 Baichuan-13B 有如下几个特点:
Baichaun-13B模型在C-Eval、MMLU、CMMLU榜单上也取得了不错的效果。 03 训练指南 在本节中,我们将一步一步地详细介绍如何使用Firefly项目对Baichuan-13B进行QLoRA微调,可在一张显卡上进行训练,包括V100和3090。 使用本项目对Baichuan-13B进行训练和推理,主要步骤如下:
一、安装环境 我们假定读者具备一定的python编程基础,忽略python、cuda、git等编程环境和工具的安装教程。 首先将Firefly项目代码库clone到本地: git clone https://github.com/yangjianxin1/Firefly.git 进入项目目录,安装相应的python包: cd ./Fireflypip install -r requirements.txt 需要额外注意的点,下面的包务必使用源码安装,以避免不必要的麻烦,且torch版本不要选择2.0,默认使用1.3版本。 pip install git+https://github.com/huggingface/peft.gitpip install git+https://github.com/huggingface/accelerate.gitpip install git+https://github.com/huggingface/transformers.gitpip install git+https://github.com/TimDettmers/bitsandbytes.git 二、准备训练集 我们整理并开源了多个较高质量的指令数据集,读者可按需下载。对于中文任务,目前推荐使用moss数据集。数据集下载地址,见Github项目地址。
训练数据为jsonl格式,每一行为一个多轮对话,其中conversation字段是必需的,可以根据实际需求添加或删除其他字段。 { "conversation_id":44, "category":"Brainstorming", "conversation":[ { "human":"怎么能够有效地提升个人能力?", "assistant":"提升个人能力可以通过以下几个方面实现:\n\n1. 学习新知识和技能:阅读相关书籍、参加课程和工作坊、观看教育视频等学习方式,可以帮助你掌握新的知识和技能,从而提升个人能力。\n\n2. 持续练习和实践:不断地练习和实践所学的知识和技能,可以帮助你更好地掌握和应用这些技能,提高你的表现和效率。\n\n3. 寻求反馈和改进:寻求他人的反馈和建议可以帮助你发现自己的不足之处,进一步完善和改进自己的能力。\n\n4. 建立良好的工作和生活习惯:建立良好的工作和生活习惯,如合理安排时间、注意健康、保持积极态度等,可以提高你的工作效率和生活品质,从而提升个人能力。\n\n5. 社交和交流:与他人交流和合作,可以帮助你更好地了解他人的观点和经验,从而提升自己的能力和见识。" }, { "human":"对于初学者来说,如何快速掌握编程技能?", "assistant":"以下是几个建议,可以帮助初学者快速掌握编程技能:\n\n1. 学习基础知识:建议先学习编程语言的基础知识和语法,例如变量、数据类型、控制结构、函数等。可以通过在线课程、编程书籍、视频教程等方式学习。\n\n2. 实践编程:进行实际的编程练习是非常重要的,可以通过参加编程挑战、编写小项目等方式来进行实践。\n\n3. 寻求反馈:可以寻求他人的反馈和建议,例如在线编程社区、编程导师等,他们可以帮助你发现问题并及时纠正。\n\n4. 阅读优秀代码:阅读和分析优秀的代码可以帮助你学习其他程序员的编程思路和技巧,从而提高自己的编程能力。\n\n5. 不断学习和更新:编程技术和工具在不断更新和发展,因此需要不断学习新的知识和技能,例如学习新的编程语言、框架、工具等,以跟上技术的发展和变化。\n\n总之,学习编程需要耐心和坚持,并且需要不断地实践和学习。通过以上建议,可以帮助初学者快速掌握编程技能。" }, { "human":"除了参加编程挑战和阅读代码,还有哪些方式可以提升自己的编程能力呢?", "assistant":"除了参加编程挑战和阅读代码,还有以下几种方式可以提升自己的编程能力:\n\n1. 参与开源项目:加入一个开源项目,可以让你了解到实际的软件开发流程和团队合作方式,并且可以与其他开发人员合作,学习和分享编程技巧和经验。\n\n2. 进行代码重构:对已经编写的代码进行重构,可以帮助你了解更好的编程实践和设计模式,从而提高代码的可读性和可维护性。\n\n3. 练习算法和数据结构:算法和数据结构是编程中的重要基础,练习算法和数据结构可以帮助你了解不同的数据结构和算法,从而更好地解决实际问题。\n\n4. 学习软件工程和架构:学习软件工程和架构的知识,可以帮助你了解如何设计和构建可靠、可扩展和可维护的软件系统。\n\n5. 参加编程社区和论坛:参加编程社区和论坛可以让你与其他开发人员分享和讨论编程经验和技巧,了解最新的技术趋势和解决方案。\n\n总之,提升编程能力需要不断地学习和实践,并与其他开发人员和编程专家进行交流和合作,以获取更多的经验和知识。" }, { "human":"你有没有推荐的编程挑战网站?", "assistant":"当然,以下是一些值得推荐的编程挑战网站:\n\n1. HackerRank:HackerRank 是一个全球领先的技术招聘平台,提供数百种编程挑战和比赛,包括算法、数据结构、数学、SQL、AI 等多个技术领域。\n\n2. LeetCode:LeetCode 是一个在线编程学习和实践平台,提供数千道编程题目,主要涵盖算法和数据结构。\n\n3. Codeforces:Codeforces 是一个全球知名的编程竞赛网站,提供数百个比赛和练习题目,主要涵盖算法和数据结构。\n\n4. Codewars:Codewars 是一个在线编程学习和实践平台,提供数千道编程题目,主要涵盖算法、数据结构、面向对象编程等多个技术领域。\n\n5. Project Euler:Project Euler 是一个非营利性的在线编程挑战平台,提供一系列数学和计算机科学问题,需要用编程语言进行解答。\n\n以上这些编程挑战网站可以帮助你提高编程能力,并且可以与其他编程爱好者进行交流和竞争。" }, { "human":"在学习编程的过程中,如何避免陷入困境和放弃呢?", "assistant":"学习编程是一个需要长期坚持和不断学习的过程,以下是一些避免陷入困境和放弃的方法:\n\n1. 制定合理的学习计划:制定合理的学习计划,包括学习时间、学习内容、目标等,可以帮助你更好地管理时间和精力,避免学习过程中的松懈和分心。\n\n2. 寻找合适的学习资源:选择适合自己的学习资源,例如在线课程、编程书籍、视频教程等,可以让你更好地了解和掌握编程知识和技能。\n\n3. 寻求帮助和支持:在学习过程中,遇到问题和困难是很正常的,可以寻求他人的帮助和支持,例如参加编程社区、找到编程导师等。\n\n4. 进行实践和项目:实践和项目是学习编程的重要组成部分,可以帮助你更好地了解和掌握编程技能,同时也可以提高学习的兴趣和动力。\n\n5. 坚持并保持兴趣:坚持学习和保持兴趣是学习编程的关键。可以通过参加编程社区、参加编程竞赛、与其他编程爱好者交流等方式来保持兴趣和动力。\n\n总之,学习编程需要耐心和坚持,并需要不断学习和实践。通过以上方法可以帮助你避免陷入困境和放弃。" } ],} 读者也可以使用自己的数据进行模型训练,只需要将数据整理成上述指定的格式即可。 在项目的data/dummy_data.jsonl文件中,我们存放了若干条调试数据,读者可以使用该数据进行代码调试。 三、配置训练参数 本项目中的所有训练参数配置,均存储在train_args目录下,方便统一管理。我们以微调Baichuan-13B为例子,其训练参数的配置文件路径为train_args/qlora/baichuan-13b-sft-qlora.json,读者可以根据自身的硬件条件,对文件中的训练参数进行修改。 训练参数的详细说明如下:
在训练Baichuan-13B时,我们的训练配置如下,读者可按需调整:
model_name_or_path可以是huggingface的模型仓库的名称,也可以是本地的模型路径。如果是huggingface的模型仓库名称,训练脚本会自动下载该模型的权重、tokenizer和代码等。如果访问速度较慢,建议先将模型下载到本地,训练时指定本地模型路径。 如果发生OOM,可以缩小max_seq_length、per_device_train_batch_size等参数来缓解。也可以设gradient_checkpointing=true,可以大幅降低显存占用,但训练速度会变慢一些,我们默认开启该参数。 四、启动训练 执行如下脚本,即可启动训练,其中num_gpus指的是训练的显卡数。global batch = per_device_train_batch_size * gradient_accumulation_steps * num_gpus。 torchrun --nproc_per_node={num_gpus} train_qlora.py --train_args_file train_args/qlora/baichuan-13b-sft-qlora.json 我们在V100上进行训练,对于7B的模型,每个step大约15秒左右,对于13B的模型,每个step大约30秒左右。 五、合并权重 为了降低保存checkpoint的时间成本,提高训练效率,在训练中,我们只保存adapter的权重,不保存合并后的模型权重。 当训练结束时,我们需要手动将adapter与base model进行权重合并。adapter的权重会保存到output_dir设置的目录,执行script目录下的merge_lora.py脚本即可得到合并后的模型权重。 注意,对于baichuan等模型,由于其自定义了模型结构和tokenizer,并且其代码并未合并到transformers代码库中。所以合并权重之后,需要将其huggingface模型仓库中的python文件也复制到合并权重的目录中,否则加载合并模型进行推理时会出错。 权重合并的脚本如下,请根据实际的base model以及adapter的保存路径,修改save_path、adapter_name_or_path、model_name_or_path等参数即可。
六、模型推理 权重合并之后,我们就可以使用该模型进行推理了。项目提供了单轮对话和多轮对话的脚本,详见script/chat目录。该脚本可以兼容本项目训练的所有模型。 生成脚本中的top_p、repetition_penalty、temperature、do_sample等参数对模型的生成效果影响较大,可按照自己的使用场景进行调试修改。 在推理阶段,模型的解码方式对模型的生成效果的影响也非常大。目前主要有Greedy Search、Beam Search、Top-K Sampling、Top-P Sampling(Nucleus Sampling)、Contrastive Search等解码方式。 目前主流模型大多使用Top-P Sampling,该算法具有一定的随机性,能提高生成结果的丰富度,降低重复输出,本项目也使用该方式。Contrastive Search也值得一试,是一种确定性的解码算法。 解码方式值得专门写一篇文章进行介绍,如果大家有兴趣,我们后续也可以对其进行介绍。 单轮对话:
多轮对话:
04 结语 本文详细介绍了如何使用Firefly项目微调Baichuan-13B模型,希望大家按照本教程一步一步地走下来后,能够顺利完成自己的大模型训练。欢迎Star我们的项目。 我们也将持续迭代优化Firefly项目,对更多的开源大模型进行支持适配,除此之外,我们也将会集中更多精力在模型评测、模型量化、推理加速等工作上。
|
|