llama.cpp 完整实操指南:下载编译 + Gemma4-E4B-it 模型转换与运行测试(避坑版)

前言:最近在部署Gemma4-E4B-it多模态模型时,踩了无数llama.cpp的坑(比如Makefile废弃、模板参数报错、多GPU冲突等),整理了一套从llama.cpp下载、编译,到模型转换、量化、单卡运行的完整流程,所有指令可直接复制粘贴,新手也能快速上手,全程避坑!

环境说明:Ubuntu系统(容器内也适用)、NVIDIA RTX 4090显卡(单卡/多卡均适配)、Python 3.8+,已安装CUDA toolkit。

一、llama.cpp 下载与编译(CMake版,弃用Makefile)

重点:llama.cpp 已彻底废弃Makefile,全部改用CMake编译,用make命令会直接报错,这是最容易踩的第一个坑!

1. 下载llama.cpp源码

克隆官方最新源码,进入目录:

# 克隆源码(国内可替换为镜像地址,速度更快)
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp

2. 安装编译依赖

安装CMake及相关依赖,确保编译顺利:

apt update
apt install -y build-essential cmake pkg-config libopenblas-dev

3. CMake编译(开启CUDA加速,适配多模态)

核心编译命令,开启CUDA支持(必须加,否则无法用GPU加速):

# 清理旧编译文件(首次编译可跳过,更新源码后必执行)
rm -rf build

# CMake配置(开启CUDA、多模态支持)
cmake -B build -DLLAMA_CUDA=ON -DLLAMA_MULTIMODAL=ON

# 多核编译(-j$(nproc) 自动适配CPU核心数,加速编译)
cmake --build build --config Release -j$(nproc)

编译完成后,所有可执行文件(如llama-mtmd-cli、llama-quantize)都会在 build/bin/ 目录下,后续所有操作都依赖该目录下的工具。

二、Gemma4-E4B-it 多模态模型转换(关键避坑)

Gemma4-E4B-it是Google原生多模态模型(支持文本+图像),llama.cpp运行需拆分转换为「文本模型(LLM)+ 视觉投影器(mmproj)」,且必须用正确参数,否则转换失败或运行崩溃。

1. 准备工作:安装转换依赖

# 安装模型转换所需依赖(在llama.cpp目录下执行)
pip install torch transformers accelerate pillow

2. 下载Gemma4-E4B-it原始模型(Hugging Face)

先创建模型目录,再下载原始模型(需安装git-lfs):

# 创建模型目录(路径可自定义,后续统一即可)
mkdir -p ../models/gemma4-E4B-it
cd ../models/gemma4-E4B-it

# 安装git-lfs(用于下载大文件)
git lfs install

# 克隆原始模型(Google官方仓库)
git clone https://huggingface.co/google/gemma-4-E4B-it

下载完成后,模型路径为:/root/xxx/gemma_proj/models/gemma4-E4B-it/gemma-4-E4B-it(可根据自己的实际路径修改)。

3. 转换模型(分2步:视觉投影器 + 文本模型)

重点:老版本llama.cpp的--vision-only参数已废弃,改用--mmproj参数,否则会报“unrecognized arguments”错误!

第一步:转换视觉投影器(mmproj,多模态核心)

回到llama.cpp目录,执行转换命令,生成mmproj文件(保持F16精度,视觉效果最好):

cd ../../llama.cpp

# 转换视觉投影器(mmproj)
python convert_hf_to_gguf.py \
/root/xxx/gemma_proj/models/gemma4-E4B-it/gemma-4-E4B-it \
--outfile ../mmproj-gemma-4-E4B-it-f16.gguf \
--mmproj \
--outtype f16

第二步:转换文本模型(LLM)

转换为F16格式(后续可量化为INT4,节省显存):

python convert_hf_to_gguf.py \
/root/xxx/gemma_proj/models/gemma4-E4B-it/gemma-4-E4B-it \
--outfile ../gemma-4-E4B-it-f16.gguf \
--outtype f16

4. 模型量化(可选但强烈推荐:INT4,显存减半)

原始F16模型约14GB,量化为INT4(q4_K_M格式,llama.cpp最优量化)后仅7GB左右,速度翻倍,效果几乎无损失,单卡也能轻松运行:

# 量化为INT4(q4_K_M格式)
./build/bin/llama-quantize \
../gemma-4-E4B-it-f16.gguf \
../gemma-4-E4B-it-q4_K_M.gguf \
q4_K_M

量化完成后,会生成INT4版本模型:gemma-4-E4B-it-q4_K_M.gguf,后续优先使用该模型。

三、Gemma4-E4B-it 模型运行测试(单卡稳定版)

llama-mtmd-cli(多模态专用工具)多GPU环境下默认会分片加载,推荐强制单卡运行,更稳定。

1. 核心运行命令(单卡+INT4模型+多模态看图)

强制使用0号显卡(第一张卡),关闭自动显存适配(-fit off,避免崩溃),完整命令:

CUDA_VISIBLE_DEVICES=0 \
./build/bin/llama-mtmd-cli \
-m ../gemma-4-E4B-it-q4_K_M.gguf \
--mmproj ../mmproj-gemma-4-E4B-it-f16.gguf \
--image /root/xxx/gemma_proj/test1.jpeg \
-p "详细描述这张图片" \
-ngl 99 \
-fit off \
--jinja

2. 命令参数详解(新手必看)

  • CUDA_VISIBLE_DEVICES=0:强制只使用0号显卡(单卡运行,避免多卡分片冲突,最稳定),换卡可改为1、2、3。

  • ./build/bin/llama-mtmd-cli:llama.cpp多模态专用运行工具,看图必须用这个,不能用llama-cli。

  • -m ../gemma-4-E4B-it-q4_K_M.gguf:指定INT4量化后的文本模型路径。

  • --mmproj ../mmproj-gemma-4-E4B-it-f16.gguf:指定视觉投影器路径(必须和文本模型匹配,不能量化)。

  • --image 图片路径:指定需要识别的图片路径(替换为自己的图片路径,支持jpeg、png格式)。

  • -p "详细描述这张图片":给模型的提示词,可根据需求修改(如“识别图片中的物体”“分析图片内容”)。

  • -ngl 99:将所有模型层加载到GPU(INT4模型单卡可轻松承载,F16模型建议改为20,避免显存不足)。

  • -fit off:关闭llama.cpp自动显存分配功能,避免Gemma4大模型+多模态导致的崩溃(核心避坑参数)。

3. 运行成功标志

执行命令后,出现以下日志,说明模型加载成功,正在看图推理:

ggml_cuda_init: found 1 CUDA devices (Total VRAM: 24217 MiB):
  Device 0: NVIDIA GeForce RTX 4090, compute capability 8.9, VMM: yes, VRAM: 24217 MiB
llama_model_loader: loaded meta data with 45 key-value pairs and 720 tensors from ../gemma-4-E4B-it-q4_K_M.gguf (version GGUF V3 (latest))
load_tensors: loading model tensors, this can take a while...
load_tensors: offloaded 43/43 layers to GPU
...

后续会输出图片的详细描述,说明多模态运行成功。

四、常见报错及解决方案(避坑汇总)

1. 报错:Makefile:6: *** Build system changed: The Makefile build has been replaced by CMake.

解决方案:弃用make命令,改用本文第一部分的CMake编译流程。

2. 报错:unrecognized arguments: --vision-only

解决方案:llama.cpp新版本已废弃--vision-only,替换为--mmproj参数(参考模型转换步骤)。

3. 报错:GGML_ASSERT(n_inputs < GGML_SCHED_MAX_SPLIT_INPUTS) failed

解决方案:加参数-fit off,关闭自动显存适配。

4. 报错:invalid argument: --chat-template-file

解决方案:llama-mtmd-cli不支持模板参数,删除--chat-template-file、--jinja等所有模板相关参数。

5. 多GPU环境下运行不稳定

解决方案:用CUDA_VISIBLE_DEVICES=0强制单卡运行,避免多卡分片冲突。

五、总结

本文梳理了llama.cpp从下载、编译,到Gemma4-E4B-it多模态模型转换、量化、单卡运行的完整流程,核心避坑点:

  • llama.cpp 用CMake编译,弃用Makefile;

  • Gemma4转换需分两步(mmproj+文本模型),用--mmproj替代--vision-only;

  • llama-mtmd-cli不支持模板参数,删除所有模板相关配置;

  • 大模型+多模态必加-fit off,单卡运行更稳定;

  • INT4量化(q4_K_M)是最优选择,兼顾速度和效果。

所有指令均已实测可用,复制粘贴即可快速部署,新手也能轻松上手。如果遇到其他报错,可在评论区留言,及时回复解决!