本文仅仅是测试一下ptuning技术方案,使用少量数据测试下微调流程
系统:CentOS-7
CPU: 14C28T
显卡:Tesla P40 24G
驱动: 515
CUDA: 11.7
cuDNN: 8.9.2.26
https://huggingface.co/THUDM/chatglm2-6b
下载模型相关文件到自己目录
我的是/models/chatglm2-6b
[root@ai-server chatglm2-6b]# pwd
/models/chatglm2-6b
[root@ai-server chatglm2-6b]# ll -h
total 12G
-rw-r--r--. 1 root root 678 Jul 29 09:30 cli.py
-rw-r--r--. 1 root root 1.2K Jul 29 09:30 config.json
-rw-r--r--. 1 root root 2.2K Jul 29 09:30 configuration_chatglm.py
-rw-r--r--. 1 root root 50K Jul 29 09:30 modeling_chatglm.py
-rw-r--r--. 1 root root 4.1K Jul 29 09:30 MODEL_LICENSE.txt
-rw-r--r--. 1 root root 1.8G Jul 29 09:33 pytorch_model-00001-of-00007.bin
-rw-r--r--. 1 root root 1.9G Jul 29 09:33 pytorch_model-00002-of-00007.bin
-rw-r--r--. 1 root root 1.8G Jul 29 09:33 pytorch_model-00003-of-00007.bin
-rw-r--r--. 1 root root 1.7G Jul 29 09:33 pytorch_model-00004-of-00007.bin
-rw-r--r--. 1 root root 1.9G Jul 29 09:33 pytorch_model-00005-of-00007.bin
-rw-r--r--. 1 root root 1.8G Jul 29 09:33 pytorch_model-00006-of-00007.bin
-rw-r--r--. 1 root root 1005M Jul 29 09:32 pytorch_model-00007-of-00007.bin
-rw-r--r--. 1 root root 20K Jul 29 09:30 pytorch_model.bin.index.json
-rw-r--r--. 1 root root 15K Jul 29 09:30 quantization.py
-rw-r--r--. 1 root root 348 Jul 29 09:30 README-env.md
-rw-r--r--. 1 root root 7.9K Jul 29 09:30 README.md
-rw-r--r--. 1 root root 9.9K Jul 29 09:30 tokenization_chatglm.py
-rw-r--r--. 1 root root 244 Jul 29 09:30 tokenizer_config.json
-rw-r--r--. 1 root root 995K Jul 29 09:30 tokenizer.model
conda create --name glm2 python=3.10
conda activate glm2
git clone https://github.com/THUDM/ChatGLM2-6B
cd ChatGLM2-6B
pip install rouge_chinese nltk jieba datasets -i https://pypi.tuna.tsinghua.edu.cn/simple
参考数据
data/train.json 文章开头【自我意识-训练数据train.json】
可以替换【AI小木】【小吕】来构建你自己的自我认识数据集
一定注意数据中格式,符号中英文等等
data/dev.json
我使用和train.json一致,正式使用是要使用真实数据
cd ptuning
修改 train.sh
--train_file data/train.json \
--validation_file data/dev.json \
--model_name_or_path /models/chatglm2-6b \
--max_steps 100 \
--logging_steps 1 \
--save_steps 50 \
sh train.sh
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla P40 Off | 00000000:03:00.0 Off | 0 |
| N/A 78C P0 196W / 250W | 7845MiB / 23040MiB | 100% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
{'train_runtime': 2787.9684, 'train_samples_per_second': 0.574, 'train_steps_per_second': 0.036, 'train_loss': 1.142700309753418, 'epoch': 20.0}
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [46:27<00:00, 27.88s/it]***** train metrics *****
epoch = 20.0
train_loss = 1.1427
train_runtime = 0:46:27.96
train_samples = 80
train_samples_per_second = 0.574
train_steps_per_second = 0.036
train_loss 要小,如果1,2这种未调出的效果很差
如果调整了数据集,要清理缓存,缓存目录如下
/root/.cache/huggingface/datasets
output/adgen-chatglm2-6b-pt-128-2e-2/checkpoint-100
vim cli.py
import logging
import os
import sys
import json
import torch
from transformers import AutoConfig, AutoModel, AutoTokenizer
# 载入Tokenizer
tokenizer = AutoTokenizer.from_pretrained("/models/chatglm2-6b", trust_remote_code=True)
config = AutoConfig.from_pretrained("/models/chatglm2-6b", trust_remote_code=True, pre_seq_len=128)
model = AutoModel.from_pretrained("/models/chatglm2-6b", config=config, trust_remote_code=True)
prefix_state_dict = torch.load(os.path.join("./output/adgen-chatglm2-6b-pt-128-2e-2/checkpoint-100", "pytorch_model.bin"))
new_prefix_state_dict = {}
for k, v in prefix_state_dict.items():
if k.startswith("transformer.prefix_encoder."):
new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)
# 之后根据需求可以进行量化
# Comment out the following line if you don't use quantization
#model = model.quantize(4)
model = model.half().cuda()
model.transformer.prefix_encoder.float()
model = model.eval()
response, history = model.chat(tokenizer, "你是谁", history=[])
print(response)
python cli.py
cat web_demo.sh
PRE_SEQ_LEN=128
CUDA_VISIBLE_DEVICES=0 python3 web_demo.py \
--model_name_or_path /models/chatglm2-6b \
--ptuning_checkpoint output/adgen-chatglm2-6b-pt-128-2e-2/checkpoint-100 \
--pre_seq_len $PRE_SEQ_LEN
注意
web_demo.py
外网访问
demo.queue().launch(share=False, inbrowser=True,server_name='0.0.0.0')
sh web_demo.sh
http://192.168.0.0:7860/
好,可以体验了