跳到主要内容

LLaVA

当前实现支持 llava-v1.5 变体,以及 llava-1.6 llava-v1.6 变体。

已预转换的 7b13b 模型已可获取。对于 llava-1.6,也提供了多种准备好的 gguf 格式模型 7b-34b

API 确认后,将支持/上传更多模型。

使用方法

构建 llama-mtmd-cli 二进制文件。

构建完成后,运行:./llama-mtmd-cli 查看使用说明。例如:

./llama-mtmd-cli -m ../llava-v1.5-7b/ggml-model-f16.gguf \
--mmproj ../llava-v1.5-7b/mmproj-model-f16.gguf \
--chat-template vicuna

注意: 建议使用较低的温度值(如 0.1)以获得更好的质量。在命令中添加 --temp 0.1 即可。

注意: 对于 GPU 加速,请像往常一样使用 -ngl 标志。

LLaVA 1.5

  1. 克隆 LLaVA 和 CLIP 模型(可用选项)。例如:
git clone https://huggingface.co/liuhaotian/llava-v1.5-7b

git clone https://huggingface.co/openai/clip-vit-large-patch14-336
  1. 安装所需的 Python 包:
pip install -r tools/mtmd/requirements.txt
  1. 使用 llava_surgery.py 将 LLaVA 模型分离为 LLaMA 和多模态投影器组件:
python ./tools/mtmd/llava_surgery.py -m ../llava-v1.5-7b
  1. 使用 convert_image_encoder_to_gguf.py 将 LLaVA 图像编码器转换为 GGUF 格式:
python ./tools/mtmd/convert_image_encoder_to_gguf.py -m ../clip-vit-large-patch14-336 --llava-projector ../llava-v1.5-7b/llava.projector --output-dir ../llava-v1.5-7b
  1. 使用 examples/convert_legacy_llama.py 将 LLaVA 的 LLaMA 部分转换为 GGUF 格式:
python ./examples/convert_legacy_llama.py ../llava-v1.5-7b --skip-unknown

现在 LLaMA 部分和图像编码器都位于 llava-v1.5-7b 目录中。

LLaVA 1.6 gguf 转换

  1. 首先克隆 LLaVA 1.6 模型:
git clone https://huggingface.co/liuhaotian/llava-v1.6-vicuna-7b
  1. 安装所需的 Python 包:
pip install -r tools/mtmd/requirements.txt
  1. 使用 llava_surgery_v2.py,该脚本同时支持 llava-1.5 变体的 pytorch 和 safetensor 模型:
python tools/mtmd/llava_surgery_v2.py -C -m ../llava-v1.6-vicuna-7b/
  • 您将在模型目录中找到 llava.projector 和 llava.clip 文件
  1. 将 llava.clip 文件复制到子目录(如 vit),将其重命名为 pytorch_model.bin,并向目录添加合适的 vit 配置:
mkdir vit
cp ../llava-v1.6-vicuna-7b/llava.clip vit/pytorch_model.bin
cp ../llava-v1.6-vicuna-7b/llava.projector vit/
curl -s -q https://huggingface.co/cmp-nct/llava-1.6-gguf/raw/main/config_vit.json -o vit/config.json
  1. 创建视觉 gguf 模型:
python ./tools/mtmd/convert_image_encoder_to_gguf.py -m vit --llava-projector vit/llava.projector --output-dir vit --clip-model-is-vision
  • 这与 llava-1.5 类似,区别在于我们告诉编码器我们正在使用 CLIP 的纯视觉模型部分
  1. 然后将模型转换为 gguf 格式:
python ./examples/convert_legacy_llama.py ../llava-v1.6-vicuna-7b/ --skip-unknown
  1. 最后,我们可以使用 1.6 模型版本运行 llava 命令行界面:
./llama-mtmd-cli -m ../llava-v1.6-vicuna-7b/ggml-model-f16.gguf --mmproj vit/mmproj-model-f16.gguf

注意: llava-1.6 比 llava-1.5 需要更多上下文,至少需要 3000(建议使用 -c 4096 运行)

注意: llava-1.6 大大受益于批量提示处理(默认设置即可)

注意: 如果第 6 步中的语言模型与旧版转换脚本不兼容,处理 LLM 模型转换的最简单方法是在 transformers 中加载模型,并仅从 llava next 模型中导出 LLM。

import os
import transformers

model_path = ...
llm_export_path = ...

tokenizer = transformers.AutoTokenizer.from_pretrained(model_path)
model = transformers.AutoModelForImageTextToText.from_pretrained(model_path)

tokenizer.save_pretrained(llm_export_path)
model.language_model.save_pretrained(llm_export_path)

然后,您可以使用 convert_hf_to_gguf.py 脚本转换 LLM,该脚本处理更多 LLM 架构。

聊天模板

对于 llava-1.5 和 llava-1.6,您需要使用 vicuna 聊天模板。只需添加 --chat-template vicuna 即可激活此模板。

如何判断您正在运行 llava-1.5 还是 llava-1.6 模式

运行 llava-cli 时,您将在提示被处理之前看到视觉信息:

Llava-1.5: encode_image_with_clip: image embedding created: 576 tokens

Llava-1.6(576 以上的任何值): encode_image_with_clip: image embedding created: 2880 tokens

或者,注意您的提示使用了多少"标记",llava-1.6 也会显示 1000+ 标记。