llama2.c 如何导出 Code Llama 并指定自定义 tokenizer 完成推理
【免费下载链接】llama2.cInference Llama 2 in one file of pure C项目地址: https://gitcode.com/GitHub_Trending/ll/llama2.c
如果你已经拿到 Meta 发布的 Code Llama 7B 权重,想在本仓库 llama2.c 里用纯 C 的run.c推理引擎跑它,需要完成三件事:把 Meta 格式的 checkpoint 导出为 llama2.c 能读取的.bin文件、为 Code Llama 构建对应的 tokenizer.bin文件、再在推理时通过-z参数把两者接起来。README 明确说明:Code Llama 的推理支持不完整,plain 和 instruct 两个变体都必须构建自己的 tokenizer 并在推理时传入,否则 C 端会默认加载仓库自带的 Llama 2 tokenizer(run.c 中tokenizer_path默认值为tokenizer.bin)。
准备条件
- Code Llama 权重:先按 README「Meta's Llama 2 models」一节的流程从 Meta 官方渠道获取 checkpoint,得到一个包含
params.json和consolidated.*.pth分片文件的目录,后文用/path/to/CodeLlama-7b指代该目录(export.py 的load_meta_model正是读取params.json并按consolidated.*.pth排序加载的)。 - Python 依赖:
pip install -r requirements.txt- 编译 C 推理程序:
make run该目标会编译出run(float32 前向)和runq(int8 量化版)两个可执行文件。大模型推理更推荐 Makefile 中的 OpenMP 目标(如make runomp),本文主路径使用make run。
导出 Code Llama 7B 权重
python export.py codellama2_7b.bin --meta-llama /path/to/CodeLlama-7b要点:
- 第一个参数是输出文件名,导出完成后
codellama2_7b.bin出现在当前目录。 --meta-llama指向 Meta 格式 checkpoint 所在目录;--checkpoint(本仓库训练出的.pt文件)和--hf(Hugging Face 目录)二选一互斥,本场景用--meta-llama。- 不加
--version时默认按 version 0 的 float32 格式导出。README 中 7B 模型(llama2_7b)的同类导出约需 10 分钟、生成 26GB 文件(7B 权重的 float32 体积),Code Llama 7B 是同一量级,导出前确认磁盘空间。
构建 Code Llama 的 tokenizer
Code Llama 不能直接复用仓库默认的 Llama 2 tokenizer,需要把 checkpoint 目录里自带的 sentencepiecetokenizer.model转换成 C 端可加载的.bin:
python tokenizer.py --tokenizer-model=/path/to/CodeLlama-7b/tokenizer.modeltokenizer.py 会先断言--tokenizer-model指向的文件存在,加载 sentencepiece 模型后,把.model同目录同名的tokenizer.bin写出。所以上面执行完,产物路径就是/path/to/CodeLlama-7b/tokenizer.bin,正好对应 README 里推理命令用的路径。
这一步是 README 的硬性要求:"Make sure to build the tokenizer for the plain and instruct variants and pass it when doing inference."
运行推理
./run codellama2_7b.bin -z /path/to/CodeLlama-7b/tokenizer.bin-z指定自定义 tokenizer 路径(run.c 帮助文本:-z <string> optional path to custom tokenizer)。不带-z时加载默认 Llama 2 tokenizer,README 的 custom tokenizers 一节说明此时模型输出的整数序列会用错误的词表翻译成文本,看起来是乱码。- 可叠加采样参数控制输出,例如:
./run codellama2_7b.bin -z /path/to/CodeLlama-7b/tokenizer.bin -t 0.8 -n 256 -i "def sort(arr):"README 建议的采样参数是 temperature 1.0(默认)配合 top-p 0.9(默认),即-t 1.0 -p 0.9;调节多样性时建议温度与 top-p 二者只动一个。
结果验证
- 推理正常时,终端会流式打印采样出的文本。
- 如果
-z路径写错,run.c的build_tokenizer会打印couldn't load <path>并直接退出,这是检查 tokenizer 路径最直接的信号。 - 注意 README 的已知限制:Code Llama 部分超参数与 Llama 2 不同(例如 RoPE 层的常量),"the inference is not exactly correct and a bit buggy right now",即输出正确性不保证完全一致,属于文档明示的当前状态,不是导出流程做错了。
可选分支:Code Llama Instruct 对话模式
instruct 变体需要单独导出并构建自己的 tokenizer,然后用-m chat进入对话模式:
python export.py codellama2_7b_instruct.bin --meta-llama /path/to/CodeLlama-7b-Instruct python tokenizer.py --tokenizer-model=/path/to/CodeLlama-7b-Instruct/tokenizer.model ./run codellama2_7b_instruct.bin -m chat -z /path/to/CodeLlama-7b-Instruct/tokenizer.bin限制与边界
- 不要尝试 7B 以上:README 说明 13B+ 因指针运算的整型流转目前跑不通,且本仓库只做 float32 推理,更大模型即使能加载也基本不可用。
- 量化路径不适用于本场景的默认导出:
--version 2的 Q8_0 导出配合 runq.c 使用,README 给出的 Code Llama 命令未包含量化版本。 - 编译加速、OpenMP 线程数等属于性能话题,可按 README 的 performance 一节单独处理,不影响本文的导出与推理主路径。
【免费下载链接】llama2.cInference Llama 2 in one file of pure C项目地址: https://gitcode.com/GitHub_Trending/ll/llama2.c
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考