ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

深入解析 Transformers 中的 CodeGen 模型:对话式程序合成与代码生成实战指南

2026/9/11 18:17:25 拓冰建站 浏览量
深入解析 Transformers 中的 CodeGen 模型:对话式程序合成与代码生成实战指南 深入解析 Transformers 中的 CodeGen 模型对话式程序合成与代码生成实战指南【免费下载链接】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/transformersCodeGen 是由 Salesforce 提出的自回归程序合成语言模型其核心思想是把根据问题规格生成程序这一任务建模为用户与系统之间的多轮对话并将程序合成视为序列预测问题。本文以本仓库docs/source/ja/model_doc/codegen.md的模型文档为主线结合 配置实现、建模实现、分词器实现 与 测试用例为你系统梳理 CodeGen 的检查点命名规则、开箱即用的代码补全流程、底层 GPT-J 风格架构细节与分词器陷阱帮助你在 Transformers 中熟练加载、生成与微调 CodeGen 系列模型。CodeGen 模型概述从序列预测到对话式程序合成CodeGen 模型出自论文 A Conversational Paradigm for Program SynthesisErik Nijkamp、Bo Pang、林宏明、Lifu Tu、Huan Wang、Yingbo Zhou、Silvio Savarese、Caiming Xiong 与卡明·雄共同撰写由林宏明Hugging Face 用户 rooa为本仓库贡献原始代码来自 Salesforce 的 CodeGen 仓库。论文的核心论点如下程序合成旨在为给定的问题规格生成计算机程序作为解决方案。作者提出一种通过大规模语言模型进行的对话式程序合成方法用以应对传统方法在巨大程序空间搜索与用户意图规格化两方面的挑战。该方法将规格与程序的创作过程视为用户与系统之间的多次交互把程序合成当作序列预测问题——规格以自然语言表达目标程序被条件采样。作者在自然语言与编程语言数据上训练了名为 CodeGen 的大型语言模型家族并发现在数据监督较弱的情况下随着数据规模与模型规模的扩大简单的自回归语言建模即可涌现出对话能力。为研究模型在对话式程序合成中的行为作者开发了多轮编程基准MTPB其中每个问题都需要通过用户与模型的多轮对话完成多步合成。研究结果表明了对话能力的涌现以及所提对话式程序合成范式的有效性。此外CodeGen在 TPU-v4 上训练最大含 16B 参数在 HumanEval 基准上超越了 OpenAI 的 Codex作者同时开源了包含检查点的训练库 JaxFormer。在训练数据层面CodeGen 是一个自回归语言模型它在 The Pile、BigQuery、BigPython 数据集上按阶段顺序训练先在自然语言语料上预训练再逐步叠加多语言编程语料与 Python 语料从而实现从自然语言规格到代码的能力迁移。检查点命名规则理解 size 与 data 后缀CodeGen 系列检查点可通过 Hugging Face Hub 按othercodegen检索统一采用如下命名格式Salesforce/codegen-{size}-{data}其中各字段含义如下字段取值含义size350M、2B、6B、16B模型参数量datanl在 Pile自然语言上预训练datamulti由nl初始化在多种编程语言数据上继续预训练datamono由multi初始化在 Python 数据上继续预训练例如Salesforce/codegen-350M-mono是一个 3.5 亿参数检查点依次在 Pile、多种编程语言与 Python 上顺序预训练而成。三个数据变体构成一条清晰的渐进式训练链路nl → multi → monomono面向纯 Python 代码生成multi适合多语言代码补全nl则侧重自然语言理解与生成能力。快速上手用 AutoModel 完成代码补全CodeGen 在 Transformers 中通过标准因果语言建模Causal LM接口暴露可直接使用AutoModelForCausalLM与AutoTokenizer加载。原文档给出的完整示例此处原样保留并补充注释如下from transformers import AutoModelForCausalLM, AutoTokenizer # 加载 350M mono 检查点也可替换为 2B / 6B / 16B 的 nl / multi / mono 变体 checkpoint Salesforce/codegen-350M-mono model AutoModelForCausalLM.from_pretrained(checkpoint) tokenizer AutoTokenizer.from_pretrained(checkpoint) # 输入一段不完整的 Python 函数定义 text def hello_world(): # 直接调用 generate 进行自回归补全 completion model.generate(**tokenizer(text, return_tensorspt)) # 解码生成结果 print(tokenizer.decode(completion[0]))上述代码的输出为def hello_world(): print(Hello World) hello_world()需要说明的是CodeGen 的检查点命名约定同样适用于代码生成之外的场景——nl变体可作为通用语言模型使用而mono变体在 Python 补全任务上表现最佳。若要进行更精细的生成控制可在generate中传入max_new_tokens、do_sample、temperature、top_p等 GenerationMixin 参数本仓库的 因果语言建模任务指南 提供了完整说明。CodeGenConfig关键配置参数与源码级解析CodeGenConfig继承自PreTrainedConfig位于 configuration_codegen.py其model_type为codegen。值得注意的一个设计是它通过attribute_map将 GPT 风格的参数名映射为 CodeGen 自身的命名体系attribute_map { max_position_embeddings: n_positions, hidden_size: n_embd, num_attention_heads: n_head, num_hidden_layers: n_layer, }也就是说通用接口如hidden_size会被自动映射到 CodeGen 的n_embd、n_head、n_layer、n_positions这与 GPT-J 的实现约定保持一致。各参数的默认值与作用如下表参数默认值说明vocab_size50400词表大小n_positions2048最大位置编码长度对应max_position_embeddingsn_ctx2048上下文长度在CodeGenModel.__init__中用于约束rotary_dim上限本身不直接参与前向计算n_embd4096隐藏层维度n_layer28Transformer 层数n_head16注意力头数rotary_dim64旋转位置编码Rotary Position Embedding作用的维度数n_innerNone前馈网络内部维度None时取 4 倍n_embdactivation_functiongelu_new激活函数resid_pdrop/embd_pdrop/attn_pdrop0.0残差、Embedding、注意力三个位置的 dropout 概率layer_norm_epsilon1e-5LayerNorm 的 epsiloninitializer_range0.02权重初始化范围use_cacheTrue是否使用 KV 缓存加速推理bos_token_id/eos_token_id50256起始/结束标记即|endoftext|tie_word_embeddingsFalse是否绑定输入输出词嵌入配置文件同样给出了直接从配置实例化模型的示例from transformers import CodeGenConfig, CodeGenModel # 初始化 CodeGen 6B 配置 configuration CodeGenConfig() # 由配置初始化一个随机权重模型 model CodeGenModel(configuration) # 访问模型配置 configuration model.configCodeGenTokenizerByte-Level BPE 与空格敏感陷阱CodeGenTokenizer基于 Hugging Face 的tokenizers库实现 byte-level Byte-Pair-EncodingBPE词表文件为vocab.json、合并规则文件为merges.txt见 tokenization_codegen.py 中的VOCAB_FILES_NAMES。最重要的使用陷阱是空格敏感该分词器被训练为把空格当作 token 的一部分类似 SentencePiece 的行为因此同一单词出现在句首无前导空格与句中有前导空格会被编码成不同的 tokenfrom transformers import CodeGenTokenizer tokenizer CodeGenTokenizer.from_pretrained(Salesforce/codegen-350M-mono) tokenizer(Hello world)[input_ids] # [15496, 995] tokenizer( Hello world)[input_ids] # [18435, 995]可以看到多一个前导空格后Hello的 token id 从 15496 变为 18435。如果需要规避该行为可以在实例化时传入add_prefix_spaceTrue但由于模型预训练时并未采用该设置这可能会带来一定性能损失。此外当配合is_split_into_wordsTrue使用如序列标注场景时必须以add_prefix_spaceTrue实例化。从源码看该分词器还做了一件对代码生成至关重要的增强——按模式截断生成结果。其decode方法接受truncate_before_pattern参数正则表达式列表例如[^#, re.escape(|endoftext|), ^, \n\n\n]内部实现逻辑如下若解码文本中出现第二个^print或第二个^def多行匹配则在第二个出现位置截断对每个终止正则如注释符#开头、|endoftext|、三引号、连续换行找到最早命中位置取最小值截断。这一机制能有效去除模型在代码补全时刹不住车产生的多余函数定义、print 语句或注释是 CodeGen 面向生产级代码补全的关键设计。对应的集成测试位于 test_tokenization_codegen.py其中验证了多语言文本含中文、泰文、emoji的 token 拆分与解码还原行为。模型架构从源码看 CodeGen 的实现细节CodeGenModel与CodeGenForCausalLM实现在 modeling_codegen.py 中其架构与 GPT-J 高度同源多处代码直接标注 Copied from transformers.models.gptj主要特征包括解码器结构wte词嵌入 → N 个CodeGenBlock→ 最终 LayerNorm每个 Block 由前置 LayerNorm、CodeGenAttention、CodeGenMLP组成残差连接采用attn_outputs feed_forward_hidden_states residual的并行写法。旋转位置编码Rotary位置信息通过正弦/余弦查表create_sinusoidal_positions与apply_rotary_pos_emb注入。rotary_dim控制旋转作用的维度剩余维度pass部分不旋转这与 GPT-J 的做法一致。TPU-v4 友好的多头切分前向计算中硬编码mp_num 4对应 TPU-v4 的逻辑核数QKV 投影后按 4 路切分再重组多头_split_heads/_merge_heads负责形状变换。fp32 注意力计算_attn中将 Q、K 显式转为 float32 计算注意力权重避免数值溢出Softmax 后再转回 value 的数据类型。KV 缓存use_cacheTrue时使用DynamicCache缓存每层 K/V通过layer_past.update自回归解码时无需重算历史位置。因果掩码通过create_causal_mask统一构造支持 attention mask 与 past 位置偏移。CodeGenForCausalLM在CodeGenModel之上叠加lm_headnn.Linear(n_embd, vocab_size)前向时支持labels参数——标签会在模型内部做位移shift即可以直接传labels input_ids进行语言建模训练-100位置的标签被忽略。它还继承GenerationMixin因此model.generate(...)可直接使用本仓库 generation 模块 的全部解码策略。从 测试目录 的结构看CodeGen 与其他因果语言模型共享统一的CausalLMTestMixin与模型测试模板覆盖前向输出形状、注意力/隐藏状态返回、KV 缓存一致性、梯度检查点等行为你可以直接运行pytest tests/models/codegen/验证本机环境下的模型行为。小结与实践建议综合文档与源码使用 CodeGen 时有几点值得牢记按任务选检查点Python 代码补全优先*-mono多语言代码优先*-multi需要通用自然语言能力时选*-nl参数量从 350M 到 16B 按算力预算取舍。注意分词器的空格语义默认情况下句首单词的 token 不同add_prefix_space会改变行为并可能略微影响预训练分布下的性能。善用截断机制在decode时传入truncate_before_pattern如[^#, \n\n\n]可自动清理生成代码中多余的注释与空行。配置命名映射hidden_size/num_attention_heads等通用参数会自动映射为n_embd/n_head微调或改造模型时无需纠结命名差异。本文涉及的配置、分词器、建模实现与测试用例分别位于 configuration_codegen.py、tokenization_codegen.py、modeling_codegen.py 以及 tests/models/codegen读者可在此基础上进一步阅读 GPT-J 的相关实现深入理解旋转位置编码与并行残差块的细节。【免费下载链接】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),仅供参考