はじめに
2024年10月時点の手順は以下の記事を参照
Elixir の Nx を GPU 上で動かしたい
Nx を GPU で動かせば、 AI モデルもスイスイ動かせるはず
でも手元に GPU もないし、お金もない、、、
そんな人にオススメなのが Google Colaboratory です
ブラウザからコードを実行、結果を表示できます
基本無料で使用でき、 GPU や TPU まで使える最高のサービスです
え、 Python 用じゃないかって?
そう、 Google Colaboratory は Python の Jupyter Notebook をクラウド上で使用できるサービスです
が、実は Elixir Livebook も実行できてしまうのです
実装したノートブックはこちら(※Evisionを入れるための設定も含んでいます)
2024/05/29
ngrok バージョンアップ対応で更新
参考記事
準備
以下の二つのアカウントが必要になります
- Google アカウント
- ngrok アカウント
ngrok はローカルで起動した Web サービスを外部に公開できるサービスです
例えばローカルの http://localhost:8080 を https://xxxx-12-34-567-890.ngrok.io のような URL で一時的に外部からアクセスできるようにしてくれます
(もう何をやるか気づいた人は気付いたと思います)
ngrok にサインインしたら、左メニューの「Your Authtoken」を開き、
認証トークンを出しておいてください
Google Colaboratory での Livebook 起動
ランタイムの設定
Google Colaboratory で「ノートブックを新規作成」をクリックしてください
以下のような画面が開きます
GPU が使いたいので、ラインタイムを変更します
上メニューの「ランタイム」から「ラインタイムのタイプを変更」をクリックしてください
開いたモーダルで「T4 GPU」を選択し、「保存」をクリックします
asdf のインストール
Erlang や Elixir は新しいものを使いたいので、 asdf を使います
まず asdf をインストールしましょう
GitHub から asdf をクローンします
再生マークの右にある入力エリア(セル)に以下のコードを貼り付けてください
Jupyter Notebook で !
を先頭に付けると、シェルコマンドを実行することができます
これを利用して、 Google Colaboratory のコンテナ上に Elixir をインストールするわけです
!git clone https://github.com/asdf-vm/asdf.git ~/.asdf
再生ボタンをクリック(=セルのコードを実行)して、しばらくすると左側に緑色のチェックマークが表示されます
すると、セルが一つ下に追加されるので、以下のコードを貼り付けてから、新しいセルを実行してください
asdf の実行ファイルにパスを通します
import os
os.environ['PATH'] = "/root/.asdf/shims:/root/.asdf/bin:" + os.environ['PATH']
Erlang のインストール
asdf で Erlang をインストールするため、プラグインを追加します
!asdf plugin add erlang
Erlang をバージョン指定でインストールします
!asdf install erlang 26.2.5
使用する Erlang のバージョンを 26.2.5
に固定します
!asdf global erlang 26.2.5
Elixir のインストール
asdf で Elixir をインストールするため、プラグインを追加します
!asdf plugin add elixir
Elixir をバージョン指定でインストールします
!asdf install elixir 1.16.3-otp-26
Erlang が 26 なので otp-26
を指定しています
使用する Elixir のバージョンを 1.16.3-otp-26
に固定します
!asdf global elixir 1.16.3-otp-26
Elixir のバージョンを確認します
!elixir -v
実行結果は以下のようになります
Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]
Elixir 1.16.3 (compiled with Erlang/OTP 26)
Livebook のインストール
次のコードを実行して Livebook の最新版をインストールします
!mix local.hex --force
!mix local.rebar --force
!mix escript.install hex livebook --force
Livebook をコマンドから使えるようにします
!asdf reshim elixir
Livebook のバージョンを確認します
!livebook -v
結果は以下のようになります
Erlang/OTP 26 [erts-14.2.5] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]
Elixir 1.16.3 (compiled with Erlang/OTP 26)
Livebook 0.12.1
Elixir モジュールの依存パッケージ
Livebook で Evision を使う場合、 OpenCV の依存モジュールが必要になります
また、 Elixir Image を使う場合は libvips が必要になります
Livebook 上で使う Elixir モジュールの依存パッケージをインストールしておきます
!sudo apt-get install -y unzip ffmpeg libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libvips-dev
ngrok CLI のインストール
続いて ngrok のクライアントツールをインストールします
v2 のクライアントが使えなくなったため、 v3 をインストールします
!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 の認証トークンを入力し、 Enter を押してください
from getpass import getpass
token = getpass()
入力した認証トークンの値を ngrok で使うように設定します
!./ngrok authtoken "$token"
次のコードを実行し、 ngrok でコンテナ内の http://localhost:8888
を外部公開します
get_ipython().system_raw('./ngrok http 8888 &')
!sleep 5s
次のコードを実行すると、公開された URL が表示されます
(ここでエラーが出る場合、 ngrok の認証トークンが誤っています)
!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
うまくいけば Livebook が起動した旨表示され、セルが実行中の状態のままになります
URL の末尾についている ?token=<Livebook認証トークン>
の「Livebook認証トークン」の値が必要になるので、コピーしておきます
この状態で ngrok の外部公開 URL を開きます
認証を求められるので、先程コピーしておいた「Livebook認証トークン」を貼り付けて "Authenticate ->" をクリックします
はい、これで Livebook が開きました
Nx の実行
右上「New Notebook」をクリックして、新しいノートブックを開きます
Notebook dependencies and setup
のセルに以下のコードを貼り付け、実行してください
Mix.install(
[
{:benchee, "~> 1.3"},
{:nx, "~> 0.7"},
{:exla, "~> 0.7"},
{:torchx, "~> 0.7"},
{:evision, "~> 0.1"},
{:kino, "~> 0.12"}
],
system_env: [
{"XLA_TARGET", "cuda120"},
{"EXLA_TARGET", "cuda"},
{"LIBTORCH_TARGET", "cu118"},
{"EVISION_ENABLE_CUDA", "true"},
{"EVISION_ENABLE_CONTRIB", "true"},
{"EVISION_CUDA_VERSION", "121"}
]
)
system_env
で指定しているのは EXLA、 Torchx、 Evision が GPU を使うための環境変数設定です
しばらく時間がかかりますが、 Nx、 EXLA、 Torchx、 Evsion 等が GPU 用にインストールされます
次のコードを実行してみましょう
tensor = Nx.tensor([1.0, 2.0, 3.0], backend: Nx.BinaryBackend)
Nx.add(tensor, tensor)
バイナリバックエンドは正常に動いていますね
続いて EXLA です
EXLA.Backend の場合、 device_id
で何番目の GPU を使うか指定できます
tensor = Nx.tensor([1.0, 2.0, 3.0], backend: {EXLA.Backend, device_id: 0})
Nx.add(tensor, tensor)
CUDA で動いていることが分かります
Torchx でも同じようにしてみます
特に指定しなくても GPU を使いますが、 device: :cuda
で明示できます
tensor = Nx.tensor([1.0, 2.0, 3.0], backend: {Torchx.Backend, device: :cuda})
Nx.add(tensor, tensor)
初回実行だけ4分くらいかかりますが、無事 CUDA で動いています
Torchx の場合、デフォルトで GPU を使うようになっていても CPU 指定が可能です
tensor = Nx.tensor([1.0, 2.0, 3.0], backend: {Torchx.Backend, device: :cpu})
Nx.add(tensor, tensor)
最後に Evision です
tensor = Nx.tensor([1.0, 2.0, 3.0], backend: Evision.Backend)
Nx.add(tensor, tensor)
おわりに
これで GPU を使った Elixir の機械学習が捗りますね