七月论文审稿GPT第4.5版:通过15K条paper-review数据微调Llama2 70B(含各种坑)

前言

当我们3月下旬微调完Mixtral 8x7B之后(更多详见:七月论文大模型:含论文的审稿、阅读、写作、修订 ),下一个想微调的就是llama2 70B

  1. 因为之前积攒了不少微调代码和微调经验,所以3月底apple便通过5K的paper-review数据集成功微调llama2 70B,但过程中也费了不少劲
  2. 考虑到最后的成功固然令人欣喜,但真正让一个人或一个团队快速涨经验的还是那些在训练过程中走过的踩过的各种坑以及走过的各种弯路,所以本文第一部分我会把apple在训练中的遇到各种报错信息而一步步debug、或各种搜Google、搜GitHub的过程都整理出来

进入到4月份之后,我们先针对数据折腾了一把,毕竟数据质量通常是一个项目效果的天花板,然数据质量的提升不是短短一两周的事情,考虑到为并行加速

三太子进入70B微调组,和apple一起继续拿之前处理好的数据继续微调70B,但这一次是用15K的数据量了

第一部分 通过1.5K条paper-review数据微调LLaMA2 70B

1.1 GPU配置情况:8张80G的A100

以下是训练过程中GPU的占用情况

  1. git lfs clone https://huggingface.co/NousResearch/Llama-2-70b-chat-hf ,这个命令运行结束后,硬盘占用为518GB
  2. 配置环境开始训练后,硬盘占用为522GB
  3. 训练完成后硬盘占用为566GB
  4. merge_lora完成后硬盘占用为694GB,训练结束时内存占用262GB

观测到训练过程中显存最高占用为570GB,故建议使用80GB*8卡训练

1.2 1.5K数据的运行过程记录

  1. 03-19 3:55 flash_attn 设置成false和true都会报错q_len %d should be divisible by group size %d,且每张卡报错by group size后面数字不同
    raise ValueError("q_len %d should be divisible by group size %d." % (q_len, group_size))
    ValueError: q_len 8454 should be divisible by group size 2113.

    最终,修改train.py中的文件引用:即把from attention.llama_attn_replace import replace_llama_attn改成如下图所示,解决报错

  2. 03-19 8:53 8*A100 成功开始训练 1500 条数据

  3. 03-19 9:34 apple按照阿旬建议,多卡训练,需要修改配置文件参数

  4. 03-19 13:09 1500 条数据训练成功完成,2 epoch 用时 3小时07 分

第二部分 开始训练 5000 条数据

2.1 5K数据的训练全程

2.1.1 第一阶段:flash_attn频频出问题

  1. 03-19 18:00 发现训练至 0.48epoch 2小时30分,到batch_id:164 2624条数据报错./aten/src/ATen/native/cuda/Indexing.cu:1141: indexselectLargeIndex: block: [613,0,0], thread.[61,0,0]Assertion`srcIndex<srcSelectDimsize` failed.

  2. 03-19 23:11 之前的训练过程中dataset没加padding
            # 分别计算输入、输出合适的截断
            # `output_ids` 在整个序列(包括 `input_format_ids` 和 `output_ids`)中所占的比例,然后这个比例乘以最大序列长度,得到的结果就是输出序列的最大长度
            max_output_len = int(self.max_seq_length * (len(output_ids) / (len(input_format_ids) + len(output_ids))))
            max_output_len = max(max_output_len, 1)     # 至少保留1个token的output
            max_input_len = self.max_seq_length - max_output_len
    
            # 对输入、输出进行截断
            if len(input_format_ids) > max_input_len:
                input_format_ids = input_format_ids[:max_input_len]
            if len(output_ids) > max_output_len:
                output_ids = output_ids[:max_output_len]
    即如阿荀所说:“我的这个dataset是没实现padding的,所以要用datacollator来做”,故需要在train.py中更正使用DataCollatorForSeq2Seq
        # 加载训练集和验证集
        if args.sft:
            # train_dataset = VicunaSFTDataset(args.train_file, tokenizer, args.max_seq_length)
            train_dataset = Llama2SFTDataset(args.train_file, tokenizer, args.max_seq_length)
            # data_collator = SFTCollator(tokenizer, args.max_seq_length, -100)
            data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer,
                                                   pad_to_multiple_of=8 if tokenizer.padding_side == "right" else None, # for shift short attention
                                                   label_pad_token_id=-100
                                                   )
        else:
            train_dataset = PretrainDataset(args.train_file, tokenizer, args.max_seq_length)
            data_collator = PretrainCollator(tokenizer, args.max_seq_length, -100)
    然并卵,修改后训练仍有index报错
    data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer,
      pad_to_multiple_of=8 if tokenizer.padding_side == "right" else None, # for shift short attention
      label_pad_token_id=-100
     )
  3. 03-20 1:51 考虑到阿荀建议“看下目前用llama_attn_replace_sft能不能训,不能的话可能可以考虑切换下llama_attn_replace”
    故apple在train.py中更正回train.py引用文件llama_attn_replace使用,可修改后训练仍有index报错
  4. 03-20 4:00 尝试搜索到的解决方案,将结尾pading改为eos,修改后训练仍有index报错
    data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer,
      pad_to_multiple_of=8 if tokenizer.padding_side == "right" else None, # for shift short attention
      label_pad_token_id=tokenizer.eos_token_id
     )
  5. 03-20 10:11 尝试搜索到的解决方案https://github.com/lm-sys/FastChat/issues/2038,将训练数据中的特殊token清洗,修改后训练仍有index报错

  6. 03-20 11:25 取训练数据2400-2880行,对应batchsize id:150-180,直接训练这个区间 1 epoch,epoch结束后有一个warning,除此之外是没有报错的

  7. 03-20 12:03 训练过程中,在阿荀建议下,尝试关掉flash_attn,训练未开始就会有多个单卡报错OOM
    至于原因,可能是如阿荀所说:“单张不够这长度,因为longqlora的lora是用32位精度的,而70b的产生的kv cache会比7b的大很多”

  8. 03-20 15:23 使用python -m bitsandbytes查看bnb没有编译问题,在阿荀建议下,apple将flash_attn降到2.3.3版本,修改后训练仍有index报错

2.1.2 第二阶段:用上DeepSpeed Zero3,且验证flash_attn得开

  1. 一开始以为longlora论文中使用deepspeed stage3(当然其只用lora没有用qlora),实现了llama70b训练(但后来才发现,longlora论文中微调70B时,flash_attn其实是加了的
    我们也可以使用stage3优化,这个可以实现关闭flash_attn的情况下,在多卡训练70b,故
    03-22 13:51 设置flash_attn=false,修改配置文件,使用DeepSpeed Zero-3,报错ValueError: DeepSpeed Zero-3 is not compatible with `low_cpu_mem_usage=True` or with passing a `device_map`.需要注释掉train.py中的device_map

  2. 03-22 14:10 报错expected there to be only one unique element in {items}查找到解决方案
    https://github.com/bigcode-project/starcoder/issues/96 https://huggingface.co/docs/peft/v0.10.0/en/accelerate/deepspeed
  3. 03-22 16:30 更换为8*RTX A6000

    quantization_config添加参数:bnb_4bit_quant_storage_dtype=torch.bfloat16
    从运行bash命令到开始训练需要17分钟,进入训练后再次报错
    expected there to be only one unique element in <generator object Init._convert_to_deepspeed_param.<locals>.all_gather_coalesced.<locals>.<genexpr> at 0x7f6ee96924a0>
  4. 03-22 17:08 查到已经有人提交了修复这个问题的pr Enable ZeRO3 allgather for multiple dtypes (#4647) · microsoft/DeepSpeed@b8e1664 · GitHub,故pip uninstall deepspeed 然后pip install deepspeed 下载最新版本
    然训练未开始便报错cuda out of memory,看来还是要用8*A100
  5. 03-22 19:48再次使用8*A100成功开始训练,最后在第四步报错,如果不开flash_attn,即使开了deepspeed stage3也会报显存不够的错误。torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 7.33 GiB (GPU 6; 79.15 GiB total capacity; 44.34 GiB already allocated; 6.52 GiB free; 70.42 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

  6. 考虑到虽然调通了deepspeed stage3 发现即使A100*8,如果不加flash_attn,训练到第4个batch就会out of memory,即准备再打开flash_attn ,将所有buff一起叠加,看看是不是可以(相当于把longqlora、Zero3、flash attention都用上),故
    03-22 20:10 使用8*A100,打开flash_attn,打开deepspeed stage3,开始训练

    这次训练时显存占用呈周期涨落而不是一直上升

    不过仍然结果还是会在batch id 16报错

2.1.3 第三阶段:二分定位筛选有问题的那条数据

我建议apple,既然是跑的5000多条数据,那可以

  1. 考虑把引发异常的那条数据 先直接剔除掉,毕竟如果实在怀疑某些数据有问题的话,先删掉,哪怕最后有个3-4K数据 能跑下来,也算是先有个结果
  2. 之后 再慢慢找问题(总之,算是短期内 没办法的办法了,后续时间充足时,再好好找下 全面的原因)

故apple便开始用二分定位法去排查那条引起异常的数据

  1. 03-23 13:34 将5189数据从上到下的顺序分成3份,1-1730,1730-3460,3461-5189,分别测试查找问题数据所在的区间。第一份在运行至batch_id 33报错。
  2. 03-23 19:33 第二份1730条训练没有报错
  3. 03-23 21:25 之前下午第二份数据在训练中总的迭代次数是432,发现第三份数据在训练中总迭代次数是216,所以其它所有变量相同条件下,由于迭代数减小1/2训练总时间也缩减了1/2,不清楚这里是否正常,训练参数配置文件是相同的,不过1730条数据集第二份的大小是120MB,第三份的大小是50MB,是否是训练数据大小的原因导致训练时产生了自动调整。第三份1728条训练没有报错。
  4. 03-23 22:36 按顺序取出第一份数据的后半部分,866-1730行,训练中batch_id 18
    报错。
  5. 03-23 22:55 按顺序取出第一份数据的前半部分,1-865行,训练没有报错。
  6. 03-24 00:28 按顺序取出第一份数据的,866-1298行,训练没有报错。
  7. 03-24 01:37 按顺序取出第一份数据的,1299-1500行,训练中batch_id 8报错。
  8. 03-24 02:32 按顺序取出第一份数据的,1501-1730行,训练没有报错。
  9. 03-24 03:13 按顺序取出第一份数据的,1299-1400行,训练没有报错。
  10. 03-24 03:46 按顺序取出第一份数据的,1401-1500行,训练中batch_id 1报错
  11. 03-24 05:08 从paper_review_5189.jsonl去除1401-1500行,最终使用5089条数据开始训练

    相当于相当于最终筛到100条的区间,删掉后使用5089条数据微调成功(实在是不易啊,如apple所说:“筛选数据我是二分法,从昨天下午1点一直做到今早凌晨5点。”)
    总之,12小时后训练成功,checkpoint文件夹和merge_lora文件夹结构如下

2.2 对5K训练数据结果的推理

  1. 03-24 18:39 开始推理285条测试数据
  2. 03-25 02:23 285条训练数据推理结束
  3. 在论文审稿效果上超过GPT4-1106,且70B只用了5K数据便和7B用的15K数据打平了

考虑到可能是数据只有5K,效果不一定好上,故如本文开头所说,我们接下来准备一方面提高数据质量,一方面准备用更大的比如15K数据微调

第三部分 15k运行过程记录

3.1 训练全过程

3.1.1 apple继续折腾

  1. 03-27 9:56 继续筛选paper_review_5189.jsonl中的1401-1500行,从中找到具体的报错数据,分析其特征,对15k数据进行清洗
    取出文件中的第1401-1420行另存为output1.jsonl没有问题
    取出文件中的第1421-1440行另存为output2.jsonl没有问题
    取出文件中的第1441-1460行另存为output3.jsonl有报错
    取出文件中的第1461-1480行另存为output4.jsonl没有报错
    取出文件中的第1481-1500行另存为output5.jsonl没有报错
  2. 03-27 17:08 继续筛选paper_review_5189.jsonl中的1441-1460行
    取出文件中的第1441-1445行另存为2output1.jsonl没有问题
    取出文件中的第1446-1450行另存为2output2.jsonl没有问题
    取出文件中的第1451-1455行另存为2output3.jsonl报错
    取出文件中的第1456-1460行另存为2output4.jsonl没有报错
  3. 03-27 17:45 继续筛选paper_review_5189.jsonl中的1451-1455行
    取出文件中的第1451行另存为3output1.jsonl没问题
    取出文件中的第1452行另存为3output2.jsonl没问题
    取出文件中的第1453行另存为3output3.jsonl报错
    取出文件中的第1454行另存为3output4.jsonl
    取出文件中的第1455行另存为3output5.jsonl
    最终的问题数据是第1453行另存为3output3.jsonl报错
  4. 考虑到因为最开始用1.5k的数据微调llama7b时,打开flash_attn会有同样报错,故
    03-30 5:52 经过1d18h使用A6000前置验证没有问题
  5. 03-30 13:06 开始使用8*A100配置环境下载basemodel正式训练,20h后查看到训练中断,可能是服务器平台的未知原因
  6. 03-30 16.01 重新恢复后,继续折腾

3.1.2 三太子接力apple:全力折腾

 一开始三太子先试下5k数据,截断的逻辑也用的七月官网首页的「大模型线上营」中讲的

// 待更

3.2 15K数据的结果评估

// 待更

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/560903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议&#xff0c;连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议&#xff0c;如以太网等&#xff0c;CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的&#xff0c;两边不存在频差&#xff0c;并且内部延时…

使用isort和autopep8统一代码风格

前言 今天和大家分享一篇关于python代码风格统一的方法。我自己之前有使用过&#xff0c;但都是使用公司现成的&#xff0c;没有自己动手去实操&#xff0c;所以为了一探究竟&#xff0c;今天专门花了一点时间去研究&#xff0c;这个过程还挺顺利的&#xff0c;这里我将这个过…

什么是IIoT?

什么是IIoT? IIoT,即工业物联网(Industrial Internet of Things),是指将物联网技术应用到工业领域,通过微型低成本传感器、高带宽无线网络等技术手段,实现工业设备、系统和服务的互联互通,从而提高生产效率、降低能耗和成本,实现智能化和自动化生产。 IIoT的应用范围…

Vitis HLS 学习笔记--BLAS库之WideType

目录 1. WideType 数据类型 2. WideType 类模板参数 2.1 SFINAE技术 3. WideType 类中的函数 3.1 operator[](unsigned int p_Idx) 3.2 operator(const WideType& p_w) const 3.3 getValAddr() 3.4 operator const t_TypeInt() 4. 总结 1. WideType 数据类型 在 …

NtripShare2024年第一季度主要技术进展

迷迷糊糊又是一个月没有写点什么&#xff0c;近期想清楚NtripShare在2024的要做什么事情&#xff0c;暂且将NtripShare要做的主要事情为搭建由软件与硬件之间的技术桥梁。 在过去的几年时间里NtripShare对硬件方面一直是规避的态度&#xff0c;今年开始要做一点软硬件搭界的技…

网络编程初步

协议&#xff1a; 一组规则 分层模型结构&#xff1a; OSI七层模型&#xff1a;物、数、网、传、会、表、应 TCP/IP 4层模型&#xff1a;网&#xff08;链路层/网络接口层)、网、传、应 应用层&#xff1a;http、 ftp、 nfs、 ssh、 telneto o .传输层:TCP、UDP 网络层&…

SpringBoot基于JavaWeb的菜鸟驿站快递管理系统ssm

前端&#xff1a;vue.jsElementUI 编程语言: java 框架&#xff1a; ssm/springboot 详细技术&#xff1a;springboot springbootvueMYSQLMAVEN 数据库: mysql5.7 数据库工具&#xff1a;Navicat/SQLyog都可以 ide工具&#xff1a;IDEA 或者eclipse 对菜鸟驿站快递管理系统设计…

判别饮用水可饮用的多机器学习模型

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 饮用水是人类生存的基本需求之一&#xff0c;也是维护健康和有效保护健康政策的重要组成部分。因此&#xff0c;确保饮用水质量对于国…

3分钟看懂Microchip 32位MCU CAN模块的配置

文章目录 CAN模块系统框图Microchip MCC Harmony下CAN模块配置选项CAN模块工作模式CAN模块中断模式CAN工作速率Bit Timing Calculation配置CAN 接收的配置CAN 发送的配置CAN 过滤器工作流程说明CAN 过滤器的配置 CAN模块系统框图 CAN的英文全称&#xff1a;Control Area Networ…

通过linux工具iftop命令查看视频监控平台是否收到监控摄像头的视频流(视频监控平台接收和转发的视频流)

目录 一、需求描述 二、解决思路 &#xff08;一&#xff09;问题分析 &#xff08;二&#xff09;解决思路 1、通过抓包的方式 2、通过一些linux的网络监视工具 三、需求实现 &#xff08;一&#xff09;抓包工具 1、tcpdump 2、Wireshark 3、tcptrace &#xff0…

OpenHarmony 网络与连接—RPC连接

介绍 本示例使用ohos.rpc 相关接口&#xff0c;实现了一个前台选择商品和数目&#xff0c;后台计算总价的功能&#xff0c;使用rpc进行前台和后台的通信。 效果预览 使用说明&#xff1a; 点击商品种类的空白方框&#xff0c;弹出商品选择列表&#xff0c;选择点击对应的商品…

天软因子数据系列课堂回顾——“委托订单:流动性因子”

高频因子库4月更新&#xff0c;新增5张表单&#xff0c;51个因子。目前&#xff0c;高频因子数量扩容到628个&#xff0c;涵盖了从2000年开始的全A市场。本次“天软因子数据系列课堂”在线分享的即是最新发布因子列表之一的流动性因子&#xff0c;剖析微观角度下因子的底层逻辑…

什么是代理IP?如何正确使用代理IP?

代理IP&#xff08;Proxy IP&#xff09;是一种网络技术&#xff0c;它允许用户通过一个中介服务器&#xff08;即代理服务器&#xff09;来访问互联网。具体来说&#xff0c;代理IP隐藏了用户的真实IP地址&#xff0c;使用第三方的IP地址进行网络访问。当用户发起网络请求时&a…

Linux进阶篇:Centos7搭建smb服务

Centos7搭建smb服务 1 smb介绍 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议&#xff0c;它为局域…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

基于SpringBoot+Vue的便利店管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;11张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&#…

tcp-learner 数据包分析 20240420

输入输出&#xff1a; 数据包分析&#xff1a; learner和Adapter建立连接。 Learner让Adapter发送RST Adapter没有从SUT抓到任何回复&#xff0c;于是向learner发送timeout learner给adapter发送reset命令&#xff0c;让SUT重置。 这是第一次初始化&#xff0c;由于Adapter和…

7. DAX 时间函数-- DATE 日期--TOTALMTD、TOTALQTD、TOTALYTD

函数名目的语法返回值TOTALMTD计算当前上下文中该月份至今的表达式的值 。TOTALMTD ( <表达式>, <日期列>, [<筛选器>] )标量 表示表达式的标量值&#xff0c;在“日期”中给定日期&#xff0c;计算当前月份至今的日期 。TOTALQTD计算当前上下文中该季度至今…

452. 用最少数量的箭引爆气球[排序+贪心]

https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xst…

C++ 内存分区管理

一、栈区&#xff08;Stack&#xff09; 栈区用来存储函数的参数值、局部变量的值等数据。栈区是自动分配和释放的&#xff0c;函数执行时会在栈区分配空间&#xff0c;函数执行结束时会自动释放这些空间。栈区的数据是连续分配的&#xff0c;由系统自动管理。 注意事项&…