前言

这个想法很早之前就有了,以至于为什么一直没有完成的原因在于互联网上对这方面的文档少之又少

对于这篇文章我尽量写的简单,一步一步操作即可训练出一个属于自己的Ai模型

导出微信聊天记录

下载留痕GitHub – LC044/WeChatMsg,解压后打开

 

点击获取信息然后启动

点击左侧的【设置】【json设置】,然后选择GLM4并按照数据集构建算法自行选择导出策略

点击左侧的【好友】然后选择想导出的聊天记录,导出json

导出成功后打开文件夹可以看到两个文件,分别是备注名_train.json备注名_dev.json

我建议将两个文件重命名为input_dev.jsoninput_train.json

下载转换工具,下载链接:convert.py – 元素云盘

路径中输入cmd可当前目录打开命令行

 

在命令行中输入

convert.py

等待代码运行完之后可以得到dev.jsonltrain.jsonl

至此微信聊天记录导出完成

租用服务器并导入训练集

这里推荐使用AutoDL算力云[无广自推]

建议选择24G显存及以上机器,避免微调时爆显存

关于Api部署需要使用自定义服务,有一些地区可能需要企业认证,这里推荐使用西北B区

选择好机器后,在下方镜像中选择社区镜像并搜索ChatGLM4,选择下方的这个镜像即可创建实例

以下内容基于该镜像v3版本撰写

在控制台界面先点击AutoPanel,然后在右侧实用工具中修改pip镜像为清华源

然后进入JupyterLab

打开服务器终端输入以下命令部署模型

bash /root/chuli/tnt.sh

当部署成功后即可Ctrl+C退出进程

我们打开 ///data 目录,并将先前转换的dev.jsonltrain.jsonl直接拖进文件夹

微调模型

打开///configs/lora.yaml自行修改配置文件,我自己的配置文件如下

data_config:
train_file: train.jsonl
val_file: dev.jsonl
test_file: dev.jsonl
num_proc: 10
max_input_length: 512
max_output_length: 1024
training_args:
# see `transformers.Seq2SeqTrainingArguments`
output_dir: ./output #自己要保存的地方
max_steps: 360000 #这里是训练多少步
# needed to be fit for the dataset
learning_rate: 2e-4
# settings for data loading
per_device_train_batch_size: 1
dataloader_num_workers: 16
remove_unused_columns: false
# settings for saving checkpoints
save_strategy: steps
save_steps: 2000 #这里是多少步保存一次
# settings for logging
log_level: info
logging_strategy: steps
logging_steps: 100
# settings for evaluation
per_device_eval_batch_size: 4
evaluation_strategy: steps
eval_steps: 500000000
# settings for optimizer
# adam_epsilon: 1e-6
# uncomment the following line to detect nan or inf values
# debug: underflow_overflow
predict_with_generate: true
# see `transformers.GenerationConfig`
generation_config:
max_new_tokens: 512
# set your absolute deepspeed path here
# deepspeed: configs/ds_zero_3.json
peft_config:
peft_type: LORA
task_type: CAUSAL_LM
r: 32
lora_alpha: 48
lora_dropout: 0.1
target_modules: ["query_key_value"]

修改好之后Ctrl+S保存

训练至loss在0.7-1.4左右即可,若数据集太大可能下不去,我自己的36w步只训练到2.5左右

输入以下命令开始训练

source activate py310_chat 
cd /root/GLM-4/finetune_demo
python finetune.py data/ /root/autodl-tmp/glm-4-9b-chat configs/lora.yaml

如果需要从保存点进行微调,可以输入以下命令

source activate py310_chat 
cd /root/GLM-4/finetune_demo
python finetune.py data/ /root/autodl-tmp/glm-4-9b-chat configs/lora.yaml yes

如果出现这种报错即爆显存

等待训练完成我们可以尝试跑一下微调之后的模型

你可以在这个路径下面:GLM-4/finetune_demo 打开 推理.py 文件

然后在33行那里,会有一个这样的显示:

MODEL_PATH = os.environ.get('MODEL_PATH', '/root/GLM-4/finetune_demo/output/模型保存点')

其中你需要将最后面的那个模型名字替换掉。替换成你刚刚训练好的模型保存点,训练好的模型可能会有很多,
在:GLM-4/finetune_demo/output 这个路径下面,也许是这样的:checkpoint-200 这个后面的数字
越大代表训练的轮数越多,可以选一个你认为可以的,然后粘贴替换掉模型名字,就像这样:

MODEL_PATH = os.environ.get('MODEL_PATH', '/root/GLM-4/finetune_demo/output/checkpoint-2000')

最后保存,接着运行以下命令就可以推理lora模型了:

bash /root/chuli/微调/lora微调/推理.sh

合并模型

如果你的模型微调好了之后,可以使用这个模型合并功能把微调后的模型融合在原模型里面

打开/GLM-4/合并.py 文件

代码文件里面只需要关注这两个内容:

checkpoint_path = "/root/GLM-4/finetune_demo/output/模型载点"
output_path = "/root/autodl-tmp/xxx"

其中:checkpoint_path = "/root/GLM-4/finetune_demo/output/模型载点"

里面的这个“模型载点”就是你output里面的微调权重模型,选择好后粘贴上去,就像这样:

checkpoint_path = "/root/GLM-4/finetune_demo/output/checkpoint-100

然后这个:output_path = "/root/autodl-tmp/xxx" 里面的xxx就是你融合模型的名字

都改好了之后即可运行:

bash /root/chuli/模型合并/合并.sh

部署API

打开/GLM-4/API.py

在62行和64行有两处需要修改的地方

 tokenizer = AutoTokenizer.from_pretrained("/root/autodl-tmp/glm-4-9b-chat", trust_remote_code=True)

 "/root/autodl-tmp/glm-4-9b-chat",

这两处的glm-4-9b-chat修改成上一步合并后的模型文件夹名称

修改好之后直接运行以下命令

bash /root/chuli/API/API.sh

看见输出6006端口后,则代表启动成功了

接着前往AutoDl控制台点击自定义服务,有一些地区可能需要企业认证,这里推荐使用西北B区

将这个链接复制下来保存好

Python的示例代码
import requests
import json

def send_message(prompt, history):
url = "https://u183410-abf6-45353a58.westc.gpuhub.com:8443/"
headers = {'Content-Type': 'application/json'}
data = {
"prompt": prompt,
"history": history
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
return response.json()
else:
print(f"Error: Received status code {response.status_code}")
return None

def main():
# 定义一个系统消息,作为上下文的一部分
system_message = {"role": "system", "content": "你是一个聪明的AI"}
# 初始化历史记录并添加系统消息
history = [system_message]
while True:
user_input = input("You: ")
if user_input.lower() == 'quit':
print("Exiting conversation.")
break
response_data = send_message(user_input, history)
if response_data:
print("AI:", response_data['response'])
# 维护历史记录,包括用户输入和AI响应
history.append({"role": "user", "content": user_input})
history.append({"role": "assistant", "content": response_data['response']})

if __name__ == "__main__":
main()
Php的示例代码

下载链接:php_demo.zip – 元素云盘

解压到服务器后打开send_message.php修改目标URL为先前获取到的链接即可

然后访问http://你的域名/chat.php即可开始交流

总结

至此这个教程也差不多结束了,如果对文章有看法的欢迎各位大佬在评论区讨论,可能有一些步骤会有错误欢迎指出错误

感谢各位开发者对国内Ai的贡献

参考文档

开发教程 | MemoTrace

GitHub – THUDM/GLM-4: GLM-4 series: Open Multilingual Multimodal Chat LMs | 开源多语言多模态对话模型