DiscoArt 0.12 : 概要

DiscoArt 0.12 : 概要 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 09/07/2022 (v0.12.0)

* 本ページは、DiscoArt の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

DiscoArt 0.12 : 概要

魅惑的な Disco Diffusion アートワークを一行で作成します

 
DiscoArt はジェネレーティブ・アーティスト, AI 熱狂者とハードコアな開発者向けの魅惑的な Disco Diffusion [*] アートワークを作成するエレガントな方法です。DiscoArt は美しいコードベースによる最新 & プロフェッショナルな API を持ち、高いユーザビリティと保守性を保証します。結果のリカバリーと永続性、gRPC/HTTP サービング w/o TLS、事後分析 (= post-analysis) のような手軽な機能を導入していて、より大規模な交差モーダルやマルチモーダルなアプリケーションへの統合を容易にします。

[*] Disco Diffusion は Google Colab ノートブックで、テキストプロンプトから魅惑的で美しい画像を作成することを可能にする CLIP-Guided Diffusion を利用します。

 
💯 クラス最高 : 業界レベルのエンジニアリング、最高のコード品質、無駄がない依存関係、小さい RAM/VRAM 使用量 ; 重要なバグ修正、機能改良 vs. オリジナル DD5.6

👼 誰でも利用可能 : セルフホスティングのためのスムースなインストール、Google Colab free tier、非-GUI (IPython) 環境、そして CLI ! 難解プログラミング言語なし、依存関係地獄なし、stackoverflow (必要) なし。

🎨 コードではなく作成にフォーカス : Pythonic なインターフェイス、IDE の自動補完、そしてパワフルな機能を持つ、ワンライナー create()。いつでもどこでもリアルタイムな結果を取得し、Google Colab のセッションの違反をもう心配する必要はありません。より効率的なパラメータ探索のために初期状態を簡単に設定できます。

🏭 統合 & プロダクションへの準備 : DocArray データ構造の上に構築され、Jina, CLIP-as-service そして他の cross-/multi-モーダル・アプリケーションとのスムースな統合を楽しんでください。

☁️ As-a-service : 単純に python -m discoart serve で、DiscoArt は gRPC/HTTP/websockets と TLS をサポートする高性能な低遅延サービスになります。スケールアップ/ダウンはワンラインです ; クラウドネイティブな機能 e.g. Kubernetes, Prometheus と Grafan もワンラインです。Jina により信じられないほど簡単です

 

ギャラリー with プロンプト

各ツイートで discoart-id を見れますか?config & プロンプトを取得するには、単純に :

from discoart import show_config

show_config('discoart-id')

 

インストール

Python 3.7+ と CUDA 対応 PyTorch が必要です。

pip install discoart

これはセルフホスティング、Google Colab、システム統合、非 GUI 環境のすべてに当てはまります。

 

GUI

DiscoArt は Disco Diffusion アートワークを作成するためのインフラストラクチャです。組み込みの Jupyter ノートブックのサポートは基本的なしかし限定的なユーザ体験を与えます、例えば、それは プロンプト・スケジューリング のための直感的な GUI を提供していません。DiscoArt は開発者-centric で API-first であり、従って消費者向けの体験の改良は範囲外であることに注意してください。既に DiscoArt をサービスとして統合してその上に素晴らしい GUI を提供している (Jina AI 関連ではない) サービス、プラットフォームと製品があります、例えば Fever Dreams, Replicate, RunPod そして Renderflux です。

サードパーティ GUI

  • Fever Dreams : 素晴らしい GUI とギャラリーを備えたフリーのコミュニティによるサービスで、そこでは DiscoArt アートワーク, プロンプトと config を生成して共有できます。

  • Replicate : サンドボックスなユーザ体験と可視化を伴う DiscoArt のフリーフォーム・ベースの GUI です。

  • RunPod : config と創作物を可視化する単純でクリーンな GUI を備えた DiscoArt コンテナを実行する有料の GPU クラウドプロバイダです。

  • Renderflux : DiscoArt をラップ制作管理のための end-to-end な GUI を提供する有料の creative アートプラットフォームです。

これらのプラットフォーム、製品あるいは企業は Jina AI と提携してないことに注意してください。They define their own terms of services, paywall and data and privacy policies, which are not in the scope of DiscoArt MIT License.

 

Get Started

アートワークの作成

from discoart import create

da = create()

That’s it! それは デフォルトのテキストプロンプトとパラメータ で作成します。

 

プロンプトとパラメータの設定

サポートされるパラメータは ここでリストアップ されます。それらを create() で指定できます :

from discoart import create

da = create(
    text_prompts='A painting of sea cliffs in a tumultuous storm, Trending on ArtStation.',
    init_image='https://d2vyhzeko0lke5.cloudfront.net/2f4f6dfa5a05e078469ebe57e77b72f0.png',
    skip_steps=100,
)

パラメータを忘れた場合には、いつでもチートシートを調べてください :

from discoart import cheatsheet

cheatsheet()

DiscoArt と DD5.6 間のパラメータの違いは ここで説明されています

 

結果の可視化

最終結果と中間結果は現在の作業ディレクトリ下に作成されます、i.e.

./{name-docarray}/{i}-done.png
./{name-docarray}/{i}-step-{j}.png
./{name-docarray}/{i}-progress.png
./{name-docarray}/{i}-progress.gif
./{name-docarray}/da.protobuf.lz4

ここで :

  • name-docarray は実行の名前です、それを指定できますがそうでないならランダム名になります。
  • i-* は n_batches の値に依ります。
  • *-done-* は on done の最終画像です。
  • *-step-* はあるステップの中間画像で、リアルタイムに更新されます。
  • *-progress.png はそこまでの総ての中間的な結果のスプライト画像で、リアルタイムに更新されます。
  • *-progress.gif はそこまでの総ての中間結果のアニメ gif で、リアルタイムに更新されます。
  • da.protobuf.lz4 はそこまでの総ての中間結果の圧縮 protobuf で、リアルタイムに更新されます。

保存頻度は save_rate で制御されます。

更に、create() は da を返します、DocumentArray -型オブジェクトです。それは以下の情報を含みます :

  • create() 関数に渡される総ての引数 – シード, テキストプロンプトそしてモデルパラメータを含みます。
  • 4 つの生成画像とその中間ステップの画像、ここで 4 は n_batches により決定され、デフォルト値です。

これは強力な DocArray API により結果の更なる後処理、分析、エクスポートを可能にします。

画像は .uri の Data URI としてストアされ、最初の画像をローカルファィルとしてセーブするには :

da[0].save_uri_to_file('discoart-result.png')

総ての最終画像をセーブするには :

for idx, d in enumerate(da):
    d.save_uri_to_file(f'discoart-result-{idx}.png')

4 つ総ての最終画像をグリッド内に表示することもできます :

da.plot_image_sprites(skip_empty=True, show_index=True, keep_aspect_ratio=True)

Or display them one by one:

for d in da:
    d.display()

Or take one particular run:

da[0].display()

 

中間ステップの可視化

ある実行 (例えば最初の実行) にズームインして中間ステップを確認することもできます :

da[0].chunks.plot_image_sprites(
    skip_empty=True, show_index=True, keep_aspect_ratio=True
)

チャンクを一つずつ .display() したり、.save_uri_to_file() を通して一つセーブしたり、あるいは総ての中間ステップを GIF としてセーブすることができます :

da[0].chunks.save_gif(
    'lighthouse.gif', show_index=True, inline_display=True, size_ratio=0.5
)

Note that >=0.7.14, a 20FPS gif is generated which includes all intermedidate steps.

 

Show/save/load config

Document/DocumentArray の config を表示するには、

from discoart import show_config

show_config(da)  # show the config of the first run
show_config(da[3])  # show the config of the fourth run
show_config(
    'discoart-06030a0198843332edc554ffebfbf288'
)  # show the config of the run with a known DocArray ID

Document/DocumentArray の config をセーブするには、

from discoart import save_config

save_config(da, 'my.yml')  # save the config of the first run
save_config(da[3], 'my.yml')  # save the config of the fourth run

Document/DocumentArray の YAML config から create を実行するには、

from discoart import create, load_config

config = load_config('my.yml')
create(**config)

config を SVG 画像としてエクスポートすることもできます :

from discoart.config import save_config_svg

save_config_svg(da)

config から実行可能な Python コードを直接生成することもできます :

from discoart.config import export_python

export_python(da)

 

結果をいつでもどこでも引き出す

貴方が free-tier の Google Colab ユーザである場合、一つの面倒事 (= annoy thing) は時々起きるセッションのロストです。あるいは最初の画像が十分に良くはなく実行を早期停止したり、キーボード割り込みが .create() がどのような結果も返すことも妨げることがあります。いずれの場合も、最後のセッション ID を引き出すことで結果を容易にリカバーできます。

  1. セッション ID を見つける。それは画像の上に現れます。


  2. 必ずしも Google Colab 上でなくても、いつでもどのマシンでも その ID を助ける通して結果を引き出せます :
    from docarray import DocumentArray
    
    da = DocumentArray.pull('discoart-3205998582')
    

 

ドキュメントを初期状態として再利用する

ドキュメントを config と画像を持つ自己充足的なデータとして考えれば、それを将来的な実行に対する初期状態として利用できます。.tags は初期パラメータとして使用されます ; .uri はもしあれば初期画像として使用されます。

from discoart import create
from docarray import DocumentArray

da = DocumentArray.pull('discoart-3205998582')

create(
    init_document=da[0],
    cut_ic_pow=0.5,
    tv_scale=600,
    cut_overview='[12]*1000',
    cut_innercut='[12]*1000',
    use_secondary_model=False,
)

既知の DocArray ID から初期化することを望む場合には、単純に :

from discoart import create

create(init_document='discoart-3205998582')

 

環境変数

DiscoArt のメタ動作を制御するために環境変数を設定できます。環境変数は DiscoArt をインポートする前に Bash or Python で os.environ 経由で設定される必要があります。

DISCOART_LOG_LEVEL='DEBUG' # more verbose logs
DISCOART_OPTOUT_CLOUD_BACKUP='1' # opt-out from cloud backup
DISCOART_DISABLE_IPYTHON='1' # disable ipython dependency
DISCOART_DISABLE_RESULT_SUMMARY='1' # disable result summary after the run ends
DISCOART_DEFAULT_PARAMETERS_YAML='path/to/your-default.yml' # use a custom default parameters file
DISCOART_CUT_SCHEDULES_YAML='path/to/your-schedules.yml' # use a custom cut schedules file
DISCOART_MODELS_YAML='path/to/your-models.yml' # use a custom list of models file
DISCOART_OUTPUT_DIR='path/to/your-output-dir' # use a custom output directory for all images and results
DISCOART_CACHE_DIR='path/to/your-cache-dir' # use a custom cache directory for models and downloads
DISCOART_DISABLE_REMOTE_MODELS='1' # disable the listing of diffusion models on Github, remote diffusion models allows user to use latest models without updating the codebase.
DISCOART_REMOTE_MODELS_URL='https://yourdomain/models.yml' # use a custom remote URL for fetching models list
DISCOART_DISABLE_CHECK_MODEL_SHA='1' # disable checking local model SHA matches the remote model SHA
DISCOART_DISABLE_TQDM='1' # disable tqdm progress bar on diffusion

 

CLI

DiscoArt は CLI から DiscoArt の実行を可能にする 2 つのコマンド create と config を提供しています。

python -m discoart create my.yml

これは YAML config ファイル my.yml からアートワークを作成します。次を行なうこともできます :

cat config.yml | python -m discoart create

それでは独自の my.yml をどのように持つことができて、それはどのようなものでしょう?それが 2 番目のコマンドです :

python -m discoart config my.yml

これは デフォルトの YAML config をフォークしてそれらを my.yml にエクスポートします。そしてそれを変更して python -m discoart create コマンドで実行できます。

出力パスが指定されない場合には、python -m discoart config はデフォルトの config を stdout にプリントします。

コマンドのヘルプを得るには、最後に –help を追加します、例えば :

python -m discoart create --help
usage: python -m discoart create [-h] [YAML_CONFIG_FILE]

positional arguments:
  YAML_CONFIG_FILE  The YAML config file to use, default is stdin.

optional arguments:
  -h, --help        show this help message and exit

 

Serving

DiscoArt のサービングは非常に簡単です。単純に次のコマンドを実行します :

python -m discoart serve

You shall see:

そして curl/Javascript 経由でリクエストをサーバに送ります、例えば :

curl \
-X POST http://0.0.0.0:51001/post \
-H 'Content-Type: application/json' \
-d '{"execEndpoint":"/create", "parameters": {"text_prompts": ["A beautiful painting of a singular lighthouse", "yellow color scheme"]}}'

That’s it.

もちろん JSON で create() 関数が受け取る総てのパラメータを渡すことができます。

 

中間結果のポーリング

create 関数が GPU 上でさえ遅くてアートワークを完了するのに 10 分かかるかもしれないことを私たちは既に知っています。つまり、上記のリクエストを送った後、クライアントはレスポンスを 10 分間待つ必要があります。総てが同期的に実行される場合にはこの動作は何も問題ありません。けれども実際には、クライアントは最後まで待つ代わりに、途中で進捗や中間結果を期待するかもしれません。

/result エンドポイントはこの目的で設計されています。それは中間結果をそれらが利用可能になるとすぐに返します。必要なもののすべては /create エンドポイントで指定したように、リクエスト・パラメータで name_docarray を指定することだけです。ここに例があります :

次のリクエストを /create エンドポイントに送って mydisco-123 を作成しましょう :

curl \
-X POST http://0.0.0.0:51001/post \
-H 'Content-Type: application/json' \
-d '{"execEndpoint":"/create", "parameters": {"name_docarray": "mydisco-123", "text_prompts": ["A beautiful painting of a singular lighthouse", "yellow color scheme"]}}'

上のリクエストがサーバ上で処理されている今、次のリクエストを /result エンドポイントに送ることで mydisco-123 の進捗を定期的にチェックできます :

curl \
-X POST http://0.0.0.0:51001/post \
-H 'Content-Type: application/json' \
-d '{"execEndpoint":"/result", "parameters": {"name_docarray": "mydisco-123"}}'

最新の進捗、DataURI としての画像、損失、ステップ等とともに JSON が返されます。Document/DocumentArray の JSON スキーマはここで記述されています

注意してください、Jina ゲートウェイのスマートなルーティングにより /result は /create によりブロックされません。これらのエンドポイントについて更に学習/プレイするために、ReDoc やサーバに埋め込まれた Swagger UI を確認できます。

 

スキップ & キャンセル

/skip への送信は、現在の実行をスキップして n_batches で定義された次の実行に移ります :

curl \
-X POST http://0.0.0.0:51001/post \
-H 'Content-Type: application/json' \
-d '{"execEndpoint":"/skip"}'

/stop への送信は、現在の実行を停止して、n_batches の総ての実行をキャンセルします :

curl \
-X POST http://0.0.0.0:51001/post \
-H 'Content-Type: application/json' \
-d '{"execEndpoint":"/stop"}'

 

/create リクエストのアンブロック

ブロックされない /create エンドポイントを持つことが可能です : /create へのクライアント・リクエストは結果が終了することを待つことなく 直ちに 戻ります。このとき結果をポーリングするためには /result に完全に依存しなければなりません。

この機能を有効にするには :

  1. デフォルトの flow.yml ファイル を myflow.yml にコピー & ペーストします ;

  2. discoart executor セクションの floating: false を floating: true に変更します ;

  3. 次のコマンドを実行します ;
    python -m discoart serve myflow.yml
    

リクエストの速度は今では 貴方の制御 下にあることに注意してください。つまり、クライアントが 1 秒間に 10 の /create リクエストを送る場合、サーバは 10 create() を並列に開始します!これは簡単に OOM につながる可能性があります。そのため、提案としては、クライアントが多すぎるリクエストを送らないことが確かな場合に限り、この機能を有効にすることです、例えばクライアントのリクエストレートを制御する場合 ; あるいは BFF (backend for frontend) の背後で DiscoArt を使用している場合です。

 

スケールアウト

貴方が複数の GPU を持ち、GPU を時間多重化 (= time-multiplexed) 方式で活用して複数の DiscoArt インスタンスを並列に実行したい場合、デフォルトの flow.yml ファイル をコピー & ペーストしてそれを以下のように変更することができます :

jtype: Flow
with:
  protocol: http
  monitoring: true
  port: 51001
  port_monitoring: 51002  # prometheus monitoring port
  env:
    JINA_LOG_LEVEL: debug
    DISCOART_DISABLE_IPYTHON: 1
    DISCOART_DISABLE_RESULT_SUMMARY: 1
executors:
  - name: discoart
    uses: DiscoArtExecutor
    env:
      CUDA_VISIBLE_DEVICES: RR0:3  # change this if you have multiple GPU
    replicas: 3  # change this if you have larger VRAM
  - name: poller
    uses: ResultPoller

ここで replicas: 3 は 3 つの DiscoArt インスタンスを起動し、CUDA_VISIBLE_DEVICES: RR0:3 は最初の 3 つの GPU をラウンドロビン方式で使用することを確実にします。

それを myflow.yml と名前付けしてから次を実行します :

python -m discoart serve myflow.yml

 

カスタマイズ

Jina のおかげで、カスタマイズできる多くのことがあります!ポート番号の変更 ; プロトコルを gRPC/Websockets に変更 ; TLS 暗号化の追加 ; Prometheus モニタリングの有効/無効 ; 以下により Kubernetes deployment bundle にエクスポートすることもできます :

jina export kubernetes myflow.yml

機能と YAML config の詳細については、Jina docs を確認してください。

 

gRPC ゲートウェイの使用

(訳注 : 原文 参照)

 

Run in Docker

DiscoArt をすぐに実行するために事前ビルドされた Docker イメージを提供しています。Docker イメージを最新版に更新するには :

docker pull jinaai/discoart:latest

 

Jupyter notebook の使用

デフォルトのエントリポイントは Jupyter notebook を開始します。

# docker build . -t jinaai/discoart  # if you want to build yourself
docker run -p 51000:8888 -v $(pwd):/home/jovyan/ -v $HOME/.cache:/root/.cache --gpus all jinaai/discoart

そしてノートブックにアクセスするために http://127.0.0.1:51000 にナビゲートすることができます。

 

Windows 上 Docker で GPU を有効化

Windows Subsystem for Linux (WSL) でそれを利用できます、公式ガイドを ここ で確認してください。

# Make sure you install Windows 11 or Windows 10, version 21H2
docker run -p 8888:8888 -v $HOME/.cache:/root/.cache --gpus all jinaai/discoart

 

サービスとして使用

# docker build . -t jinaai/discoart  # if you want to build yourself
docker run --entrypoint "python" -p 51001:51001 -v $(pwd):/home/jovyan/ -v $HOME/.cache:/root/.cache --gpus all jinaai/discoart -m discoart serve

DiscoArt サーバは http://127.0.0.1:51001 で動作しています。

 

リリース・サイクル

Docker イメージはリリース毎にビルドされます ので、特定のバージョンにロックできます、例えば 0.5.1 :

docker run -p 51000:8888 -v $(pwd):/home/jovyan/ -v $HOME/.cache:/root/.cache --gpus all jinaai/discoart:0.5.1

 

What’s next?

Next is create.

😎 貴方が既に DD ユーザである場合 : you are ready to go! 特別に学習することはありません、DiscoArt は DD5.6 と同じパラメータ・セマンティクスを尊重しています。So just unleash your creativity! 違いについてはここで更に読んでください

総ての新しい/変更されたパラメータを確認するには “from discoart import cheatsheet; cheatsheet()” を常に実行することができます。

 
👶 DALL·E Flow または新規ユーザである場合 : Disco Diffusion は DALL·E とは全く異なる方法で動作しますので、一歩ずつ進むことを望むかもしれません。それは遥かに進んでいて強力です : 例えば、Disco Diffusion は重み付けられ & 構造化されたテキストプロンプトを取ることができます ; 制御されたノイズを持つ画像から初期化できます ; そして調整可能な多くのパラメータがあります。”armchair avocado” のようなせっかちな (= impatient) プロンプトは混乱とフラストレーションしか与えません。貴方自身のプロンプトを試す前に以下のリソースを確認することを強く勧めます :

 

以上