Asagi-VLMは日本語に特化したオープンなVision&Languageモデル(VLM)で、出力物の利用に制限のあるLLM(GPT-4oなど)を合成プロセスにおいて使用していないという利点があり、2.3B、4.2B、7.8B、14.2Bの複数モデルがあります。日本語対応のVLMは貴重なモデルなので色々試してみようと思ったのですが、GGUF化されたモデルが見当たらなかった為(MLX-VLM等への変換も失敗しました)、GGUF化を自力でやってみた手順を紹介します。
1.GGUF化の準備
Llama.cppを使うので下記等を参考にインストーします。
AsagiのモデルをLlama.cpp直下のmodelフォルダにダウンロードしておきます。
AsagiはLLMにllm-jp-3を、画像系にはGoogle/Siglipを使っており、変換処理に必要なllm-jp-3用のtokenizer.model(「llm-jp-tokenizer-100k.ver3.0b1.model」)をmodelフォルダにダウンロードしておきます。
2. 手順 ①
Llama.cppのGithubにあるLlava用の公式手順ではうまく行かなかったので、詳しく解説します。
まず最初にLlama.cppのtools/mtmd/llava_surgery_v2.pyを使って元のモデルからprojectorとclipを取り出します(llava_surgery.pyはpytorch_model.bin専用で、model.safetensorsには未対応らしい)。
python tools/mtmd/llava_surgery_v2.py -C -m {Path to your Asagi model}
正常に動作すればモデルフォルダ内にllava.clipとllava.projectorの2つのファイルが生成されますので、llava.clipをpytorch_model.binに名前を変更します。
3. 手順 ②
次に下記コマンドでimage_encoderをGGUFに変換します。
python convert_image_encoder_to_gguf.py -m {Path to your Asagi model} --llava-projector {Path to your Asagi model}/llava.projector --output-dir {Path to your Asagi model} --clip-model-is-siglip
公式の説明はsiglip前提の記載になっていない為、最後のargsが--clip-model-is-visionになっており、かなりエラーで悩まされましたが上記でうまくいくはずです。また、この処理でconfig.jsonの各パラメータを参照しており、公式のように他からconfig.jsonを持ってくると失敗する可能性大ですので、Asagiの元のconfig.jsonをそのまま使えば上手くいくはずです。もしエラー等が出る場合は、下記のgoogle/siglip2-so400m-patch14-384のconfig.jsonを使う方法もありますが、この場合はパラメータを追加する必要がありました("layer_norm_eps": 1e-06と、"hidden_act": "gelu_pytorch_tanh")。
4. 手順 ③
最後にLLM部分のGGUF化をしますが、準備に記載した通り予めtokenizer.modelを同じフォルダに配置しておいて下さい(無い場合はエラーが出ます)。公式ではconvert_legacy_llama.pyを使うようになってますがエラーで失敗するので、下記のように最初からconvert_hf_to_gguf.pyで普通に実行します。
python convert_hf_to_gguf.py {Path to your Asagi model}
これでLLMのGGUF化が完了しました。Ollamaで利用する場合はModelfileにllmとmmprojの両方のGGUFファイルをFROMで読み込んで使います。
FROM ./model/asagi-1.9B-F16.gguf
FROM ./model/mmproj-model-f16.gguf
・・・・・
最後にOllamaでcreateしてrunで実行します。
ollama create {Ollamaのモデル名} -f Modelfile_asagi (量子化したい場合は’-q q4_K_M’を付与)
ollama run {Ollamaのモデル名}
5. まとめ
今回はAsagi-VLMのGGUF化の手順を紹介させてもらいました。日本語対応のビジョン系モデルが盛り上がって行くことに少しでも手助けになれば幸いです。BF16のGGUFファイルは下記にアップロードしてありますので、良かったら使ってみて下さい。