
 智谱AI引领技术前沿,推出了新一代预训练模型GLM-4系列,其中的GLM-4-9B作为开源版本,展现了其在人工智能领域的深厚实力。在语义理解、数学运算、逻辑推理、代码编写以及广泛知识领域的数据集测评中,GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均以超越Llama-3-8B的优异表现,证明了其卓越的性能。
GLM-4-9B-Chat不仅擅长进行流畅的多轮对话,还集成了网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大128K上下文)等高级功能,极大地扩展了其应用场景。此外,本代模型在语言支持上迈出了重要一步,现已支持包括日语、韩语、德语在内的26种语言,进一步促进了全球范围内的语言交流与技术融合。
为了满足不同用户的需求,智谱AI还推出了支持1M上下文长度(约200万中文字符)的GLM-4-9B-Chat-1M模型,以及基于GLM-4-9B的多模态模型GLM-4V-9B。GLM-4V-9B在1120 * 1120的高分辨率下,展现了其中英双语多轮对话的强大能力。在中英文综合能力、感知推理、文字识别、图表理解等多模态评测中,GLM-4V-9B的表现超越了GPT-4-turbo-2024-04-09、Gemini 1.0 Pro、Qwen-VL-Max和Claude 3 Opus等同类模型。
GLM结构
GLM(General Language Modeling)是一种自然语言处理模型,用于理解和生成人类语言。GLM的架构包括多个层次,每个层次都扮演着重要的角色。下面是GLM框架和模型的详细解释:
- 输入层:输入层负责将文本数据转换为模型可以理解的格式。首先,使用Tokenizer将输入的文本序列转换为字或词标记的序列。然后,将这些词标记转换为对应的ID,即Input_ids。
- Embedding层:Embedding层将每个ID映射到一个固定维度的向量。这样,每个文本序列都被转换为一个向量序列,作为模型的初始输入表示。
- GLMBlock28(或GLM4-9B-Chat的GLMBlock40):这是GLM模型的核心部分,由多个GLMBlock组成。每个GLMBlock包含两个主要部分:Self-Attention和Feed-Forward Network (MLP)。 
  -  Self-Attention:在Self-Attention部分,输入首先通过Q、K、V矩阵映射。然后,引入Rotary Position Embedding(RoPE)以更好地学习词之间的位置信息。接着,进行注意力计算,并将输出线性变换为与输入相同的维度。最后,使用残差连接网络(Residual Connection)、Dropout和RMSNorm等方法来防止过拟合。 
-  Feed-Forward Network (MLP):在MLP部分,输入通过两层全连接变换,最多扩展到13696维度。使用Swiglu激活函数代替传统的Relu激活函数。与Self-Attention的输出类似,MLP的输出也引入了Dropout和RMSNorm方法。 
 
-  
- RMSNorm层:在GLM模型中,使用RMSNorm(均方根标准化)代替传统的LayerNorm(层标准化)。RMSNorm具有加速训练和改善模型泛化能力的效果。
- 输出层:输出层负责将模型的最终输出转换回文本格式。首先,将embedding转换回字词编码。然后,使用解码器将这些编码转换为人类可读的文本。
- 残差连接网络(Residual Connection):残差连接网络是一种在深度学习中常用的技巧。它在神经网络的层与层之间添加一个直接的连接,允许输入信号无损地传递到较深的层。这样设计的目的是为了缓解梯度消失和梯度爆炸问题,同时促进梯度在深层网络中的流畅传播,使得训练更高效,模型更容易学习复杂的特征。
- 旋转位置编码(Rotary Position Embedding,RoPE):RoPE是一种位置编码方法,用于更好地学习词之间的位置信息。它被广泛应用于各种NLP模型中,如Qwen、LLaMA等。
GLM-4V模型
ChatGLMForConditionalGeneration(
  (transformer): ChatGLMModel(
    (embedding): Embedding(
      (word_embeddings): Embedding(151552, 4096)
    )
    (rotary_pos_emb): RotaryEmbedding()
    (encoder): GLMTransformer(
      (layers): ModuleList(
        (0-39): 40 x GLMBlock(
          (input_layernorm): RMSNorm()
          (self_attention): SelfAttention(
            (query_key_value): Linear(in_features=4096, out_features=4608, bias=True)
            (core_attention): CoreAttention(
              (attention_dropout): Dropout(p=0.0, inplace=False)
            )
            (dense): Linear(in_features=4096, out_features=4096, bias=False)
          )
          (post_attention_layernorm): RMSNorm()
          (mlp): MLP(
            (dense_h_to_4h): Linear(in_features=4096, out_features=27392, bias=False)
            (dense_4h_to_h): Linear(in_features=13696, out_features=4096, bias=False)
          )
        )
      )
      (final_layernorm): RMSNorm()
    )
    (output_layer): Linear(in_features=4096, out_features=151552, bias=False)
    (vision): EVA2CLIPModel(
      (patch_embedding): PatchEmbedding(
        (proj): Conv2d(3, 1792, kernel_size=(14, 14), stride=(14, 14))
        (position_embedding): Embedding(6401, 1792)
      )
      (transformer): Transformer(
        (layers): ModuleList(
          (0-62): 63 x TransformerLayer(
            (input_layernorm): LayerNorm((1792,), eps=1e-06, elementwise_affine=True)
            (attention): Attention(
              (query_key_value): Linear(in_features=1792, out_features=5376, bias=True)
              (dense): Linear(in_features=1792, out_features=1792, bias=True)
              (output_dropout): Dropout(p=0.0, inplace=False)
            )
            (mlp): MLP(
              (activation_fn): GELUActivation()
              (fc1): Linear(in_features=1792, out_features=15360, bias=True)
              (fc2): Linear(in_features=15360, out_features=1792, bias=True)
            )
            (post_attention_layernorm): LayerNorm((1792,), eps=1e-06, elementwise_affine=True)
          )
        )
      )
      (linear_proj): GLU(
        (linear_proj): Linear(in_features=4096, out_features=4096, bias=False)
        (norm1): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
        (act1): GELU(approximate='none')
        (dense_h_to_4h): Linear(in_features=4096, out_features=13696, bias=False)
        (gate_proj): Linear(in_features=4096, out_features=13696, bias=False)
        (dense_4h_to_h): Linear(in_features=13696, out_features=4096, bias=False)
      )
      (conv): Conv2d(1792, 4096, kernel_size=(2, 2), stride=(2, 2))
    )
  )
)
GLM-4V-9B硬件要求

 最低硬件要求
 如果您希望运行官方提供的最基础代码 (transformers 后端) 您需要:
- Python >= 3.10
- 内存不少于 32 GB
如果您希望运行官方提供的本文件夹的所有代码,您还需要:
- Linux 操作系统 (Debian 系列最佳)
- 大于 8GB 显存的,支持 CUDA 或者 ROCM 并且支持 BF16 推理的 GPU 设备。(FP16 精度无法训练,推理有小概率出现问题)
多模态能力
GLM-4V-9B 是一个多模态语言模型,具备视觉理解能力,其相关经典任务的评测结果如下:
| MMBench-EN-Test | MMBench-CN-Test | SEEDBench_IMG | MMStar | MMMU | MME | HallusionBench | AI2D | OCRBench | |
|---|---|---|---|---|---|---|---|---|---|
| gpt-4o-2024-05-13 | 83.4 | 82.1 | 77.1 | 63.9 | 69.2 | 2310.3 | 55.0 | 84.6 | 736 | 
| gpt-4-turbo-2024-04-09 | 81.0 | 80.2 | 73.0 | 56.0 | 61.7 | 2070.2 | 43.9 | 78.6 | 656 | 
| gpt-4-1106-preview | 77.0 | 74.4 | 72.3 | 49.7 | 53.8 | 1771.5 | 46.5 | 75.9 | 516 | 
| InternVL-Chat-V1.5 | 82.3 | 80.7 | 75.2 | 57.1 | 46.8 | 2189.6 | 47.4 | 80.6 | 720 | 
| LLaVA-Next-Yi-34B | 81.1 | 79.0 | 75.7 | 51.6 | 48.8 | 2050.2 | 34.8 | 78.9 | 574 | 
| Step-1V | 80.7 | 79.9 | 70.3 | 50.0 | 49.9 | 2206.4 | 48.4 | 79.2 | 625 | 
| MiniCPM-Llama3-V2.5 | 77.6 | 73.8 | 72.3 | 51.8 | 45.8 | 2024.6 | 42.4 | 78.4 | 725 | 
| Qwen-VL-Max | 77.6 | 75.7 | 72.7 | 49.5 | 52.0 | 2281.7 | 41.2 | 75.7 | 684 | 
| Gemini 1.0 Pro | 73.6 | 74.3 | 70.7 | 38.6 | 49.0 | 2148.9 | 45.7 | 72.9 | 680 | 
| Claude 3 Opus | 63.3 | 59.2 | 64.0 | 45.7 | 54.9 | 1586.8 | 37.8 | 70.6 | 694 | 
| GLM-4V-9B | 81.1 | 79.4 | 76.8 | 58.7 | 47.2 | 2163.8 | 46.6 | 81.1 | 786 | 
import torch
from PIL import Image
from transformers import AutoModelForCausalLM, AutoTokenizer
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4v-9b", trust_remote_code=True)
query = '描述这张图片'
image = Image.open("your image").convert('RGB')
inputs = tokenizer.apply_chat_template([{"role": "user", "image": image, "content": query}],
                                       add_generation_prompt=True, tokenize=True, return_tensors="pt",
                                       return_dict=True)  # chat mode
inputs = inputs.to(device)
model = AutoModelForCausalLM.from_pretrained(
    "THUDM/glm-4v-9b",
    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]))
未完待续
感谢LDG_AGI分享的《【机器学习】GLM-4V:图片识别多模态大模型(MLLs)初探》博客














![NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点](https://img-blog.csdnimg.cn/direct/8380c8c294a04b508433106b944e5411.png)




