拓冰建站拓冰建站
首页 / 资讯中心 / 正文

深入解析 CPMAnt:Hugging Face Transformers 中的 10B 中文因果语言模型

深入解析 CPMAntHugging Face Transformers 中的 10B 中文因果语言模型【免费下载链接】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/transformersCPMAnt 是由 OpenBMB 团队开源、并于 2023-04-12 贡献进 Hugging Face Transformers 的 10B 参数中文预训练语言模型也是 CPM-Live 开放训练计划的第一个里程碑。本文以 docs/source/en/model_doc/cpmant.md及其日文版 docs/source/ja/model_doc/cpmant.md为骨架结合仓库内 CpmAntConfig、CpmAntTokenizer、CpmAntModel / CpmAntForCausalLM 的源码实现系统讲解 CPMAnt 的模型架构、分词器设计、配置项以及基于 Pipeline 和直接调用模型两种文本生成实战方案。模型概览CPM-Live 的第一个里程碑CPM-Ant 是一个拥有 100 亿10B参数的开源中文预训练语言模型PLM它是 CPM-Live 实时训练流程产出的第一个里程碑模型。CPM-Live 项目以持续学习、持续演进为理念其训练过程强调成本效益与环境友好。除了完整模型外官方还针对不同硬件配置提供了多种压缩版本以便在显存受限的环境中也能运行。从评测角度看CPMAnt 在CUGE 基准中文生成与理解评测的 delta tuning增量微调任务上取得了有竞争力的结果。在当前的 Transformers 仓库中CPMAnt 相关代码位于 src/transformers/models/cpmant/ 目录由四个文件组成文件职责configuration_cpmant.pyCpmAntConfig配置类定义模型超参数modeling_cpmant.pyCpmAntModel基础模型与CpmAntForCausalLM因果语言建模头tokenization_cpmant.pyCpmAntTokenizer基于 rjieba 分词 byte-level BPE 的中文分词器init.py模块导出入口采用_LazyModule惰性加载对应的测试位于 tests/models/cpmant/包括 test_modeling_cpmant.py 与 test_tokenization_cpmant.py覆盖了模型前向推理、因果 LM 输出、简单/批量生成以及分词器行为等场景。快速上手两种文本生成方式英文文档给出了两种使用 CPMAnt 生成中文文本的示例官方 checkpoint 为openbmb/cpm-ant-10b。下面分别介绍。方式一使用 Pipeline推荐快速体验Pipeline 封装了 tokenizer、模型与前处理/后处理逻辑只需两行代码即可完成文本生成from transformers import pipeline pipe pipeline( tasktext-generation, modelopenbmb/cpm-ant-10b, ) pipe(今天天气很好)Pipeline 方式会自动加载 CPMAnt 的 tokenizer 与CpmAntForCausalLM模型并执行标准的自回归解码。方式二直接使用 CpmAntForCausalLM当需要更精细地控制生成参数如max_new_tokens、device_map、采样策略时可以直接实例化模型类from transformers import CpmAntForCausalLM, CpmAntTokenizer tokenizer CpmAntTokenizer.from_pretrained(openbmb/cpm-ant-10b) model CpmAntForCausalLM.from_pretrained( openbmb/cpm-ant-10b, device_mapauto, # 自动分配层到可用设备缓解显存压力 ) input_ids tokenizer(今天天气很好, return_tensorspt).to(model.device) output model.generate(**input_ids, max_new_tokens50) print(tokenizer.decode(output[0], skip_special_tokensTrue))要点说明CpmAntTokenizer与CpmAntForCausalLM均通过from_pretrained(openbmb/cpm-ant-10b)加载仓库源码 modeling_cpmant.py 的 docstring 中还给出了同样的生成示例输出形如今天天气不错阳光明媚我和妈妈一起去超市买东西……的中文续写结果device_mapauto依赖accelerate库可将模型各层自动分布到多 GPU/CPU 上是运行 10B 量级模型时的常用手段generate(**input_ids, max_new_tokens50)指定最多新生成 50 个 tokenskip_special_tokensTrue在解码时剔除s、/s等特殊 token。CpmAntConfig关键配置参数详解configuration_cpmant.py 定义了CpmAntConfig其model_type为cpmant。该类继承自PreTrainedConfig所有字段均为类属性并带有默认值因此可以直接CpmAntConfig()构造一个cpm-ant-10b 风格的配置再传入CpmAntModel(configuration)初始化模型或通过model.config回读配置。核心超参数参数默认值说明vocab_size30720词表大小hidden_size4096隐藏层维度num_attention_heads32注意力头数dim_head128每个注意力头的维度hidden_size / num_attention_headsdim_ff10240前馈网络中间层维度num_hidden_layers48Transformer 层数dropout_p0.0注意力与前馈层 dropout 概率position_bias_num_buckets512位置偏置的 bucket 数量position_bias_max_distance2048位置偏置的最大距离eps1e-6RMS LayerNorm 的数值稳定性常数init_std1.0参数初始化标准差prompt_types32prompt 类型数量prompt_length32prompt 长度segment_types32segment 类型数量use_cacheTrue是否缓存 KV加速自回归解码tie_word_embeddingsTrue是否绑定输入输出嵌入自定义配置示例from transformers import CpmAntModel, CpmAntConfig # 初始化一个 cpm-ant-10b 风格的配置 configuration CpmAntConfig() # 基于该配置初始化模型随机权重非预训练权重 model CpmAntModel(configuration) # 读取模型配置 configuration model.config也可以按需修改字段例如减小层数或调整注意力头维度构造适合自己显存的小规模模型用于实验。架构剖析从源码看 CPMAnt 的模型设计modeling_cpmant.py 共 783 行实现了完整的自回归解码器。其核心设计可以从以下几个组件理解。1. RMS LayerNormCpmAntLayerNormCPMAnt 使用Root Mean SquareRMSLayer Normalization参考论文 1910.07467而不是标准的 LayerNorm。从源码 modeling_cpmant.py 可见其实现在 float32 下计算激活的均方根用torch.rsqrt(variance eps)归一化后乘上可学习的权重并做了 dtype 保持处理。该实现移除了均值中心化在保证训练稳定的同时降低了计算开销。2. 多头注意力CpmAntAttentionCpmAntAttention 采用标准的 Q/K/V 投影project_q、project_k、project_v均为无 bias 的线性层将 query 与 key 做点积后除以sqrt(dim_head)缩放然后加上位置偏置position_bias再通过 attention mask 屏蔽非法区域填充为-inf经 softmax 后与 value 加权求和最后经attention_out投影回原维度。它还支持传入past_key_valuesCache类型实现 KV 缓存加速解码。3. 门控前馈网络CpmAntDenseGatedACT CpmAntFeedForwardFFN 采用门控激活结构CpmAntDenseGatedACT 包含两条并行线性投影w_0、w_1其中一条经过 GELU 激活后作为门控与另一条逐元素相乘再经w_out投影回hidden_size。这种门控设计类似 SwiGLU 思路是提升模型表达能力的常用手段。4. 段位置编码CpmAntSegmentPositionEmbeddingCPMAnt 最具特色的设计之一是对位置与段落信息的统一建模。在 modeling_cpmant.py 中relative_attention_bias参数的大小为segment_types * segment_types position_bias_num_buckets行 ×num_attention_heads列融合了两类信息段相对位置桶segment-relative position bucket通过query_segment * num_segments key_segment计算编码 query 与 key 所属段落的关系绝对位置桶absolute position bucket对相对位置差采用log 分桶策略——小距离用精确桶大距离按log(max_distance / max_exact)的对数比例分桶从而在有限的 bucket 数量内覆盖到max_distance2048的长程距离。当 query 与 key 属于同一段时使用绝对位置桶否则使用段相对位置桶最终经F.embedding得到形如(batch, num_heads, len_q, len_k)的偏置直接加到注意力分数上。5. 模型主体CpmAntModel 与 CpmAntForCausalLMCpmAntModel 的组成input_embedding词嵌入维度为vocab_size prompt_types * prompt_length——为 prompt 预留了额外的嵌入槽位segment_embedding段嵌入维度segment_types × hidden_sizeposition_bias上述段位置编码模块encoder48 层CpmAntTransformerBlock自注意力块 FFN 块的残差堆叠外加输出 LayerNorm。在其forward中值得注意的细节modeling_cpmant.py自动注入 prompt当past_key_values为空首次前向时会在输入序列前面拼接一段长度为prompt_length32的特殊 prompt id区间为[prompt_length*2 vocab_size, prompt_length*3 vocab_size)用于让模型学习固定的引导模式掩码策略_prepare_attention_mask构造的是双向可见span 内与因果可见同一段内左到右的复合掩码同时屏蔽左侧 padding输出裁剪首轮前向后会把 prompt 部分从hidden_states、attentions、hidden states 中裁掉确保对外暴露的序列长度与用户输入一致KV 缓存使用DynamicCachecache_utils.py管理历史 key/value解码阶段segment_states只取最后一帧配合past_length完成增量计算。CpmAntForCausalLM 在CpmAntModel之上叠加了一个lm_headhidden_size → vocab_size的线性层无 bias。与一般权重绑定不同由于 LM 头只是输入嵌入矩阵的一个切片checkpoint 中单独保存了lm_head.weight源码注释明确指出这一点。该类继承GenerationMixin可直接调用generate进行文本生成其forward还支持labels参数计算交叉熵损失用于微调训练并且通过logits_to_keep只计算需要的 logits 以节省显存。CpmAntTokenizerrjieba 分词 byte-level BPEtokenization_cpmant.py 实现的CpmAntTokenizer面向中文场景做了专门设计其分词流程为rjieba 中文分词 → WordPiece 子词切分。依赖与加载分词器依赖rjiebaPython 的结巴分词绑定。源码 tokenization_cpmant.py 通过requires_backends(self, [rjieba])强制校验未安装时会报错提示。安装方式pip install rjieba特殊 token 体系CpmAntTokenizer定义了一套面向文档/文本结构的中文特殊 token参数默认值含义bod_tokend文档开始beginning of documenteod_token/d文档结束end of documentbos_tokens序列开始eos_token/s序列结束pad_tokenpad填充 tokenunk_tokenunk未知 tokenline_token/n换行 tokenspace_token/_空格 token初始化时分词器会将空格 token 映射为真实空格 、换行 token 映射为\n再把这些功能化的 token 从 added tokens 中移除tokenization_cpmant.py因此 与\n能直接被词表编码。其默认padding_sideleft左填充model_input_names [input_ids, attention_mask]与模型的注意力掩码设计相匹配。分词流程先用rjieba.cut(text, False)将中文文本切分为词语每个词语再交给WordpieceTokenizertokenization_cpmant.py按最长匹配在词表中切分为子词找不到则回退到unk解码时_decode会自动过滤掉pad、eos、bostokentokenization_cpmant.pyconvert_tokens_to_string直接以空字符串连接还原出连续中文文本。该分词器的行为在 test_tokenization_cpmant.py 中有系统测试覆盖。模型验证测试用例如何印证实现tests/models/cpmant/test_modeling_cpmant.py 通过CpmAntModelTester构造小型 CPMAnt 模型并利用ModelTesterMixin、PipelineTesterMixin进行了全面验证其中与本文内容直接相关的用例包括test_cpmant_model验证基础模型前向输出test_cpmant_lm_head_model验证带 LM 头的因果模型输出test_inference_causal验证因果 LM 的 logits 形状与数值test_simple_generation/test_batch_generation验证单条与批量generate文本生成。这些测试印证了 CPMAnt 在仓库中已经实现为可直接用于推理与生成的完整因果语言模型开发者可以参考它们了解模型的输入输出契约或在自己环境中复现验证。应用建议与注意事项显存考量CPMAnt 拥有 10B 参数直接以 fp32 加载需要约 40GB 显存。实际使用建议使用device_mapauto自动分片开启 8-bit / 4-bit 量化如load_in_8bitTrue或使用官方提供的压缩版本 checkpoint生成时通过max_new_tokens限制生成长度并善用 KV 缓存use_cacheTrue为默认。运行环境需安装transformers、torch、rjieba多设备分片还需accelerate。中文续写场景CPMAnt 适合中文开放式文本生成、对话与内容续写等任务在 CUGE 基准的 delta tuning 任务上表现良好也可在其上做 LoRA 等轻量微调。模型规模从配置看48 层、32 头、hidden_size4096、dim_ff10240的结构属于典型的大模型配置适合有充足算力与显存资源的场景。总结CPMAnt 作为 CPM-Live 开放训练计划的首个成果在 Transformers 仓库中提供了完整的配置、分词、建模与生成支持。其架构融合了 RMS LayerNorm、门控 FFN、段位置编码与 prompt 注入机制分词器则以rjieba WordPiece的组合服务于中文场景。无论是通过pipeline快速体验还是借助CpmAntForCausalLM深度定制生成与微调开发者都可以从 src/transformers/models/cpmant/ 出发结合本文的配置说明与源码解析快速上手。注本文以仓库当前代码为准模型权重与官方压缩版本请以 Hugging Face Hub 上openbmb/cpm-ant-10b的实际文件为准CUGE 基准与 CPM-Live 训练细节详见 OpenBMB 官方项目资料。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门