Klang(金浪)AI量化论坛

    • 注册
    • 登录
    • 版块
    • 最新
    • 标签
    • 热门
    • 用户
    • 群组

    一步一步做微调 Finetune

    AI研究
    1
    1
    197
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • A
      asmcos 管理员 最后由 asmcos 编辑

      OpenAI chatGPT 对外公布可以微调以后。 Finetune 技术就非常火爆。

      1、什么是微调?

      对于普通开发者来说,微调就是把自己的个性化内容加入到已有的成熟的大模型里面。
      让大模型回答自己的个性化内容。
      他属于 迁移学习的部分, 他是在已经成熟的模型上增加定制化的内容。

      2、为什么需要微调?

      因为大部分开发者没有自己做模型的能力,因为很多开发者无法获取大量数据,并且专业的技术都参数也不太了解。
      所以大部分人如果需要将自己专业领域的数据 加到大模型里,就会选择使用微调。

      3、如何微调?

      # 加载预训练的VGG16网络
      model = models.vgg16(pretrained=True)
      
      # 修改最后一层为二分类输出
      model.classifier[-1] = nn.Linear(model.classifier[-1].in_features, 2)
      
      # 冻结除最后一层外的所有参数
      for param in model.parameters():
          param.requires_grad = False
      for param in model.classifier[-1].parameters():
          param.requires_grad = True
      

      这个代码的例子,就是 获取一个成熟的模型vgg16, 但是修改了最后一层。
      微调的方法就是 将其他层参数冻结,仅仅 修改最后一层参数。

      4、大模型微调

      大模型的微调 流行的做法使用 peft的lora。
      lora 为什么能微调很多大模型?

      只要这些模型包含全连接层或者类似的线性变换层。例如,chatglm、chatglm2、Alpaca 等都是基于 transformer 结构的语言模型,它们都包含多头注意力层和前馈网络层,这些层都可以使用 peft lora 进行微调。具体来说,可以在每个注意力层或者前馈网络层的权重矩阵旁边增加一个低秩适配器,由两个矩阵相乘组成,然后将适配器的输出与原始权重矩阵的输出相加得到最终输出。

      5、peft 官方例子

      from transformers import AutoModelForSeq2SeqLM
      from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
      model_name_or_path = "bigscience/mt0-large"
      tokenizer_name_or_path = "bigscience/mt0-large"
      
      peft_config = LoraConfig(
          task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
      )
      
      model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
      model = get_peft_model(model, peft_config)
      model.print_trainable_parameters()
      # output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282
      

      内存空间展示

      2b3efab2-79af-4182-ac93-13ccfeb0dec4-image.png

      使用 accelerator 和deepspeed

      减少GPU空间

        model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare(model, optimizer, train_dataloader, eval_dataloader)
      
      
      1 条回复 最后回复 回复 引用 0
      • First post
        Last post