【PythonでAIアート】DISCOARTのインストール

【PythonでAIアート】DISCOARTのインストール 機械学習

「AIアートを無料で無制限に行いたい」
「テキストから画像を自動生成するCLIPベースのモデルを試したい」

このような場合には、DISCOARTがオススメです。
この記事では、AIアートが可能なDISCOARTについて解説しています。

本記事の内容

  • DISCOARTとは?
  • DISCOARTのシステム要件
  • DISCOARTのインストール
  • DISCOARTの設定
  • DISCOARTの動作確認

それでは、上記に沿って解説していきます。

DISCOARTとは?

DISCOARTとは、Disco Diffusionを利用できるPythonライブラリです。
Disco Diffusionとは、CLIPベースの画像生成モデルになります。

CLIPについては、次の記事で説明しています。

簡単に言うと、テキストから画像を生成する技術のことです。
このCLIPベースの画像生成モデルは、他にも存在します。

これらと比べると、DISCOARTはより簡単にAIアートが実行できます。
気軽にAIアートをDisco Diffusionで試したい場合には、DISCOARTは最適と言えます。

以上、DISCOARTについて説明しました。
次は、DISCOARTのシステム要件を説明します。

DISCOARTのシステム要件

現時点(2022年8月)でのDISCOARTの最新バージョンは、0.12.0となります。
この最新バージョンは、2022年8月10日にリリースされています。

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

サポート対象となるPythonのバージョンは、以下となっています。

  • Python 3.7
  • Python 3.8
  • Python 3.9
  • Python 3.10

このサポート状況は、以下のPython公式開発サイクルに完全に一致しています。

バージョンリリース日サポート期限
3.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年10月4日2026年10月

Python 3.6のサポートは、2021年で終了していることに注意しましょう。
そして、最も重要なのはPyTorchが必須というところになります。

最新版のPyTorchをインストールしましょう。
GPU版PyTorchのインストールについては、次の記事で説明しています。

DISCOARTは、CPU版PyTorchでも動くようです。
しかし、GPU版PyTorchを推奨しておきます。
おそらく、CPU版ではまともに動かないでしょうから。

以上、DISCOARTのシステム要件を説明しました。
次は、DISCOARTのインストールを説明します。

DISCOARTのインストール

DISCOARTのインストールは、Python仮想環境の利用をオススメします。
かなり多くのパッケージに依存がインストールされます。

Python仮想環境は、次の記事で解説しています。

検証は、次のバージョンのPythonで行います。

> python -V 
Python 3.10.4

まずは、現状のインストール済みパッケージを確認しておきます。
事前にGPU版のPyTorchがインストール済みです。

> pip list 
Package            Version 
------------------ ------------ 
certifi            2022.6.15 
charset-normalizer 2.1.0 
idna               3.3 
numpy              1.23.2 
Pillow             9.2.0 
pip                22.2.2 
requests           2.28.1 
setuptools         65.0.2 
torch              1.12.1+cu113 
torchaudio         0.12.1+cu113 
torchvision        0.13.1+cu113 
typing_extensions  4.3.0 
urllib3            1.26.11 
wheel              0.36.2

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、DISCOARTのインストールです。
DISCOARTのインストールは、以下のコマンドとなります。

pip install discoart

DISCOARTのインストールは、そこそこ時間がかかります。
終了したら、どんなパッケージがインストールされたのかを確認します。

> pip list 
Package                Version 
---------------------- ------------ 
aiofiles               0.8.0 
aiohttp                3.8.1 
aiosignal              1.2.0 
aiostream              0.4.4 
anyio                  3.6.1 
async-timeout          4.0.2 
attrs                  22.1.0 
blobfile               1.3.1 
certifi                2022.6.15 
cffi                   1.15.1 
charset-normalizer     2.1.0 
click                  8.1.3 
colorama               0.4.5 
commonmark             0.9.1 
cryptography           37.0.4 
cycler                 0.11.0 
discoart               0.12.0 
docarray               0.15.0 
docker                 4.2.2 
docker-pycreds         0.4.0 
fastapi                0.79.0 
filelock               3.8.0 
fonttools              4.35.0 
frozenlist             1.3.1 
ftfy                   6.1.1 
gitdb                  4.0.9 
GitPython              3.1.27 
grpcio                 1.47.0 
grpcio-health-checking 1.47.0 
grpcio-reflection      1.47.0 
guided-diffusion-sdk   1.0.0 
h11                    0.13.0 
httptools              0.4.0 
idna                   3.3 
jina                   3.7.9 
jina-hubble-sdk        0.12.1 
kiwisolver             1.4.4 
lpips                  0.1.4 
lz4                    4.0.2 
matplotlib             3.5.3 
multidict              6.0.2 
numpy                  1.23.2 
open-clip-torch        1.3.0 
openai-clip            1.0.1 
packaging              21.3 
pathspec               0.9.0 
pathtools              0.1.2 
Pillow                 9.2.0 
pip                    22.2.2 
prometheus-client      0.14.1 
promise                2.3 
protobuf               3.20.1 
psutil                 5.9.1 
pycparser              2.21 
pycryptodomex          3.15.0 
pydantic               1.9.2 
Pygments               2.13.0 
pyparsing              3.0.9 
pypiwin32              223 
pyspellchecker         0.6.3 
python-dateutil        2.8.2 
python-dotenv          0.20.0 
python-multipart       0.0.5 
pywin32                304 
PyYAML                 6.0 
regex                  2022.7.25 
requests               2.28.1 
resize-right-sdk       1.0.2 
rich                   12.5.1 
scipy                  1.9.0 
sentry-sdk             1.9.5 
setproctitle           1.3.2 
setuptools             65.0.2 
shortuuid              1.0.9 
six                    1.16.0 
smmap                  5.0.0 
sniffio                1.2.0 
starlette              0.19.1 
torch                  1.12.1+cu113 
torchaudio             0.12.1+cu113 
torchvision            0.13.1+cu113 
tqdm                   4.64.0 
typing_extensions      4.3.0 
urllib3                1.26.11 
uvicorn                0.18.2 
wandb                  0.13.1 
watchfiles             0.16.1 
wcwidth                0.2.5 
websocket-client       1.3.3 
websockets             10.3 
wheel                  0.36.2 
xmltodict              0.12.0 
yarl                   1.8.1

かなりの数のパッケージが、インストールされます。
これが、Python仮想環境の利用を推奨する理由です。

以上、DISCOARTのインストールを説明しました。
次は、DISCOARTの設定を説明します。

DISCOARTの設定

DISCOARTを動作させる上での、必要な設定を説明します。
DISCOARTの設定とは、以下のことです。

  • Weights & Biases(WandB)の設定
  • Jina AIへのログイン
  • CUDA out of memory(GPUのメモリ不足)への対応

それぞれを下記で説明します。

Weights & Biases(wandb)の設定

wandbとは、機械学習の実験管理サービスです。
個人利用の場合は、無料で使えます。

機械学習において、次のようなグラフを見たことがあるでしょう。

DISCOARTでは、wandbに対応しています。
そして、デフォルトでは利用する前提の設定となっています。

もちろん、利用する場合はアカウント登録が必要です。
設定は、次の環境変数を用います。

  • WANDB_MODE
  • WANDB_API_KEY

WANDB_MODEには、デフォルトでは「online」が設定されています。
「disabled」に設定すると、wandbを利用しないようになります。

WANDB_API_KEYには、次のような文字列を設定します。

もちろん、WANDB_MODEが「online」のときにのみ意味があります。
なお、wandbを利用しなくてもDISCOARTは利用できます。

Jina AIへのログイン

Jina AIは、DISCOARTを開発している企業です。
ここで言うログインとは、この企業の提供するサービスへのログインのことです。

Jina Hub
https://hub.jina.ai/

未ログインあれば、動作の度に次のように表示されます。

ログイン方法については、次のページで説明されています。
https://github.com/jina-ai/jina-hubble-sdk

なお、Jina AIへログインしなくてもDISCOARTは利用できます。

CUDA out of memory(GPUのメモリ不足)への対応

これが、最も厄介です。
放置すると、エラーが出てDISCOARTが動きません。

エラーが出ないなら、何もする必要はありません。
しかし、次のようなエラーが出ると対策を実施する必要があります。

RuntimeError: CUDA out of memory. Tried to allocate 960.00 MiB (GPU 0; 8.00 GiB total capacity; 5.06 GiB already allocated; 0 bytes free; 6.63 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

このメッセージでは、GPUのメモリが不足していることを伝えています。
GPUのメモリが8GBでは、エラーが出ることを確認済みです。
(※正確には、各自の環境毎に異なる)

このエラーが出る場合は、環境変数のPYTORCH_CUDA_ALLOC_CONFを設定する必要があります。

以上、DISCOARTの設定を説明しました。
次は、DISCOARTの動作確認を説明します。

DISCOARTの動作確認

DISCOARTの動作確認は、次の条件で行います。

  • wandbは利用しない(disabled)
  • Jina AIにはログインしない
  • デフォルトではCUDA out of memoryエラーが出る

上記条件においては、次のコードで動作確認が可能です。

import os 
from discoart import create 

os.environ['WANDB_MODE'] = "disabled" 
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = "max_split_size_mb:500" 

da = create( 
    text_prompts='The Dog from Hell', 
    n_batches=1 
)

上記コードでは、「The Dog from Hell」で画像を1枚だけ作成するようにDISCOARTへ指示しています。
デフォルトでは、「n_batches=4」であるため4枚の画像が作成されます。

コードを実行すると、実行条件が表示されます。
「discoart-931caa47203911ed992e7085c2f05309」は、処理IDになります。

                   discoart-931caa47203911ed992e7085c2f05309                    
┌────────────────────────────┬────────────────────────────────────────────────┐ 
│                   Argument │ Value                                          │ 
├────────────────────────────┼────────────────────────────────────────────────┤ 
│                 batch_name │ None                                           │ 
│                 batch_size │ 1                                              │ 
│                 clamp_grad │ True                                           │ 
│                  clamp_max │ 0.05                                           │ 
│              clip_denoised │ False                                          │ 
│        clip_guidance_scale │ 5000                                           │ 
│                clip_models │ ['ViT-B-32::openai', 'ViT-B-16::openai',       │ 
│                            │ 'RN50::openai']                                │ 
│      clip_models_schedules │ None                                           │ 
│                 cut_ic_pow │ 1.0                                            │ 
│               cut_icgray_p │ [0.2]*400+[0]*600                              │ 
│               cut_innercut │ [4]*400+[12]*600                               │ 
│               cut_overview │ [12]*400+[4]*600                               │ 
│        cut_schedules_group │ None                                           │ 
│               cutn_batches │ 4                                              │ 
│            diffusion_model │ 512x512_diffusion_uncond_finetune_008100       │ 
│     diffusion_model_config │ None                                           │ 
│    diffusion_sampling_mode │ ddim                                           │ 
│               display_rate │ 1                                              │ 
│                        eta │ 0.8                                            │ 
│                    gif_fps │ 20                                             │ 
│             gif_size_ratio │ 0.5                                            │ 
│               image_output │ True                                           │ 
│                 init_image │ None                                           │ 
│                 init_scale │ 1000                                           │ 
│                 n_batches* │ 1                                              │ 
│             name_docarray* │ discoart-931caa47203911ed992e7085c2f05309      │ 
│        on_misspelled_token │ ignore                                         │ 
│                perlin_init │ False                                          │ 
│                perlin_mode │ mixed                                          │ 
│                   rand_mag │ 0.05                                           │ 
│            randomize_class │ True                                           │ 
│                range_scale │ 150                                            │ 
│                  sat_scale │ 0                                              │ 
│                  save_rate │ 20                                             │ 
│                      seed* │ 1031524948                                     │ 
│                 skip_event │ None                                           │ 
│                 skip_steps │ 0                                              │ 
│                      steps │ 250                                            │ 
│                 stop_event │ None                                           │ 
│           text_clip_on_cpu │ False                                          │ 
│              text_prompts* │ The Dog from Hell                              │ 
│     transformation_percent │ [0.09]                                         │ 
│ truncate_overlength_prompt │ False                                          │ 
│                   tv_scale │ 0                                              │ 
│    use_horizontal_symmetry │ False                                          │ 
│        use_secondary_model │ True                                           │ 
│      use_vertical_symmetry │ False                                          │ 
│             visualize_cuts │ False                                          │ 
│               width_height │ [1280, 768]                                    │ 
└────────────────────────────┴────────────────────────────────────────────────┘ 
                showing all args (bold * args are non-default)

警告などが表示された後に、次のような表示になればひとまずOKです。

 6%|▌         | 15/250 [01:08<16:56,  4.32s/it]

あとは、とにかく待ちましょう。
1枚の画像を作成するのには、20分程度はかかっています。
GPUのメモリに余裕があれば、この時間がもっと短くなるのでしょう。

処理が終わったら、作成できた画像が表示されます。
そして、「discoart-〇〇」(処理ID)という名前のディレクトリが作成されています。
そのディレクトリでは、次のように多くの画像を確認できます。

処理過程の画像が、各ステップごとに保存されています。
この場合では、「0-done-0.png」が完成画像となります。

0-done-0.png

どうでしょうか?
「The Dog from Hell」と言えば、そんな感じにも見えます。

また、DISCOARTは同じ画像を作成することはありません。
つまり、毎回異なる画像が作成されるということです。

異なる画像と言っても、似たような画像にはなりますけどね。

以上、DISCOARTの動作確認を説明しました。

タイトルとURLをコピーしました