当前位置:   article > 正文

【保姆教程】白嫖GPU T4*2!Kaggle实现chatglm微调任务----单机多卡训练测试_prefix_state_dict

prefix_state_dict

目录

一、克隆 ChatGLM-6B 源码到本地

二、下载数据集ADGEN 数据集

三、代码修改

四、Kaggle代码运行

五、最后将模型加载到本地用CPU进行效果测试


一、克隆 ChatGLM-6B 源码到本地

        (1)下载压缩包到本地

        (2)Git 克隆

git clone https://github.com/THUDM/ChatGLM-6B.git

二、下载数据集ADGEN 数据集

    数据集下载地址:

  1. # Google Drive:
  2. https://drive.google.com/file/d/13_vf0xRTQsyneRKdD1bZIr93vBGOczrk/viewTsinghua
  3. # Cloud:
  4. https://cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/?dl=1

  下载处理好的 ADGEN 数据集,将解压后的AdvertiseGen目录放到本目录下(也就是放在\ChatGLM-6B\ptuning文件夹下)。

三、代码修改

        (1)配置文件修改(ChatGLM-6B文件夹下的requirements.txt),删除torch>=1.10(kaggle自带相对应的cuda版本),并添加 rouge_chinese nltk jieba datasets 这几个依赖包。

         处理后的文件

        (2) 切换到ChatGLM-6B\ptuning目录下,修改训练的配置文件train.sh。需要修改的参数有:

2.1 CUDA_VISIBLE_DEVICES=0修改为CUDA_VISIBLE_DEVICES=0,1

     因为我们用的kaggle的T4*2单机双卡训练,这里把CUDA_VISIBLE_DEVICES可用的GPU设置为2张。

     注意:目前不知道什么原因,用kaggle的P100进行单卡训练时,出现以下报错(RuntimeError: CUDA error: no kernel image is available for execution on the device),可能是GPU版本问题,切换为T4*2双卡下训练就不会报错了。

2.2 --model_name_or_path参数:THUDM/chatglm-6b修改为THUDM/chatglm-6b-int4。

      原因很简单,显存有限,只能使用-int4量化的版本来训练,总的参数也有30亿多了。

2.3 --output_dir参数output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR修改为/kaggle/working/output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR

2.4 (可选)--max_steps,--logging_steps,--save_steps,为了演示方便,这里把这几个参数设置小一点

最终的文件设置如下:

代码如下:

  1. PRE_SEQ_LEN=128
  2. LR=2e-2
  3. CUDA_VISIBLE_DEVICES=0,1 python3 main.py \
  4. --do_train \
  5. --train_file AdvertiseGen/train.json \
  6. --validation_file AdvertiseGen/dev.json \
  7. --prompt_column content \
  8. --response_column summary \
  9. --overwrite_cache \
  10. --model_name_or_path THUDM/chatglm-6b-int4 \
  11. --output_dir /kaggle/working/output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \
  12. --overwrite_output_dir \
  13. --max_source_length 64 \
  14. --max_target_length 64 \
  15. --per_device_train_batch_size 1 \
  16. --per_device_eval_batch_size 1 \
  17. --gradient_accumulation_steps 16 \
  18. --predict_with_generate \
  19. --max_steps 20 \
  20. --logging_steps 10 \
  21. --save_steps 10 \
  22. --learning_rate $LR \
  23. --pre_seq_len $PRE_SEQ_LEN \
  24. --quantization_bit 4

        (3)修改测试的配置文件evaluate.sh。

 

 代码如下:

  1. PRE_SEQ_LEN=128
  2. LR=2e-2
  3. CHECKPOINT=adgen-chatglm-6b-pt-128-2e-2
  4. STEP=20
  5. CUDA_VISIBLE_DEVICES=0,1 python3 main.py \
  6. --do_predict \
  7. --validation_file AdvertiseGen/dev.json \
  8. --test_file AdvertiseGen/dev.json \
  9. --overwrite_cache \
  10. --prompt_column content \
  11. --response_column summary \
  12. --model_name_or_path THUDM/chatglm-6b-int4 \
  13. --ptuning_checkpoint /kaggle/working/output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR/checkpoint-$STEP \
  14. --output_dir /kaggle/working/output/$CHECKPOINT \
  15. --overwrite_output_dir \
  16. --max_source_length 64 \
  17. --max_target_length 64 \
  18. --per_device_eval_batch_size 1 \
  19. --predict_with_generate \
  20. --pre_seq_len $PRE_SEQ_LEN \
  21. --quantization_bit 4

四、Kaggle代码运行

代码如下:

pip install -r /kaggle/input/datas-chat-glm-xiaolvs/ChatGLM-6B/requirements.txt
  1. # 修改工作路劲
  2. import os, sys
  3. path = "/kaggle/input/datas-chat-glm-xiaolvs/ChatGLM-6B/ptuning"
  4. # 查看当前工作目录
  5. retval = os.getcwd()
  6. print("当前工作目录为 %s" % retval)
  7. # 修改当前工作目录
  8. os.chdir( path )
  9. # 查看修改后的工作目录
  10. retval = os.getcwd()
  11. print("目录修改成功 %s" % retval)
  1. # 关闭 wandb ,不然训练是会报错。
  2. !wandb off
  1. # 训练
  2. ! bash train.sh
  1. # 测试
  2. ! evaluate.sh

运行过程如图:

         !!成功跑通!!

        代码在kaggle上已经公开,可以直接拷贝下来自己去运行试试。

        链接:https://www.kaggle.com/lvcuiyan/chatglm-6b-pt-xiaolvExplore and run machine learning code with Kaggle Notebooks | Using data from datas_chat_glm_xiaolvshttps://www.kaggle.com/lvcuiyan/chatglm-6b-pt-xiaolv

五、最后将模型加载到本地用CPU进行效果测试

        这里使用本地CPU进行推理。        

  1. # !/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. """
  4. # File : pre.py
  5. # Time :2023/5/26 16:53
  6. # Author :小吕同学
  7. """
  8. import torch
  9. from transformers import AutoConfig, AutoModel, AutoTokenizer
  10. # 原始模型的路径:THUDM/chatglm-6b-int4,本地文件路径也可。
  11. model_path = r"THUDM/chatglm-6b-int4"
  12. # 经过微调后保存的模型,这里选择最后一个模型 output\adgen-chatglm-6b-pt-128-2e-2\checkpoint-20\pytorch_model.bin
  13. prefix_state_dict = r"\output\adgen-chatglm-6b-pt-128-2e-2\checkpoint-20\pytorch_model.bin"
  14. # 载入Tokenizer
  15. tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
  16. config = AutoConfig.from_pretrained(model_path, trust_remote_code=True, pre_seq_len=128)
  17. model = AutoModel.from_pretrained(model_path, config=config, trust_remote_code=True)
  18. # ------------ vvvv 测试原本模型可以注释掉 vvvvv ------------
  19. # prefix_state_dict = torch.load(prefix_state_dict,map_location=torch.device('cpu'))
  20. # new_prefix_state_dict = {}
  21. # for k, v in prefix_state_dict.items():
  22. # if k.startswith("transformer.prefix_encoder."):
  23. # new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
  24. # model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)
  25. # ------------ ^^^^^^^^^^^^^^^^^^^^^ ------------
  26. # 模型量化
  27. model = model.quantize(4)
  28. model = model.float()
  29. model.transformer.prefix_encoder.float()
  30. model = model.eval()
  31. print('模型总的参数:', sum(p.numel() for p in model.parameters()))
  32. """
  33. 通过设置top_p=0.01, temperature=0.01,来控制模型输出的模型,数值越小,模型越准确。
  34. """
  35. response, history = model.chat(tokenizer, "类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞", history=[],do_sample=True, top_p=0.01, temperature=0.01)
  36. print(response)
  37. print(history)
  38. # 原始数据
  39. # {"content": "类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞",
  40. # "summary": "简约而不简单的牛仔外套,白色的衣身十分百搭。衣身多处有做旧破洞设计,打破单调乏味,增加一丝造型看点。衣身后背处有趣味刺绣装饰,丰富层次感,彰显别样时尚。"}
  41. # 没微调前的模型输出
  42. # [('类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞', '类型:\n\n上衣材质:牛仔布\n颜色:白色\n风格:简约\n图案:刺绣\n衣款式:外套\n\n破洞')]
  43. # 微调后模型的输出
  44. # {"labels": "<image_-100> 简约而不简单的牛仔外套,白色的衣身十分百搭。衣身多处有做旧破洞设计,打破单调乏味,增加一丝造型看点。衣身后背处有趣味刺绣装饰,丰富层次感,彰显别样时尚。",
  45. # "predict": "小清新风格的牛仔外套,简约又无味,轻松搭配牛仔裤,搭配高跟鞋,完美诠释了甜美小清新的气息。拼接关系的刺绣元素,凸显美感,破洞的设计,播放出时尚感,可爱甜美,可爱本人了。"}

代码地址:

openi:

xiaolv/chatglm_kaggle: 利用Kaggle的GPU T4*2资源进行单机双卡训练微调Chatglm模型,最后进行本地CPU运行验证。 - chatglm_kaggle - OpenI - 启智AI开源社区提供普惠算力!chatglm_kaggle - 利用Kaggle的GPU T4*2资源进行单机双卡训练微调Chatglm模型,最后进行本地CPU运行验证。https://openi.pcl.ac.cn/xiaolv/chatglm_kaggle.gitkaggle:

ChatGLM-6B-PT-xiaolv | Kaggle 代码Explore and run machine learning code with Kaggle Notebooks | Using data from datas_chat_glm_xiaolvshttps://www.kaggle.com/lvcuiyan/chatglm-6b-pt-xiaolv


参考链接:

ChatGLM-6B源码https://github.com/THUDM/ChatGLM-6B
官方微调代码https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/260374
推荐阅读
相关标签
  

闽ICP备14008679号