GLM3出来的时候据说在中文方面表现的不错,这是升级版,除了对话功能之外,还多了工具的调用、文档的理解和图像识别等任务。最近因为最新网页版的通义千问升级了,不知道怎么回事,是不免费还是咋的,词的数量好像限制了,还有就是我梯子的原因有时候ChatGPT网页也访问不了,所以想着搞一个本地的模型用用。后面也会本地部署一下通义千问Qwen2,根据最新的评测,除了GPT4o、GPT4其他系列、Gemini之外就是它了,排第8。

我的安装的设备信息:

说明
系统 Ubuntu 20.04.1
存储 >100GB
Python 3.10
CUDA Version 11.8
GPU Driver 520.61.05
GPU NVIDIA 3090 1张(不配与A100为伍!跑不了多模态模型!)

具体的显存占用可以查看这里:设备和依赖检查

环境构建

1
2
3
4
5
6
7
8
9
10
11
12
# 创建conda环境
conda create -n ChatGLM4 python=3.10
conda activate ChatGLM4

# pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple modelscope==1.9.5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple "transformers>=4.37.0"
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple streamlit==1.24.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple sentencepiece==0.1.99
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple accelerate==0.24.1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple transformers_stream_generator==0.0.4
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tiktoken

安装的时候如果出现错误:ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device,一般是临时文件夹容量不够的问题,有两种可能解决方法:

方法1:设置TMPDIR的路径然后再安装(这个方法对我有用):

1
2
mkdir tmp
export TMPDIR=./tmp

方法2:在pip安装的后面添加一个--no-cache-dir

下载模型

首先新建一个文件夹,比如LocalLLMs:

1
2
3
4
5
# 文件夹名字你自己起
mkdir LocalLLMs
cd LocalLLMs
mkdir ChatGLM4
cd ChatGLM4

在下面新建一个python文件,比如download_model.py,里面写上这些代码:

1
2
3
4
5
6
7
# 使用国内魔搭社区下载,抱脸有时候下载速度不行
from modelscope import snapshot_download

# 这是对话模型
model_dir = snapshot_download("ZhipuAI/glm-4-9b-chat", cache_dir="./glm-4-9b-chat")
# 这是多模态模型(你可以选择不下载)
model_dir = snapshot_download("ZhipuAI/glm-4v-9b", cache_dir="./glm-4v-9b")

执行python download_model.py下载模型,是阿里做的社区,下载速度不错。这两个模型要占18G + 18G=36G存储。

下载完成之后,把模型的文件调整一下:

1
2
mv ./glm-4-9b-chat/ZhipuAI/glm-4-9b-chat/* ./glm-4-9b-chat
mv ./glm-4v-9b/ZhipuAI/glm-4v-9b/* ./glm-4v-9b

下载网页界面:

1
2
3
4
5
6
7
8
9
cd ChatGLM4

# git拉不下来就手动去下载zip,或者去https://ghproxy.com/ 加速一下
git clone https://github.com/THUDM/GLM-4.git

# 安装WebUI所需要的包
cd ./GLM-4/composite_demo/
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
ipython kernel install --name ChatGLM4 --user --display-name "ChatGLM4"

CUDA11.8的调整,因为我的CUDA版本是11.8,默认会装CUDA12的pytorch,我这里再装一下pytorch,如果你是CUDA12不用执行这一步:

1
2
3
# pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cu118
pip uninstall torch torchvision torchaudio
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

运行模型:

1
2
3
4
5
6
7
8
# 把刚才下载的模型的路径放到环境变量中
# 大语言模型
export CHAT_MODEL_PATH=~/ChatGLM4/glm-4-9b-chat
# 多模态模型
export VLM_MODEL_PATH=~/ChatGLM4/glm-4v-9b

# 执行WebUI
streamlit run src/main.py --server.address 0.0.0.0 --server.port 10000

在浏览器中输入http://服务器IP地址:10000打开网页。

WebUI界面

左侧是模型参数,右侧有3种模式,分别是:

  • All Tools:具有完整工具调用能力的对话模式,原生支持网页浏览、代码执行、图片生成,并支持自定义工具。
  • 文档解读:支持上传文档进行文档解读与对话。
  • 多模态:支持上传图像进行图像理解与对话。

其中前面两个模型用的是glm-4-9b-chat,多模态用的是glm-4-9b,在模式来回切换显存可能不足,需要重启。点击具体模式之后,模型才会被加载。我加载模型大约花费18G的显存,后续推理可能会达到22G。多模态模型3090不够用!

加载成功的命令行中是这样的:

1
2
3
4
5
6
  You can now view your Streamlit app in your browser.

URL: http://0.0.0.0:10000

Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
Loading checkpoint shards: 100%|██████████████████████████| 10/10 [00:26<00:00, 2.69s/it]

代码调用

如果你希望更加细节的去处理对话,可以使用下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

device = "cuda"

model_path = "~/ChatGLM4/glm-4-9b-chat"

tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)

query = "你好"

inputs = tokenizer.apply_chat_template([{"role": "user", "content": query}],
add_generation_prompt=True,
tokenize=True,
return_tensors="pt",
return_dict=True
)

inputs = inputs.to(device)
model = AutoModelForCausalLM.from_pretrained(
"THUDM/glm-4-9b-chat",
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True,
trust_remote_code=True
).to(device).eval()

gen_kwargs = {"max_length": 2500, "do_sample": True, "top_k": 1}
with torch.no_grad():
outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs[:, inputs['input_ids'].shape[1]:]
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

可以转换为API接口,方便其他程序调用:GLM-4-9B-chat FastApi 部署调用

chat模型vLLM

目前的chat模型支持vllm,可以尝试一下使用vllm加速推理:

1
2
3
4
# 我这里没有尝试,因为CUDA11.8安装vllm有点麻烦
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple vllm
# 关闭vLLM模式:export USE_VLLM=0
export USE_VLLM=1

然后再打开,我还没有尝试,不知道情况如何。

测试模型

文生图

本地模型似乎不调用cogview,好像是调用的在线的cogview,需要申请API的密钥。这里就不测试了。

对话

对话没有什么问题,感觉没有和通义千问聊的舒服。

文档解读

下载论文attention is all you need,选择文档解读模式,将PDF上传上去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
我:请总结一下这篇论文

GLM4:

这篇论文提出了 Transformer,一种基于注意力机制的序列到序列模型,在机器翻译和英语依存句法分析等任务上取得了显著的成果。

主要贡献:

Transformer 模型:完全基于注意力机制,无需循环或卷积,能够并行化训练,在机器翻译任务上达到当时最佳水平。
自注意力机制:通过自注意力机制,模型能够捕捉输入序列中不同位置之间的依赖关系,从而更好地理解句子结构。
多头注意力:多头注意力机制允许模型同时关注不同表示子空间中的信息,提高模型的性能。
位置编码:由于 Transformer 模型没有循环或卷积,需要引入位置编码来表示输入序列的顺序信息。
实验结果:在 WMT 2014 英语到德语和英语到法语翻译任务上,Transformer 模型取得了当时最佳水平,并且在英语依存句法分析任务上也取得了良好的结果。
模型结构:

Transformer 模型由编码器和解码器组成,都由多层相同的子层堆叠而成。每个子层包含两个子层:多头自注意力机制和位置前馈神经网络。

注意力机制:

缩放点积注意力:计算查询与所有键的点积,然后通过 softmax 函数得到权重,并计算加权求和的值。
多头注意力:将查询、键和值分别投影到不同的维度,并行执行多个注意力函数,然后将结果拼接起来。
实验结果:

在 WMT 2014 英语到德语翻译任务上,Transformer 模型取得了 28.4 BLEU 分数,优于当时所有模型,包括集成模型。
在 WMT 2014 英语到法语翻译任务上,Transformer 模型取得了 41.8 BLEU 分数,创造了当时最佳水平。
在英语依存句法分析任务上,Transformer 模型取得了与 RNN 模型相当的性能。
总结:

Transformer 模型是自然语言处理领域的一个重要里程碑,它推动了机器翻译和序列到序列模型的发展。由于其强大的并行化能力和优异的性能,Transformer 模型在许多其他领域也取得了成功。

用kimi总结一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
这篇论文是关于一种新型神经网络架构——Transformer的介绍。Transformer完全基于注意力机制,不再依赖于传统的循环神经网络(RNN)或卷积神经网络(CNN)。以下是对论文内容的总结:

背景与动机:传统的序列转换模型,如语言建模和机器翻译,通常基于RNN和LSTM等,存在计算上的局限性,因为它们是序列化的,难以并行化处理。注意力机制已被证明在序列建模中非常有效,但通常与RNN结合使用。

Transformer架构:作者提出了一种新的网络架构,完全基于注意力机制,不使用递归和卷积。这种架构可以更有效地进行并行计算,并且训练时间更短。

主要贡献:

提出了一种新的注意力机制,称为“Scaled Dot-Product Attention”,用于计算查询(query)、键(key)和值(value)之间的关系。
引入了“Multi-Head Attention”,允许模型在不同位置的不同表示子空间中联合关注信息。
设计了一种“Positional Encoding”方法,使得模型能够理解序列中单词的相对位置信息。
实验结果:在WMT 2014英德和英法机器翻译任务上,Transformer模型取得了优于现有最佳结果的性能,BLEU分数分别达到了28.4和41.8。

模型细节:

编码器(Encoder)和解码器(Decoder)都由多层相同的堆叠层组成,每层包含多头自注意力机制和逐位置的全连接前馈网络。
采用了残差连接和层归一化来提高模型的稳定性和性能。
训练细节:使用了Adam优化器,并采用了一种特定的学习率调度策略。此外,还使用了标签平滑和残差dropout作为正则化手段。

泛化能力:Transformer不仅在机器翻译任务上表现出色,还在英语成分句法分析任务上取得了良好的结果,证明了其泛化能力。

结论:Transformer模型展示了基于注意力的模型在序列转换任务上的潜力,并且由于其高效的并行化能力,训练速度更快。作者对未来将Transformer应用于其他任务和其他模态(如图像、音频和视频)持乐观态度。

代码:论文提供了训练和评估模型的代码链接。

论文的附录部分还包含了对注意力机制的可视化分析,展示了模型是如何捕捉到句子中不同位置之间的关系的。

可以能用,感觉不如kimi。

图片理解

3090用不了,爆显存了。

根据别人的测试要比Llama-3-8B慢很多。

参考