safetensors を ONNX に変換する手順
Civitai や Hugging Face で公開されている .safetensors 形式の Stable Diffusion モデルは、そのままではブラウザの WebGPU 推論で動きません。
ONNX 形式に変換することで、sd.keydrop.net で読み込めるようになります。
準備
- Python 3.10 以上
- ディスク空き容量 20GB 以上(中間ファイルが大きい)
- GPU なしでも変換は可能(CPU で完結)
① Python 環境を作る
python -m venv sd-convert
source sd-convert/bin/activate
pip install "optimum[onnxruntime]" diffusers transformers accelerate safetensors onnxconverter-common
② safetensors → Diffusers 形式
diffusers リポジトリ付属のスクリプトで、単一ファイルの .safetensors を分割されたディレクトリ構造に変換します。
python scripts/convert_original_stable_diffusion_to_diffusers.py \
--checkpoint_path my_model.safetensors \
--dump_path ./my_model_diffusers \
--from_safetensors
③ Diffusers → ONNX
optimum-cli export onnx \
--model ./my_model_diffusers \
--task stable-diffusion \
./my_model_onnx
出力ディレクトリに text_encoder/, unet/, vae_decoder/, tokenizer/ が生成されます。
④ FP16 量子化(任意)
ブラウザのメモリ消費を半減させるため、UNet を FP16 に変換します。品質はほぼ劣化しません。
python -c "
from onnxconverter_common import float16
import onnx
m = onnx.load('my_model_onnx/unet/model.onnx')
m16 = float16.convert_float_to_float16(m, keep_io_types=True)
onnx.save(m16, 'my_model_onnx/unet/model_fp16.onnx')
"
⑤ sd.keydrop.net に読み込む
アプリ を開き、生成された text_encoder / unet / vae_decoder の .onnx と、tokenizer/ 内の vocab.json / merges.txt をドラッグ & ドロップするだけで利用開始できます。
注意
SDXL モデルの変換は VRAM 負荷と時間がかかります(30〜60 分)。SD 1.5 系から試すことを推奨します。