sd.keydrop.net

safetensors を ONNX に変換する手順

Civitai や Hugging Face で公開されている .safetensors 形式の Stable Diffusion モデルは、そのままではブラウザの WebGPU 推論で動きません。 ONNX 形式に変換することで、sd.keydrop.net で読み込めるようになります。

準備

① 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 系から試すことを推奨します。

関連ページ