给我一分钟,教你推理+训练GLM4全系列模型

xxxiu_001 2024-08-19 12:33:03 阅读 88

你有没有想过,如果你喜欢的虚拟角色能和你聊天,会是什么样子?大语言模型就是这样一个聪明的“AI好友”——你问它问题,它能给你答案;你给它一段内容,它能回应你的想法。这不仅是一个人工智能,更像是一个了解你的聪明的伙伴。如果你有你喜欢角色的对话数据,甚至可以训练出任何一个性格的人。例如通过此镜像,训练而出的模型:

在中文开源大模型中。GLM-4系列模型特别出色。实际使用加训练上百次之后。我认为它有着很不错的质量。不管是知识储备比前几代更完善,还是在理解能力上。又或者是微调中。都能明显感觉出来这些能力大大提高了。但是有许多人因为各种原因。部署环境报错、模型训练出现bug、数据集格式不对等等等等。让新手使用门槛极其之高。基于此,我制作了一个全一键调用的镜像。配置好所有的模型和环境,全部功能全都为一键使用。

所以接下来我就向大家介绍如何推理+训练glm4系列模型。

这里我推荐使用Autodl:AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL

打开链接后,你会看见这个界面,我们在第1步那里推荐选择西北B区,当然别的地区也可以。显卡可以选择4090D 或者3090 也可以选择例如L40或者更大显存的显卡。这里我推荐选择4090D。

继续往下滑,按照图片的顺序提示选择,最后点击立即创建,如果点击立即创建后提示:该主机已租满,请更换主机重新创建实例。那么就是你当前选择的显卡被别人抢先选择了,可以选下面几个,或者刷新一下,重新选一个机子。

当你点击加载后,会直接跳转到这个界面,我们直接点击这个JupyterLab

稍等片刻,即可看见操作界面

里面所有的环境和模型以及推理+训练的功能我全部都配置好了,即开即用。

我们复制这个指令:bash /root/chuli/tnt.sh 

然后点击那个终端图标,然后将其输入到终端

稍等片刻,即可加载模型并与其对话,你可以直接在终端和glm4-9b-chat对话:

想要退出对话,可以在模型对话里直接输入:exit  即可退出和模型的对话,同时释放显存。

接下来我们点开左侧的推理.txt

这是其中的界面

如果我们想要继续使用之前的glm-4-9b-chat 那么直接在终端输入:bash /root/chuli/推理/终端.sh

就可以了。如果想要使用别的模型可以按照文章提示选择自己想要的模型。如果你没有下载,也没有关系,输入指令。模型会自动帮你下载,下载完自动推理。实现真正的一键部署。

其中我用一个glm-4v-9b展示一下,首先前往终端,输入:bash /root/chuli/推理/多模态推理.sh

我们会发现,它提示我们没有模型,这里就可以直接输入yes

模型会马上开始帮你下载,而且速度非常快,一分钟都不需要就可以马上下好。下面就是最终的样子:

这里提示我们输入图片名字

因为glm-4v-9b是一个多模态模型,是可以识别图片的。所以我们可以上传一张图片让它去识别。我们只需要选一张jpg格式的图片,然后在左边界面,打开“图片存放”这个文件夹,将图片拖到里面,然后名字建议改成英文的。

例如像我这样:aaa、bbb、ccc这种。

上传好了之后,我们只需要在终端的输入图片名字:aaa (或者你自己图片的名字)

然后回车,下面就可以和模型讨论你上传的图片了。

如果想要退出还是一样在对话里输入exit  即可退出。

下面我们来介绍如何训练模型

本镜像支持:单/多轮训练、ptuning_v2、lora 训练方式。

我们打开左侧的训练.txt

文件打开后是这样的:

由于其中的训练方式有很多,所以我这里就选择其中一种来介绍,其余的内容可以自行操作,里面的教程也十分的简单。

这里我就先介绍单轮对话lora微调。

首先,我们需要准备好数据集,数据集的格式是这种样式的:

问:你喜欢我吗?

答:我喜欢你,可以先把枪放下好吗。

问:为什么AI进步的这么快?

答:因为大公司有钱,有资源。

数据集做好之后,打开左侧的 数据集全自动处理文件夹

打开之后我们继续选择 问答对处理.txt

你可能会发现这个文件里面有很多已经有了的数据集。

这实际上是我提前放进去的文件,方便一些懒得做数据集的人可以直接使用,当然,你也可以全删除,替换成自己的。

你的数据集做好之后,记得ctrl+s 保存。

然后接下来就可以直接在终端输入:python /root/chuli/微调/lora微调/一条龙.py

这个指令是会将你的数据集处理,自动转换成模型可以训练的格式。

到了这一步后,其实就已经完成了一大半了,剩下的就是配置训练参数和最终的训练了。这部分也很简单。

我们在左侧的页面依次点开:

其中这个lora.yaml 就是我们的训练配置文件,我们可以在这里面调整模型的训练参数。方便我们调试。

对于参数,我们先不聊那么多,其中就介绍两个主要的参数:max_steps 以及 save_steps

其中max_steps的意思就是模型的总训练步数。我在这里选择了2500步,你如果想调整也可以自己改动。

然后save_steps的意思是模型多少步会保存一次的意思,这里我输入的是50 也就是说,模型每50步的时候,会保存一次。这个你也可以自己改动。

当然,即使什么都不改也可以。如果改好了记得保存。

最后,我们就可以开始训练了,我们来到终端,

输入:bash /root/chuli/微调/lora微调/lora训练.sh

即可一键开始训练:

可以发现,模型现在就是开始训练了。但是有些同学可能就要问了:我到底什么时候结束训练呀?

是等进度条跑完吗? 

回答:不需要,我们可以观察下面的那个红框,就用我图片里面的输出举例:

{'loss': 3.2656, 'grad_norm': 2.828125, 'learning_rate': 0.00019920000000000002, 'epoch': 0.23}                                                                                                                                                

{'loss': 2.8172, 'grad_norm': 4.125, 'learning_rate': 0.0001984, 'epoch': 0.45}                                                                                                                                                                

{'loss': 2.5875, 'grad_norm': 2.28125, 'learning_rate': 0.0001976, 'epoch': 0.68}                                                                                                                                                              

{'loss': 2.7672, 'grad_norm': 2.578125, 'learning_rate': 0.0001968, 'epoch': 0.91}                                                                                                                                                             

{'loss': 2.5266, 'grad_norm': 3.0, 'learning_rate': 0.000196, 'epoch': 1.14}          

这些内容里面只需要关注loss后面的内容。其中你会发现loss是处于一个下降的状态。这就代表模型在不断的学习你的数据集。loss越低证明模型学习的越好。但是!并不是loss越低越好。过犹不及。我自己个人的训练经验,我们最好在loss输出到1.4~0.7 这个范围内手动停止训练。

例如看到这个输出区间,里面的loss已经降到我们说的那个区间了,那么其实现在就可以停止训练了。停止训练就直接在终端上面:ctrl+c  然后不停的按回车就可以了。

然后,还记得之前我设置的每50步保存一次模型吗?里面如果你仔细看左侧,都是每隔50步就保存一次模型。那么我们就很清楚我们当前红框里面的模型是第几步了——第200步的模型

下面我们就可以开始推理自己训练的模型了,在左侧的界面打开finetune_demo

里面的界面是这样的:

我们打开output文件夹,这里面的所有文件都是你刚刚保存的模型,后面的数字就是不同步数下保存的模型。刚刚的200步就是:checkpoint-200这个文件

返回这个界面,打开推理.py文件

推理.py文件里面。关注第33行。将模型保存点换成:checkpoint-200

就像这样:

然后就可以了,记得保存。

最后我们直接在终端里面输入:bash /root/chuli/微调/lora微调/推理.sh

就可以和训练后的模型对话了。

同样的,我们可以输入exit结束对话。

那么,这里又有人要问了。我的这个训练好的模型,好像是加载保存点形式的呀?该怎么合并呢?

其实,将训练好的模型和主模型合并也十分的简单。

来到这个界面,打开: 合并.py 

其中:“模型载点”  就是和之前的模型保存点是一个意思,然后xxx就是你最终合并的模型名字。这里我给你取名了xxx 这个名字。你可以改成你喜欢的,或者不改。

改好后记得保存:

然后再终端里输入:bash /root/chuli/模型合并/合并.sh

即可开始合并模型

最后模型保存后的路径是:autodl-tmp/xxx   这个路径下面

最后,可能还有同学要问了,我想要把合并好的模型部署成API,然后调用。而且我还想在这个云服务器上,调用到我的本地机子上推理,可以吗?

当然可以!

我们还是在左侧这个界面,打开API.py 

其中我们在代码文件里面滑到最下面,这个里面红框标注的是glm-4-9b-chat原模型的路径。

但是既然我们是要使用微调后的模型,就不可以用原模型的路径了。所以我们换成之前合并好模型的路径

最后直接在终端输入:bash /root/chuli/API/API.sh

这里你可能会发现模型开始下载依赖,这是正常的,因为API需要额外的依赖,可以稍等2分钟。等待下载好之后,会自动生成API端口

在等了2分钟后,发现模型已经输出了端口号:http://0.0.0.0:6006

但实际上,这个端口号我们不能在外部使用,因为这是此镜像独有的端口,所以我们还得再做一步

回到这个界面,点击自定义服务

然后再点击访问

你可能进去后只能看见一片空白,这是正常的,我们要做的就是双击这个网址,然后将这个网址复制下来,例如我的就是:https://u183410-8642-ecd0cded.westb.seetacloud.com:8443/

记住这个网址。然后现在如果你本地有python 的话,可以使用我这个调用代码:

<code>import requests

import json

def send_message(prompt, history):

url = "输入你的那个网址"

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()

其中在url那行后面输入你刚刚复制的网址,就像这样:

import requests

import json

def send_message(prompt, history):

url = "https://u183410-8642-ecd0cded.westb.seetacloud.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()

最后,我们直接运行,就可以在本地机子上推理模型了:

这里我们就结束了,实际上这个镜像还有很多的功能,只是要一一全部介绍就实在太长了,所以我推荐直接自己根据镜像内容的文件教程自己操作。我在文件里面写的很详细,全都是输入指令的方式。非常方便。此镜像会不断的更新,后续更新会加入:

1.多模态模型的微调

2.function calling工具调用

3.多卡训练

4.全参数微调

5.vllm部署

敬请期待!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。