Code Llama 推理实战指南:一个仓库跑通代码补全、代码填充与指令对话
【免费下载链接】codellamaInference code for CodeLlama models项目地址: https://gitcode.com/GitHub_Trending/cod/codellama
如果你想在自己的 GPU 上用 Code Llama 这个代码大模型做补全、填充和指令对话,这个官方推理代码仓库 codellama 是最快的入口:纯 PyTorch 实现,自带权重下载脚本和三个可直接运行的示例,从克隆到看到第一段生成的代码,一小时内就能搞定。
先弄清这个仓库是什么:推理代码,不是模型权重
很多人克隆下来后期待在目录里找到模型文件,其实没有。这个仓库的定位官方写得很明确:加载 Code Llama 模型并跑推理的最小示例(官方文档:README.md)。它真正提供的东西有四样:
llama/核心实现:model.py里是带 RMSNorm 和 RoPE 旋转位置编码的 Transformer,用 fairscale 张量并行实现(源码:llama/model.py);generation.py封装了Llama入口类,负责加载权重、批采样和提示词格式化(源码:llama/generation.py);tokenizer.py是 sentencepiece 分词器的薄封装。download.sh权重下载与校验脚本。- 三个可运行示例:
example_completion.py(代码补全)、example_infilling.py(代码填充)、example_instructions.py(指令对话)。 setup.py和依赖清单,一条pip install -e .装好全部依赖。
三类模型家族,先按用途选
Code Llama 分三类,每类都有 7B、13B、34B、70B 四档规格:
| 模型家族 | 训练方式 | 适合场景 |
|---|---|---|
| Code Llama | 基础模型,代码高比例采样微调 | 代码补全、自然续写 |
| Code Llama - Python | 针对 Python 专门微调 | 纯 Python 项目 |
| Code Llama - Instruct | 指令跟随微调 | 对话式问答与任务指令 |
两个容易踩的坑先记住:基础模型(前两类)不懂"问问题",prompt 要写成让期望答案成为上下文的自然延续,比如直接接在def fizzbuzz(n: int):后面;Instruct 版本则必须套上[INST]/[/INST]标签,好消息是仓库里的chat_completion()已经帮你处理了这套格式,直接调用即可。另外只有 7B、13B 的基础版和 Instruct 版支持代码填充——在<FILL>占位符前后给出上下文,模型补出中间缺失的代码。
用邮件链接下载 Code Llama 权重并校验完整性
权重不在任何公开存储上,需要先到 Meta 官网申请下载授权(接受 Llama 2 社区许可),审批通过后邮件会给你一个签名 URL。👇
download.sh 脚本的完整流程
脚本逻辑不复杂:读入你粘贴的 URL,让你勾选要下哪些模型(默认全部 12 个),然后逐个模型用wget --continue下载权重分片,每下完一个目录就用md5sum -c checklist.chk校验一遍(官方脚本:download.sh):
git clone https://gitcode.com/GitHub_Trending/cod/codellama cd codellama pip install -e . bash download.sh三个注意事项,都是仓库里明说的:从邮件复制链接时要复制 URL 文本本身,不要右键"复制链接地址",正确的链接以https://download.llamameta.net开头,复制错的会带l.facebook.com前缀;链接 24 小时后过期且有下载次数上限,遇到403: Forbidden重新申请即可;权重体积大,7B 约 12.55GB、13B 24GB、34B 63GB、70B 131GB,先规划好磁盘空间。
五分钟跑通第一段本地代码生成
假设环境里已有 PyTorch 和 CUDA,权重已就位,剩下的就是跑示例。以 7B 基础版做补全为例,prompt 是一个代码存根,模型会顺着语义继续写下去(官方示例:example_completion.py):
torchrun --nproc_per_node 1 example_completion.py \ --ckpt_dir CodeLlama-7b/ \ --tokenizer_path CodeLlama-7b/tokenizer.model \ --max_seq_len 128 --max_batch_size 4这里--nproc_per_node是模型并行的进程数,7B 填 1;max_seq_len和max_batch_size用于预分配 KV 缓存,按你的显存来定,别凭感觉拉满。
代码填充与指令对话两条路径
填充只支持 7B/13B,命令形态和补全一样,换成 infilling 示例即可:
torchrun --nproc_per_node 1 example_infilling.py \ --ckpt_dir CodeLlama-7b/ \ --tokenizer_path CodeLlama-7b/tokenizer.model \ --max_seq_len 192 --max_batch_size 4示例里的 prompt 都含一个<FILL>,脚本把它切成前缀和后缀,交给text_infilling()补出中间部分。指令对话则把问题写成消息列表传给chat_completion(),函数自动完成INST标签与 system 提示的格式化(官方示例:example_instructions.py);70B Instruct 走的是独立的逐轮对话格式,仓库里的dialog_prompt_tokens()同样帮你封装好了。
模型并行数与长上下文参数怎么按 GPU 数量配置
MP 值与进程数一一对应
Code Llama 用 fairscale 张量并行把权重切到多卡上,每卡对应加载一个consolidated.{n}.pth分片文件(源码:llama/generation.py):
| 模型 | 权重分片数 | torchrun --nproc_per_node |
|---|---|---|
| 7B | 1 | 1 |
| 13B | 2 | 2 |
| 34B | 4 | 4 |
| 70B | 8 | 8 |
进程数传错会直接报错Loading a checkpoint for MP=... but world size is ...,从报错信息就能知道该怎么改。
10 万 token 长上下文与显存取舍
除 70B 的 Python 和 Instruct 版本外,所有模型都支持最长 10 万 token 的输入,但要注意两点:模型是在 16k token 序列上训练的,超长输入属于外推能力,效果需要自己验证;max_seq_len直接决定缓存预分配大小,把它设成 100000 而max_batch_size不动,7B 在单卡上很快就会 OOM。实际做法是批次降到 1、序列长度按真实最长输入给,别为了"能用"而虚标。
用熟官方仓库之后:往服务化、安全与量化方向走
官方仓库刻意只给最小可运行样例,服务化部分得自己补。我常用的是下面三条路线:
把推理包成 API 服务
Llama.build()返回的 generator 对象提供text_completion、text_infilling、chat_completion三个方法,返回值都是结构化字典,外面套一层 FastAPI 之类的框架就是一个可用的代码补全服务,请求参数映射也很直接。
加一层安全过滤
官方建议在生产部署中额外挂一个分类器,过滤掉被认为不安全的输入和输出,相当于在服务层做输入输出拦截。上线前也建议通读一遍模型卡和使用政策,里面明确了模型的预期行为和限制(官方文档:MODEL_CARD.md、USE_POLICY.md)。
显存不够时的量化路线
全精度装不下 34B 时,常见做法是转向支持 4/8bit 量化的社区推理框架来加载同一套权重。切框架时最容易丢的是提示词格式:基础模型的续写风格和 Instruct 的对话格式不通用,务必对照本仓库三个示例的 prompt 写法,格式对了,效果才谈得上对齐。
写在最后
这个仓库的价值不在于"功能多",而在于它把 Code Llama 推理链路里最关键的环节——权重加载、张量并行、三种提示格式、下载校验——用最小代码量讲清楚了。读懂它之后,无论是自己包 API、接量化框架还是做安全过滤,你手上都有一个可以对标的官方基准实现,这也是它比任何第三方封装都适合作为起点的原因。
【免费下载链接】codellamaInference code for CodeLlama models项目地址: https://gitcode.com/GitHub_Trending/cod/codellama
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考