Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intel CPUでもAIに画像生成してもらう

Intel CPUでもAIに画像生成してもらう

"小江戸らぐ 9月のオフな集まり(第242回) - connpass" https://koedolug.connpass.com/event/258128/
source: https://gitlab.com/matoken/koedolug-2022.09/-/blob/main/slide/slide.adoc

Kenichiro MATOHARA

September 10, 2022
Tweet

More Decks by Kenichiro MATOHARA

Other Decks in Technology

Transcript

  1. Intel CPUでもAIに
    Intel CPUでもAIに
    画像生成してもら
    画像生成してもら


    Kenichiro Matohara(matoken)
    1 / 32

    View Slide

  2. 南隅から参加(鹿児島の右下)
    好きなLinuxディストリビューションはDebian
    お仕事募集 mailto:work@matohara.org
    Kenichiro Matohara(matoken)
    Kenichiro Matohara(matoken)
    https://matoken.org
    https://matoken.org
    2 / 32

    View Slide

  3. Intel CPUでもAIに画像生成して
    Intel CPUでもAIに画像生成して
    もらう(Core i 6世代以降対応)
    もらう(Core i 6世代以降対応)
    画像生成AIのStable DiffusionがOSSで公開
    しかローカルで動かすにはディスクリートGPUが必要(今は行ける?)
    とりあえず無料で提供されている @shi3zさんのStable
    Diffusion Web AppのMemeprex.appで遊ぶ
    Intel内蔵GPUで動作するStable Diffusion.OpenVINOを知っ
    たので試してみた
    Memeplex.app
    bes-dev/stable_diffusion.openvino
    3 / 32

    View Slide

  4. いくつかのStable Diffusion
    いくつかのStable Diffusion
    (クラウドの一つ)
    (iGPUで動作する今回
    試したもの)
    その他派生いっぱい
    Stable Diffusion with 🧨 Diffusers
    Google Colab で はじめる Stable Diffusion v1.4|npaka|
    note
    bes-dev/stable_diffusion.openvino
    4 / 32

    View Slide

  5. Stable Diffusion OpenVINO
    Stable Diffusion OpenVINO
    Intel内蔵GPUで動作するOpenVINOを使ってStable
    Diffusionを動くようにしたもの
    動作要件
    bes-dev/stable_diffusion.openvino
    Requirements

    Linux, Windows, MacOS

    Python 3.8.+

    CPU compatible with OpenVINO.
    5 / 32

    View Slide

  6. OpenVINOの要件
    手元の端末は第3及び第6世代
    System Requirements for the Intel® Distribution of
    OpenVINO™
    Toolkit
    CPU

    Processors

    6th to 12th generation Intel Core processors

    1st to 3rd generation of Intel® Xeon® Scalable processors

    Intel Atom® processor with Intel® Streaming SIMD Extensions 4.2 (Intel® SSE4.2)
    $ lscpu | grep ^Model\ name:

    Model name: Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz

    $ lscpu | grep ^Model\ name:

    Model name: Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
    6 / 32

    View Slide

  7. 導入環境
    導入環境
    LENOVO ThinkPad Yoga 260
    CPU
    Intel® Core™
    i5-6200U CPU @ 2.30GHz
    RAM
    DDR4 8GB
    DISK
    SSD + USB2.0接続HDD

    SSDの容量が足りないので外付けHDDに導入した
    7 / 32

    View Slide

  8. Stable Diffusion OpenVINO 導入
    Stable Diffusion OpenVINO 導入
    1
    HDDに作業ディレクトリ作成
    2
    virtualenv で環境作成
    3
    virtualenv環境反映
    4
    stable_diffusion.openvinoをclone
    5
    Install

    Dockerfileも在り
    $ mkdir /media/matoken/export/sd

    $ cd /media/matoken/export/sd

    $ virtualenv .

    $ source bin/activate

    $ git clone https://github.com/bes-dev/stable_diffusion.openvino

    $ cd stable_diffusion.openvino

    $ pip install -r requirements.txt
    1
    2
    3
    4
    5
    8 / 32

    View Slide

  9. 実行
    実行
    $ python ./demo.py --prompt "kawaii neko"

    :
    9 / 32

    View Slide

  10. 初回起動時にモデルデータのダ
    初回起動時にモデルデータのダ
    ウンロードが行われる
    ウンロードが行われる
    10回以上試みたがタイムアウトで失敗&毎回ファイル先頭からダウン
    ロードで進めないのでVPSで入手してコピー
    DiskFullになったので
    ~/.cache/huggingface
    からHDDにシン
    ボリックリンクを貼ってそちらにコピー
    $ ls -Ss1 ~/.cache/huggingface/hub/models--bes-dev--stable-diffusion-v1-4-openvino/blobs/

    合計 4169032

    3357512 7655112cde3c5084c2709b2b89994834b24efc457f2c1b302bb3d7a056bfdb7a

    480740 b3f34c33d8c272f61c6780251a503911c7e7a448cdc10f8fb7d9bc59c3462951

    193328 456fd6d12ffab507af1ad6772b7b1922b35502272cd5be3708c8292252cd4c46

    133460 8732df1da0a3026da5ee6070df8899efbccf0d844821368214af8d95abeae467

    2952 a6514903a2875c318399e451c1f9ddaf4a3f7ba4

    460 dfb9780b4527132dfe9a19ccc7ce5c0d885cb2ae

    328 c0f568310ea3a649aea01772031087d324272780

    252 87adf22fe4160e26a799270b2f53c8c21c9d6cd0
    10 / 32

    View Slide

  11. プロンプトからの画像生成
    プロンプトからの画像生成
    ここまで来たら画像生成ができる
    テキストの文字列でどんな画像を生成するか伝える → プロンプト
    メモリが足りなそう😿
    $ python ./demo.py --prompt "kawaii neko"

    Terminated
    11 / 32

    View Slide

  12. メモリ不足なのでディスクスワ
    メモリ不足なのでディスクスワ
    ップファイルの追加
    ップファイルの追加
    1
    8GB程のディスクイメージの作成
    2
    スワップとして初期化
    3
    スワップを有効にする
    4
    再度画像生成
    $ dd if=/dev/zero of=./swap.img bs=1M count=8096

    $ sudo chown 0.0 ./swap.img

    $ sudo chmod 600 ./swap.img

    $ sudo mkswap ./swap.img

    $ sudo swapon `pwd`/swap.img

    $ python ./demo.py --prompt "kawaii neko"

    32it [13:14, 24.84s/it]
    1
    2
    3
    4
    12 / 32

    View Slide

  13. 15分程経って処理が終了し,
    output.png
    として画像が出来た
    何度か試すと10〜20分程で1枚
    LoadAverageは10くらいまで上がって他の処理はあまりやりた
    くない感じ
    13 / 32

    View Slide

  14. またTerminated
    またTerminated
    数回に一回
    Terminated
    この環境に導入している
    nohung
    がkillしているようなので一時的に
    無効にして安定
    一般的な環境には導入されていない
    $ sudo systemctl stop nohang-desktop.service

    $ sudo systemctl stop nohang.service
    14 / 32

    View Slide

  15. 次回以降起動時
    次回以降起動時
    1
    Stable Diffusion 作業ディレクトリに移動
    2
    virtualenv virtualenv 環境反映
    3
    disk swap 反映
    4
    nohang 停止
    $ cd /media/matoken/export/sd/stable_diffusion.openvino

    $ source ../bin/activate

    $ sudo swapon `pwd`/swap.img

    $ sudo systemctl stop nohang-desktop.service

    $ sudo systemctl stop nohang.service
    1
    2
    3
    4
    15 / 32

    View Slide

  16. 初期画像とプロンプトから画像
    初期画像とプロンプトから画像
    生成(img2img)
    生成(img2img)
    初期画像を渡してそれを参考にプロンプトから画像を生成する
    初期画像に山の中のハンモック画像,プロンプトに「寝猫,キャンプ場,
    ハンモック」
    $ python demo.py --seed ${seed} --prompt "sleep cat, campe site, hammock" --init-image=./hammo
    16 / 32

    View Slide

  17. 元画像
    17 / 32

    View Slide

  18. ハンモックに猫っぽいものが
    ハンモックに猫っぽいものが
    18 / 32

    View Slide

  19. SEEDの固定
    SEEDの固定
    モデルとSEEDとプロンプトが同じだと同じ画像が得られるらしいの
    で試す
    既定値では内部でランダムなSEEDが使われる(後でわからない)よう
    なので実行時に引数で適当なSEEDを渡す
    MODEL: bes-dev/stable-diffusion-v1-4-openvino (既定値)
    SEED: 999999
    PROMPT: "kawaii neko"
    $ python demo.py --seed 999999 --prompt "kawaii neko" --output "kawaii_neko-999999-01.png"

    32it [09:47, 18.36s/it]

    $ python demo.py --seed 999999 --prompt "kawaii neko" --output "kawaii_neko-999999-02.png"

    32it [09:41, 18.18s/it]
    19 / 32

    View Slide

  20. 見た目もチェックサムも同じ
    見た目もチェックサムも同じ
    $ sha512sum ./kawaii_neko-999999-0?.png

    3cd2fad521495571842d9f37f13113bd6a18195e120fd4cded40f7fcf59eb3807cdd9aa43ae4831dfd7e4b0228077bd
    3cd2fad521495571842d9f37f13113bd6a18195e120fd4cded40f7fcf59eb3807cdd9aa43ae4831dfd7e4b0228077bd
    20 / 32

    View Slide

  21. 低解像度で作成して気に入った
    低解像度で作成して気に入った
    画像だけ高解像度で作り直すと
    画像だけ高解像度で作り直すと
    いったことができそう
    いったことができそう

    今の所OpenVINO版は解像度指定が出来ないがロードマップに
    ある
    Suggestion: Add --height and --width for
    generating images in different pixel sizes · Issue
    #6 · bes-dev/stable_diffusion.openvino
    21 / 32

    View Slide

  22. SEEDの範囲とパラメーターの記
    SEEDの範囲とパラメーターの記


    SEEDは既定値ではランダムで保存されないようなので毎回指定する
    ことにする
    SEEDの範囲は
    0〜4294967295
    (2^32)のよう
    生成された画像のexif領域にパラメータをメモしておく
    seed=$( shuf -i 0-4294967295 -n 1 )

    python demo.py --seed ${seed} --prompt "${prompt}" --init-image="${image}" --output "${outfile
    exiftool -overwrite_original -comment="SEED:${seed}/PROMPT:${prompt}" "${outfile}"
    $ exiftool ./seed-neko-1024.png | grep ^Comment

    Comment : SEED:1024/PROMPT:a charactor of Future kawaii neko
    22 / 32

    View Slide

  23. SEEDで探索
    SEEDで探索
    似たプロンプトでSEEDを指定してみる
    上から「kawaii inu」「kawaii neko」「kawaii penguin」
    SEEDが同じでプロンプトが似ていると似た傾向に?
    23 / 32

    View Slide

  24. strengthで探索
    strengthで探索
    どのくらいプロンプトに寄せるかの強さ?(0〜1で既定値:0.8)
    プロンプトのみ
    24 / 32

    View Slide

  25. 初期イメージあり
    25 / 32

    View Slide

  26. num-inference-steps
    num-inference-steps
    どのくらい推測するか?(既定値:32)
    20~くらいでSEED探索すると時
    間が節約できる?


    26 / 32

    View Slide

  27. NSFWフィルタ
    NSFWフィルタ
    Stable Diffusion既定値ではNSFWフィルタが掛かっている
    patchして外せる
    NSFWをすり抜けてくるものもあるのでWebサービスなどでは大変
    そう
    27 / 32

    View Slide

  28. プロンプト(呪文)の作り方
    プロンプト(呪文)の作り方
    Memeplexはプリセットが充実しているので便利,画像をクリック
    すると日本語,英語翻訳後のプロンプトも表示される
    構図やフィルタなどの例がたくさん紹介されている
    Twitterで「#StableDiffusion」などで検索
    プロンプトを推測してもらうことが出来る
    Memeplex.app
    The Ai Art - AI, Art, and everything in between
    https://twitter.com/search?
    q=%23stablediffusion&f=live
    methexis-inc/img2prompt – Run with an API on
    Replicate
    28 / 32

    View Slide

  29. Intel 第5世代以前でも動かしたい
    Intel 第5世代以前でも動かしたい
    OpenVINO版は6世代目以降のCPUが必要
    を見かける
    patch適用済リポジトリ
    導入例
    (docker runのbind mountが逆になっている?)
    第3世代のIntel® Core™
    i5-3320M CPU @
    2.60GHz/RAM 16GBで動くことを確認
    Stable Diffusion CPU patch
    https://github.com/loadletter/stable-diffusion
    https://rentry.org/cpu_stable_diffusion_guidea
    29 / 32

    View Slide

  30. imageサイズ指定も可能,以下はプロンプト,SEED,モデルは共通で
    128x128(9min), 256x256(31min), 512x512(139min)の
    例.サイズが違うと結果も違うものに?
    30 / 32

    View Slide

  31. まとめ
    まとめ
    Stable Diffusion楽しいけど時間をかけるか,お金をかけないと遊
    びにくかった
    OpenVINO版だとiGPUでも試せて嬉しい
    ディスクリートGPUに比べて速度は遅いけどローカルなのでパラメー
    ターをずらしながらloopで回したりなど気兼ねなく動かせる
    しかし進化が日どころか時間単位で目まぐるしいしこれから控えてい
    る3Dや動画対応となると今の環境では現実的ではない
    強いマシンや強いクラウドを使うべき……🦾
    31 / 32

    View Slide

  32. 奥付
    奥付
    発表
    発表者
    利用ソフトウェア
    ライセンス
    小江戸らぐ 9月のオフな集まり(第242回)
    Kenichiro Matohara(matoken)
    Asciidoctor Reveal.js
    CC BY 4.0
    32 / 32

    View Slide