はじめに
以前の記事の組み合わせで、 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 に外部からアクセスできます
!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()
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 の認証画面が表示されます
Livebook 起動時に表示される URL 末尾の認証トークンを入力してください(下画像の赤枠部分)
StableDiffusion による画像生成
セットアップ
Livebook のホーム画面から、右上の青い "+ New notebook" ボタンで新しいノートブックを開きます
一番上のセットアップセルをクリックすると、セルの左下に見慣れない "+ Python" ボタンが表示されます
"+ Python" ボタンをクリックすると、セットアップセルに Python セル用の設定が自動的に追加されます
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]
実行結果
20 秒くらいで画像生成できました
Kino との組み合わせ
せっかくなので、 Kino の入出力と組み合わせましょう
Elixir セルでテキスト入力を用意します
prompt_input = Kino.Input.text("prompt")
「Flying cat」と入力しておきます
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]
実行結果
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)
実行結果
まとめ
Google Colab 上で Livebook を起動することで、 Pythonx から CUDA を利用し、画像生成することができました
Elixir と Python を自然に行き来できるので、 AI を動かすのも簡単ですね