第七篇-Tesla P40+ChatGLM2+P-Tuning

本文目的

本文仅仅是测试一下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

Web验证

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/

好,可以体验了

你可能感兴趣的:(AI-LLM-实战,chatgpt,人工智能,centos)