尧图精选

在 [特殊字符] Transformers 中使用 Code Llama:从精度选型到代码填充(Infilling)实战指南

🕒 发布时间:2026/9/11 18:17:49 📁 来源:尧图网络
在 Transformers 中使用 Code Llama从精度选型到代码填充Infilling实战指南【免费下载链接】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导读Code Llama 是 Meta 基于 Llama 2 架构发布的代码大语言模型家族在 Transformers 中以CodeLlamaTokenizer以及作为别名的CodeLlamaTokenizerFast的形式提供完整支持模型主体复用 Llama 架构可直接通过LlamaForCausalLM或AutoModelForCausalLM加载。本篇文章以 docs/source/ja/model_doc/code_llama.md 为核心结合仓库内 tokenizer 实现源码、权重转换脚本 与 tokenizer 测试用例系统讲解如何在当前仓库中完成 Code Llama 的权重转换、精度选型、代码生成与代码填充infilling等完整流程并深入剖析其基于 SentencePiece 的 BPE 分词器的内部机制。Code Llama 模型家族概览Code Llama 由论文Code Llama: Open Foundation Models for CodeBaptiste Rozière 等提出是基于 Llama 2 的代码大语言模型家族提供多种形态基础模型Code Llama面向通用代码任务Python 特化Code Llama - Python针对 Python 编程深度优化指令跟随模型Code Llama - Instruct面向指令式对话与任务执行。三种形态均提供 7B、13B、34B以及后续的 70B参数规模。所有模型以 16,000 token 的序列长度训练并可在最长 100,000 token 的输入上保持稳定生成。7B 与 13B 的基础模型与 Instruct 变体支持**基于上下文的代码填充infilling**能力。在论文报告的基准中Code Llama 在 HumanEval 与 MBPP 上分别取得最高约 53% 与 55% 的分数且 Code Llama - Python 7B 在这两项基准上优于 Llama 2 70B。需要说明的是这些数据均来自论文原文与官方发布口径作为模型能力背景参考。在 Transformers 中Code Llama 与 Llama 2 使用同一套模型架构因此模型类不单独命名直接使用LlamaForCausalLM架构参考见 Llama 2 文档仓库仅在 models/code_llama 目录 下提供独立的 tokenizer 实现。精度选型float32 / bfloat16 / float16 怎么选Code Llama 底层基于 Llama 2 家族以bfloat16精度训练而原始推理习惯使用float16。三种精度在 Transformers 中的行为如下精度推荐场景说明float32默认初始化PyTorch 的约定是无论权重以何种 dtype 存储加载时统一转为float32Transformers 保持一致默认即此行为bfloat16继续训练 / 微调Code Llama 以该精度训练微调场景优先选用float16推理通常比bfloat16更快且相对bfloat16没有明显的评估指标下降微调后也建议在两种精度下分别验证推理结果关键机制除非在初始化时显式指定dtypeauto否则存储权重的 dtype 基本无关紧要。原因是模型先按在线检查点的 dtype 下载随后被强制转换为 torch 默认的float32只有在传入dtype参数时才会采用指定精度。因此若希望直接使用检查点存储的权重类型加载应写成from transformers import AutoModelForCausalLM model AutoModelForCausalLM.from_pretrained(path/to/checkpoint, dtypeauto)这一点同样适用于pipeline等上层 API例如pipeline(text-generation, modelmeta-llama/CodeLlama-7b-hf, dtypetorch.float16, device_mapauto)。从原始权重转换为 HF 格式Code Llama 与 Llama 2 家族共用同一个转换脚本 convert_llama_weights_to_hf.py官方原始代码见 Meta 的 llama 仓库。转换命令如下python src/transformers/models/llama/convert_llama_weights_to_hf.py \ --input_dir /path/to/downloaded/llama/weights --model_size 7B --output_dir /output/path运行注意事项内存要求脚本需要足够容纳整个模型的 CPU RAM即使是最小版本因为模型可能被切分为多个检查点如NUM_SHARDS中定义的 13B 为 2 个分片、34B 为 4 个分片、70B 为 8 个分片每个分片只包含各权重的一部分必须全部加载进内存才能拼装完整模型。转换完成后即可用LlamaForCausalLM与CodeLlamaTokenizer直接加载输出目录。从源码结构看转换脚本除 Code Llama 外还支持 Llama 3/3.1/3.2/Guard-3 等版本通过--llama_version与CONTEXT_LENGTH_FOR_VERSION映射不同上下文长度并处理 GQA/MQA 键值头分片与 RoPE 权重置换permute函数等细节。基础代码生成模型与分词器的加载转换完成后或直接从 Hub 加载官方检查点模型与 tokenizer 可按如下方式加载from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer CodeLlamaTokenizer.from_pretrained(meta-llama/CodeLlama-7b-hf) model LlamaForCausalLM.from_pretrained(meta-llama/CodeLlama-7b-hf)使用AutoModelForCausalLM与AutoTokenizer亦可且可配合device_mapauto与attn_implementationsdpa等参数from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer AutoTokenizer.from_pretrained(meta-llama/CodeLlama-7b-hf) model AutoModelForCausalLM.from_pretrained( meta-llama/CodeLlama-7b-hf, device_mapauto, attn_implementationsdpa, ) prompt # Function to calculate the factorial of a number\ndef factorial(n): input_ids tokenizer(prompt, return_tensorspt).to(model.device) output model.generate(**input_ids, max_new_tokens256, cache_implementationstatic) print(tokenizer.decode(output[0], skip_special_tokensTrue))代码填充Infilling让模型补全代码中间部分Code Llama 的核心特性之一是代码填充在输入中标记FILL_ME位置模型会生成该位置应填入的代码片段同时结合前后文prefix 与 suffix。使用要点在想要填充的位置写入tokenizer.fill_token默认即FILL_ME分词器会自动将输入按FILL_ME切分为前缀与后缀并按原始训练格式构造填充提示比自己手工拼装格式更稳健可规避 token 拼接等难以调试的陷阱。方式一手动生成 解码from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer CodeLlamaTokenizer.from_pretrained(meta-llama/CodeLlama-7b-hf) model LlamaForCausalLM.from_pretrained(meta-llama/CodeLlama-7b-hf) PROMPT def remove_non_ascii(s: str) - str: FILL_ME return result input_ids tokenizer(PROMPT, return_tensorspt)[input_ids] generated_ids model.generate(input_ids, max_new_tokens128) filling tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokensTrue)[0] print(PROMPT.replace(FILL_ME, filling))输出示例来自原文档def remove_non_ascii(s: str) - str: Remove non-ASCII characters from a string. Args: s: The string to remove non-ASCII characters from. Returns: The string with non-ASCII characters removed. result for c in s: if ord(c) 128: result c return result方式二pipeline 一行式若只需要填充片段本身可直接用pipelinefrom transformers import pipeline import torch generator pipeline(text-generation, modelmeta-llama/CodeLlama-7b-hf, dtypetorch.float16, device_mapauto) generator(def remove_non_ascii(s: str) - str:\n FILL_ME\n return result, max_new_tokens128)填充格式的源码级解析分词器内部如何将FILL_ME拆分成前后缀从 tokenization_code_llama.py 的tokenize/_encode_plus方法可以看到完整链路切分若文本包含fill_token且未显式提供 suffix则text, suffix text.split(self.fill_token)自动拆出前缀与后缀源码第 277-283 行。校验若prefix_id、middle_id、suffix_id任一为None则抛出ValueError提示该模型不支持 infilling源码第 286-292 行。对应测试test_no_infilling_init与test_fill_token测试文件第 115-118 行、第 334-350 行验证了这一行为。格式化调用set_infilling_processor(False, suffix_first..., add_special_tokens...)临时切换 post-processor将输入整理为原始训练模式默认suffix 在后PRE {pre} SUF{suf} MIDsuffix_firstTruePRE SUF{suf} MID {pre}若add_eos_tokenTrue还会在末尾追加eos_token源码第 229-275 行。恢复编码结束后调用set_infilling_processor(True)恢复普通模式normalizer 重新添加前缀空格并恢复 BOS 后处理。测试 test_infilling_tokenization 对多个真实场景Python 函数、bash 安装说明、类构造、Lean 定理证明验证了直接用FILL_ME文本编码与手动拆成 prefix/suffix 编码结果完全一致。另外注意填充时 prefix 与 suffix 的编码不使用 BOS 字符BOS 只出现在每个提示的开头suffix_first参数可用于需要先给出后缀的填充场景。CodeLlamaTokenizer基于 SentencePiece 的 BPE 分词器默认配置与特殊 tokenCodeLlamaTokenizer是一个基于字节级 BPE 的 tokenizer使用 ByteFallback 且不做 normalization。其默认配置与meta-llama/CodeLlama-7b-Instruct-hf的tokenizer_config.json保持一致支持 prompt infilling。默认参数如下源码第 112-130 行参数默认值作用clean_up_tokenization_spacesFalse解码后是否清理多余空格等伪影unk_tokenunk词表外 token 的兜底bos_tokens序列起始 tokeneos_token/s序列结束 tokenprefix_token▁PRE填充任务的前缀 tokenmiddle_token▁MID填充任务的中部 tokensuffix_token▁SUF填充任务的后缀 tokeneot_token▁EOT填充任务结束文本 tokenfill_tokenFILL_ME用于在前缀与后缀之间切分输入的标记add_bos_tokenTrue序列开头是否添加 BOSadd_eos_tokenFalse序列末尾是否添加 EOSuse_default_system_promptFalse是否使用 Llama 默认系统提示add_prefix_spaceTrue是否在输入前添加初始空格使首词与其他词同等处理所有填充相关 tokenprefix/middle/suffix/eot/fill会在初始化时自动并入additional_special_tokens。通过prefix_id、middle_id、suffix_id、eot_id等属性可快速获取对应 token id。分词细节Metaspace 预分词与 ByteFallback从源码可以看到分词器使用pre_tokenizers.Metaspace(replacement▁, prepend_schemefirst, splitFalse)作为预分词器解码器由Replace(▁, )、ByteFallback()、Fuse()与Strip(content , left1)顺序组合而成源码第 158-165 行。这带来两个可观察的行为解码时首词不加前缀空格SentencePiece 的一个特点是当解码序列的第一个 token 是单词开头如 Banana时tokenizer 不会在字符串开头添加前缀空格。这在测试 test_no_differences_decode 中也有体现。任意 UTF-8 文本可无损编码通过 ByteFallback中文等多字节字符会被拆成0xXX字节 token测试test_simple_encode_decode验证了生活的真谛是的编解码往返一致性测试文件第 223-236 行。若需要修改bos_token或eos_token应在初始化模型时显式指定或调用tokenizer.update_post_processor()确保后处理正确——否则编码序列的首 token 与末 token 值会不正确。内存估算与模型规模参考由于 Code Llama 支持超长上下文训练 16K、生成可稳定到 100K token运行前建议评估 CPU/GPU 内存需求可参考 HF 提供的模型内存占用计算工具hf-accelerate/model-memory-usageSpace估算具体数值避免 OOM。补充量化推理与注意力可视化当模型规模较大如 34B、70B时可在推理中引入量化以降低显存占用。以下示例使用 bitsandbytes 将权重量化为 4-bitNF4 双重量化计算 dtype 为bfloat16# pip install bitsandbytes import torch from transformers import AutoModelForCausalLM, BitsAndBytesConfig, CodeLlamaTokenizer bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_quant_typenf4, bnb_4bit_use_double_quantTrue, ) tokenizer CodeLlamaTokenizer.from_pretrained(meta-llama/CodeLlama-34b-hf) model AutoModelForCausalLM.from_pretrained( meta-llama/CodeLlama-34b-hf, device_mapauto, quantization_configbnb_config, ) prompt # Write a Python function to check if a string is a palindrome\ndef is_palindrome(s): input_ids tokenizer(prompt, return_tensorspt).to(model.device) output model.generate(**input_ids, max_new_tokens200, cache_implementationstatic) print(tokenizer.decode(output[0], skip_special_tokensTrue))此外仓库还提供了 AttentionMaskVisualizer 工具可直观理解模型能/不能 attend 到的 tokenfrom transformers.utils.attention_visualizer import AttentionMaskVisualizer visualizer AttentionMaskVisualizer(meta-llama/CodeLlama-7b-hf) visualizer(def func(a, b): return a b)注意事项小结结合原文档与仓库实现使用 Code Llama 时有以下几点需要特别留意填充能力范围infilling 仅在 7B / 13B 基础模型中可用Python 特化版、Instruct 版、34B 与 70B 模型不支持英文文档 Notes 一节明确说明。精度纪律训练/微调用bfloat16推理用float16不要忘记dtypeauto的语义否则权重会被静默转为float32。BOS 位置填充时前缀与后缀内部不加 BOSBOS 只出现在每个提示的开头。tokenizer 行为CodeLlamaTokenizerFast在当前仓库中作为CodeLlamaTokenizer的向后兼容别名导出见 源码第 355-358 行分词采用 Metaspace 预分词 ByteFallback无 normalization与 Llama 2 系保持一致legacyFalse语义。转换脚本内存权重转换需将全部 checkpoint 分片加载进内存请预留充足 CPU RAM。参考资源模型文档docs/source/ja/model_doc/code_llama.md本文主体、docs/source/en/model_doc/code_llama.md架构参考Llama 2 文档Tokenizer 实现src/transformers/models/code_llama/tokenization_code_llama.pyTokenizer 测试tests/models/code_llama/test_tokenization_code_llama.py权重转换脚本src/transformers/models/llama/convert_llama_weights_to_hf.py注意力可视化src/transformers/utils/attention_visualizer.py【免费下载链接】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),仅供参考
上一篇/下一篇内容由系统自动关联 返回资讯列表 →