11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

以前の記事の組み合わせで、 Google Colab 上で GPU を使い、 Elixir の Livebook で Python コードを実行して、 StableDiffusion で画像を生成します

Python の実行環境から Elixir の実行環境を起動して、その上で Python を動かすという遠回りな手法ではありますが、 Elixir と Python を連携させつつ、無料で GPU が使えるのは魅力的です

実装したノートブックはこちら

Google Colab 上での Livebook 起動

環境確認

!cat /etc/os-release
!nvcc --version
!cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

2025年6月時点では、 Google Colab の GPU ランタイム環境は以下のようになっています

  • OS: Ubuntu 22.04.4
  • CUDA: 12.5.82
  • cuDNN: 9.2.1

特に問題ないので、このまま進めます

mise のインストール

以下のコードを実行し、mise をインストールします

!sudo apt update -y && sudo apt install -y gpg sudo wget curl
!sudo install -dm 755 /etc/apt/keyrings
!wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor | sudo tee /etc/apt/keyrings/mise-archive-keyring.gpg 1> /dev/null
!echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
!sudo apt update
!sudo apt install -y mise

mise でインストールした Elixir と、 Hex でインストールした Livebook へのパスを通します

import os

os.environ['PATH'] = "/root/.local/share/mise/shims:/root/.mix/escripts:" + os.environ['PATH']

Erlang のインストール

Erlang の 27.3 をインストールします

!mise use -g erlang@27.3

Elixir のインストール

Elixir の 1.18.4 OTP 27 をインストールし、バージョン確認をします

!mise use -g elixir@1.18.4-otp-27
!elixir -v

Livebook のインストール

Livebook をインストールし、バージョン番号を確認します

!mix local.hex --force
!mix local.rebar --force
!mix escript.install hex livebook --force
!livebook -v

ngrok CLI のインストール

ngrok CLI をインストールします

ngrok を使うことで、 Colab 上の localhost で起動した Livebook に外部からアクセスできます

ngrok にアカウントを作成し、認証トークンを準備しておきましょう

スクリーンショット 2024-10-06 9.12.04.pngスクリーンショット 2024-10-06 9.12.33.png

!curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
	| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
	&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
	| sudo tee /etc/apt/sources.list.d/ngrok.list \
	&& sudo apt update \
	&& sudo apt install ngrok

パスワード用テキスト入力を用意し、 ngrok の認証トークンを入力します

from getpass import getpass

token = getpass()

スクリーンショット 2024-10-06 9.11.56.png

ngrok CLI に認証トークンを設定します

!ngrok config add-authtoken "$token"

Livebook の起動

ngrok を起動し、 Colab 上の localohost 8888 ポートを外部に公開します

get_ipython().system_raw('ngrok http 8888 &')
!sleep 5s

ngrok が外部に公開している URL を取得します

!curl -s http://localhost:4040/api/tunnels | python3 -c "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

Livebook を 8888 ポートで起動します

!livebook server --port 8888

ngrok の公開 URL にアクセスすると、 Livebook の認証画面が表示されます

スクリーンショット 2024-10-06 9.12.49.png

Livebook 起動時に表示される URL 末尾の認証トークンを入力してください(下画像の赤枠部分)

スクリーンショット 2024-10-06 9.12.33.png

StableDiffusion による画像生成

セットアップ

Livebook のホーム画面から、右上の青い "+ New notebook" ボタンで新しいノートブックを開きます

スクリーンショット 2025-05-29 9.53.54.png

一番上のセットアップセルをクリックすると、セルの左下に見慣れない "+ Python" ボタンが表示されます

スクリーンショット 2025-05-29 9.52.04.png

"+ Python" ボタンをクリックすると、セットアップセルに Python セル用の設定が自動的に追加されます

スクリーンショット 2025-05-29 9.56.16.png

Elixir のセットアップセルに以下のコードを入力します

Mix.install([
  {:pythonx, "~> 0.4.2"},
  {:kino_pythonx, "~> 0.1.0"},
  {:evision, "~> 0.2.13"}
])

Python のセットアップセルに以下のコードを入力します

[project]
name = "project"
version = "0.0.0"
requires-python = "==3.13.*"
dependencies = [
  "diffusers[torch]",
  "transformers"
]

セットアップセルを実行すると、必要なモジュールがインストールされます

GPU 使用可能確認

Python セルで CUDA が使用できるかどうかを確認します

import torch

torch.cuda.is_available()

実行結果

True

StableDiffusion による画像生成

Python セルで diffusers を使い、画像生成します

from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
  "stable-diffusion-v1-5/stable-diffusion-v1-5",
  torch_dtype=torch.float16)
pipeline.to("cuda")

images = pipeline("Jumping dog", num_inference_steps=100).images
images[0]

実行結果

スクリーンショット 2025-06-19 23.40.17.png

20 秒くらいで画像生成できました

Kino との組み合わせ

せっかくなので、 Kino の入出力と組み合わせましょう

Elixir セルでテキスト入力を用意します

prompt_input = Kino.Input.text("prompt")

「Flying cat」と入力しておきます

スクリーンショット 2025-06-19 23.43.17.png

Elixir セルでテキスト入力を読み込みます

prompt = Kino.Input.read(prompt_input)

実行結果

"Flying cat"

Python セルで画像生成します

images = pipeline(prompt.decode(), num_inference_steps=100, num_images_per_prompt=4).images
images[0]

実行結果

スクリーンショット 2025-06-19 23.46.04.png

Python セルで Elixir への連携用にデータを変換します

import io

binary_images = []

for image in images:
  binary_image = io.BytesIO()
  image.save(binary_image, format='PNG')
  binary_images.append(binary_image.getvalue())

Elixir セルで画像を 2 x 2 に並べて表示します

binary_images
|> Pythonx.decode()
|> Enum.map(fn binary_image ->
  Evision.imdecode(binary_image, Evision.Constant.cv_IMREAD_COLOR())
end)
|> Kino.Layout.grid(columns: 2)

実行結果

スクリーンショット 2025-06-19 23.48.58.png

まとめ

Google Colab 上で Livebook を起動することで、 Pythonx から CUDA を利用し、画像生成することができました

Elixir と Python を自然に行き来できるので、 AI を動かすのも簡単ですね

11
6
0

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
11
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?