当前位置: 首页 > article >正文

【ChatGLM3】第三代大语言模型多GPU部署指南

关于ChatGLM3

ChatGLM3智谱AI清华大学KEG实验室联合发布的新一代对话预训练模型。在第二代ChatGLM的基础之上,

  • 更强大的基础模型: 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。以上所有权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。

关于部署前的准备

  • 可以参考两篇文章
    • 如果有GPU资源,可以参考【ChatGLM2-6B】从0到1部署GPU版本
    • 如果只有CPU服务器,可以参考【ChatGLM2-6B】在只有CPU的Linux服务器上进行部署
  • 本文主要针对ChatGLM第三代模型ChatGLM3-6B进行部署,假设你已经成功部署过ChatGLM系列其它版本

ChatGLM3模型开源列表

模型介绍上下文token数
ChatGLM3-6B第三代 ChatGLM 对话模型。ChatGLM3-6B 采用了全新设计的 Prompt 格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。8K
ChatGLM3-6B-base第三代ChatGLM基座模型。ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示,ChatGLM3-6B-Base 具有在 10B 以下的基础模型中最强的性能。8K
ChatGLM3-6B-32k第三代ChatGLM长上下文对话模型。在ChatGLM3-6B的基础上进一步强化了对于长文本的理解能力,能够更好的处理最多32K长度的上下文。32K

本文以ChatGLM3-6B-base为例进行部署,因为作者想体验长文本处理的效果

创建Python虚拟环境

  • conda创建虚拟环境: conda create --name ChatGLM3 python=3.10.6 -y
  • –name 后面ChatGLM3为创建的虚拟环境名称
  • python=之后输入自己想要的python版本
  • -y表示后面的请求全部为yes,这样就不用自己每次手动输入yes了。
  • 激活虚拟环境: conda activate ChatGLM3

下载ChatGLM3代码仓库

git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3
# 使用 pip 安装依赖
pip install -r requirements.txt

下载模型

使用git命令下载

# 在ChatGLM3目录下创建THUDM,把模型文件放在THUDM目录里面
mkdir THUDM
cd THUDM
git lfs install
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b-32k.git
# 也可以根据自己的需要下载其它模型
#git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b-base.git
#git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

主要是其中的7个模型文件,比较大,下载时间稍长,约12G

  1.4K Dec  6 15:36 config.json
  2.4K Dec  6 15:36 configuration_chatglm.py
    40 Dec  6 15:36 configuration.json
   55K Dec  6 15:36 modeling_chatglm.py
  4.1K Dec  6 15:36 MODEL_LICENSE
  1.8G Dec  6 15:38 pytorch_model-00001-of-00007.bin
  1.9G Dec  6 15:41 pytorch_model-00002-of-00007.bin
  1.8G Dec  6 15:44 pytorch_model-00003-of-00007.bin
  1.7G Dec  6 15:47 pytorch_model-00004-of-00007.bin
  1.9G Dec  6 15:50 pytorch_model-00005-of-00007.bin
  1.8G Dec  6 15:52 pytorch_model-00006-of-00007.bin
 1005M Dec  6 15:54 pytorch_model-00007-of-00007.bin
   20K Dec  6 15:54 pytorch_model.bin.index.json
   15K Dec  6 15:54 quantization.py
  5.0K Dec  6 15:36 README.md
   12K Dec  6 15:54 tokenization_chatglm.py
   244 Dec  6 15:54 tokenizer_config.json
  995K Dec  6 15:54 tokenizer.model

修改脚本

分别以web端浏览器访问和API访问两种最常用的场景进行脚本修改

浏览器访问脚本修改

  • 复制一份web_demo2.pyChatGLM3目录
cp basic_demo/web_demo2.py ./web_demo2_32k.py
  • 修改MODEL_PATH路径
# 尽量使用绝对路径,这样可以避从Huggingface下载模型
MODEL_PATH = os.environ.get('MODEL_PATH', '/ChatGLM3/THUDM/chatglm3-6b-32k')
  • 使用2GPU加载模型
@st.cache_resource
def get_model():
    tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
    # if 'cuda' in DEVICE:  # AMD, NVIDIA GPU can use Half Precision
    #     model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).to(DEVICE).eval()
    # else:  # CPU, Intel GPU and other GPU can use Float16 Precision Only
    #     model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).float().to(DEVICE).eval()

    # 多显卡支持,使用下面两行代替上面一行,将num_gpus改为你实际的显卡数量
    import sys
    sys.path.append('./openai_api_demo')
    from utils import load_model_on_gpus
    model = load_model_on_gpus(MODEL_PATH, num_gpus=2)

    return tokenizer, model
  • 修改默认最大token数
# 设置max_length、top_p和temperature
max_length = st.sidebar.slider("max_length", 0, 32768, 32768, step=1)
  • 启动大模型服务
# 后台方式运行,退出终端后服务不会停止运行
nohup streamlit run web_demo2_32k.py &
  • 浏览器访问效果截图
    在这里插入图片描述

在这里插入图片描述

API访问脚本修改

  • 复制一份openai_api_demo/openai_api.pyChatGLM3目录
cp openai_api_demo/openai_api.py ./openai_api_32k.py
  • 修改导入包路径
import sys
sys.path.append('./openai_api_demo')
from utils import process_response, generate_chatglm3, generate_stream_chatglm3
  • 修改MODEL_PATH路径
# 尽量使用绝对路径,这样可以避从Huggingface下载模型
MODEL_PATH = os.environ.get('MODEL_PATH', '/ChatGLM3/THUDM/chatglm3-6b-32k')
  • 使用2GPU加载模型
if __name__ == "__main__":

    tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
    if 'cuda' in DEVICE:  # AMD, NVIDIA GPU can use Half Precision
        #model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).to(DEVICE).eval()

        # Multi-GPU support, use the following two lines instead of the above line, num gpus to your actual number of graphics cards
        import sys
        sys.path.append('./openai_api_demo')
        from utils import load_model_on_gpus
        model = load_model_on_gpus(MODEL_PATH, num_gpus=2)

    else:  # CPU, Intel GPU and other GPU can use Float16 Precision Only
        model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).float().to(DEVICE).eval()
    uvicorn.run(app, host='0.0.0.0', port=8000, workers=1)
  • 启动大模型服务
# 后台方式运行,退出终端后服务不会停止运行
nohup python openai_api_32k.py &
  • API访问测试
curl -X POST "http://127.0.0.1:8000/v1/chat/completions" \
-H "Content-Type: application/json" \
-d "{\"model\": \"chatglm3-6b\", \"messages\": [{\"role\": \"system\", \"content\": \"You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.\"}, {\"role\": \"user\", \"content\": \"你好,给我讲一个故事,大概100字\"}], \"stream\": false, \"max_tokens\": 100, \"temperature\": 0.8, \"top_p\": 0.8}"

大模型响应示例

{"model":"chatglm3-6b","object":"chat.completion","choices":[{"index":0,"message":{"role":"assistant","content":"有一天,在一个遥远的王国里,有一个勇敢的年轻人名叫杰克。他听说王国里有一座神秘的城堡,里面藏着传说中的宝藏。于是,杰克带着他的忠实伙伴——一只忠诚的狗一起踏上了寻找宝藏的旅程。\n\n他们跋山涉水,历经千辛万苦,终于来到了那座城堡。城堡的大门紧闭,门前还有一条恶龙在守护着。杰克并没有退缩,他知道这是他实现梦想的机会。","name":null,"function_call":null},"finish_reason":"stop"}],"created":1702003224,"usage":{"prompt_tokens":54,"total_tokens":154,"completion_tokens":100}}

总结

  • 经过测试对比,ChatGLM3ChatGLM2强大了很多很多,可以在一定程度上满足商用
  • ChatGLM系列大模型的迭代速度还是比较快的,可以感受到研究人员的努力
  • 一款优秀的具有自主知识产权的国产大模型,数据安全有保障,有活跃的社区,有越来越丰富的文档资料
  • 希望ChatGLM可以早日超越ChatGPT

http://www.kler.cn/a/163043.html

相关文章:

  • idea的mapper.xml文件里写sql语句出现Tag name expected错误提示
  • 谷歌浏览器的自动翻译功能如何开启
  • 《重学Java设计模式》之 原型模式
  • 华为网络设备这些“危险命令”,切记不能瞎操作!
  • Rust 中的 match 基本用法
  • 一篇Spring Boot 笔记
  • node14升级node16之后无法启动处理
  • Java编程中通用的正则表达式(二)
  • idea__SpringBoot微服务05——JSR303校验(新注解)(新的依赖),配置文件优先级,多环境切换
  • Mysql 命令行导出SQL文件和导入文件
  • mybatisplus手动获取数据源执行非主数据库事务
  • sql行转列
  • java-两个列表进行比较,判断那些是需要新增的、删除的、和更新的
  • 线性回归与逻辑回归:深入解析机器学习的基石模型
  • LinuxBasicsForHackers笔记 -- 日志系统
  • AGM CPLD 应用指南
  • 《每天一个Linux命令》 -- (5)通过sshkey密钥登录服务器
  • Could not resolve all dependencies for configuration ‘:app:androidApis‘.
  • Amazon CodeWhisperer 开箱初体验
  • JAVA程序如何打jar和war问题解决
  • CentOS系统装机流程
  • 【场景测试用例】上传文件
  • 【数据开发】Hive 多表join中的条件过滤与指定分区
  • ReactNative性能优化实践
  • Azure云WAF服务的CRS规则和DRS规则区别
  • 大数据技术3:数据仓库的ETL和分层模型