Transformers 原生集成 GLM-4:模型架构解读、GlmConfig 配置与 glm-4-9b-chat 推理实战
Transformers 原生集成 GLM-4模型架构解读、GlmConfig 配置与 glm-4-9b-chat 推理实战【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers本文以 Hugging Face Transformers 官方文档 docs/source/en/model_doc/glm.md 为骨架结合本仓库src/transformers/models/glm/下的真实实现系统讲解 GLM-4 系列模型在 Transformers 中的架构设计、GlmConfig全部关键参数以及如何基于 ChatML 格式完成glm-4-9b-chat的加载与生成推理。读完本文你将掌握 GLM-4 的源码组织结构、逐参数配置方法以及一套可直接运行的对话推理代码。GLM-4 是什么从 ChatGLM 家族到本次集成glm.md明确说明GLM-4 由THUDM 与智谱 AIZhipuAI团队在论文ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools发布于 2024-06中提出本仓库于 2024-10 完成社区集成。根据论文摘要ChatGLM 是一个持续迭代的大语言模型家族报告重点围绕 GLM-4 系列展开包含GLM-4、GLM-4-Air、GLM-4-9B等版本它们在超过 10 万亿 token 的中英文为主语料外加 24 种语言的小规模语料上完成预训练并通过监督微调 人类反馈学习的多阶段后训练实现高质量对齐。GLM-4 All Tools 进一步对齐了工具调用能力网页浏览、Python 解释器、文生图模型与用户自定义函数。文档同时提到该系列已开源包括 ChatGLM-6B三代、GLM-4-9B128K、1M 上下文版本、GLM-4V-9B、WebGLM、CodeGeeX 等模型。在本仓库语境下GLM-4 并非远程代码remote code式接入而是拥有完整原生实现模型代码位于 src/transformers/models/glm/modeling_glm.py配置类位于 src/transformers/models/glm/configuration_glm.py同时配套权重转换脚本 src/transformers/models/glm/convert_glm_weights_to_hf.py 与完整测试套件 tests/models/glm/test_modeling_glm.py。从代码生成方式看modeling_glm.py由 src/transformers/models/glm/modular_glm.py 自动生成——文件头部有明确的 Do NOT edit this file manually 告警。该 modular 文件显示GLM-4 的实现大量复用 Llama 与 Phi-3 的既有代码骨架GlmMLP直接继承自Phi3MLPGlmForCausalLM、GlmForSequenceClassification、GlmForTokenClassification分别继承自 Llama 的对应类仅注意力模块与 RoPE 旋转位置编码做了定制。这也意味着 GLM-4 的推理体验与行为会与这些成熟架构高度一致。架构核心基于 GQA 部分旋转 RoPE 的稠密解码器阅读 modeling_glm.py 的源码GLM-4 是一个仅解码器decoder-only的自回归稠密模型逐层结构如下embed_tokens(词嵌入) → 40 × GlmDecoderLayer → GlmRMSNorm →可选 lm_head每个GlmDecoderLayer见 modeling_glm.py#L295-L335采用Pre-Norm 残差结构input_layernorm归一化 → 多头自注意力残差相加post_attention_layernorm归一化 →GlmMLP残差相加。GQA 分组查询注意力与偏置细节GlmAttentionmodeling_glm.py#L209-L271实现了标准 GQAGrouped-Query Attention查询头数为num_attention_heads而键/值头数仅为num_key_value_heads默认 2num_key_value_groups num_attention_heads // num_key_value_heads推理时通过repeat_kvmodeling_glm.py#L125-L134把 KV 头复制回全量头数再计算注意力。与常见 Llama 变体不同的是GLM-4 的q_proj/k_proj/v_proj投影层携带 bias由config.attention_bias控制默认True而o_proj与 MLP 投影均无 bias。eager_attention_forwardmodeling_glm.py#L137-L159在 fp32 上做 softmax 以提升数值稳定性。SwiGLU 门控 MLP 与分段写法GlmMLPmodeling_glm.py#L48-L63采用 SwiGLU 门控结构单个gate_up_proj把隐层映射到2 * intermediate_size然后chunk(2, dim-1)拆成 gate 与 up 两路乘以 SiLU 激活后由down_proj投影回hidden_size。官方配置中intermediate_size13696而GlmConfig的 TP张量并行计划为此特别标注了 我们因chunk操作需要复制/切分输入输出 的注释见 configuration_glm.py#L42-L49。RMSNorm 与部分旋转 RoPEGlmRMSNormmodeling_glm.py#L274-L292是无偏置的均方根归一化计算在 fp32 下完成参数rms_norm_eps默认取1.5625e-7。GLM-4 RoPE 最独特的点在于partial rotary部分旋转compute_default_rope_parametersmodeling_glm.py#L86-L104先以head_dim * partial_rotary_factor计算实际参与旋转的维度partial_rotary_factor默认0.5见GlmConfig.__post_init__中kwargs.setdefault(partial_rotary_factor, 0.5)configuration_glm.py#L76-L80即每个注意力头的 128 维中仅前 64 维注入位置信息。配套的apply_rotary_pos_embmodeling_glm.py#L169-L206使用**交错interleave而非拼接concat**的旋转排列并把张量切成 rot/pass 两段只对前段做旋转后拼接还原。这与 GlmRotaryEmbedding 中 Interleave them instead of usual shape 的注释一致。GlmConfig 参数速查默认值与设计含义GlmConfigmodel_type 为glm继承自PreTrainedConfig。以官方发布配置对应THUDM/glm-4-9b-chat检查点为准全部核心字段及默认值如下表参数默认值含义vocab_size151552词表大小hidden_size4096隐藏层维度intermediate_size13696MLP 中间维度num_hidden_layers40解码器层数num_attention_heads32查询头数num_key_value_heads2KV 头数GQA 压缩head_dim128每头维度hidden_actsilu激活函数attention_dropout0.0注意力 dropoutmax_position_embeddings131072最大序列长度128Kinitializer_range0.02参数初始化范围rms_norm_eps1.5625e-7RMSNorm 数值稳定项use_cacheTrue是否缓存 KVtie_word_embeddingsFalse是否共享词嵌入与 LM 头rope_parametersNoneRoPE 超参字典pad_token_id151329pad tokeneos_token_idNone→ 由__post_init__设为[151329, 151336, 151338]EOS 序列bos_token_idNoneBOS对话首 token 由 ChatML 模板处理attention_biasTrueQ/K/V 投影是否带 bias需要特别注意的运行时行为全部有源码可查多 EOS__post_init__中当eos_token_id未显式指定时会被替换为三个 token[151329, 151336, 151338]configuration_glm.py#L78-L80这是 GLM-4 使用 ChatML 多终止符的特性partial rotary 默认值兜底为了向后兼容__post_init__会自动补上partial_rotary_factor0.5推理忽略键keys_to_ignore_at_inference [past_key_values]确保past_key_values不会随输出一起被序列化configuration_glm.py#L41。实战加载 glm-4-9b-chat 并进行对话推理文档给出了最简洁的推理入口——使用AutoModelForCausalLMAutoTokenizer加载官方对话模型THUDM/glm-4-9b-chat。GLM-4 对话使用ChatML 消息格式含system/user/assistant角色与专用终止符正确做法是借助分词器的apply_chat_template自动组装提示词而不是手工拼接模板。下面这段代码完整继承自glm.md并做了最小必要补充以保证可直接运行同样适用于单卡、多卡场景from transformers import AutoModelForCausalLM, AutoTokenizer model AutoModelForCausalLM.from_pretrained(THUDM/glm-4-9b-chat, device_mapauto, trust_remote_codeTrue) tokenizer AutoTokenizer.from_pretrained(THUDM/glm-4-9b-chat) prompt Give me a short introduction to large language model. messages [{role: user, content: prompt}] # 用 ChatML 模板生成带生成标记的完整文本 text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) model_inputs tokenizer([text], return_tensorspt).to(model.device) generated_ids model.generate(model_inputs.input_ids, max_new_tokens512, do_sampleTrue) # 去掉输入前缀只保留新生成的 token generated_ids [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)] response tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0] print(response)几个可以按需调整的关键点max_new_tokens512限制本次新生成的最大 token 数do_sampleTrue开启随机采样若需要确定性输出可改do_sampleFalsedevice_mapauto会在多 GPU 环境中自动做层切分trust_remote_codeTrue用于兜底加载 Hub 上的辅助配置代码多轮对话只需不断向messages追加assistant与新的user消息后重新apply_chat_template即可。若想跳过对话模板、以纯文本续写方式测试模型可参考GlmForCausalLMdocstring 中演示的简单流程modeling_glm.py#L461-L477from transformers import AutoTokenizer, GlmForCausalLM model GlmForCausalLM.from_pretrained(meta-glm/Glm-2-7b-hf) tokenizer AutoTokenizer.from_pretrained(meta-glm/Glm-2-7b-hf) prompt Hey, are you conscious? Can you talk to me? inputs tokenizer(prompt, return_tensorspt) generate_ids model.generate(inputs.input_ids, max_length30) tokenizer.batch_decode(generate_ids, skip_special_tokensTrue, clean_up_tokenization_spacesFalse)[0]四种面向任务的入口从因果 LM 到序列标注glm.md的 autodoc 区块共列出四类可实例化的 API本仓库中对应类均在 modeling_glm.py 中导出类用途实现要点源码依据GlmModel基础解码器输出隐状态由embed_tokens 40 层GlmDecoderLayer 末尾GlmRMSNormGlmRotaryEmbedding构成modeling_glm.py#L357-L428GlmForCausalLM对话 / 文本生成返回词表 logits额外带无 bias 的lm_head支持labels计算交叉熵损失modeling_glm.py#L431-L503GlmForSequenceClassification整句分类情感等GenericForSequenceClassification泛型混入类modeling_glm.py#L506-L507GlmForTokenClassification序列标注NER 等GenericForTokenClassification泛型混入类modeling_glm.py#L510-L511高效生成相关的实现细节logits 裁剪GlmForCausalLM.forward接收logits_to_keep默认 0仅对最后若干位置计算 LM logits显著降低长上下文下的显存与算力开销modeling_glm.py#L490-L491词嵌入独立tie_word_embeddings默认False即lm_head为独立权重不过_tied_weights_keys仍登记了与embed_tokens的映射关系方便用户自行开启权重绑定modeling_glm.py#L433。特性支持矩阵与并行方案FlashAttention、SDPA 与 TP/PPglm.md页首的徽章标明了 GLM-4 集成支持 FlashAttention、SDPA 与张量并行这与源码中的能力声明完全对应GlmPreTrainedModel声明了_supports_flash_attn True、_supports_sdpa True、_supports_flex_attn True并支持_can_compile_fullgraph全图编译与梯度检查点supports_gradient_checkpointing Truemodeling_glm.py#L338-L354注意力实现通过ALL_ATTENTION_FUNCTIONS.get_interface(config._attn_implementation, eager_attention_forward)统一分发modeling_glm.py#L254-L256因此可在from_pretrained时通过attn_implementationflash_attention_2 / sdpa / eager切换后端张量并行TP计划base_model_tp_plan描述 Q/K/V 投影做colwise、o_proj做rowwise、MLP 因chunk语义做colwise_gather_output/rowwise_split_input的切分策略configuration_glm.py#L42-L49流水线并行PP计划base_model_pp_plan给出embed_tokens、layers、norm各阶段输入输出张量的交接约定configuration_glm.py#L50-L54_no_split_modules [GlmDecoderLayer]让层内不跨设备切分是 device_map 自动分层的依据。回归验证集成测试在做什么仓库用 tests/models/glm/test_modeling_glm.py 保证实现的正确性其中有两层测试值得关注通用小模型测试GlmModelTester/GlmModelTest复用仓库统一的CausalLMModelTest体系做大规模随机化前向/梯度测试并强制attention_dropout 0.0——测试注释说明这是为了兼容 TP 反向传播测试的 RNG 一致性test_modeling_glm.py#L41-L57慢速集成测试slow以THUDM/glm-4-9brevisionrefs/pr/15为基准分别以 fp16 / bf16 / eager / sdpa / flash_attention_2 后端跑generate并断言 batch 解码文本与期望输出逐字一致test_modeling_glm.py#L59-L183。这说明四种注意力后端在 GLM-4 上被持续验证为输出一致是你在生产环境切换attn_implementation时的可靠性依据。小结与延伸阅读一句话概括本仓库的 GLM-4 集成以 Llama 解码器骨架为基座叠加 GLM 特有的 128K 上下文、ChatML 三终止符、GQA 与前 64 维参与旋转的部分 RoPE 与带 bias 注意力并通过 modular 机制统一维护。如果你想继续深挖推荐按以下路径阅读当前仓库配置全文src/transformers/models/glm/configuration_glm.py模型主实现src/transformers/models/glm/modeling_glm.py复用了哪些 Llama/Phi-3 骨架src/transformers/models/glm/modular_glm.py官方 checkpoint 到 HF 格式的权重转换src/transformers/models/glm/convert_glm_weights_to_hf.py各注意力后端回归测试tests/models/glm/test_modeling_glm.py以上内容均以docs/source/en/model_doc/glm.md为主线整理参数默认值与行为细节均可通过上述源码文件核对可放心作为二次开发与模型部署的参考资料。【免费下载链接】transformers Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and multimodal models, for both inference and training.项目地址: https://gitcode.com/GitHub_Trending/tra/transformers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考