SafetensorsをGGUFファイルへの変換する!@llama.cppを使用するパターン
Easyforgeさんはとても簡単にGGUFファイルへの変換がされているようです。
ただ、pythonスクリプトを使用して行うことで、paperspaceも含めてほかの環境で使用しやすくなるかなと考え、とりあえず以下のページの内容をLocal環境で行ってみました。
※変換用のスクリプトが対応しているアーキテクチャは(flux, sd3, sdxl, sd1)の4つのようです。
<手順概要>
llama.cppリポジトリのクローンと必要なインストール
lcpp.patchの適用とバイナリのコンパイル
モデルの変換(FP16/BF16形式への変換)
モデルの量子化(指定のフォーマットに量子化)
①llama.cppリポジトリのクローンと必要なインストール
作業用フォルダを作成して、そこにllama.cppをgitcloneします。60MBぐらい。
Local PCで行う場合は、そのディレクトリで、llama.cppのgguf-pyモジュールをインストールします。
※バージョンを指定してllama.cppをダウンロードすることもできますが、あとの操作でgitを使用するので、gitcloneをするのが良いと思います。
git clone https://github.com/ggerganov/llama.cpp
pip install ./llama.cpp/gguf-py
こんなフォルダ構成になっています。model.safetensorsは実験用のSDXLモデルです。
残りのpyとpatchは、リンクのHPのスクリプトです。
②lcpp.patchの適用とバイナリのコンパイル
まずはコマンドプロンプトでllama.cppのディレクトリに移動した後、llama.cppのバージョンを指定したものに変えます
git checkout tags/b3600
次にlcpp.patchを適用して、コードを修正します。
以下のコマンドを実行してください。これは一つ上のディレクトリのファイルを参照しているコマンドのようです。
git apply ../lcpp.patch
③CMakeを使用してバイナリをコンパイル
CMakeというのをインストールする必要があります。この「Windowsx64 Installer」をダウンロードして実行するとインストールされます。
ここで、インストール時に「Add CMake to the system PATH for all users」というオプションを選択すると、cmakeコマンドをどこからでも使用できるようになります(デフォルトでチェックが入っているので外さない)。
次のコマンドを1行ずつ、実行していきます。
これは、コマンドプロンプトの場所が、llama.cppのディレクトリでの作業を前提にしています。
mkdir build
cd build
cmake ..
cmake --build . --config Debug -j10 --target llama-quantize
CMAKEがインストールされていると色々とコマンドの作業が進みます。
これで、build/bin/Debug/フォルダにllama-quantize.exeバイナリが生成されます。
④モデルの変換(FP16/BF16形式への変換)
convert.pyを使用して、モデルの変換を行います。
以下のスクリプトは、パスを指定せず起動した場合に、同じディレクトリ内のsafetensorsを認識するものです。
batファイルを使用:パスをしていないで起動するコマンド
@echo off
REM カレントディレクトリに移動
cd /d %~dp0
REM Pythonスクリプトを実行
python convert.py
REM 実行結果を表示し、終了する前に待機
pause
「model/F16.gguf」が出来ました。
⑤モデルの量子化(指定のフォーマットに量子化)
コンパイルしたllama-quantizeバイナリを使って、生成されたGGUFファイルを量子化します。量子化フォーマット(例:Q4_K_M)をコマンドで指定します。
量子化しているようなコマンドが出現
とりあえずこのコマンド自体が配置されている場所が異なる部分を指定しているため、面倒な印象。
先程変換した「model/F16.gguf」と同じディレクトリに以下の内容のbatファイルを作成してダブルクリックすると、それを認識して変換するようなものを配置した。
@echo off
REM カレントディレクトリに移動
cd /d %~dp0
REM llama-quantize.exeの実行
llama.cpp\build\bin\Debug\llama-quantize.exe model-F16.gguf model-Q4_K_S.gguf Q4_K_M
REM 実行結果を表示し、終了する前に待機
pause
とりあえずサイズは小さくなった模様。
このconvert.pyだと、diffusion modelのところだけ取り出している為、clipとvaeは入っていない状態です。
ComfyUIのGGUFloaderで、modelのところからつなげると画像生成できました。
とりあえずはGGUF化が出来たという話になります。
GPTさんに聞いた感じだと、paperspaceのコマンドでも同じ様なことができるらしい。(試していない)