日本語 English
インターステラ株式会社の技術ブログです

Stable DiffusionをM1 macのローカルで動かしてみた

鈴木です。プログラミング初心者の私ですが、最近AIで画像を作成できることが話題になり、自分も試してみました。

https://stablediffusionweb.com

こちらのページから話題のStable Diffusionが使用できます。
プロンプトと呼ばれる、どんな画像が欲しいかを箇条書きのように表していく文を使うことで、
自動的に画像が作成できるというものです。

これをローカルでできないかと考え、参考になる記事を見ながらローカルでもできるようにしました。
どうやらDiffuserというモジュールを使えばできるようです。

ローカルで実行するにあたって、
https://zenn.dev/michy/articles/102a0558096199

こちらの記事が非常に参考になりました。

なるべく初心者でもわかるように私も紹介したいと思います。

homebrewのインストール

私の場合は、通常のPythonエディタからプログラムを起動させるように作ります。
なので、Jupyterは使わない前提で進めます。

まずhomebrewがインストールされていない場合、それを最初にインストールします。
https://brew.sh/index_ja
macのターミナルを開いて、サイトに書いてあるコードをそのままコピペしてEnterしてください。

インストールできたら、次はPythonをインストールします。
もし既にインストールしていたら必要ありません。

brew update && brew install python3

これをターミナルに打てばpythonがインストールされます。

今インストールされているのかわからない場合は
python --version (-は2個必要です 表示で1個しか表示されてないかもしれませんが2個つけてください)
とターミナルに打ってください。もしあればversionが表示されます。
ただ多少pythonの基礎知識的なものは必要になるので、混乱しそうでしたら他の紹介ページ、
あるいはChatGPTに聞きましょう。

huggingFaceのアカウントを作る・トークン認証

事前準備として、
Stable Diffusionをローカルで使うためには、「Diffuser」というモジュールを使うのですが、それには
「huggingFace」というサイトから発行されるトークンが必要になります。

https://huggingface.co/
こちらに登録して、

https://huggingface.co/settings/tokens
ここからトークンを発行できます。やっておきましょう。

トークンを発行したら、ローカルに認証する必要があります。
ターミナルで

git config --global credential.helper

と打ってください。おそらくすぐに操作が終わります。

次に

huggingface-cli login

と行きたいのですが、私の場合huggingface-cliがインストールされていませんでした。
もしエラーになる場合は、

brew search huggingface-cli

とターミナルで打つとありますよと表示されるので

brew install huggingface-cli

と打って、huggingface-cli をインストールしてください。
その後に

huggingface-cli login

と打つと、トークンを聞かれます。

ここでhttps://huggingface.co/settings/tokens
こちらのトークンをコピペすれば、huggingfaceのトークンが認証され、diffuserが使えるようになります。

仮想環境の作成

次に仮想環境です。私はvenvを使用するのでそれの紹介です。
仮想環境を使う理由は割愛しますが、さまざまなサイトで取り上げられているので初めての方はご覧ください。

何かしらエディタを使っていて、プロジェクトをひらけば自動的に仮想環境が作られる場合は、この操作は必要ありません。

おそらくターミナルのディレクトリはhomeにいると思うので、適宜ディレクトリを作成するか、もしくはその場所でも良いので仮想環境を作成します。

python3 -m venv venv

と打てば、仮想環境が作成されます。
python3 -m venv  の時点で仮想環境が作成され、その後のvenvは名前を示します。
「venv」という名前が紛らわしかったり、他とかぶる場合は、何か名前を変えてください。

仮想環境が作成されたら、

source venv/bin/activate

と打って、仮想環境を起動します。
このコマンドのvenvは、名前を示すので仮想環境の名前に合わせて適宜変更してください。
仮想環境を終了したい時は

deactivate

と打てば仮想環境が終了します。
ただし今はまだ終了しないでください笑 作業を終わりたい時に終了しましょう。

ライブラリのインストール

それでは、仮想環境を起動させた状態でライブラリをインストールします。

pip install torch
pip install transformers
pip install accelerate
pip install scipy
pip install diffusers


これらを順にインストールしてください。
※ これらをインストールしても、実際には何かしら足りないものが出てくるかもしれません。
コードを実行したときに no module 〇〇 と表示されたら、それをpip install 〇〇 
として再度インストールしてください。

ちなみに、私の環境でrequirements.txtを pip freeze > requirements.txt で書かせるとこうなりました。

accelerate==0.16.0
anyio==3.6.2
appnope==0.1.3
argon2-cffi==21.3.0
argon2-cffi-bindings==21.2.0
arrow==1.2.3
asttokens==2.2.1
attrs==22.2.0
backcall==0.2.0
beautifulsoup4==4.11.2
bleach==6.0.0
certifi==2022.12.7
cffi==1.15.1
charset-normalizer==3.0.1
comm==0.1.2
debugpy==1.6.6
decorator==5.1.1
defusedxml==0.7.1
diffusers==0.13.1
executing==1.2.0
fastjsonschema==2.16.3
filelock==3.9.0
fqdn==1.5.1
huggingface-hub==0.12.1
idna==3.4
importlib-metadata==6.0.0
ipykernel==6.21.2
ipython==8.10.0
ipython-genutils==0.2.0
ipywidgets==8.0.4
isoduration==20.11.0
jedi==0.18.2
Jinja2==3.1.2
jsonpointer==2.3
jsonschema==4.17.3
jupyter==1.0.0
jupyter-console==6.6.1
jupyter-events==0.6.3
jupyter_client==8.0.3
jupyter_core==5.2.0
jupyter_server==2.3.0
jupyter_server_terminals==0.4.4
jupyterlab-pygments==0.2.2
jupyterlab-widgets==3.0.5
MarkupSafe==2.1.2
matplotlib-inline==0.1.6
mistune==2.0.5
nbclassic==0.5.2
nbclient==0.7.2
nbconvert==7.2.9
nbformat==5.7.3
nest-asyncio==1.5.6
notebook==6.5.2
notebook_shim==0.2.2
numpy==1.24.2
packaging==23.0
pandocfilters==1.5.0
parso==0.8.3
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.4.0
platformdirs==3.0.0
prometheus-client==0.16.0
prompt-toolkit==3.0.37
psutil==5.9.4
ptyprocess==0.7.0
pure-eval==0.2.2
pycparser==2.21
Pygments==2.14.0
pyrsistent==0.19.3
python-dateutil==2.8.2
python-json-logger==2.0.7
PyYAML==6.0
pyzmq==25.0.0
qtconsole==5.4.0
QtPy==2.3.0
regex==2022.10.31
requests==2.28.2
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
scipy==1.10.1
Send2Trash==1.8.0
six==1.16.0
sniffio==1.3.0
soupsieve==2.4
stack-data==0.6.2
terminado==0.17.1
tinycss2==1.2.1
tokenizers==0.13.2
torch==1.13.1
tornado==6.2
tqdm==4.64.1
traitlets==5.9.0
transformers==4.26.1
typing_extensions==4.5.0
uri-template==1.2.0
urllib3==1.26.14
wcwidth==0.2.6
webcolors==1.12
webencodings==0.5.1
websocket-client==1.5.1
widgetsnbextension==4.0.5
zipp==3.15.0
すごい量ですね。もし次の段階でStable Diffusionを動かす時に、
何か足りないとエラーが出る場合は、
requirements.txt というファイルを作り、それにに上記をコピペして
pip install -r requirements.txt

としてください。 また、ライブラリをインストールしたはずのものがないとエラーが出る場合は、

deactivate

で一旦仮想環境を終了し、再度

source venv/bin/activate

にて仮想環境を起動してください。
それでもダメな場合は1つ1つエラーが出るライブラリをインストールし直しましょう。

Stable Diffusionの実行

いよいよStable Diffusionの実行です。
pythonのコードを書いて、そのpyファイルを実行すれば、画像が生成されます。
便宜上 main.py というファイル名とします。
main.pyというファイルに、以下のコードをコピペして、実行してみてください。

# main.py

from diffusers import StableDiffusionPipeline

# モデルの指定
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")

# デバイスの指定。mpsはM1/M2 Macを指す。
pipe = pipe.to("mps")

pipe.enable_attention_slicing()

prompt = "a dog"
n_prompt = "bad fingers"

# modelのウォームアップ。Macの場合は必要
_ = pipe(prompt, negative_prompt=n_prompt,  num_inference_steps=1)

# 処理の実行
image = pipe(prompt, negative_prompt=n_prompt).images[0]

image.save("/output.jpg")  # 任意のpath + ファイル名.jpg

いかがでしょうか。
最初はモデルのダウンロードがあるので、結構時間がかかるはずです。
1度モデルをダウンロードすれば、次回以降は生成の段階から始まります。

少し説明します

# モデルの指定 
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5") 

この、”runwayml/stable-diffusion-v1-5″ という部分がモデルを指定しています。
今回はstable diffusionのモデルですが、現在多くのモデルが公開されています。

絵の精度に関しては、モデルの選択が非常に重要な気がしています。
プロンプトでもある程度は修正できますが、0を1にすることはできないようです。

# デバイスの指定。mpsはM1/M2 Macを指す。 
pipe = pipe.to("mps") 

ここは、M1/M2 macでは “mps” と指定すると動くようです。
Intel Macでは、CPUしかないので ”cpu” とすると動くと思うのですが、実際に試してないので検証が必要です。

prompt = "a dog" 
n_prompt = "bad fingers"

これはよくある呪文というものですね。
promptはそのままプロンプトで、作りたい絵の説明をします。
今回はa dogだけですが、実際にはもっと長く、細かく書くことが多くなるでしょう。
プロンプトについては私もあまり確信がないので、他の方の記事など参考にしてください。

n_promptはネガティブプロンプトで、作りたくないものの説明を書きます。
AIは基本的に手が苦手なので、人間の場合bad fingersは入れておいた方がいいような気がします。
今回は犬なので、正直なくてもいいです。

実際にコードを動かしてできた画像がこちらです。1枚目はn_promptあり、2枚目はn_promptなしです。

かわいらしいですね。よーく見ると合成してる感じがしますが、ぱっと見はわかりません。
こちらはネガティブプロンプトなしです。犬なので目立ちませんが尻尾がちょっと変かもしれません。

このような写真のような画像が合成で作れるなんてすごいですよね、びっくりしました。
ネガティブプロンプトをなしにしたいときは、コメントアウトは面倒なので、
n_prompt = “”
としてしまえば問題ありません。

一応、画像の権利などに関して
https://huggingface.co/spaces/CompVis/stable-diffusion-license
こちらのライセンスに同意することが必要になります。
特には「同意する」ボタンなどはないのですが、乱用するなという認識です。

ローカルで画像を作れれば強い

このように、自動的にAIが画像を作ってくれるサービスは正直驚きです。
WebUIで作っても良いのですが、完全ローカルで作ることにより、他の処理(for文など)も行えるので、よりコンピューターの恩恵にあずかれます。

色々と話題になる予感のするAIです。何か画像を作成する際の参考になれば幸いです。

PAGE TOP