LivebookでノートパソコンからAI GPUクラスターを利用する by José Valim

原文:https://fly.io/blog/ai-gpu-clusters-from-your-laptop-livebook/
(監訳: 山崎 進 @zacky1972 )

**Livebook、FLAME、Nxスタックは、説明が簡単で、見た目よりも強力で、Elixirエコシステムに複雑に組み込まれている 3 つの Elixir コンポーネントです。数週間前、Chris McCord (👋) と Chris Grainger が ElixirConf 2024 でこれらを披露しました。この講演は要約する価値があると思いました。**

まずは登場人物の紹介から始めましょう。

[Livebook](https://livebook.dev/) は通常、[Jupyter Notebook](https://jupyter.org/) に対する Elixir の回答として説明されます。これは良い考え方です。しかし、Livebook は Elixirプラットフォームを最大限に活用しているため、ひそかに強力になっています。Elixirアプリクラスターに直接リンクすることで、Livebook はローカルまたはリモートサーバーでのコンピューティングの駆動を簡単に切り替えることができ、あらゆる種類のデータを再現可能なワークフローに簡単に取り込むことができます。

[FLAME](https://fly.io/blog/rethinking-serverless-with-flame/) は、サーバーレスコンピューティングに対する Elixir の回答です。ライブラリが実行プログラム(訳註: executor)のプールを管理することで、FLAME では、アプリケーション全体を弾力性があり、ゼロまでスケールできるものとして扱うことができます。コードを実行する場所と実行できるインスタンスの数に関する基本情報を使用して FLAME を構成し、```Flame.call``` を使用して任意のコードセクションをマークします。フレームワークが残りの処理を行います。これは、アプリを細かく複雑に接続された部分に分解する必要がない、サーバーレスの利点です。

[Nx スタック](https://github.com/elixir-nx)は、Elixirネイティブの AI と ML を実行する方法です。Nx は、GPU バックエンドを使用した Elixirネイティブのテンソル計算の概念を提供します。[Axon](https://github.com/elixir-nx/axon) は、その上に ML モデルの共通インターフェイスを構築します。[Bumblebee](https://github.com/elixir-nx/bumblebee) は、わずか数行のコードで、ダウンロードしたいすべての Elixir アプリにこれらのモデルを提供します。

Livebook、FLAME、Nx を使用して、ローカルテンソルをリモート GPU に転送する方法を示す短いビデオを以下に示します。

https://www.youtube.com/watch?v=5ImP3gpUSkQ

[基調講演](https://www.youtube.com/watch?v=4qoHPh0obv0)を詳しく見ていきましょう。

# インフラストラクチャに穴を開ける

ラップトップで実行されているものも含め、すべての Livebook は、Fly.io のパブリッククラウドにある Fly Machine で実行されているランタイムを開始できます。その Elixir マシンは (デフォルトでは) デフォルトの Fly.io 組織に存在し、そこに存在する可能性のある他のすべてのアプリにネットワークアクセスを許可します。

これは、要求しなくても必要な操作をほとんど実行するアクセス制御の状況です。要求しない限り、Fly.io はインターネットや他の Fly.io ユーザーに何も公開しません。たとえば、レポートの生成に使用するデータベースがあるとします。このデータベースは、世界との接続がないプライベートネットワーク内の Fly 組織に存在できます。ネットワークやインフラストラクチャのエンジニアリングを行わなくても、このデータベースと通信できる Livebook インスタンスを起動できます。

でも、まだあります。これらはすべて Elixir なので、Livebook ではインフラストラクチャ内で実行中の Erlang/Elixir アプリケーションに接続して、デバッグ、イントロスペクション、監視を行うこともできます。

基調講演中に Chris McCord が[既存のアプリケーション](https://rtt.fly.dev/)に接続しているこのクリップをご覧ください。

https://youtu.be/4qoHPh0obv0

ラップトップからリモートサーバー上のコードスニペットを実行するのは巧妙な仕掛け(訳註: trick)ですが、Livebook はそれよりも深いことを行っています。クラスター計算を備えた Erlang/Elixir のネイティブ機能を活用し、それをノートブックで利用できるようにしています。その結果、自動補完などの操作を行うと、Livebook はリモートノート自体で定義されたモジュールから結果を提供します。🤯

# FLAMEを使用した弾性スケール

FLAME を初めて導入したとき、私たちが使用した例はビデオエンコーディングでした。

ビデオエンコーディングは複雑で遅いため、通常はリモートで実行するか、バックグラウンドジョブキューで実行するか、トリガー可能な Lambda 関数として実行するようにします。FLAME のポイントは、これらのステップをすべて取り除き、代わりにフレームワークに渡すことです。そのため、```ffpmeg``` 呼び出しを通常のコードのようにインラインで記述し、マイクロ秒単位で完了するかのようにして、```Flame.call``` ブロッ​​クでラップしました。これでデモは完了です。

ここで、少し AI の要素を加えます。

ここで最初に行うことは、Livebook から FLAME プールを駆動することです。Livebook は、ノートブックの依存関係と、ノートブックで定義されているモジュールまたはコードをノード間で自動的に同期します。つまり、ノートブックで記述したコードは、任意の数のコンピューティングノードに透過的に、何の手続きもなく送信できます。

次に、AI の要素を追加しましょう。ビデオファイルがいっぱい入ったオブジェクトストアバケットを使用します。 ```ffmpeg``` を使用して、さまざまな瞬間のビデオから静止画を抽出します。次に、それらを [GPU Fly Machines](https://fly.io/gpu) (まだ組織にロックされています) で実行されている [Llama](https://www.llama.com/) に送信して、静止画の説明を取得します。

これらすべての静止画と説明は、リアルタイムでノートブックにストリーミングされます。

https://youtu.be/4qoHPh0obv0

最後に、説明は [Mistral](https://mistral.ai/) に送信され、要約が作成されます。

FLAME のおかげで、同時に実行するノードの最小数と最大数、およびそれらの同時実行設定を明示的に制御できます。ノードが各ビデオの処理を終了すると、バケット全体が走査されるまで、新しいビデオが自動的にノードに送信されます。各ノードはアイドルタイムアウト後に自動的にシャットダウンし、Livebook ランタイムを切断するとクラスター全体が終了します。

FLAME を使用すると、アプリコードと同様に、ローカルで実行するように設計されたノートブックコードをほとんど変更せずに、一時的なインフラストラクチャ全体で弾力的に実行できます。

# ラップトップでの 64 GPU ハイパーパラメータのチューニング

次に、[Amplified](https://www.amplified.ai/ja/) の CTO である Chris Grainger 氏が登壇します。

Amplified での仕事として、Chris 氏は食用カンナビノイドの研究を行っているクライアントに代わって、膨大な数の特許アーカイブを分析したいと考えています。そのために、彼は BERT モデルを使用します (Google の BERT は、テキスト理解用に最適化された OG「トランスフォーマー」モデルの 1 つです)。

このタスクで BERT モデルを効果的に機能させるために、彼はハイパーパラメータトレーニングを実行する予定です。

これは、先ほど紹介した Llama の作業よりもはるかに複雑な AI タスクです。Chris 氏は、それぞれが [L40s GPU](https://fly.io/blog/cutting-prices-for-l40s-gpus-in-half/) を実行する 64 台の GPU Fly Machines のクラスターを生成する予定です。これらの各ノードで、次の作業を行う必要があります。

- 環境を設定する (ネイティブ依存関係と GPU バインディングを含む)
- トレーニングデータを読み込む
- 異なるパラメーター、オプティマイザーなどを使用して、異なるバージョンの BERT をコンパイルする
- 微調整を開始する
- 割り当てられた各チャートに結果をリアルタイムでストリーミングする

これがクリップです。結果がリアルタイムで直接 Livebook にストリーミングされるのがわかります。視聴にそれほど時間はかからないので、しばらくお待ちください。

https://youtu.be/4qoHPh0obv0

# これはほんの始まりに過ぎない

Livebook と FLAME を組み合わせてノートブックの実行を弾力的にスケーリングするという提案は、もともと ElixirConf EU で Chris Grainger によって提案されました。その後 4 か月間、Jonatan Kłosko、Chris McCord、José Valim がパートタイムで作業し、ElixirConf US に間に合うように実現しました。これほど短期間でこれほど豊富な機能の組み合わせを提供できるのは、Elixir と Livebook が動作する Erlang 仮想マシンの能力の証です。[リモートデータフレームや分散 GC](https://github.com/elixir-explorer/explorer/pull/932) などの他の機能は、週末に実装されました。同じ機能を他のエコシステムに導入するには、さらに数か月かかり、場合によっては数百万ドルの資金が投入され、クローズドソース製品の一部として提供されることもよくあります。

さらに、この機能を発表してから、[Michael Ruoss](https://github.com/mruoss) が参加し、同じ機能を Kubernetes に導入しました。Livebook v0.14.1 からは、Kubernetes クラスター内で Livebook ランタイムを起動し、FLAME を使用して弾力的にスケーリングすることもできます。この分野では、さらに多くの機能とニュースが発表される予定です。

最後に、Fly のインフラストラクチャは、GPU クラスターを数分ではなく数秒で起動できるようにする上で重要な役割を果たしました。必要なのは Docker イメージだけです。他のテクノロジーやノートブックプラットフォームが Fly を活用して開発者エクスペリエンスを向上させる方法を見るのが楽しみです。