背景:
目前,大模型的技術(shù)應(yīng)用已經(jīng)遍地開花。最快的應(yīng)用方式無(wú)非是利用自有垂直領(lǐng)域的數(shù)據(jù)進(jìn)行模型微調(diào)。chatglm2-6b在國(guó)內(nèi)開源的大模型上,效果比較突出。本文章分享的內(nèi)容是用chatglm2-6b模型在集團(tuán)EA的P40機(jī)器上進(jìn)行垂直領(lǐng)域的LORA微調(diào)。
一、chatglm2-6b介紹
github: https://github.com/THUDM/ChatGLM2-6B
chatglm2-6b相比于chatglm有幾方面的提升:
1. 性能提升: 相比初代模型,升級(jí)了 ChatGLM2-6B 的基座模型,同時(shí)在各項(xiàng)數(shù)據(jù)集評(píng)測(cè)上取得了不錯(cuò)的成績(jī);
2. 更長(zhǎng)的上下文: 我們將基座模型的上下文長(zhǎng)度(Context Length)由 ChatGLM-6B 的 2K 擴(kuò)展到了 32K,并在對(duì)話階段使用 8K 的上下文長(zhǎng)度訓(xùn)練;
3. 更高效的推理: 基于 Multi-Query Attention 技術(shù),ChatGLM2-6B 有更高效的推理速度和更低的顯存占用:在官方的模型實(shí)現(xiàn)下,推理速度相比初代提升了 42%;
4. 更開放的協(xié)議:ChatGLM2-6B 權(quán)重對(duì)學(xué)術(shù)研究完全開放,在填寫問(wèn)卷進(jìn)行登記后亦允許免費(fèi)商業(yè)使用。
二、微調(diào)環(huán)境介紹
2.1 性能要求
推理這塊,chatglm2-6b在精度是fp16上只需要14G的顯存,所以P40是可以cover的。
EA上P40顯卡的配置如下:
2.2 鏡像環(huán)境
做微調(diào)之前,需要編譯環(huán)境進(jìn)行配置,我這塊用的是docker鏡像的方式來(lái)加載鏡像環(huán)境,具體配置如下:
FROM base-clone-mamba-py37-cuda11.0-gpu # mpich RUN yum install mpich # create my own environment RUN conda create -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ --override --yes --name py39 python=3.9 # display my own environment in Launcher RUN source activate py39 && conda install --yes --quiet ipykernel && python -m ipykernel install --name py39 --display-name "py39" # install your own requirement package RUN source activate py39 && conda install -y -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ pytorch torchvision torchaudio faiss-gpu && pip install --no-cache-dir --ignore-installed -i https://pypi.tuna.tsinghua.edu.cn/simple protobuf streamlit transformers==4.29.1 cpm_kernels mdtex2html gradio==3.28.3 sentencepiece accelerate langchain pymupdf unstructured[local-inference] layoutparser[layoutmodels,tesseract] nltk~=3.8.1 sentence-transformers beautifulsoup4 icetk fastapi~=0.95.0 uvicorn~=0.21.1 pypinyin~=0.48.0 click~=8.1.3 tabulate feedparser azure-core openai pydantic~=1.10.7 starlette~=0.26.1 numpy~=1.23.5 tqdm~=4.65.0 requests~=2.28.2 rouge_chinese jieba datasets deepspeed pdf2image urllib3==1.26.15 tenacity~=8.2.2 autopep8 paddleocr mpi4py tiktoken
如果需要使用deepspeed方式來(lái)訓(xùn)練, EA上缺少mpich信息傳遞工具包,需要自己手動(dòng)安裝。
2.3 模型下載
huggingface地址: https://huggingface.co/THUDM/chatglm2-6b/tree/main
三、LORA微調(diào)
3.1 LORA介紹
paper: https://arxiv.org/pdf/2106.09685.pdf
LORA(Low-Rank Adaptation of Large Language Models)微調(diào)方法: 凍結(jié)預(yù)訓(xùn)練好的模型權(quán)重參數(shù),在凍結(jié)原模型參數(shù)的情況下,通過(guò)往模型中加入額外的網(wǎng)絡(luò)層,并只訓(xùn)練這些新增的網(wǎng)絡(luò)層參數(shù)。
LoRA 的思想:
?在原始 PLM (Pre-trained Language Model) 旁邊增加一個(gè)旁路,做一個(gè)降維再升維的操作。
?訓(xùn)練的時(shí)候固定 PLM 的參數(shù),只訓(xùn)練降維矩陣A與升維矩B。而模型的輸入輸出維度不變,輸出時(shí)將BA與 PLM 的參數(shù)疊加。
?用隨機(jī)高斯分布初始化A,用 0 矩陣初始化B,保證訓(xùn)練的開始此旁路矩陣依然是 0 矩陣。
3.2 微調(diào)
huggingface提供的peft工具可以方便微調(diào)PLM模型,這里也是采用的peft工具來(lái)創(chuàng)建LORA。
peft的github: https://gitcode.net/mirrors/huggingface/peft?utm_source=csdn_github_accelerator
加載模型和lora微調(diào):
# load model tokenizer = AutoTokenizer.from_pretrained(args.model_dir, trust_remote_code=True) model = AutoModel.from_pretrained(args.model_dir, trust_remote_code=True) print("tokenizer:", tokenizer) # get LoRA model config = LoraConfig( r=args.lora_r, lora_alpha=32, lora_dropout=0.1, bias="none",) # 加載lora模型 model = get_peft_model(model, config) # 半精度方式 model = model.half().to(device)
這里需要注意的是,用huggingface加載本地模型,需要?jiǎng)?chuàng)建work文件,EA上沒(méi)有權(quán)限在沒(méi)有在.cache創(chuàng)建,這里需要自己先制定work路徑。
import os os.environ['TRANSFORMERS_CACHE'] = os.path.dirname(os.path.abspath(__file__))+"/work/" os.environ['HF_MODULES_CACHE'] = os.path.dirname(os.path.abspath(__file__))+"/work/"
如果需要用deepspeed方式訓(xùn)練,選擇你需要的zero-stage方式:
conf = {"train_micro_batch_size_per_gpu": args.train_batch_size, "gradient_accumulation_steps": args.gradient_accumulation_steps, "optimizer": { "type": "Adam", "params": { "lr": 1e-5, "betas": [ 0.9, 0.95 ], "eps": 1e-8, "weight_decay": 5e-4 } }, "fp16": { "enabled": True }, "zero_optimization": { "stage": 1, "offload_optimizer": { "device": "cpu", "pin_memory": True }, "allgather_partitions": True, "allgather_bucket_size": 2e8, "overlap_comm": True, "reduce_scatter": True, "reduce_bucket_size": 2e8, "contiguous_gradients": True }, "steps_per_print": args.log_steps }
其他都是數(shù)據(jù)處理處理方面的工作,需要關(guān)注的就是怎么去構(gòu)建prompt,個(gè)人認(rèn)為在領(lǐng)域內(nèi)做微調(diào)構(gòu)建prompt非常重要,最終對(duì)模型的影響也比較大。
四、微調(diào)結(jié)果
目前模型還在finetune中,batch=1,epoch=3,已經(jīng)迭代一輪。
?審核編輯 黃宇
-
LoRa
+關(guān)注
關(guān)注
349文章
1689瀏覽量
231910 -
大模型
+關(guān)注
關(guān)注
2文章
2423瀏覽量
2640
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論