一行命令把 Hugging Face 模型转成 PowerInfer GGUF?零门槛实操指南
【免费下载链接】PowerInferHigh-speed Large Language Model Serving for Local Deployment项目地址: https://gitcode.com/gh_mirrors/po/PowerInfer
PowerInfer 仓库根目录下的转换脚本 convert-hf-to-powerinfer-gguf.py,能把 Hugging Face 格式的 LLM 权重加上 MLP predictor 权重,合并成一个 PowerInfer 可直接加载的 GGUF 文件。跟着本文做完,你手里会多出一个能跑稀疏推理的*.powerinfer.gguf。
为什么需要这一步
PowerInfer 的稀疏推理引擎吃不了 Hugging Face 的原始权重,它要求把 LLM 权重和每一层的 MLP predictor 权重打进同一个 PowerInfer GGUF 文件里,并用PWRI魔数标记格式。这两个目录的张量命名、精度、转置规则各不相同,手工拼既慢又容易错,交给脚本一次搞定。
🎬 先看效果
最终产物就一个文件,且能用两步验证它真的对。
文件头 4 个字节被改写成PWRI魔数,与标准 GGUF 区分开;把它丢给 PowerInfer 推理入口就能出 token:
./build/bin/main -m 你的模型.powerinfer.gguf -n 128 -t 8 -p "Once upon a time"
看到逐 token 的输出和 tokens/s 统计,说明转换链路全部打通。完整命令在下一节给。
🛠 动手流程
第 1 步:环境检查
要求 Python 3.8+ 和 pip,转换本身不需要编译 C++ 部分。
git clone https://gitcode.com/gh_mirrors/po/PowerInfer cd PowerInfer pip install -r requirements.txtrequirements.txt里带 numpy、sentencepiece、transformers,并会自动装好 gguf-py/ 和 powerinfer-py/ 两个本地包。执行完没有报错、python -c "import gguf"无输出,就算通过。
第 2 步:准备两份材料
转换脚本需要两个目录,缺一不可:
- 模型目录:
config.json(声明架构,如LlamaForCausalLM)、分词器(Llama 系是tokenizer.model)、权重文件(.safetensors或.bin,分片也支持) - predictor 目录:按层命名的
model_0.pt、model_1.pt……;可选放一个config.json,写sparse_threshold控制稀疏阈值
ls ./llama-7b-relu ./llama-7b-relu-predictor两个目录里都能看到对应文件,这一步才算完成。predictor 目录里.pt文件的数量应当与模型层数一致,少了就意味着 predictor 没下全。
第 3 步:执行转换命令
python convert-hf-to-powerinfer-gguf.py \ ./llama-7b-relu ./llama-7b-relu-predictor \ --outfile ./llama-7b-relu.powerinfer.gguf \ --outtype f16过程会逐行打印每个张量的映射和精度变化,先写 predictor 再写模型权重。结尾出现Model successfully exported to ...即成功;此时文件头已被写入PWRI魔数。
第 4 步:验证结果
head -c 4 ./llama-7b-relu.powerinfer.gguf ./build/bin/main -m ./llama-7b-relu.powerinfer.gguf -n 128 -t 8 -p "Once upon a time"第一条输出应是PWRI四个字;第二条能正常生成文本。两条都通过,这个 GGUF 才算真正可用。
参数速查
| 参数 | 作用 | 何时使用 |
|---|---|---|
model(位置参数) | 原始模型权重目录,脚本从其中的config.json判断架构 | 每次转换必传 |
mlp_predictors(位置参数) | MLP predictor 权重目录(.pt文件),一并打进 GGUF | 要跑 PowerInfer 稀疏推理必传 |
--outfile | 指定输出 GGUF 的完整路径 | 想自定义文件名或放到别的目录时 |
--outtype f32 / f16 | 决定权重写入精度 | 显存、磁盘紧张选f16;追求精度选f32 |
--vocab-only | 只导出词汇表,不写权重 | 仅需补一个带 vocab 的 GGUF 头文件时 |
--bigendian | 生成大端序文件 | 目标机器是大端架构时 |
predictor 目录里的config.json不是命令行参数,但能写sparse_threshold:想调整 hot/cold 神经元划分比例时改这里,重新转换即可生效。
🕳 你可能踩的 3 个坑
现象:Error: xxx is not a directory根因:位置参数传成了文件路径,或目录名打错、路径写了一半。 修复:先用ls确认两个目录真实存在,再原样复制路径执行。
现象:Architecture "XxxForCausalLM" not supported!根因:config.json里的架构不在支持列表内,目前脚本只认 Llama、Falcon、OPT 三类。 修复:换受支持的模型,或参考脚本里的Model子类为新架构补一个实现。
现象:Error: Missing .../tokenizer.model根因:Llama 系走 SentencePiece 分词,但模型目录里的分词文件没下全。 修复:重新完整下载模型目录,确认tokenizer.model就位再转换。
继续深入
- 不想要 predictor、只想跑稠密模式:用 convert-dense.py 转出兼容 llama.cpp 的稠密 GGUF
- 文件还是太大:进 examples/quantize/ 把 GGUF 量化到更低比特
- 想在自己的程序里调用转换与稀疏求解逻辑:看 powerinfer-py/ 的 Python 封装
- 想搞懂 GGUF 头里每个字段:读 gguf-py/ 的格式定义
- 更多模型下载与推理命令示例:README.md
【免费下载链接】PowerInferHigh-speed Large Language Model Serving for Local Deployment项目地址: https://gitcode.com/gh_mirrors/po/PowerInfer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考