大模型参数高效微调技术实战(一)-PEFT概述及环境搭建

释放双眼,带上耳机,听听看~!
本文是关于大模型参数高效微调技术中的PEFT概述及环境搭建的实战文章,介绍了PEFT库的一些支持的高效微调技术和模型类型。

本文为稀土掘金技术社区首发签约文章,30天内禁止转载,30天后未获授权禁止转载,侵权必究!

随着,ChatGPT 迅速爆火,引发了大模型的时代变革。然而对于普通大众来说,进行大模型的预训练或者全量微调遥不可及。由此,催生了各种参数高效微调技术,让科研人员或者普通开发者有机会尝试微调大模型。

因此,该技术值得我们进行深入分析其背后的机理,之前分享了大模型参数高效微调技术原理综述的文章。下面给大家分享大模型参数高效微调技术实战系列文章,该系列共六篇文章,相关代码均放置在GitHub:llm-action

  • 大模型参数高效微调技术实战(一)-PEFT概述及环境搭建
  • 大模型参数高效微调技术实战(二)-Prompt Tuning
  • 大模型参数高效微调技术实战(三)-P-Tuning
  • 大模型参数高效微调技术实战(四)-Prefix Tuning
  • 大模型参数高效微调技术实战(五)-LoRA
  • 大模型参数高效微调技术实战(六)-IA3

本文为大模型参数高效微调技术实战的第一篇。由于本系列文章主要针对 Huggingface 开源的 PEFT 库进行讲解;因此,本文先对其进行概述以及环境搭建。

PEFT 概述

PEFT 是 Huggingface 开源的一个参数高效微调库,它提供了最新的参数高效微调技术,并且可以与 Transformers 和 Accelerate 进行无缝集成。

支持的高效微调技术

目前支持的一些高效微调方法如下:

  1. LoRA: LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  2. Prefix Tuning: Prefix-Tuning: Optimizing Continuous Prompts for GenerationP-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
  3. P-Tuning: GPT Understands, Too
  4. Prompt Tuning: The Power of Scale for Parameter-Efficient Prompt Tuning
  5. AdaLoRA: Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning
  6. (IA)3(IA)^3 : Infused Adapter by Inhibiting and Amplifying Inner Activations

具体可通过 PEFT 的源码看到支持的参数高效微调技术类型枚举。

class PeftType(str, enum.Enum):
    PROMPT_TUNING = "PROMPT_TUNING"
    P_TUNING = "P_TUNING"
    PREFIX_TUNING = "PREFIX_TUNING"
    LORA = "LORA"
    ADALORA = "ADALORA"
    ADAPTION_PROMPT = "ADAPTION_PROMPT"
    IA3 = "IA3"

支持的模型

我们可通过 PEFT 的源码看到支持的任务类型枚举。

class TaskType(str, enum.Enum):
    SEQ_CLS = "SEQ_CLS"
    SEQ_2_SEQ_LM = "SEQ_2_SEQ_LM"
    CAUSAL_LM = "CAUSAL_LM"
    TOKEN_CLS = "TOKEN_CLS"
    QUESTION_ANS = "QUESTION_ANS"
    FEATURE_EXTRACTION = "FEATURE_EXTRACTION"

针对不同的任务支持的高效微调方法和模型不一样,下面是 PEFT 针对每项任务列出了支持的高效微调方法和模型。

因果语言建模任务(Causal Language Modeling)

因果语言建模任务(CLM),在这种建模方法中,模型试图预测给定上下文中的下一个单词,该上下文通常包括在当前单词之前的所有单词。这种建模方法遵循因果原则,即当前单词只受到其前面单词的影响,而不受后面单词的影响。代表模型有GPT2、Bloom、OPT、GPT-Neo、GPT-J、LLaMA、ChatGLM。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
GPT-2
Bloom
OPT
GPT-Neo
GPT-J
GPT-NeoX-20B
LLaMA
ChatGLM

条件生成任务(Conditional Generation)

条件生成任务(Conditional Generation),根据给定的输入(可能是文本、图片等)生成符合条件的输出。

与因果语言建模任务不同,条件生成不仅仅关注于给定上下文的连贯性,还关注于满足预定的任务要求。因果语言建模仅关注于根据给定的上下文生成文本序列。

条件生成的应用包括但不限于机器翻译、文本摘要、图像描述等。这些任务通常需要模型在输入和输出之间建立复杂的映射关系。

在这种建模方法中,模型是一个Encoder-Decoder架构,即序列到序列模型(编码器的输出作为解码器的输入),代表模型有BART、T5。

因果语言建模任务与条件生成任务对比

因果语言建模主要关注于生成连贯、自然的文本,而条件生成关注于生成满足特定条件或任务要求的文本。这两种建模方法在某些场景下可能会互相使用和结合,以实现更复杂的自然语言处理任务。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
T5
BART

序列分类任务(Sequence Classification)

序列分类(Sequence Classification),对整个句子进行分类。如: 获取评论的情绪,检测电子邮件是否为垃圾邮件,确定句子在语法上是否正确或两个句子在逻辑上是否相关等

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
BERT
RoBERTa
GPT-2
Bloom
OPT
GPT-Neo
GPT-J
Deberta
Deberta-v2

Token 分类任务(Token Classification)

Token 分类任务(Token Classification),对句子中的每个词进行分类。如: 识别句子的语法成分(名词、动词、形容词)或命名实体(人、地点、组织)。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
BERT
RoBERTa
GPT-2
Bloom
OPT
GPT-Neo
GPT-J
Deberta
Deberta-v2

文本生成图像任务(Text-to-Image Generation)

文本生成图像任务(Text-to-Image Generation),通过文本生成符合给定文本描述的真实图像。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
Stable Diffusion

图像分类任务(Image Classification)

图像分类任务(Image Classification),根据图像信息中所反映的不同特征,把不同类别的图像区分开来。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
ViT
Swin

图像生成文本任务(Image to text)

图像生成文本任务(Image to text),根据视觉图像输入生成关于图像的自然语言描述,属于多模态大模型。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
Blip-2

语义分割任务(Semantic Segmentation)

语义分割任务(Semantic Segmentation),通过使用类标签标记每个像素来识别和定位图像中的对象。

Model LoRA Prefix Tuning P-Tuning Prompt Tuning IA3
SegFormer

除了以上的任务,PEFT 中还提供了特征抽取任务和问答任务。

  • 特征抽取(Feature extraction),从最初的一组测量数据开始,构建旨在提供信息且非冗余的派生值(特征),通过X,创造新的X’,以促进后续的学习和泛化过程。
  • 问答任务(question answering),试图回答自然语言形式提出的问题,答案有可能来自结构化的数据库中,也可能来自非结构化的文本片段。

对 PEFT 进行简单介绍了之后,下面开始进行搭建搭建。

PEFT 运行环境搭建

基础环境配置如下:

  • 操作系统: Centos 7
  • CPUs: 单个节点具有 1TB 内存的 Intel CPU,物理CPU个数为64,每颗CPU核数为16
  • GPUs: 8 卡 A800 80GB GPUs
  • Python: 3.10 (需要先升级OpenSSL到1.1.1t版本(点击下载OpenSSL),然后再编译安装Python),点击下载Python
  • NVIDIA驱动程序版本: 515.65.01,根据不同型号选择不同的驱动程序,点击下载
  • CUDA工具包: 11.7,点击下载
  • NCCL: nccl_2.14.3-1+cuda11.7,点击下载
  • cuDNN: 8.8.1.3_cuda11,点击下载

上面的NVIDIA驱动、CUDA、Python等工具的安装就不一一赘述了。

先创建虚拟环境并激活虚拟环境 peft-venv-py310-cu117:

cd /home/guodong.li/virtual-venv
virtualenv -p /usr/bin/python3.10 peft-venv-py310-cu117
source /home/guodong.li/virtual-venv/peft-venv-py310-cu117/bin/activate

然后,安装Pytorch、DeepSpeed、PEFT、jupyterlab等依赖库。

# 离线安装PyTorch
pip install torch-1.13.1+cu117-cp310-cp310-linux_x86_64.whl
pip install torchvision-0.14.1+cu117-cp310-cp310-linux_x86_64.whl

# 从源码安装PEFT
git clone https://github.com/huggingface/peft
cd peft
git checkout 42ab106
pip install -e .

# 在线安装datasets、jupyterlab、deepspeed
pip install datasets
pip install jupyterlab
pip install deepspeed

为了便于运行官方的样例,这里安装了jupyterlab库。由于GPU算力通常在远程服务器,而开发是本地笔记本,因此,需要搭建远程jupyterlab服务,然后在本地访问,具体操作如下所示。

首先,生成配置文件(jupyter_lab_config.py):

> jupyter lab --generate-config
Writing default config to: /home/guodong.li/.jupyter/jupyter_lab_config.py

然后,对密码进行加密:

from jupyter_server.auth import passwd; passwd()

之后,修改生成的配置文件(jupyter_lab_config.py):

c.ServerApp.allow_origin = '*'
c.ServerApp.allow_remote_access = True
c.ServerApp.ip = '0.0.0.0'
c.ServerApp.open_browser = False  
c.ServerApp.password = '加密后的密码'
c.ServerApp.port = 9999

最后,在服务器端启动jupyterlab服务。

# jupyter lab --allow-root
nohup jupyter lab --allow-root > jupyterlab.log 2>&1 &

至此,PEFT 运行环境搭建完成,可以通过IP+端口进行访问了。

模型准备

本系列文章基础模型均采用bloomz-560m,因此,需预先从 Huggingface 模型仓库下载。

git lfs clone https://huggingface.co/bigscience/bloomz-560m

基础模型结构如下所示:

BloomForCausalLM(
  (transformer): BloomModel(
    (word_embeddings): Embedding(250880, 1024)
    (word_embeddings_layernorm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
    (h): ModuleList(
      (0): BloomBlock(
        (input_layernorm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
        (self_attention): BloomAttention(
          (query_key_value): Linear(in_features=1024, out_features=3072, bias=True)
          (dense): Linear(in_features=1024, out_features=1024, bias=True)
          (attention_dropout): Dropout(p=0.0, inplace=False)
        )
        (post_attention_layernorm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
        (mlp): BloomMLP(
          (dense_h_to_4h): Linear(in_features=1024, out_features=4096, bias=True)
          (gelu_impl): BloomGelu()
          (dense_4h_to_h): Linear(in_features=4096, out_features=1024, bias=True)
        )
      )
      ...
      (23): BloomBlock(
        ...
      )
    )
    (ln_f): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
  )
  (lm_head): Linear(in_features=1024, out_features=250880, bias=False)
)

结语

文本主要对 PEFT 库进行了基本的概述,同时,搭建了运行 PEFT 的开发环境。本系列后续文章将对不同的PEFT技术进行实战。

如果觉得我的文章能够能够给您带来帮助,期待您的点赞收藏加关注~~

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

深入探讨BERT模型的架构和应用

2023-11-21 13:48:14

AI教程

图像标注技术及实现方法详解

2023-11-21 13:55:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索