NVIDIA4090GPU服务器部署ChatGLM3-6B教程

NVIDIA 4090 GPU服务器部署ChatGLM3-6B教程

最近一直在体验ChatGLM2-6B,文章也写了一半。结果ChatGLM3突然发布了,于是又体验了ChatGLM3-6B。

本文只是记录部署的过程,以及测试使用功能。并未高深的内容!技术大佬可忽略!

这里特别感谢 @厚德云又拍云另一个产品)提供免费体验GPU服务器的活动!

大家感兴趣可以去尝试申请,或者付费体验。

另外:阿里云新用户可享受免费体验GPU服务器,腾讯云有HAI上限50元体验活动!咸鱼上也有许多出租算力服务器的卖家!

更多关于: ChatGPT / 免费服务器 

 

简介

ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。

ChatGLM3-6B 是 ChatGLM3 系列中的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性:

  • 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在 10B 以下的基础模型中最强的性能。
  • 更完整的功能支持: ChatGLM3-6B 采用了全新设计的 Prompt 格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
  • 更全面的开源序列: 除了对话模型 ChatGLM3-6B 外,还开源了基础模型 ChatGLM3-6B-Base、长文本对话模型 ChatGLM3-6B-32K。以上所有权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。

 

开源地址

https://github.com/THUDM/ChatGLM3

 

准备工作

GPU服务器,显存最少13G以上

FRP内网穿透(由于服务器并未开放其他端口,临时才有这种方式实现外网测试访问,如果官方提供外网端口可忽略)

 

机器配置

型号:NVIDIA 4090

CPU:16 核

内存:100 G

显存:24 G
磁盘:100G - 800G

系统环境:ubuntu 22.04,  nvidia_driver 530.30.02,miniconda py311_23.5.2-0,jupyterlab 4.0.4,stable-diffusion-webui 1.5.2

(base) root@gpu-4eaf390938734d30b61-1886:~/public# nvidia-smi
Tue Oct 31 10:40:56 2023       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02              Driver Version: 530.30.02    CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                  Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf            Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4090         On | 00000000:00:06.0 Off |                  Off |
|  0%   31C    P8               22W / 450W|      1MiB / 24564MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

 

 

环境部署

由于服务器自带部分依赖内容,本文不用安装!系统自带!

 

#首先需要下载本仓库(国内可能会出现无法访问,多试几次)
git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3

#使用 pip 安装依赖
pip install -r requirements.txt

 

其中 transformers 库版本推荐为 4.30.2,torch 推荐使用 2.0 及以上的版本,以获得最佳的推理性能。

 

模型下载

HuggingFace

境外服务器可直接从 Hugging Face Hub 下载模型需要先安装Git LFS,然后运行!

sudo apt-get install git-lfs
git lfs install
git clone https://huggingface.co/THUDM/chatglm3-6b

 

ModelScope

针对国内服务器只能采取这种方式才有这种方式下载模型,速度会快很多!!!

新建 download.py,粘贴以下内容

from modelscope import snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")

执行命令:python download.py  开始下载模型

 

模型文件目录

模型默认会下载到:/root/.cache/modelscope/hub/ZhipuAI/chatglm3-6b

可以将模型文件迁移到其他目录!本文下面演示全部使用上面的地址。

 

 

启动服务

 

基础Demo

修改模型文件目录

from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html
from utils import load_model_on_gpus

#修改这里模型文件目录
model_path = "/root/.cache/modelscope/hub/ZhipuAI/chatglm3-6b"

tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).cuda()

 

 

修改文件最后一行,share=True

demo.queue().launch(share=True, server_port=8501, inbrowser=True)

 

 

启动服务:

 

 

策略参数

Top P:限制最高置信度分数,即在回答问题时,助手最多可以给出多少置信度较高的答案

Maximum length:文本的最大长度,即助手能够回答的最大字符数

Temperature:参数是控制助手回答的随机性,即在回答问题时,助手的回答可能会更加随机的

部分模型支持惩罚机制

Frequency penalty  和 Presence penalty 是两种惩罚机制,用于限制人工智能模型在对话中的回复频率和连续时间。

Frequency penalty 是指在对话中,如果人工智能模型连续回复了多个问题,那么后续问题回答的频率会降低。具体来说,如果模型在一段时间内连续回答了 n 个问题,那么第 n+1 个问题回答的频率会变为之前的1/2,第 n+2 个问题回答的频率会变为之前的1/4,以此类推。这种惩罚机制旨在避免模型过度依赖之前的回答,影响后续问题的回答质量。

Presence penalty 是指在对话中,如果人工智能模型在一段时间内没有回答问题,那么后续问题回答的频率也会降低。具体来说,如果模型在一段时间内没有回答问题,那么第n个问题回答的频率会变为0,直到模型再次回答问题。这种惩罚机制旨在鼓励模型在对话中保持一定的活跃度,避免模型过长时间地保持沉默,影响后续问题的回答质量。

 

 

OpenAI Demo

修改 openai_api_demo/openai_api.py

修改模型文件地址

if __name__ == "__main__":

    model_path = "/root/.cache/modelscope/hub/ZhipuAI/chatglm3-6b"
    tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
    model = AutoModel.from_pretrained(model_path, trust_remote_code=True).cuda()

 

 

部署ChatGPT Next

docker pull yidadaa/chatgpt-next-web
docker run -d -p 3000:3000 yidadaa/chatgpt-next-web

 

ChatGPT Next 设置 - 选择自定义接口 - 接口地址 填写

 

 

 

 

综合Demo

 

conda create -n chatglm3-demo python=3.10
conda activate chatglm3-demo

#安装依赖
pip install -r requirements.txt

#使用 Code Interpreter 还需要安装 Jupyter 内核
ipython kernel install --name chatglm3-demo --user


#环境变量,指定模型文件地址
export MODEL_PATH=/path/to/model

#启动服务
streamlit run main.py

 

 

访问Demo

  • Chat: 对话模式,在此模式下可以与模型进行对话。
  • Tool: 工具模式,模型除了对话外,还可以通过工具进行其他操作。
  • Code Interpreter: 代码解释器模式,模型可以在一个 Jupyter 环境中执行代码并获取结果,以完成复杂任务。

 

对话模式

Chat (对话模式)不多介绍

 

具模式

在composite_demo目录中文件:tool_registry.py 中定义自己的工具方法。

官方提供了2个方法:get_weather (获取城市气候),random_number_generator(生成随机数)

 

 

如何自定义工具,同样在 tool_registry.py 填写自己的代码,通过文章ID 获取文章的标题!

@register_tool
def get_ruyonet(
    pid: Annotated[int, '输入文章ID', True],
) -> str:
    """ 
    通过文章ID获取文章内容
    """
    ret = ""
    import requests
    from bs4 import BeautifulSoup
    try:
        response = requests.get(f"https://51.RUYO.net/{pid}.html")
        if response.status_code == 200:
            soup = BeautifulSoup(response.content, 'html.parser')
            ret = soup.find('h1').text
    except:
        import traceback
        ret = "Error encountered while fetching ruyonet data!\n" + traceback.format_exc() 

    return str(ret)

 

重启服务后,测试一下!

 

 

 

 

代码解释器模式

个人测试感觉,只有像官方那样画爱心貌似还行。画个其他的貌似都不行。

 

 

运行监测

服务器显存正常运行在13G - 15G之间波动。

GPU利用率波动不大。

 

未完待续

业余时间一边体验功能,一边水文章。关于ChatGLM3微调,LangChain部分内容 还没有顺利体验完成,后续再水文章更新吧。

有童鞋问,弄这些有何用?其实作为一个新时代的农民工,要尽量跟具有革命意义的技术变革。不是所有人需要了解内部运行逻辑,但是对于 "农民工" 应该最起码需要知道怎么使用它。

有任何问题,大家可留言讨论!!

 

 

 

阅读剩余
THE END