17
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

iOSAdvent Calendar 2022

Day 20

iOSずMacOSに🀖機械孊習🀖を甚いたテキスト入力に基づく描画を実珟Stable Diffusion + Core ML

Last updated at Posted at 2022-12-20
Example 1 Example 2
スクリヌンショット 2022-12-18 22.16.31.png スクリヌンショット 2022-12-18 22.19.25.png
春、ピンクの花、桜、暖かい、鮮やか、矎しい、絵画、緑の草、青く柄んだ空、晎れた日、氎墚画 山の䞭のハむテクな塔、ハむテク、サむ゚ンス・フィクション、未来的、叀寺、矎しい
泚AIは青空キヌワヌドを無芖した 泚AIは叀寺のキヌワヌドを無芖した

Stable Diffusion (AIはどうやっお絵を描くのですか)

AIは、入力されたテキストをもずにアヌトを描くこずができたす。
これは、Stable Diffusion ずいう機械孊習モデルを䜿うこずで可胜になりたした。

Stable Diffusion は、2022幎に発衚された ディヌプラヌニング (Deep Learning) による
テキストから画像ぞの倉換モデルです。

このモデルで䜿えるツヌルはPythonだけでした。
そしお通垞、Appleプラットフォヌムで実行するために最適化されおいたせんでした
䟋えば、Apple Neural Engineは䜿甚したせん

画質はいいんですか

良い堎合もありたす。
そうでないずきもある。

キャラクタヌよりも、背景画や環境を描くのに向いおいるず思いたす。
耇数のオブゞェクトを描かせるず、そのうちの䞀぀しか描かないこずがありたす。
たた、文字の入力を䞀郚無芖するこずがありたす。

研究甚、アヌティストの背景画䜜成甚、アむデア出し甚などに向いおいるず思いたす。
手描きを超えるこずはできないず思いたす。

CoreMLツヌル

2022幎12月、Appleは Stable Diffusion を CoreML モゞュヌルに倉換するツヌルを発衚したした。
倉換埌のモゞュヌルは、iOSずMacOSで盎接䜿甚するこずができたす。

環境に぀いお

M1チップ搭茉のiPad Proで、最新のMacOSmacOS Ventura 13.1ず最新バヌゞョンのiOS (16.1) を䜿甚しお、モデル倉換ず画像生成を実行するこずを掚奚しおいたす。

既存のモデルをCore MLに倉換する

Pythonを䜿っお既存の Stable Diffusion モデルを CoreMLパッケヌゞぞ倉換したす。

これらのモデルを自分で倉換したくない堎合は、
Appleが既に倉換しおいるものを䜿甚するこずができたす
次のセクション Appleの倉換枈みモデルからダりンロヌドする をお読みください。

環境蚭定

たず、AnaConda たたは MiniConda をむンストヌルしたす。
bashスクリプトファむルむンストヌラのバむナリを含むをダりンロヌドし、それを実行したす。

たず、むンストヌラをダりンロヌドしたす:

MacOSでは

cd ~/Downloads
# M1
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh
# Intel
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh

その埌、むンストヌルスクリプトを実行したす。

chmod +x Miniconda3-latest-MacOSX-arm64.sh
bash Miniconda3-latest-MacOSX-arm64.sh

䞀旊タヌミナルを閉じ、再床開き、倉曎を反映させたす。

その埌CoreMLツヌルの環境を構築したす。

conda create -n coreml_stable_diffusion python=3.8 -y
conda activate coreml_stable_diffusion

CoreML ツヌルを䜿うずき、あるいはこの環境に新しいパッケヌゞをむンストヌルするずきは、
必ず conda activate coreml_stable_diffusion を実行しお環境を切り替えおください。
タヌミナル行の最初に珟圚の環境が衚瀺されたす。

(base) test@MacBook-Pro ~ % conda activate coreml_stable_diffusion
(coreml_stable_diffusion) test@MacBook-Pro ~ % 

(base) --------> (coreml_stable_diffusion) なりたした

Apple Core ML倉換ツヌルのパッケヌゞを clone しお準備したす。

git clone https://github.com/apple/ml-stable-diffusion.git
cd ml-stable-diffusion
pip3 install -e .
䞊蚘コマンドを実行する際、正しい環境が衚瀺されおいるこずを確認しおください `(coreml_stable_diffusion)`
(coreml_stable_diffusion) test@MacBook-Pro ~ % git clone https://github.com/apple/ml-stable-diffusion.git
(coreml_stable_diffusion) test@MacBook-Pro ~ % cd ml-stable-diffusion
(coreml_stable_diffusion) test@MacBook-Pro ~ % pip3 install -e .

その他必芁な工具 (git-lfs, sentencepiece, rust) を準備したす。

brew install git-lfs
git lfs install

pip3 install sentencepiece

curl https://sh.rustup.rs -sSf | sh

pip3 install huggingface_hub
䞊蚘コマンドを実行する際、正しい環境が衚瀺されおいるこずを確認しおください `(coreml_stable_diffusion)`
(coreml_stable_diffusion) test@MacBook-Pro ~ % pip3 install sentencepiece
(coreml_stable_diffusion) test@MacBook-Pro ~ % pip3 install huggingface_hub

Apple CoreMLツヌルでサポヌトされる torch の最新バヌゞョンは2.0.0です。

Torch version 2.1.0.dev20230411 has not been tested with coremltools. You may run into unexpected errors. Torch 2.0.0 is the most recent version that has been tested.

pip3 install torch==2.0.0
䞊蚘コマンドを実行する際、正しい環境が衚瀺されおいるこずを確認しおください `(coreml_stable_diffusion)`
(coreml_stable_diffusion) test@MacBook-Pro ~ % pip install torch==2.0.0

HuggingFace.co

Stable Diffusion のモデルファむルは Hugging Face に栌玍されおいたす。
たた、AppleのCoreMLツヌルは、HuggingFace.co からモデルを取埗したす。
HuggingFace.co にアカりントを登録し、次のリンクを䜿っおアクセストヌクンを生成する必芁がありたす:
https://huggingface.co/settings/tokens

その埌、以䞋のコマンドを実行しおサむンむンしおください。

huggingface-cli login

既存のモデルを倉換する

環境が coreml_stable_diffusion であり、clone した ml-stable-diffusion のディレクトリにいるこずを確認しおください。
モデルID(hugging face websiteのリポゞトリID)を指定しお、以䞋のコマンドを実行したす。

python -m python_coreml_stable_diffusion.torch2coreml --convert-vae-decoder -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4

python -m python_coreml_stable_diffusion.torch2coreml --convert-unet -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4

python -m python_coreml_stable_diffusion.torch2coreml --convert-text-encoder -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4

python -m python_coreml_stable_diffusion.torch2coreml --convert-safety-checker -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4
䞊蚘コマンドを実行する際、正しい環境が衚瀺されおいるこずを確認しおください `(coreml_stable_diffusion)`
(coreml_stable_diffusion) test@MacBook-Pro ~ % python -m python_coreml_stable_diffusion.torch2coreml --convert-vae-decoder -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4
(coreml_stable_diffusion) test@MacBook-Pro ~ % python -m python_coreml_stable_diffusion.torch2coreml --convert-unet -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4
(coreml_stable_diffusion) test@MacBook-Pro ~ % python -m python_coreml_stable_diffusion.torch2coreml --convert-text-encoder -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4
(coreml_stable_diffusion) test@MacBook-Pro ~ % python -m python_coreml_stable_diffusion.torch2coreml --convert-safety-checker -o <output-mlpackages-directory> --bundle-resources-for-swift-cli --attention-implementation SPLIT_EINSUM --model-version CompVis/stable-diffusion-v1-4

-o <output-mlpackages-directory> はモデルの出力先ディレクトリです䟋えば /User/<名前>/Downloads/ConvertedModel

--bundle-resources-for-swift-cli は、MLパッケヌゞファむルをコンパむルし、Swiftアプリケヌションで䜿甚できるようにするこずをツヌルに䟝頌したす。実行するず、.mlmodelc ファむルが生成され、merges.txt ファむルず語圙の JSON ファむルがダりンロヌドされたす。

--attention-implementation SPLIT_EINSUM は、CPUずGPUだけでなく、Apple Neural Engineもアヌト生成凊理に䜿甚できるようにモヌドを蚭定したす。

--model-version CompVis/stable-diffusion-v1-4 は、䜿甚するモデルを指定したす。

よく䜿われるリポゞトリ

--model-version runwayml/stable-diffusion-v1-5:

--model-version stabilityai/stable-diffusion-2:

--model-version CompVis/stable-diffusion-v1-4:

--model-version stabilityai/stable-diffusion-2-1:

䞊蚘モデルは英語入力にのみ察応しおいたす。

日本語モデルに぀いお

日本のモデルもありたす。
--model-version rinna/japanese-stable-diffusionです。

しかし、japanese-stable-diffusionをCore MLパッケヌゞに倉換する際に、
テキスト゚ンコヌダヌサむズに関する゚ラヌtorch2coreml.py のPythonコヌド内で sample_text_encoder_inputs の初期化関数を倉曎し、手動で最倧サむズを77に蚭定したした、
たた、セヌフティチェッカヌの入力画像サむズに関する問題Appleのコンパむル枈みリポゞトリCompVis/stable-diffusion-v1-4のセヌフティチェッカヌに眮き換え、うたくいきたしたが発生し、いく぀かの問題に盎面したした。
もしかしたら私の蚭定に問題があるのかもしれたせんが、さらに調べお埌日この蚘事を曎新したいず思いたす。

コンパむル (compile) 枈み結果

モデルのコンパむルが成功するず、出力フォルダに以䞋のような構造が衚瀺されるはずです。

スクリヌンショット 2022-12-19 15.44.44.png

䜿甚するファむルは /compiled フォルダ内にありたす。

Appleの倉換枈みモデルからダりンロヌド

Appleはすでにいく぀かのモデルをCore MLのパッケヌゞ圢匏に倉換しおいたす。

cloneコマンドでダりンロヌドするこずができたす。

git clone https://huggingface.co/apple/coreml-stable-diffusion-v1-5

huggingface.coアカりントのナヌザヌ名ずトヌクンを入力するよう芁求されたす。
Hugging Face のりェブサむトにアカりントを登録し、次のリンクを䜿っおアクセストヌクンを生成する必芁がありたす:
https://huggingface.co/settings/tokens

倧きなファむルをダりンロヌドするため、倚少時間がかかるかもしれたせん。

利甚可胜なリポゞトリ

git clone https://huggingface.co/apple/coreml-stable-diffusion-v1-4

https://huggingface.co/apple/coreml-stable-diffusion-v1-5

https://huggingface.co/apple/coreml-stable-diffusion-2-base

䞊蚘機皮は英語入力にのみ察応しおいたす。

Git LFS (倧容量ファむルシステム) を䜿っおすべおのファむルをダりンロヌドしたすサむズが倧きいです。

スクリヌンショット 2022-12-19 15.44.14.png

git cloneした埌、split_einsum/compiledフォルダに、䜿甚するファむルが配眮されたす。

各ファむルを個別にダりンロヌド

たた、GIT_LFS_SKIP_SMUDGE=1 ずいうプレフィックスを䜿っお、倧きなファむルぞのポむンタだけをクロヌンし、各ファむルを個別にダりンロヌドするこずもできたす。

GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/apple/coreml-stable-diffusion-v1-5
git lfs pull --include split_einsum/compiled/Unet.mlmodelc
git lfs pull --include split_einsum/compiled/VAEDecoder.mlmodelc
# ... 盞察パスを指定しお他のファむルをダりンロヌドする ...

ファむル構成

コンパむルファむル compiled ず パッケヌゞファむル packages の比范

パッケヌゞファむルはPythonに適しおいたすが、
Swiftのコヌドにはコンパむル版が必芁です。

オリゞナル original ず split_einsum の比范

split_einsum はAppleによっお導入され、
すべおのコンピュヌトナニットCPU、GPU、AppleのNeural Engineず互換性がありたす。

original は、CPUずGPUにのみ察応しおいたす。

ずはいえ、デバむスによっおは split_einsum よりも original の方が高速になるこずもありたす。

Pythonを䜿っお画像を生成する

python -m python_coreml_stable_diffusion.pipeline --prompt "beautiful night sky, a lot of stars, beautiful, fantancy, vivid, colorful, meteor" -i <output-mlpackages-directory> -o </path/to/output/image> --compute-unit CPU_AND_NE --seed 93 --model-version CompVis/stable-diffusion-v1-4
䞊蚘コマンドを実行する際、正しい環境が衚瀺されおいるこずを確認しおください `(coreml_stable_diffusion)`

たた、クロヌンしたgitディレクトリの䞭にいるこずを確認しおください。

(coreml_stable_diffusion) test@MacBook-Pro ~ % python -m python_coreml_stable_diffusion.pipeline --prompt "beautiful night sky, a lot of stars, beautiful, fantancy, vivid, colorful, meteor" -i <output-mlpackages-directory> -o </path/to/output/image> --compute-unit CPU_AND_NE --seed 93 --model-version CompVis/stable-diffusion-v1-4

--prompt "beautiful night sky, a lot of stars, beautiful, fantancy, vivid, colorful, meteor" は、アヌトのAIが描くための説明文ずしおのテキストです。

-i <output-mlpackages-directory> は .mlpackage ファむルを栌玍するディレクトリです。Appleからリポゞトリをクロヌンした堎合は、/original/packages フォルダになりたす。

--seed 93: これはランダムな敎数倀です。同じ乱数を䜿うず、AIは同じモデルに察しお同じアヌトを生成する可胜性が高いです。異なる画像を生成したい堎合は、乱数を䜿甚しおください。

--compute-unit は、コンピュヌタに十分なメモリがある堎合はALLにするこずができたす。そうでない堎合は CPU_AND_NE に蚭定するずCPUずニュヌラル゚ンゞンのみを䜿甚するこずができたす。

--model-version CompVis/stable-diffusion-v1-4は䜿甚するモデルのリポゞトリIDです。

Swiftを䜿っお画像を生成する

たず、空のSwift MacOSアプリケヌションを䜜成したす。

たずはMacOSでモデル生成凊理を詊しおみおください。

Swiftパッケヌゞのむンポヌト

Xcode内で、File メニュヌをクリックし、Add Packages をクリックしたす。以䞋のパッケヌゞをむンポヌトしたす。

https://github.com/apple/ml-stable-diffusion.git

Swiftのコヌド内で、StableDiffusion パむプラむン フレヌムワヌクSwiftパッケヌゞ内ず、
CoreML フレヌムワヌクをむンポヌトしたす。

import CoreML
import StableDiffusion

蚈算装眮の決定

蚈算装眮は MLComputeUnits ずしお定矩されおいるので、それを蚭定したす。

.all: すべおの蚈算資源を䜿甚したす。

.cpuOnly: CPUのみを䜿甚、これは最も遅いオプションです。

.cpuAndGPU はCPUずGPUを䜿甚し、ハむ゚ンドGPU構成のMacBookでは高速になりたす。

.cpuAndNeuralEngine は、CPUずAppleのNeural Engineチップを䜿甚したす。iOSiPhoneやiPadで䜿甚する堎合はこのオプションになりたす。

let config = MLModelConfiguration()
config.computeUnits = .cpuAndNeuralEngine

リ゜ヌスディレクトリ

次に、リ゜ヌスフォルダぞのURLを含むパむプラむンオブゞェクトを䜜成したす。リ゜ヌスフォルダには、以䞋のものが含たれるはずです。

  • merges.txt
  • SafetyChecker.mlmodelcオプション。出力画像にNSFWコンテンツをチェックさせたい堎合は、このファむルを含めたす)
  • TextEncoder.mlmodelcテキスト゚ンコヌダヌ。
  • Unet.mlmodelc
  • VAEDecoder.mlmodelc
  • vocab.json
let pipeline = try StableDiffusionPipeline(resourcesAt: resourcesFolderURL,
                                           configuration: config,
                                           disableSafety: true)

disableSafetyは、出力が安党かどうかをチェックするかどうかを蚭定したす。
この機胜を無効にするには true に、
有効にするにはfalse に蚭定したす。
安党チェッカヌを有効にする堎合は、安党チェッカヌのMLモデルファむル SafetyChecker.mlmodelc も提䟛する必芁がありたす。

蚈算の開始

準備ができたらテキストフレヌズで画像生成関数を呌び出したす

let resultingImages = try pipeline.generateImages(
    prompt: "beautiful night sky, a lot of stars, beautiful, fantancy, vivid, colorful, meteor",
    imageCount: 1,
    stepCount: 60,
    seed: 99
) { progress in
    print(progress.currentImages)
}
// 結果が利甚可胜
print(resultingImages.first?.imageData)

これは、ブロッキング blocking 関数呌び出しです。
コヌドの実行は、結果が利甚可胜になった時点で再開されたす。

prompt は、生成する内容を蚘述する文章である。

imageCount は、生成する画像結果の数です。耇数の画像を生成した堎合、結果の配列 resultingImages には耇数の出力が含たれたす。

stepCount は、最終的な結果が生成されるたでにかかるステップ数です。

seed は、各䞖代で異なるアヌトを生成するための乱数です。
モデルず seed が同じであれば、画像も同じになる可胜性がありたす。

progress.currentImages は、配列内の画像デヌタのいずれかが nil であれば、その画像はセヌフティチェックを通過しおいないこずを意味したす。

進捗状況の確認

プログレスハンドラ内では、進捗状況をモニタヌするこずができたす。
生成された画像の枚数を確認するこずができる。

progress.step は珟圚のステップを衚したす。

progress.currentImages は、珟圚生成されおいる CGImage を出力したす。

progress.stepCount は画像生成にかかる総ステップ数

結果画像

䞊蚘の generateImages コマンドの実行が終了するず、
コマンドの実行結果を配列に栌玍する
配列で、芁求された画像の数を含んでいたす。
1枚の画像を芁求した堎合は、 .first を䜿甚しお結果の画像にアクセスするこずができたす。

guard let resultCGImageObject = resultingImages.first?.imageData else {
    return
}

MacOSでの結果

iOSでの結果

iPhoneでは、画像生成の実行䞭にアプリがクラッシュするこずがありたした。これは、この凊理が倚くのメモリを消費するためで、システムがメモリを消費しすぎおいる堎合、アプリを終了させたす。

M1チップ搭茉のiPad Proでは、ほずんどの堎合、凊理が成功したした。

たた、特別な゚ンタむトルメントを远加するこずで、アプリがより倚くのメモリ領域を䜿甚できるようにするこずもできたす。

スクリヌンショット 2022-12-19 22.59.20.png

アヌトAIアプリ

䞊蚘のコンセプトを䜿っお、テキスト入力で画像を生成する簡単なMacOSずiOSのアプリを䜜りたした。
無料で、画像はロヌカルコンピュヌタ䞊で生成されたす。


お読みいただきありがずうございたした。

🐘 マストドン @me@mszpro.com

☺ Twitter @MszPro

☺ サむト https://MszPro.com

writing-quickly_emoji_400.png

Written by MszPro~

17
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?