---
# System prepended metadata

title: ChatGLM-FineTune(P-Tuning v2)

---

# ChatGLM-FineTune(P-Tuning v2)
此微調方式基於P-Tuning v2 微調所需的vram大約7.7G，受限於硬體所以我們只使用這個方法

# 數據集格式
官方例子(https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md)
示例1
Input: 类型#上衣*材质#牛仔布*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞
Label: 简约而不简单的牛仔外套,白色的衣身十分百搭。衣身多处有做旧破洞设计,打破单调乏味,增加一丝造型看点。衣身后背处有趣味刺绣装饰,丰富层次感,彰显别样时尚。
Output[微调前]: 这件上衣的材质是牛仔布,颜色是白色,风格是简约,图案是刺绣,衣样式是外套,衣款式是破洞。
Output[微调后]: 这是一款简约的牛仔外套,破洞设计,将牛仔布破洞,带来一种随意与个性。破洞的牛仔外套,展现出时尚气息,带来一种休闲感。同时,刺绣图案,让整件外套更加立体。

示例2
我們的excel數據集
![](https://hackmd.io/_uploads/rknVeJADh.png)

excel文件轉為json形式
![](https://hackmd.io/_uploads/H1egIbkAwh.png)
![](https://hackmd.io/_uploads/B1X8bJRw2.png)
訓練文件--train_file
![](https://hackmd.io/_uploads/H1JubyAw3.png)
驗證文件--validation_file
![](https://hackmd.io/_uploads/S1L1Pk0w2.png)


# Ptuning訓練參數
--train_file ..\answers.json
--validation_file ..\dev.json
--prompt_column prompt
--response_column response 
--overwrite_cache 
--model_name_or_path ..\model 
--output_dir ..\output 
--overwrite_output_dir

以上為路徑設定
---
--max_source_length 256(原128改為256)
--max_target_length 256(原128改為256)
--per_device_train_batch_size 1(原為6改為1)
--per_device_eval_batch_size 1 (原為6改為1)
--gradient_accumulation_steps 16 
--predict_with_generate 
--max_steps 500 
--logging_steps 10 
--save_steps 50 
--learning_rate 2e-2(原為2e-4) 
--pre_seq_len 128 (這裡設定多少下面的也要一樣)
--quantization_bit 4(int4量化)
![](https://hackmd.io/_uploads/rJPSM1CDh.png)
# 訓練完成
只需把訓練好的pytorch_model.bin抓回chatglm
![](https://hackmd.io/_uploads/r1ps4yCP2.png)
pytorch_model.bin放回chatglm目錄下
![](https://hackmd.io/_uploads/rkm_ryAPn.png)
如果需要加载的是新 Checkpoint（只包含 PrefixEncoder 参数）
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
config = AutoConfig.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True, pre_seq_len=128)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", config=config, trust_remote_code=True).half().cuda()
prefix_state_dict = torch.load("D:/4a9g0046/ChatGLM-6B-main/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)
![](https://hackmd.io/_uploads/Hy8VI1CPh.png)
注意你可能需要將 pre_seq_len 改成你訓練時的實際值

# 訓練畫面
![](https://hackmd.io/_uploads/H1UD9JAPn.png)

# 實際回答畫面
問題如下:
1.德國的首都
2.天氣如何
3.你的名字
4.美國首都
![](https://hackmd.io/_uploads/r1CxOkCP2.png)
這是一張文本轉音檔的圖片,不使用對話紀錄是因為每回答一個問題就會看不到上一個。



<style>
.blue {
  color: red;
}
</style>
{%hackmd sMV2zv-CTsuIqnpb0hZLmA %}