前言
这个想法很早之前就有了,以至于为什么一直没有完成的原因在于互联网上对这方面的文档少之又少
对于这篇文章我尽量写的简单,一步一步操作即可训练出一个属于自己的Ai模型
导出微信聊天记录
下载留痕GitHub – LC044/WeChatMsg,解压后打开
点击获取信息然后启动
点击左侧的【设置】【json设置】,然后选择GLM4并按照数据集构建算法自行选择导出策略
点击左侧的【好友】然后选择想导出的聊天记录,导出json
导出成功后打开文件夹可以看到两个文件,分别是备注名_train.json
和备注名_dev.json
我建议将两个文件重命名为input_dev.json
和input_train.json
下载转换工具,下载链接:convert.py – 元素云盘
路径中输入cmd可当前目录打开命令行
在命令行中输入
convert.py
等待代码运行完之后可以得到dev.jsonl
和train.jsonl
至此微信聊天记录导出完成
租用服务器并导入训练集
这里推荐使用AutoDL算力云[无广自推]
建议选择24G显存及以上机器,避免微调时爆显存
关于Api部署需要使用自定义服务,有一些地区可能需要企业认证,这里推荐使用西北B区
选择好机器后,在下方镜像中选择社区镜像并搜索ChatGLM4
,选择下方的这个镜像即可创建实例
以下内容基于该镜像v3版本撰写
在控制台界面先点击AutoPanel
,然后在右侧实用工具中修改pip镜像为清华源
然后进入JupyterLab
打开服务器终端输入以下命令部署模型
bash /root/chuli/tnt.sh
当部署成功后即可Ctrl+C
退出进程
我们打开 /GLM-4/finetune_demo/data
目录,并将先前转换的dev.jsonl
和train.jsonl
直接拖进文件夹
微调模型
打开/GLM-4/finetune_demo/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的贡献
参考文档
GitHub – THUDM/GLM-4: GLM-4 series: Open Multilingual Multimodal Chat LMs | 开源多语言多模态对话模型
无聊搜了一下,没想到搜到了我写的镜像,嘿嘿
@ xxxiu 佬哈哈哈,感谢大佬做的镜像方便多了
链接:https://pan.baidu.com/s/15aTTV-lXaXfYI97aD0ATEw
提取码:9gj6
這是第一個168的模型,還有一個:
链接:https://pan.baidu.com/s/1K3uH_bbc8fNBzDAf8n8Qeg
提取码:yhkf
水贴文件a6打印 不要缩放
up主原话
最好兩個都幫我打一下,沒信息科這周真操蛋
@ 我鬼知道 收到