chatglm2-6b在P40上做LORA微调 | 京东云技术团队

背景:

目前,大模型的技术应用已经遍地开花。最快的应用方式无非是利用自有垂直领域的数据进行模型微调。chatglm2-6b在国内开源的大模型上,效果比较突出。本文章分享的内容是用chatglm2-6b模型在集团EA的P40机器上进行垂直领域的LORA微调。

一、chatglm2-6b介绍

github: https://github.com/THUDM/ChatGLM2-6B

chatglm2-6b相比于chatglm有几方面的提升:

1. 性能提升: 相比初代模型,升级了 ChatGLM2-6B 的基座模型,同时在各项数据集评测上取得了不错的成绩;

2. 更长的上下文: 我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练;

3. 更高效的推理: 基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%;

4. 更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。

二、微调环境介绍

2.1 性能要求

推理这块,chatglm2-6b在精度是fp16上只需要14G的显存,所以P40是可以cover的。

EA上P40显卡的配置如下:

2.2 镜像环境

做微调之前,需要编译环境进行配置,我这块用的是docker镜像的方式来加载镜像环境,具体配置如下:

1FROM base-clone-mamba-py37-cuda11.0-gpu 2 3# mpich 4RUN yum install mpich 5 6# create my own environment 7RUN conda create -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ --override --yes --name py39 python=3.9 8# display my own environment in Launcher 9RUN source activate py39 \ 10 && conda install --yes --quiet ipykernel \ 11 && python -m ipykernel install --name py39 --display-name "py39" 12 13# install your own requirement package 14RUN source activate py39 \ 15 && conda install -y -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ \ 16 pytorch torchvision torchaudio faiss-gpu \ 17 && pip install --no-cache-dir --ignore-installed -i https://pypi.tuna.tsinghua.edu.cn/simple \ 18 protobuf \ 19 streamlit \ 20 transformers==4.29.1 \ 21 cpm_kernels \ 22 mdtex2html \ 23 gradio==3.28.3 \ 24 sentencepiece \ 25 accelerate \ 26 langchain \ 27 pymupdf \ 28 unstructured[local-inference] \ 29 layoutparser[layoutmodels,tesseract] \ 30 nltk~=3.8.1 \ 31 sentence-transformers \ 32 beautifulsoup4 \ 33 icetk \ 34 fastapi~=0.95.0 \ 35 uvicorn~=0.21.1 \ 36 pypinyin~=0.48.0 \ 37 click~=8.1.3 \ 38 tabulate \ 39 feedparser \ 40 azure-core \ 41 openai \ 42 pydantic~=1.10.7 \ 43 starlette~=0.26.1 \ 44 numpy~=1.23.5 \ 45 tqdm~=4.65.0 \ 46 requests~=2.28.2 \ 47 rouge_chinese \ 48 jieba \ 49 datasets \ 50 deepspeed \ 51 pdf2image \ 52 urllib3==1.26.15 \ 53 tenacity~=8.2.2 \ 54 autopep8 \ 55 paddleocr \ 56 mpi4py \ 57 tiktoken 58

如果需要使用deepspeed方式来训练, EA上缺少mpich信息传递工具包,需要自己手动安装。

2.3 模型下载

huggingface地址: https://huggingface.co/THUDM/chatglm2-6b/tree/main

三、LORA微调

3.1 LORA介绍

paper: https://arxiv.org/pdf/2106.09685.pdf

LORA(Low-Rank Adaptation of Large Language Models)微调方法: 冻结预训练好的模型权重参数,在冻结原模型参数的情况下,通过往模型中加入额外的网络层,并只训练这些新增的网络层参数。

LoRA 的思想:

  • 在原始 PLM (Pre-trained Language Model) 旁边增加一个旁路,做一个降维再升维的操作。
  • 训练的时候固定 PLM 的参数,只训练降维矩阵A与升维矩B。而模型的输入输出维度不变,输出时将BA与 PLM 的参数叠加。
  • 用随机高斯分布初始化A,用 0 矩阵初始化B,保证训练的开始此旁路矩阵依然是 0 矩阵。

3.2 微调

huggingface提供的peft工具可以方便微调PLM模型,这里也是采用的peft工具来创建LORA。

peft的github: https://gitcode.net/mirrors/huggingface/peft?utm_source=csdn_github_accelerator

加载模型和lora微调:

1 # load model 2 tokenizer = AutoTokenizer.from_pretrained(args.model_dir, trust_remote_code=True) 3 model = AutoModel.from_pretrained(args.model_dir, trust_remote_code=True) 4 5 print("tokenizer:", tokenizer) 6 7 # get LoRA model 8 config = LoraConfig( 9 r=args.lora_r, 10 lora_alpha=32, 11 lora_dropout=0.1, 12 bias="none",) 13 14 # 加载lora模型 15 model = get_peft_model(model, config) 16 # 半精度方式 17 model = model.half().to(device) 18

这里需要注意的是,用huggingface加载本地模型,需要创建work文件,EA上没有权限在没有在.cache创建,这里需要自己先制定work路径。

1import os 2os.environ['TRANSFORMERS_CACHE'] = os.path.dirname(os.path.abspath(__file__))+"/work/" 3os.environ['HF_MODULES_CACHE'] = os.path.dirname(os.path.abspath(__file__))+"/work/" 4 5 6

如果需要用deepspeed方式训练,选择你需要的zero-stage方式:

1 conf = {"train_micro_batch_size_per_gpu": args.train_batch_size, 2 "gradient_accumulation_steps": args.gradient_accumulation_steps, 3 "optimizer": { 4 "type": "Adam", 5 "params": { 6 "lr": 1e-5, 7 "betas": [ 8 0.9, 9 0.95 10 ], 11 "eps": 1e-8, 12 "weight_decay": 5e-4 13 } 14 }, 15 "fp16": { 16 "enabled": True 17 }, 18 "zero_optimization": { 19 "stage": 1, 20 "offload_optimizer": { 21 "device": "cpu", 22 "pin_memory": True 23 }, 24 "allgather_partitions": True, 25 "allgather_bucket_size": 2e8, 26 "overlap_comm": True, 27 "reduce_scatter": True, 28 "reduce_bucket_size": 2e8, 29 "contiguous_gradients": True 30 }, 31 "steps_per_print": args.log_steps 32 } 33

其他都是数据处理处理方面的工作,需要关注的就是怎么去构建prompt,个人认为在领域内做微调构建prompt非常重要,最终对模型的影响也比较大。

四、微调结果

目前模型还在finetune中,batch=1,epoch=3,已经迭代一轮。

作者:京东零售 郑少强

来源:京东云开发者社区 转载请注明来源

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

DeepSpeed: 大模型训练框架 | 京东云技术团队

目前,大模型的发展已经非常火热,关于大模型的训练、微调也是各个公司重点关注方向。但是大模型训练的痛点是模型参数过大,动辄上百亿,如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这项工作。

直播预告 | 大模型时代 “应用变了”:看大模型如何跑进零售电商应用

走进零售电商,大模型能做什么?今年11.11,应用大模型带来成效显著今天下午2:00,京东云视频号准时直播看京东零售如何破题新解法,大小模型协同大模型将走向多模态,走向具身智能

大语言模型微调数据竞赛,冠军!

近日,天池FTDataRanker竞赛落下帷幕,天翼云智能边缘事业部AI团队(后称天翼云AI团队)凭借在大语言模型(LLM)训练数据增强方面的卓越研究,荣获大语言模型微调数据竞赛——7B模型赛道冠军。

揭秘ChatGPT,如何打造自己的自定义指令 | 京东云技术团队

在大语言模型的训练中,经常会看到InstructTuning(指令微调)这个单词,GPT家族中也有一个InstructGPT的模型(指令微调后的GPT),通过指令微调的LLM会更按照我们期望的方式输出

chatglm2-6b在P40上做LORA微调

背景:目前,大模型的技术应用已经遍地开花。最快的应用方式无非是利用自有垂直领域的数据进行模型微调。chatglm26b在国内开源的大模型上,效果比较突出。本文章分享的内容是用chatglm26b模型在集团EA的P40机器上进行垂直领域的LORA微调。一、c