赞
踩
你有没有想过,如果你喜欢的虚拟角色能和你聊天,会是什么样子?大语言模型就是这样一个聪明的“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 的话,可以使用我这个调用代码:
- 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部署
敬请期待!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。