こちらは、勉強会を行いました画像生成AI向けの入門資料となっています。
画像生成AIとは?
画像生成AIはテキストやイメージから自分の欲しい画像を出すことができます。txt2imgやimg2imgなど元となる素材やキーワードから自分の欲しい画像を生成してくれるAIです。
画像生成AIではすでにいくつかの有名なサービスがあり、自分の手元で実行するというよりはクラウド上で計算をしてくれて簡単に使うことができます。例えば、OpenAIの提供するDALL-E(ダーリー)はChatGPTと統合されたりしてテキストから所望の画像を作ってくれます。
DALL-E-3
また、Midjourney(ミッドジャーニー)は主にdiscordと呼ばれる掲示板のようなチャットサービスを使って、テキストなどを投げることにより欲しい画像を作ってくれます。また多少なら作った画像から派生して調整ができます。
Midjourney
ただ、これらのサービスは簡単にテキストから画像を作ってくれる一方で細かい制御などはこちらではできず、ある程度大雑把な調整のみになります。自分でより細かく画像を制御したい、作成したい場合にはローカルのマシンやクラウドのマシンにプログラムを導入して利用することができます。
その代表格がStable Diffusion(ステーブルディフュージョン)で、手元のパソコンなどに導入をすることで簡単に利用できます。
そもそもなぜ量子コンピュータと生成AI?
私たちは元々量子コンピュータのソフトウェアを開発していた企業です。なぜ生成AIを行っているのでしょうか。簡単に紹介させてください。元々私たちは量子コンピュータ向けのシミュレーションとしてGPUを利用するcuQuantum(クークオンタム)などを利用して機械学習のソフトウェア開発を行ってまいりました。cuQuantumはNVIDIAが2021年に提供を開始した公式の量子コンピュータシミュレータで多くのソフトウェアを高速に動作させることができる世界でのスタンダードフレームワークとなりました。
cuQuantum
https://developer.nvidia.com/cuquantum-sdk
私たちも公式フレームワークとしてそこに名を連ねていますが、このcuQuantumに搭載されている Tensor Network技術というのが近年急激に開発されてきました。このテンソルネットワークフレームワークはこれまでの量子コンピュータのシミュレータの仕組みから少し発展し、ニューラルネットワークとの類似性を活用してソフトウェアを開発します。例えばGoogleの提供しているTensorFlowなど、テンソルと呼ばれる要素を利用して計算をします。量子計算もテンソルを活用することで新しい道を切り拓き始めたのですが、それが生成AIとかなり相性が良く、いくつかの量子企業は近年生成AIに力を入れています。欧州を代表するTerra QuantumやMultiverseなどや、米国を代表するZapata Computingなどは近年このテンソルネットワークを活用し、生成AIに力を入れています。また、Zapata Computingは最近生成AI企業へと鞍替えし米国での上場を果たしました。このように量子計算の一部と生成AIはとても相性が良いです。我々も日本を代表し世界で多々変えるテンソルネットワーク技術を携え、世界中から物理出身の機械学習エンジニアがテンソルを活用したモデルの開発を行っています。
画像生成AIの数理モデル
画像生成AIは拡散モデルと呼ばれる、ノイズから徐々に画像に戻していく過程を学習することにより、効率的に画像の生成を行う拡散モデルをベースに理論が構築されています。また、この拡散モデルを効率的に画像に戻すためにノイズを取り除くデノイズの過程においては、ニューラルネットワークのモデルの中でもU-Net(ユーネット)と呼ばれるモデルが主に利用されています。最近ではこのU-Netの代わりにTransformerを利用したDiffusion Transformerなども出てきていますが、とりあえずU-Netを利用します。
U-Netは構造がU型をしていて、畳み込みを利用してダウンサンプル -> アップサンプルと手順を踏んでいきます。
また、最近では拡散モデルをさらに拡張した一貫性モデルと呼ばれるものもありますが、基本的には同じ理論に基づいています。ただ、入門ではこの辺りはあまり深くは触れません。
動画モデルなどとの関連
今回扱うモデルは静止画のモデルで、テキストから静止画を作ってくれます。動画を作成するようなモデルもこのような静止画のモデルをベースに作られており、静止画間でのモデルの一貫性や連続性などを確保するのにみんな苦労しています。一応勉強会でも質問が出ましたので補足しておきます。
モデル
以前は結構やることが決まっていなかったり、クオリティが出ないという課題がありましたが、最近はきちんとクオリティが確保され、ある程度簡単に所望の画像を出せるようになってきました。
画像生成AIで重要なのはcheckpoint(チェックポイント)と呼ばれる元のモデルで、これはテンソルと呼ばれる数字の配列の塊のデータとなっています。画像生成AIでどのようにノイズから画像に戻すかが数字として格納されているファイルで、.ckptや最近では.safetensorsの拡張子のモデルです。このようなチェックポイントのファイルは世界で作っている人がたくさんいて、それらを入手しやすい場所もあります。画像生成AIでは、これらのチェックポイントのデータモデルを取得できるサイトとして、
Hugging Face(ハギングフェイス)
や
CivitAI(シビットエーアイ)
があります。例えば、runwayから配布されているStable Diffusion v1.5に関しては、
https://huggingface.co/runwayml/stable-diffusion-v1-5
に概要がありますが、その中にタブでファイルが見れます。
https://huggingface.co/runwayml/stable-diffusion-v1-5/tree/main
このページにおける、v1-5-pruned-emaonly.safetensorsなどがチェックポイントのモデルファイルに相当します。
とにかく画像生成AIにおいてはこのチェックポイントファイルが一番重要な核となるファイルになります。
Python Jupyternotebookでの利用
では、このチェックポイントのファイルがあれば画像生成AIを使って画像を自由につくることができます。ファイルサイズも7G程度と大規模言語モデルと比較すると相対的に小さなサイズですので、マシンパワーも言語モデルほどは必要ないのも特徴です。
画像生成AIは画像を扱うので、GUIと呼ばれるマウスやトラックパッドなどをブラウザ経由で使うようなグラフィカルインターフェイスの相性が良いです。最近ではかなりプロ向けに色々な調整ができるものも出てきていますが、まずは純粋にPythonのコードを使って画像生成するようなものを確認します。
最近ではdiffusersと呼ばれるフレームワークを利用して、画像生成AIのモデルを読み込んで画像を生成するようなものが一般的です。コードは、まずdiffusersをインストールします。pypiと呼ばれるよく使われるパッケージ管理ツールから簡単にインストールできます。
(宣伝)blueqatでは量子計算だけでなく生成AIも簡単に使える研究開発プラットフォームを企業向けに有料で提供しています。宣伝でした。
pip install diffusers transformers
これでインストールできます。利用するのは簡単です。
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("runwayml/stable-diffusion-v1-5").to("cuda")
image = pipeline("cat and cherry blossom", num_inference_steps=25).images[0]
image
数行で計算できました。最初に画像を復元するノイズによって出来上がる画像も異なってきます。同じ画像を毎回作りたい場合にはノイズを作成する乱数と呼ばれるランダムな値を固定する必要があります。
pipelineを作ると簡単にテンソルの重みをロードして画像を生成する準備ができます。.from_pretrainedは、Hugging Faceで重みが格納されている場所を示すためのHugging Faceでのモデルの置き場に割り振られた名前です。今回は、
runwayml/stable-diffusion-v1-5
を指定しました。その後、プロンプトと呼ばれるテキストの羅列を記述し、推論ステップとして25を指定しました。ノイズから画像に戻すステップ数で、一般的には多い方が画像の書き込みやクオリティが上がります。
春なので、「猫と桜」と打ってみました、
かかった時間は、
25/25 [00:10<00:00, 2.36it/s]
GPUを利用しているので、25ステップで10秒ほどでした。25ステップはノイズから画像を復元するまでの拡散ステップに対応しています。
画像保存は、
image.save('neko.png')
のようにすれば保存できます。Jupyternotebookでも簡単に実行できました。研究開発にすぐに使えます。勉強会の後で言われましたが、GPUを利用しなくてもCPUでも推論できるのがいいと言われました。
.to("cuda")でGPU利用を指定しています。理由はGPUを利用した方が早いからです。GPUを利用しないで、CPUでも計算ができます。ただその場合には10分弱時間がかかります。10秒ほどで終わるGPUに比べるとだいぶ時間をロスします。GPUが手に入らない場合などはCPUでも計算してもいいと思います。
pipelineの設定をするときに、cudaの指定を外せばCPU計算になりますので、
pipeline = AutoPipelineForText2Image.from_pretrained("runwayml/stable-diffusion-v1-5")
と、cuda指定を外せばCPUでも計算できます。
GUIの利用
このようにJupyterを中心にPythonでの実装もできますが、画像を扱うのでGUIの方がやりやすいというのもあります。Stable DiffusionにはいくつかGUIを使って画面上で操作できるものがあります。一番有名なのがStable Diffusion Web UIというもので、Automatic1111版が有名です。
stable-diffusion-webui
https://github.com/AUTOMATIC1111/stable-diffusion-webui
UIは結構複雑ですが、利用するのは基本的にはtxt2imgかimg2imgのページかと思います。
左上にチェックポイントを選べます。チェックポイントのアップロードやダウンロードはこのページからはできないので、別途SSHなどで行う必要があります。modelsというフォルダの中にStable Diffusionというフォルダがあるので、その中に格納します。7GBくらいのサイズがあります。
こちらは初期設定で入っている、stable diffusion v1-5-pruned-emaonly.ckptというファイルが使えます。
プロンプトをテキストエリアに入れて、Generateボタンを押すだけで右下に絵が出ます。
左下に各種設定値がありますが、横幅、高さなどが重要で、Sampling stepsなどは多い方が一般的にはクオリティが上がります。
下の方のSeed値はモデルと画像サイズが同じならシード番号を固定にすることで同じ絵を再現することができます。
今回は細かい値の説明はしませんが、一般的にはプロンプト、画像サイズ、サンプリングステップ(モデルによるが、5-20くらい)、CFG Scale(モデルによって1-7程度)、Seedを指定すればOKです。Seedは-1にしておくとランダムで勝手に選んでくれます。
Sampling Methodもモデルによっては指定した方がクオリティが上がります。Hugging FaceやCivitAIでダウンロードするモデルの設定値が指定されていたりするので、そちらを参照して合わせるようにしてください。
どうでしょうか?導入は結構簡単です。やはりGUIを使った方が簡単ではあります。
別の勉強会ではLoRAと呼ばれるチェックポイントに付属させることで絵柄を調整するような追加コンテンツの導入方法や、
自分独自のチェックポイントの作成方法なども確認したいと思います。
diffusersやstable-diffusion-webuiを使うとCUIやGUIで簡単に画像生成ができますので、ぜひやってみてください。
今回は以上です。