🐒大模型提高(训练量化微调)

type
status
date
slug
summary
tags
category
icon
password
😀
参考资料: 1. 手把手实战transformer 2. 3. 知乎

📝基础入门

transformers库


  1. 生态
    1. notion image

pipeline


  1. 流水线 拍不烂
    1. notion image
      notion image
    2. 代码
    3. pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
      notion image

分词


notion image
  1. 有 Fast/ Slow Tokenizer之分。
    1. 编解码,id与token相互转换。
    1. 填充与截断
      1. 一般使用:
         

        如何使用本地的模型


        1. 数据 for i in range(5):print(dataset[i])
          1. 分词+数据加载 next(enumerate(validloader))[1]
            1. 模型
              1. 训练与预测
                1. 推理pipeline上场 或有时候可用在 原始数据进行预处理
                  1. model head 全连接层 映射解决不同问题
                    1. notion image
                   

                  datasets


                  意思就是可以不用自己搞个class MyDataset(Dataset): 使用map
                   

                  Evaluate


                   
                   

                  Train


                  以前的train自己写,现在搞个类

                  📝实战演练

                  流程


                  notion image

                  降显存


                  notion image
                  1. 减少batch_size 增加梯度累加GA
                  1. grad checkPoint 去掉中间一些值的存储 gradient_checkpointing=True, # *** 梯度检查点 ***
                  1. 优化优化器 optim="adafactor"
                  1. 冻结预训练部分的bert 只跑全连接层那部分 效果不好
                    1. 效果不好 数据的长度
                      notion image

                      📝高效微调

                      1. 有意思的指标:
                        1. 独显占有率 时间
                          参数量 model.prompt_encoder model.print_trainable_parameters()
                          参数量 sum(param.numel() for param in model.parameters())
                          AutoModelForCausalLM.from_pretrained("Langboat/bloom-1b4-zh", low_cpu_mem_usage=True)
                          notion image
                      1. bitfit : 冻结除去bias的参数,少用
                        1. 模型创建后动手
                          保存下来的模型参数,下次接着用
                      1. Prompt-Tuning: 额外加入参数 hard prompt与soft prompt
                        1. 在模型创建的时候动手
                          PEFT Step1 配置文件
                          PEFT Step2 创建模型
                          加载训练好的PEFT模型
                      1. P-Tuning 优化soft prompt 对prompt那一部分进行进一步的编码计算
                        1. notion image
                          依旧是模型创建部分
                          PEFT Step1 配置文件
                          PEFT Step2 创建模型
                      1. Prefix-tuning: 不再embedding进行拼接,放到整个Transformer blocks,放在每一层中
                        1. notion image
                      1. Lora: 内在维度 没有计算量 权重矩阵加两个小分支 会合并故没有额外推理开销
                        1. AB的维度,那些权重需要旁系,默认只对key与value调整
                          notion image
                          合并(导入)
                      1. IA3 比lora多了一份右边的 dense_h_to_4h 参数最少
                        1. 抑制和放大内部激活,对K、V.FFN三部分的值进行调整,权重合并
                          notion image
                      1. PEFT 进阶操作
                        1. 适配器
                          notion image

                      📝低精度训练

                      降低模型本身的显存占用


                      notion image
                      4Bytes(单精度32bit) → LP16 半精度(2字节) → int8
                      常见的低精度数据类型: fp16 (half、半精度)、bfloat16、int8、fp4、nf4
                      表示数字范围变小:溢出问题 舍入误差
                      notion image
                       

                      LLAMA2


                      自回归架构: 极大的复用之前的代码
                      他在调优的时候遇到了问题:
                      1. 解码出来发现有问题
                        1. MAX_LENGTH = 384 # Llama分词器会将一个中文字切分为多个token,因此需要放开一些最大长度,保证数据的完整性
                        2. instruction = tokenizer("\n".join(["Human: " + example["instruction"], example["input"]]).strip() + "\n\nAssistant: ", add_special_tokens=False)
                      1. 增加batch_size为2的时候发现,梯度变为0,或者一下子很大,问题是左侧填充
                        1. # 开启梯度检查点时,要执行该方法
                          1. 偷偷做了32 全精度训练 但是要整个模型都是16
                            1. # model = model.half() # 当整个模型都是半精度时,需要将adam_epsilon调大
                              化完还需要
                              notion image
                          1. tokenizer.eos_token 被切碎了 + id
                            1. notion image
                          1. tokenizer.pad_token_id=2

                          ChatGLM3


                          notion image
                          notion image
                           

                          📝番外技能

                          GPT


                          Bert模型: 非任务导向的预训练方法
                           

                          PEFT 使用

                          上一篇
                          大模型开发(使用GPT)
                          下一篇
                          多模态探索
                          Loading...
                          文章列表
                          一枚热爱技术与产品的产品经理
                          基本信息
                          薯塔AI
                          产品修炼
                          技术分享
                          编码知识
                          AI相关
                          行业知识