はじめに
環境構築のお手軽さ(やり直しやすさ)から、よく Docker コンテナ上で Livebook を起動しています
ローカル環境の OS が Linux であればコンテナを使っていてもパフォーマンスはほぼ変わりません
しかし、 Linux 以外の OS の場合、間に一つ仮想マシン(VM)を挟んでいるため、遅くなってしまいます
しかも VM に割り当てられるリソースは限られるため、重い処理では更に顕著に差が出るはずです
どの程度の差が出るのか Livebook で検証してみます
実行する処理
Nx の様々なバックエンドによる行列の加算処理を計測の対象とします
Benchee.run
によって、IPS(Instructions Per Second 1秒間に何回処理を実行できたか)を計測します
bench = fn backend ->
tensor =
{200, 200}
|> Nx.iota(type: :f64, backend: backend)
Nx.add(tensor, tensor)
end
Benchee.run(%{
"binary" => fn -> bench.(Nx.BinaryBackend) end,
"exla" => fn -> bench.(EXLA.Backend) end,
"torchx" => fn -> bench.(Torchx.Backend) end,
"evision" => fn -> bench.(Evision.Backend) end
})
詳細な内容は以下の記事を参照してください
Nx.BinaryBackend
を使っている場合は単純に Elixir で 40,000 回足し算を行っています
Evision.Backend
なら OpenCV 、 EXLA.Backend
なら XLA を使った行列演算を実行しています
ローカル
実行環境は以下の通りです
- MacBook Pro 13 inch, 2019
- macOS Ventura 13.4.1
- CPU 2.4 GHz クアッドコアIntel Core i5
(物理的には 4 コア、 Hyperthreading による擬似 8 コア) - メモリ 16 GB
- Elixir 1.15.2
- Erlang 26.0.2
- Livebook 0.10.0
Elixir と Erlang は asdf でインストールし、 Livebook は GitHub からタグ指定でクローンしてきたコードをローカルビルドしています
実行結果は以下のようになりました
バックエンド | IPS |
---|---|
binary | 79 |
evision | 2,580 |
exla | 8,260 |
torchx | 5,810 |
コンテナ
コンテナには Rancher Desktop を使います
また、イメージは以下のリポジトリーのものを使いました
- Rancher Desktop 1.9.1
- CPU割当て 6
- メモリ割当て 10 GB
- Debian 11
- Elixir 1.15.2
- Erlang 26.0.2
- Livebook 0.10.0
実行結果は以下の通りです
バックエンド | IPS |
---|---|
binary | 41 |
evision | 392 |
exla | 771 |
torchx | 862 |
ローカルと比べて明らかに遅くなりましたね
比較
ローカルとコンテナの比較表は以下のようになります
バックエンド | ローカル IPS | コンテナ IPS | ローカル / コンテナ |
---|---|---|---|
binary | 79 | 41 | 1.93 |
evision | 2,580 | 392 | 6.58 |
exla | 8,260 | 771 | 10.71 |
torchx | 5,810 | 862 | 6.74 |
BinaryBackend 、つまり単純な足し算のループでも 2 倍近い差がありました
EXLA に至っては 10 倍も差があります
まとめ
使用目的に応じて環境を使い分けましょう
-
コンテナ
- 環境構築を試行錯誤したい
- 速度は気にしない
-
ローカル
- 環境構築はすでに確立している
- 速度が問題になる