外观
ChatGLM-6B-部署与使用
ChatGLM-6B 是由清华大学和智谱 AI 开源的一款对话语言模型,基于 General Language Model (GLM)架构,具有 62 亿参数。该模型凭借其强大的语言理解和生成能力、轻量级的参数量以及开源的特性,已经成为在学术界和工业界引起了广泛关注。
本篇将介绍使用 DAMODEL 深度学习平台部署 ChatGLM-6B 模型,然后通过 Web API 的形式使用本地代码调用服务端的模型进行对话。
一、DAMODEL-ChatGLM-6B 服务端部署
DAMODEL(丹摩智算)是专为 AI 打造的智算云,致力于提供丰富的算力资源与基础设施助力 AI 应用的开发、训练、部署。
1.1、实例创建
首先进入 DAMODEL 控制台,点击资源-GPU 云实例,点击创建实例:
进入创建页面后,首先在实例配置中首先选择付费类型为按量付费,其次选择单卡启动,然后选择需求的 GPU 型号,本次实验可以选择选择:按量付费--GPU 数量 1--NVIDIA-GeForc-RTX-4090,该配置为 60GB 内存,24GB 的显存。
继续往下翻,配置数据硬盘的大小,每个实例默认附带了 50GB 的数据硬盘,本次创建可以就选择默认大小 50GB,可以看到,平台提供了一些基础镜像供快速启动,镜像中安装了对应的基础环境和框架,这里选择 PyTorch1.13.1 的框架启动,也可以选择 PyTorch2.1.2 版本启动。
点击创建密钥对,输入自定义的名称,创建好密钥对后,选择刚刚创建好的密钥对,并点击立即创建,等待一段时间后即可启动成功!
1.2、模型准备
启动环境后,打开终端,用 git 克隆ChatGLM-6B项目,若遇到github连接超时,可以选择gitcode站点,或者离线下载并上传到项目中。
bash
cd /home/aistudio/work/
git clone https://github.com/THUDM/ChatGLM-6B.git
# 如果遇见github因为网络问题导致失败,可选择gitcode站点进行下载
# git clone https://gitcode.com/applib/ChatGLM-6B.git
成功克隆项目后,会显示如下文件夹:
其次 cd 进入该文件夹,使用 pip 安装项目依赖:
bash
pip install -r requirements.txt
可以看到 DAMODEL 平台环境依赖的下载安装速度可以达到 18MB/s 以上,非常迅速,等待片刻显示如下 Successfully installed 则说明依赖安装完成!
依赖安装成功后,我们需要引入模型文件,比较方便的是,DAMODEL(丹摩智算)提供了数据上传功能,用户有 20GB 免费存储空间,该空间被挂载到实例的/root/shared-storage
目录,跨实例共享。
这里首先点击文件存储,点击上传文件。
然后下载 Hugging Face 上的 ChatGLM-6B 预训练模型,也可以进入魔塔社区选择Chatglm3-6B里的所有文件进行下载。
然后将下载下来的模型文件及配置进行上传并解压,上传时尽量保持该界面首页显示,等待上传成功后再进行其他操作。
1.3、模型启动
上传好预训练模型及解压后,我们就可以去启动 python 脚本运行了,ChatGLM-6B 提供了cli_demo.py
和web_demo.py
s两个文件来启动模型,第一个是使用命令行进行交互,第二个是使用本机服务器进行网页交互。 由于要使用本地模型启动,所以我们需要把从 Hugging Face Hub 加载改为本地路径加载,打开cli_demo.py
和web_demo.py
文件,将这两行代码改为从本地文件目录加载预训练模型。
然后在终端输入 pythoncli_demo.py
就可以成功启动模型了,在cli_demo.py
中,main
函数启动一个无限循环,等待用户输入。用户可以输入文本与模型进行对话,或输入"clear"清空对话历史并清除屏幕,或输入"stop"退出程序。对于正常的对话输入。 启动模型后的效果如下图所示:
也可以在终端输入python web_demo.py
,通过 Web 界面与模型进行交互。
不过由于 Jupyter 的限制,无法直接打开访问服务器的127.0.0.1:7860
网页端交互界面,这里可以利用 MobaXterm 建立 ssh 隧道,实现远程端口到本机端口的转发。首先打开 tunneling,新建 SSH 通道,填入 ssh 的相关配置,并将 7860 通道内容转发到本机,点击 start 开始转发:
转发成功后,就可以成功在网页与模型进行交互了,效果如下:
二、通过 Web API 实现本地使用
2.1、启动服务
通过以上步骤,我们成功启动了 ChatGLM-6B 模型,并可以在服务器的 JupyterLab 中进行对话,下面我们将其部署为 API 服务,然后在本地进行使用。 同样 ChatGLM-6B 模型为我们提供了api.py
文件,它实现了一个基于 FastAPI 框架 API 服务,其接收一个HTTP POST
请求,该请求体包含文本生成所需的参数,如 prompt(提示文本)、history(对话历史)、max_length(生成文本的最大长度)、top_p(采样时的累积概率阈值)和 temperature(采样时的温度参数,影响生成文本的随机性)。在接收到请求后,该服务使用预训练的模型和分词器(tokenizer)来生成一个响应文本,并更新对话历史。随后生成的响应文本、更新后的对话历史、状态码(固定为 200)和当前时间戳被打包成一个 JSON 对象并返回给客户端。 我们可以直接在终端 cd 进入 ChatGLM-6B 文件夹,运行api.py
文件:
bash
cd ChatGLM-6B
python api.py
显示如下提示则说明启动成功!
2.2、开放端口
其次需要为本地访问开放对应的端口,首先需要点击访问控制,进入端口开放页面:
然后点击添加端口,输入端口号,并点击确定开放:
点击确认开放端口后,平台会给出访问链接,将其复制以便后续使用 做完以上这些步骤后,服务器端就已经部署好了,接下来测试本地调用效果!
2.3、使用 PostMan 测试功能
打开 PostMan,新建一个 Post,将刚刚复制的网址粘贴到 url 栏,然后在 Body 中填入相应的内容。 Body 示例内容如下:
json
{
"prompt": "你好,你是谁?",
"max_length": 512,
"top_p": 0.9,
"temperature": 0.7
}
点击 send 后,显示以下 response 则说明成功!
2.4、本地代码使用功能
测试完成后,下面开始转到本地开发,以下是一个基础的单轮对话功能示例代码:
python
import requests
import json
# API的URL
# 即刚刚复制的访问链接
api_url = "http://cqbiq6nhri0c73eq3cv0-8000.agent.damodel.com"
data = {
"prompt": "你好,你是谁?",
"max_length": 500,
"top_p": 0.9,
"temperature": 1.0
}
# 发送POST请求
response = requests.post(api_url, json=data)
# 检查响应状态码
if response.status_code == 200:
result = response.json()
print("Response:", result['response'])
print("Updated History:", result['history'])
print("Time:", result['time'])
else:
print("Failed to get response from the API. Status code:", response.status_code)
print(response.text)
在此基础上,我们可以实现一个基于 ChatGLM-6B 模型的简单对话系统,在本地通过命令行与 DAMODEL 部署好的模型进行交互。对于正常的对话输入,程序将用户的输入作为 prompt,连同当前的对话历史记录 conversation_history、最大生成长度 max_length、top_p 和 temperature 等参数一起发送到指定的 API URL。然后,它检查 API 的响应状态码。如果状态码为 200,表示请求成功,程序将打印出 API 返回的响应内容和更新后的对话历史记录,并更新 conversation_history 列表。 以下是一个多轮对话的示例代码:
python
import requests
import json
api_url = "http://cqbiq6nhri0c73eq3cv0-8000.agent.damodel.com"
conversation_history = []
print("欢迎使用 ChatGLM-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序")
while True:
query = input("\n用户:")
if query.strip() == "stop":
break
if query.strip() == "clear":
history = []
os.system(clear_command)
print("欢迎使用 ChatGLM-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序")
continue
prompt = query
data = {
"prompt": prompt,
"history": conversation_history,
"max_length": 5000,
"top_p": 0.9,
"temperature": 0.9
}
response = requests.post(api_url, json=data)
if response.status_code == 200:
result = response.json()
print("Response:", result['response'])
print("Updated History:", result['history'])
conversation_history = result['history']
else:
print("Failed to get response from the API. Status code:", response.status_code)
print(response.text)
运行的效果如下: