SD1.5モデルをM5Stack LLM8850で動かす:推論速度9.5秒を実現したデプロイ全記録
Stable Diffusion 1.5の任意のカスタムモデルを、M5Stack LLM8850アクセラレーションボード上で画像生成まで約9.5秒で実行できるようになりました。本記事では、Civitaiからのモデル選定からAX8850向けの最適化まで、実際に試行したデプロイ手順を詳しく解説します。
環境・使用ハードウェア
- 開発ボード: M5Stack LLM8850アクセラレーションカード
- 変換ツール: Pulsar2 4.2
- 元モデル: Stable Diffusion 1.5ベース(xxmix9realistic v4.0を例として使用)
- 全コード: https://github.com/yuyun2000/sd15-to-ax8850-deploy
モデル選定の条件
Civitai(https://civitai.com)からSD1.5モデルを選ぶ際、以下3点を満たす必要があります:

- Base Model: SD1.5であること
- モデルタイプ: Checkpoint(完全版) - LoRAは今後別途解説予定
- ファイルサイズ: 1.99GB程度が最適(多少大きくても動作可能)
例として使用したxxmix9realisticモデルは上記条件を全て満たしています。

デプロイ手順
1. safetensorモデルでの推論確認
まずPC環境で元モデルの動作を検証します:
python safetensor_infer.py \
--input_path "./s/xxmix9realistic_v40.safetensors" \
--output_path "./test_output" \
--negative_prompt "easynegative,ng_deepnegative_v1_75t,(worst quality:2),(low quality:2),(normal quality:2),lowres,bad anatomy,bad hands,normal quality,((monochrome)),((grayscale)),((watermark))," \
--prompt "1girl, upper body, (huge Laughing),sweety,sun glare, bokeh, depth of field, blurry background, light particles, strong wind,head tilt,simple background, red background,<lora:film:0.4>"
2. ONNX形式への変換
AX8850向けの最適化前に、まずONNX形式へ変換します:
python export_onnx.py \
--input_path ./s/xxmix9realistic_v40.safetensors \
--output_path ./out_onnx \
--isize 480x320 \
--prompt "1girl, upper body, (huge Laughing),sweety,sun glare, bokeh, depth of field, blurry background, light particles, strong wind,head tilt,simple background, red background,<lora:film:0.4>"
画像サイズに関する注意点:
-
320x480: 横長画像 -
480x320: 縦長画像 -
512x512: 正方形(これより大きいとエラー) - VAEとの間で8倍のスケーリングが発生するため、後続処理で同じサイズ指定が必要
Text Encoderを個別エクスポートしない理由:
- AX提供のエクスポート環境の問題で変換が不安定
- 全モデル共通でCLIPを使用しており、カスタマイズ不要
ONNXモデルでの推論確認はpython dpm_infer.pyで実行可能ですが、次のステップに問題なければスキップ可能です。

3. 量子化用キャリブレーションデータの準備
python prepare_data.py
重要: モデルごとに適切なキャリブレーションデータが必要です。スクリプト内のサンプル生成ロジックは必要に応じて調整してください。
4. AX8850向けモデル変換
Pulsar2環境に切り替え、以下2つのモデルを変換します。
UNetの変換
pulsar2 build \
--input out_onnx/unet_sim_cut.onnx \
--config config_unet_u16.json \
--output_dir output_unet_ax \
--output_name unet.axmodel
処理時間: 約68分(環境により1時間前後)
VAE Decoderの変換
pulsar2 build \
--input out_onnx/vae_decoder_sim.onnx \
--config config_vae_decoder_u16.json \
--output_dir output_vae_ax \
--output_name vae.axmodel
Text Encoderの入手
変換済みモデルは以下から取得可能:
https://huggingface.co/yunyu1258/SD1.5-AX8850-xxmix9realistic/tree/main
このリポジトリには、ボード上で実行可能なPythonスクリプトも含まれています。
実測パフォーマンス
合計推論時間: 約9.5秒(20ステップ)
内訳:
- Text Embedding: 0.7秒
- Diffusion(20ステップ): 0.4秒 × 20 = 8秒
- VAE Decoder: 0.7秒
10ステップへの削減も可能: 実測では画質への影響は軽微でした。用途に応じて調整することで、さらなる高速化が期待できます。
M5Stack LLM8850を選んだ理由
本プロジェクトでM5Stack LLM8850を採用した技術的理由:
- AX8850チップの推論性能: U16量子化による高速推論が可能
- 開発の容易性: Pulsar2ツールチェーンとの統合が良好
- エッジデバイス向け最適化: 省電力でSD1.5クラスのモデルを実行可能
まとめ
Stable Diffusion 1.5のカスタムモデルを、M5Stack LLM8850上で実用的な速度で動作させることができました。変換プロセスは時間がかかるものの、一度完了すれば安定した推論が可能です。
LoRAモデルへの対応や、さらなる高速化手法については、今後のアップデートで解説予定です。

