Stable Diffusion Webui(AUTOMATIC1111)の拡張機能「Merge Block Weighte」でckptのモデルファイルをsafetensorsに変換する方法を解説します。
また、safetensors化によりどのくらい生成速度が短縮されるか調査しました。
結論から言うと、変換するだけでRTX3060TiをRTX3080に買い替えたとき以上の速度短縮効果がありました!!!
1,ckptをsafetensorsに変換する
拡張機能をインストール
拡張機能追加方法を参考にして、「Merge Block Weighted 」という拡張機能を追加しましょう。
インストール済みのタブを見て、このように名前があればOKです。
「適用してUIを再起動」ボタンを押して拡張機能を有効化してください。
ckptからsafetensorsに変換する方法
まず、「Save as safetensors」にチェックを入れます。
そして、「Model A」と「Model B」に同じモデルを指定します。
最後に中央下部の「M00」に値を0にしてください。
あとは「Model B」の横にある「Output Model Name」に適当な名前を入れて、オレンジボタン「Run Marge」をクリックして実行しましょう。
モデルフォルダ内に新しいモデルが保存されているはずです。
モデルを変換しても同じ画像になるのか?
生成差異はないように見受けられます。
少なくとも目視の範囲内では、ckptをsafetensorsに変換しても同じ画像が出力されることが確認できました。
なお、Safetensors形式が具体的にどんなものかはこちらで解説しています。
方法2,生成速度がどのくらい高速化するか
検証条件
アスカベンチマークを使用します。
簡単にいえば、パラメータなどを同一に設定して行う画像生成速度のベンチマークテストです。
ある512×512サイズの画像を10枚(batch count10,batch size1)生成する際に掛かった時間(Time taken値)を比較するものです。
ここではそれぞれ3回計測してその平均値を比べました。
なおxformersは有効で、ライブプレビュー機能をオフ、グリッド画像作成はオンにしています。
VAEファイルとモデルファイルのキャッシュはしていない状態です。
検証結果と考察
ckpt時のスコアは、パワーリミット9段階別の生成速度検証の電力制限なし(PL100%)時点のものを流用しています。
1回目 | 2回目 | 3回目 | 平均値 | ckpt時を1とした場合 | |
ckpt | 19.15 | 18.44 | 19.00 | 18.86 | 1.0000 |
safetensors | 13.16 | 13.25 | 13.21 | 13.21 | 0.7001 |
はっっっっやい!3090なのに不調な4090くらい出ちゃう!嬉しい!変換凄い!!
30%高速化!!
ちょっと信じられない結果ですね!!!!
でもフェイクじゃないですよ!?
グラボで言うなら、RTX3080がRTX3060Tiより28%高速なので、ckpt→safetensors変換だけで数万円以上の投資に匹敵する効果があるといえます。
マージの瞬間に2つのモデルの合計と同じくらいRAMを消費するので、10GBはあけておきましょう。
もし16GB程度しかRAMを搭載していない方は、16GB1本を追加して、合計で32GB程度になるように増設することを検討してください。
5000円程度てRTX3060Ti→RTX3080レベルの速度アップを体感できます。
エラー時対処:safetensorsが読み込めない時は?
safetensorsの読み込みに失敗するのはwebuiのバージョンが古すぎるのが原因です。
以下の手順通りにアップデートをしてください。
今回の方法と併用可能で、RAMさえあればそこそこ高速化できるこちらも合わせてお試しください。