目录
新鲜出炉,国产 GPT 版本迭代更新啦~清华团队刚刚发布ChatGLM3,恰逢云栖大会前百川也发布Baichuan2-192K,一时间掀起的国产AI大模型又一阵热浪来袭。
随着两个公司融资到位,国内大模型研究和开源活动,进展更加如火如荼。目前有越来越多的公司和研究机构开始将他们的大模型开源,国内比较知名的就有阿里巴巴的通义大模型系列、华为的盘古大模型系列、腾讯的混元大模型系列等多家。但由于这些开源的大模型具有极高的参数量和计算量,需要大量的数据和算力支持,所以只有少数的大型科技公司和研究机构能够开发和维护这些大模型。
当然,大模型如何在小显存部署和使用也是非常重要,让AI的价值应用并延伸到更广泛的领域。本实战专栏继续关注小而美的大模型,将评估一系列的开源模型,尤其关注国产大模型,重点在于可私有化、轻量化部署,比如推理所需的GPU资源控制在24G显存内,2张Titan XP,或1080 Ti。
一、ChatGLM3 模型
10 月 27 日,智谱 AI 在 2023 中国计算机大会(CNCC)上发布自研第三代对话大模型 ChatGLM3,这是智谱 AI 在今年内第三次发布 ChatGLM 基座模型。智谱 AI 宣布为了进一步推动开源生态,将对包括 ChatGLM3-6B、ChatGLM3-6B-32K 以及 CogVLM-17B 和 AgentLM 在内的多个模型进行开源。
ChatGLM3-6B 是开源中英双语对话模型 ChatGLM-6B 的第三代版本,一经推出就迅速受到行业内的关注。基于最新的高效动态推理和显存优化技术,ChatGLM3-6B 依然是:
-
更强大:与 ChatGLM 二代模型相比,ChatGLM3 在 44 个中英文公开数据集测试中表现优异,在国内同尺寸模型中排名首位。评测结果显示,ChatGLM3 在 MMLU、CEval、GSM8K 和 BBH 等基准测试中均取得了显著的性能提升,分别提升了 36%、33%、179% 和 126%。得益于其独创的多阶段增强预训练方法,以及更丰富的训练数据以及更优的训练方案。
-
更完整: ChatGLM3-6B 采用了全新设计的 Prompt 格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
-
更高效:ChatGLM3 还可手机部署的端侧模型 ChatGLM3-1.5B 和 3B,支持包括 vivo、小米、三星在内的多种手机以及车载平台,甚至支持移动平台上 CPU 芯片的推理,速度可达 20tokens/s。在精度方面,1.5B 和 3B 模型在公开 benchmark 上与 ChatGLM2-6B 模型性能接近。这一创新为自然语言处理应用在移动设备上的部署提供了便捷的方式,进一步拓展了自然语言处理技术的应用范围。
ChatGLM3 的语义和逻辑等各方面能力都得到大大增强:
-
最引人注目的就是多模态理解能力的 CogVLM- 看图识语义功能,该功能在 10 余个国际标准图文评测数据集上取得 SOTA。
-
代码增强模块 Code Interpreter 根据用户需求生成代码并执行,自动完成数据分析、文件处理等复杂任务;
-
网络搜索增强 WebGLM- 接入搜索增强,能自动根据问题在互联网上查找相关资料并在回答时提供参考相关文献或文章链接。
-
ChatGLM3 目前已经具有了全新的 Agent 智能体能力,其集成了自研的 AgentTuning 技术,激活了模型智能代理能力。
-
在智能规划和执行方面,ChatGLM3 相比 ChatGLM 二代提升了 1000%,这一技术开启了一种全新的模型智能体能力,使 ChatGLM3 能够在更多复杂场景中发挥出色表现。例如,ChatGLM3 能够原生支持工具调用、代码执行、游戏、数据库操作、知识图谱搜索与推理以及操作系统等复杂场景。
-
CogVLM 模型则提高了智谱清言的中文图文理解能力,取得了接近 GPT-4V 的图片理解能力。它可以回答各种类型的视觉问题,并且可以完成复杂的目标检测,并打上标签,完成自动数据标注。
-
具有搜索增强能力,它可以帮助用户整理出相关问题的网上文献或文章链接,并整理出答案,这意味着智谱清言将为用户提供更好的自然语言处理服务。
ChatGLM在国产芯片支持方面也做了很多工作,自 2022 年初,ChatGLM 系列模型已支持在昇腾、神威超算、海光 DCU 架构上进行大规模预训练和推理,截至目前已支持 10 余种国产硬件生态,包括昇腾、神威超算、海光 DCU、海飞科、沐曦曦云、算能科技、天数智芯、寒武纪、摩尔线程、百度昆仑芯、灵汐科技、长城超云等。通过与国产芯片企业的联合创新,ChatGLM 系列模型性能不断优化,国产硬件生态也得到了大模型国产化的闭环。
二、资源需求
代码下载链接:
Github地址 git clone https://github.com/THUDM/ChatGLM3
模型文件类型及获取
ChatGLM3的6B中英对话模型,两个分为6B,6B-Base, 上下文长度8K。
ChatGLM3的6B-32k,上下文长度32K。
一共3种类型,可根据自身情况选择。模型获取途径见表格。
Model | Seq Length | Download |
---|---|---|
ChatGLM3-6B | 8k | HuggingFace | ModelScope |
ChatGLM3-6B-Base | 8k | HuggingFace | ModelScope |
ChatGLM3-6B-32K | 32k | HuggingFace | ModelScope |
推理的GPU资源要求
简单测试样例的实际测试数据
量化等级 | 生成 8192 长度的最小显存 |
---|---|
FP16 | 15.9 GB |
INT8 | 11.1 GB |
INT4 | 8.5 GB |
对 ChatGLM3 进行加速的开源项目:
chatglm.cpp: 类似 llama.cpp 的量化加速推理方案,实现笔记本上实时对话
三、部署安装
配置环境
项目在本地普通设备,部署非量化版本。
显卡双显卡Nivdia Titan XP,每块12G, 共24G显卡
操作系统:ubuntu 20.04
python 3.10版本,推荐3.8以上版本
pytorch 2.01,推荐2.0及以上版本。
CUDA 12.0,驱动525,建议使用11.4及以上版本。
安装过程
创建虚拟环境
conda create -n chatglm3 python==3.10.6 -y
conda activate chatglm3
安装ChatGLM3 依赖配套软件
git clone https://github.com/THUDM/ChatGLM3
cd ChatGLM3
pip install -r requirements.txt -i https://mirror.sjtu.edu.cn/pypi/web/simple
其中 transformers
库版本推荐为 4.30.2
,torch
推荐使用 2.0 及以上的版本,以获得最佳的推理性能。
下载模型文件
推理所需的模型权重、源码、配置已发布在ModleScope 和 Hugging Face,见上面的下载链接。
代码会由 transformers
自动下载模型实现和参数。完整的模型实现在 Hugging Face Hub。
另外,模型权重比较大,如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。国外网络不佳的,建议从国内的ModelScope下载,或者清华云下载手动下载。并将下载的文件替换到本地的 THUDM/ChatGLM3
目录下。加载本地模型时需要修改为模型的本地目录,如将以上代码中的 THUDM/ChatGLM3
替换为你本地的 ChatGLM3
文件夹的路径,即可从本地加载模型。
低成本配置部署方案
量化模型加载
默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 16 GB 显存。
如果显存不足:
torch.cuda.OutOfMemoryError: CUDA out of memory.
如果 GPU 显存有限,可以尝试以量化方式加载模型,如INT8量化,使用方法如下:
model = AutoModel.from_pretrained("THUDM/chatglm3-6b",load_in_8bit=True,trust_remote_code=True).cuda()
模型量化会带来一定的性能损失,经过测试,ChatGLM2-6B 在 8-bit 量化下仍然能够进行自然流畅的生成。
多卡部署加载
如果有多张 GPU,但是每张 GPU 的显存大小都不足以容纳完整的模型,那么可以将模型切分在多张GPU上。首先安装 accelerate: pip install accelerate
,然后通过如下方法加载模型:
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm3-6b", num_gpus=2)
即可将模型部署到两张 GPU 上进行推理。你可以将 num_gpus
改为你希望使用的 GPU 数。默认是均匀切分的,你也可以传入 device_map
参数来自己指定。
CPU部署
如果没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存,及以上的内存)
model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).float()
如果内存不足的话,也可以使用量化后的模型
model = AutoModel.from_pretrained("THUDM/chatglm2-6b",load_in_8bit=True,trust_remote_code=True).float()
对 ChatGLM3 进行加速的开源项目:
chatglm.cpp: 类似 llama.cpp 的量化加速推理方案,实现笔记本上实时对话
在 cpu 上运行量化后的模型需要安装 gcc
与 openmp
。多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选 openmp
。 Windows 测试环境 gcc
版本为 TDM-GCC 10.3.0
, Linux 为 gcc 11.3.0
。
四、启动 ChatGLM3
命令行对话界面
python cli_demo.py
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear
可以清空对话历史,输入 stop
终止程序。
网页demo
python web_demo.py
可以通过命令启动基于 Gradio 的网页版 demo,会在本地启动一个 web 服务,把控制台给出的地址放入浏览器即可访问。
还可以通过以下命令启动基于 Streamlit 的网页版 demo:
streamlit run web_demo2.py
网页版 demo 会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。 经测试,基于 Streamlit 的网页版 Demo 会更流畅。
API 部署
实现的 OpenAI 格式的流式 API 部署,可以作为任意基于 ChatGPT 的应用的后端。可以通过运行仓库中的openai_api.py 进行部署:
python openai_api.py
进行 API 调用的示例代码为
import openai
if __name__ == "__main__":
openai.api_base = "http://localhost:8000/v1"
openai.api_key = "none"
for chunk in openai.ChatCompletion.create(
model="chatglm3-6b",
messages=[
{"role": "user", "content": "你好"}
],
stream=True
):
if hasattr(chunk.choices[0].delta, "content"):
print(chunk.choices[0].delta.content, end="", flush=True)
五、功能测试
认识自己问题:你是谁
User: 你好 ChatGLM: 你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。 User: 欧洲有哪些好玩的地方 ChatGLM: 欧洲地域辽阔,有很多好玩的地方。以下是一些建议你参观的欧洲旅游景点: 1. 法国:巴黎、艾菲尔铁塔、卢浮宫、里昂、马赛、香槟酒产区等。 2. 意大利:罗马、古罗马斗兽场、梵蒂冈、佛罗伦萨、威尼斯、那不勒斯等。 3. 英国:伦敦、大本钟、伦敦塔桥、泰晤士河、曼彻斯特、爱丁堡等。 4. 德国:柏林、柏林墙、柏林大教堂、科隆、慕尼黑等。 5. 西班牙:巴塞罗那、塞纳河、加泰罗尼亚平原、马德里、格拉纳达等。 6. 葡萄牙:里斯本、 Belem 热空气城堡、辛特拉等。 7. 荷兰:阿姆斯特丹、风车、哈莱姆、阿姆斯特丹市中心的运河等。 8. 挪威:奥斯陆、布里特维克、特罗姆瑟、尼德罗得等。 9. 瑞典:斯德哥尔摩、卡罗林斯卡AI、瑞典哥德堡等。 10. 芬兰:赫尔辛基、北极圈、芬兰湖、凯米等地。 以上只是欧洲众多旅游景点中的一部分,你还可以根据自己的兴趣和时间来选择其他地方进行旅行。 User: 查查巴黎的天气怎么样 ChatGLM: 我无法实时查询天气,建议你查询当地的天气预报或者使用天气应用来获取最新的巴黎天气信息。 |
欣赏一下,让不同量化程度的ChatGLM写诗,看看各自能力如何
默认版本写的诗歌
默认,不加量化参数。
User: 帮忙写一篇散文诗,主题为扎根,终有一天,我们会变成参天大树 ChatGLM: 扎根大地,汲取营养, 在岁月的洗礼中,我们成长。 从嫩芽到枝干,从细弱到坚韧, 我们慢慢变成一棵参天大树。 我们的根深植土壤, 脉络纵横,吸收大地的养分。 我们的枝叶繁茂, 绿意盎然,为大地增添色彩。 风雨来了,我们挺住, 地震来了,我们屹立不倒。 我们就像一座山, 坚定地站立着,支撑着大地的重量。 终有一天,我们会变成参天大树, 我们的枝干粗壮,叶茂根深。 我们会成为大地的守护者, 为我们所热爱的土地提供庇护。 扎根,是一种信仰, 是一种坚持,是一种责任。 我们会不断地成长, 在时间的流逝中,变得更为坚定。 终有一天,我们会变成参天大树, 我们的影响力和价值, 将会被后人所铭记。 我们将永远根植于大地, 为大地带来生命的希望。
BF16量化版本
User: 帮忙写一篇散文诗,主题为扎根,终有一天,我们会变成参天大树 ChatGLM: 扎根大地,汲取养分, 岁月沧桑,时光荏苒, 我们的身躯,逐渐茁壮, 如同大地反抗风沙,顽强生命。 从小到大,我们陪伴着成长, 从嫩芽到枝干,从童真到成熟, 在生活的风雨中,我们坚毅前行, 无论多艰难,我们从不屈服。 终有一天,我们将变成参天大树, 我们的根系,深入土壤, 我们的枝叶,繁茂昌盛, 我们的力量,支持天空。 我们会陪伴着下一代成长, 我们的种子,传承着希望, 我们的根,始终扎根在大地, 我们的魂,始终连接着天空。 扎根,是一种信仰,是一种坚持, 是一种力量,是一种勇气, 我们会变成参天大树,坚定而伟岸, 我们的生命,将永远扎根在大地。
INT8量化版本写的诗**
User: 帮忙写一篇散文诗,主题为扎根,终有一天,我们会变成参天大树 ChatGLM: 扎根大地,汲取营养, 在岁月的长河里,我们成长。 从小到大,我们经历风雨, 从未退缩,从未畏惧,因为我们知道, 终有一天,我们会变成参天大树。 我们的根深扎大地, 吸收着阳光和雨露, 在肥沃的土壤里,茁壮成长。 我们努力地生长, 直到长成直冲云霄的大树, 为大地增添一抹绿色的生机。 参天大树,我们不仅仅是自然的奇迹, 更是生命的伟大见证。 我们的根深扎大地, 承载着无数的故事和希望, 如同大地的守护者, 永远屹立不倒。 我们会变成参天大树, 为我们所热爱的土地, 为我们所珍视的生活, 为我们所奋斗的目标, 提供坚定的支持和庇护。 终有一天,我们会变成参天大树, 成为大地上最耀眼的风景, 我们的根,我们的枝, 将共同构建一个美好的未来。
INT4版本写的诗
User: 帮忙写一篇散文诗,主题为扎根,终有一天,我们会变成参天大树 ChatGLM: 扎根 deep in the earth, 我们的根系 strong and steady. 像一棵大树,我们也要成长, 枝繁叶茂,成为栋梁之材。 在生活的土壤中,我们吸收营养, 在岁月的阳光里,我们茁壮成长。 风雨中,我们坚定地立定脚跟, 无论多高的天空,我们都能触及。 我们的根系,深入大地的深处, 吸收着生命的养分,一天天茁壮。 终有一天,我们会变成参天大树, 为这个世界,为人类,提供庇护和支撑。 像一棵大树,我们也要成长, 成为生活的见证,成为美好的象征。 我们的根系,深入大地的深处, 吸收着生命的养分,一天天茁壮。 终有一天,我们会变成参天大树, 为这个世界,为人类,提供庇护和支撑。
写诗可能还是比较简单,但也可以看出来量化后句子语义失真的情况
你喜欢哪个版本诗歌呢?喜欢打 1,不喜欢 打2
觉得有用 点个赞 + 收藏 吧
End
专栏文章:
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)