StableDiffusion 2.1をM1 Macで使う!【Google colab】

当ページのリンクには広告が含まれています。
  • この記事は2023年1月時点の情報です。

2022年に話題をさらったMidjourneyに始まり、最近の画像生成AIの進歩は目を見張りますね。

特に注目を集めているのが、オープンソースで有志による開発がさかんな「Stable Diffusion」モデルが一般公開されており、誰でも無料で利用することが可能です。

ただ、MacではGPUの制限があるため、そのままでは自前のPC上で使用することはできません。

私自身Macユーザーなので長く導入を見送っていたのですが、Google colabなどを活用すればMacでもStable Diffusionを動かすことができます。

さっそく試してみたので、コードの説明を添えながら導入方法を紹介します。

目次

MacでStableDiffusionを動かす方法

StableDiffusionをデスクトップで起動させる場合、NDVIAのGPUが必要です。外付けGPUを使用した旧Intel Macなら条件を満たすことができますが、Apple silicon(M1/M2)モデルのMacは対象外。
 
一応、M1/M2 Mac上で StableDiffusionを動かす方法もあるのですが、Githubで公開されている「apple-silicon-mps-support」というブランチを利用して、Apple SiliconのGPUを使えるように環境を構築しないといけません。

Mac内部で動かすのは少し手間なので、今回はブラウザ上で動作する「Google colab」を使用することにしました。

Google colabとは

Google colabGoogleが提供しているPythonの仮想実行環境です。

Google colabは基本無料な上、GPUが使用可能。機械学習やデータビジュアライゼーションなどの用途に活用されるサービスで、Googleアカウントにログインしていれば誰でも使えます。

無償版では、標準GPUとしてTesla T4(16GB)が使用できます。有償版ではTesla T4/V100/A100の3種のGPUがランダムで割り当てられるので、以下のコマンドで事前にGPUを確認しておくといいでしょう。

!nvidia-smi

StableDiffusionを使う下準備

さっそくColabにアクセスし、新しいノートブックを作成します。

編集→ノートブックの設定→ハードウェアアクセラレータを「GPU」に設定。

必要なパッケージのインストール

Google ColabではPythonの汎用ライブラリが既に用意されていますが、それ以外に必要なライブラリを追加でインストールする必要があります。

「Diffusers」のパッケージをインストールします。Diffusersは画像や音声の機械学習に使用するライブラリです。

以下のコードを実行します。

!pip install diffusers[torch]==0.11 transformers
!pip install --upgrade --pre triton

Hugging Faceのアカウント作成(任意)

StableDiffusionで用いる学習済みパラメータは、ディープラーニングのコミュニティ「Hugging Face」のサーバーで配布されています。

かつてはモデルを利用するためにHugging Faceのアカウントを作成し、アクセストークンの取得が必要でした。現在はトークンを使わず利用できるので省略して構いません。[2022年11月28日のアナウンス

ですが、各種モデルの検索や自然言語処理を学べる学習コンテンツなどを利用できるため、アカウントを作成しておいた方が何かと便利です。

StableDiffusionのセットアップ

以下のコードを実行します。

from diffusers import StableDiffusionPipeline import torch

model_id = “stabilityai/stable-diffusion-2-1”
scheduler = DPMSolverMultistepScheduler.from_pretrained(model_id, subfolder=“scheduler”)

pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    scheduler = scheduler,
    torch_dtype = torch.float16,
    revision = “fp16”
 ).to(“cuda”)
pipe.enable_attention_slicing()  

それぞれのコードの説明は次の通りです。

解説が不要な場合は「③ StableDiffusionで画像生成する」へどうぞ。

セットアップのコードの説明

StableDiffusionPipelineのインポート

diffusersを用いてStableDiffusionPipelineをインポートします。

続いて、使用したい学習モデル名をmodel idに指定します。モデル名はHugging faceで公開されているモデルカードに記載されています。今回はStableDiffusion 2.1を使用することにしました。

このidをパイプラインクラス(pipe)のfrom_pretrainedメソッドに渡します。

# 基本のコード
from diffusers import StableDiffusionPipeline import torch

model_id = “stabilityai/stable-diffusion-2-1”
pipe = StableDiffusionPipeline.from_pretrained(model_id).to(“cuda”)

スケジューラーを使用する

この状態で画像生成を試してみてもいいのですが、より高速な処理のために「DPM-Solver++(DPMSolverMultistepScheduler)」というスケジューラを使用してみることにしました。

スケジューラ(Scheduler)は画像生成時のノイズ処理をするアルゴリズムで、出力の結果やスピードに影響します。モデルによってサンプラーと読んだりもするようです。

DiffusersからStableDiffusionPipelineと合わせて「DPMSolverMultistepScheduler」をインポートし、パイプラインクラスの中でスケジューラを指定します。 

# スケジューラを追加したコード
from diffusers import StableDiffusionPipeline import torch

model_id = “stabilityai/stable-diffusion-2-1”
scheduler = DPMSolverMultistepScheduler.from_pretrained(model_id, subfolder=“scheduler”)

pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    scheduler = scheduler,
 ).to(“cuda”)

動作を軽量化

Hugging faceのドキュメント「Memory and speed」を参考に、以下のコードを追加しました。 

torch_dtype = torch.float16,
revision = “fp16”

モデルを半精度データ型で使用することでメモリと処理時間を削減できます。
float16というブランチに格納されているので指定します。

enable_attention_slicing()

計算処理をステップごとに分けて実行することでGPU負荷を減らします。
速度は10%程度遅くなりますが、GPUへの負荷は大幅に軽くなるようです。 

これらの処理を追加し、最終的にセットアップで実行したコードが以下の通りです。

# セットアップで実行したコード
from diffusers import StableDiffusionPipeline import torch

model_id = “stabilityai/stable-diffusion-2-1”
scheduler = DPMSolverMultistepScheduler.from_pretrained(model_id, subfolder=“scheduler”)

pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    scheduler = scheduler,
    torch_dtype = torch.float16,
    revision = “fp16”
 ).to(“cuda”)
pipe.enable_attention_slicing()  

StableDiffusionで画像生成する

下準備ができたので、画像を生成させてみます。

「prompt」 が生成させる画像の要素を指示するワード(いわゆる詠唱)、「image」で画像サイズを指定しています。stable-diffusion-2モデルでは最大768×768ピクセルの画像が生成できるようになりました。

prompt = “a photo of an astronaut riding a horse on mars”
image = pipe(prompt, height=768, width=768).images[0]
image

テストプロンプトではこのような画像が生成されました。
予想以上にクオリティが高くて驚いています。

生成させてみたた画像とプロンプト

さっそく色々な画像を生成させてみました。

プロンプト:

“a kawaii anime girl with bluegreen short weavy hair wearing white coat,japanese anime style,full body illustration,high resolution,perfect beautiful face with blush cheeks,fine detailed face, white background”

背景の指示は無視されましたが、白衣は高確率で反映されるようです。

試行錯誤は必要だけど、それらしいイラストにはなってくれます。楽しい。

プロンプト:

“a Weapon driven by tall 8 legs like spider,steampunk, taken by Canon 5D Mk4”

Factorioのスパイダートロンのようなメカを生成。比較的シンプルな指示でそれらしい画像になりました。p

romptでカメラの指示をするとリアル系に、Unreal Engineを記載するとCG系のカリカチュアされたメカに寄るようです。

プロンプト:

“Landscape with buildings across the beautiful river, concept art, soft lighting, pastel color”

川の向こうにビル群が見える絵。

同じプロンプトでも、アニメ絵にチューニングされたモデルを使うとこんな感じになりました。

プロンプト:

“a cat on car,high detail,firly cat,high detail cute cat,bright lighting,pastel color,high-quality painting”

車の上にいる猫。

猫がやや破綻していますが許容範囲でしょう。画角などの指示を増やしてもいいかもしれません。

思ったより簡単な画像生成AI。試行錯誤して遊びたい

難しそうな印象のあった画像生成AIですが、Google Colabを使えばMacでも簡単に導入できました。

Stable Diffusionは有志による開発も盛んで、新しいモデルやノウハウが毎日のように生み出されています。ぜひ、色々試して遊んでみてはいかがでしょうか。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次