清水理史の「イニシャルB」
初めてでもできる! 自宅PCのGPUを「Google Colab」から使い、生成AIをカンタンに動かす方法
2023年10月2日 06:00
大規模言語モデル(LLM)に画像生成、ボイスクローニング、そしてこれらを組み合わせたマルチモーダルと、いろいろな生成系AIを家庭用PCのGPUでも試せる時代が到来した。ただし、簡単に使えるといっても、実行環境を用意しなければならず、この点が入門者にとっての高いハードルとなっている。
今回は、そうした状況を乗り越える1つの手段として、Google Colab(Google Colaboratory:Googleが提供するクラウドのPython実行環境)から接続可能な「ローカルランタイム」環境を、なるべく手間なく作る方法を紹介する。
複雑なモデルをどう試すか?
筆者は、これまでローカルでLLMなどを試す際、WindowsにPythonをインストールして、Visual Studio Code(以下VSCode)でサンプルコードを実行するという方法を利用してきた。
もちろん、画像生成AI向けの「stable-diffusion-webui」やLLMで定番の「text-generation-webui」のような実行環境が使える場合は、これらを利用してきたが、こうしたGUIの実行環境が使えないケースも珍しくなくなってきた。
たとえば、以下のような多彩な機能を持つモデルは、汎用的なGUI環境では動かないため、直接コードを実行して試す必要があった。
rinna画像テキストマルチモーダルモデル
画像に写っているものをテキストで回答するマルチモーダルモデル。
3秒の録音音声だけで利用できるボイスクローニングモデル
3秒ほどの音声を入力するだけでクローンして自由にしゃべらせることができるボイスクローニングモデル。Hugging FaceのSpaceでデモも利用可能。
テキストと音声の組み合わせが可能な翻訳モデル
声から声、声からテキスト、テキストからから声、入力と出力で声とテキストを自由に組み合わせられる翻訳モデル。デモページも用意されている。
しばらくは、Windows環境ではうまく動かなかったり、必要なモジュールのバージョンが合わなかったりと、試行錯誤しながら試していたのだが、エラーと格闘する時間の方が長くなってきたので、さすがに「もう限界」となってしまった。
やはりGoogle Colabが楽
そこで、新たな実行環境として移行を決意したのが、今回紹介するGoogle Colabだ。
「何をいまさら」と言われてしまいそうだが、もちろんそのまま利用するのではなく、PCのGPUを利用するためにローカルランタイムを用意して、そこに接続して利用する方法となる。
無料版でも、ほとんどの場合はGPUにT4(VRAM 16GB)が割り当てられるので、小規模なモデルであれば、そのままクラウドで試すことができる。ただし、無料版では、起動から12時間で環境がリセットされるなどの制限があり、「ちょっと試す」程度であれば問題ないが、数日かけて機能を検証したい場合には面倒だった。
一方、ローカルランタイムを用意すれば、こうした制限がなくなり、24GBのVRAMを搭載した家庭用GPUなどを使って、時間をかけて、いろいろな大規模なモデルを検証できる。
Windows環境でローカルランタイムを利用する
それでは、早速、ローカルランタイムを準備していこう。方法はいろいろあるが、今回はWindowsユーザー向けに、なるべく簡単にできる方法を紹介する。
STEP 1:WSLをインストールする
実行環境として、Windows上で動作するLinux環境「WSL」を利用する。ターミナルから以下のコマンドを実行するだけで簡単にインストールできる。
wsl --install
STEP 2:Docker Desktopをインストールする
続いてDockerをインストールする。こちらも公式サイトからインストーラーをダウンロードしてインストールするだけと簡単だ。インストール時に実行環境として標準で「WSL」が選択されるので、そのままインストールすれば利用できる。
なお、デスクトップ版のDockerは、Windows上でアプリを起動した状態で利用する(起動しないとエンジンが起動しない)。利用する際に、アプリを起動することを忘れずに。
STEP 3:フォルダーを準備する
エクスプローラーを使って、Google Colabのローカルランタイム用のフォルダーを任意のドライブに作成する(今回は「colab-runtime」という名前で作成)。
詳しくは後述するが、このフォルダーの配下に「content」と「cache」という2つのフォルダーが自動的に作成され、そこにGoogle Colabのデータを保存(永続化)する。「content」はモデルのプログラムの保存先、「cache」はPythonのモジュールやLLMのモデルファイルのキャッシュ先となる。
モデルによっては数GBのファイルを複数ダウンロードするので、空き容量に余裕のあるドライブにフォルダーを準備する必要がある。
STEP3:docker-compose.ymlを準備する
作成したフォルダーに、「docker-compose.yml」という名前で以下の内容のファイルを作成する。メモ帳などを使って、普通にWindowsから作成すればいい。
変更すべき点は、1カ所、Google Colabから接続するときに指定するトークンだ。「JUPYTER_TOKEN=123123123」の行の「123123123」の部分を、好きなトークンに変えておく。
version: "3"
services:
colab:
image: asia-docker.pkg.dev/colab-images/public/runtime
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
ports:
- "127.0.0.1:9000:8080"
- "0.0.0.0:7860:7860"
environment:
- JUPYTER_TOKEN=123123123
volumes:
- ./content:/content
- ./cache:/root/.cache
簡単に説明しておくと、以下の図のようになる。「ports」の部分は、実行するコードに合わせて変更しなければならないケースもある。
STEP 4:起動する
最後に作成したファイルを「docker-compose」コマンドで起動する。これは、初回に一度だけ、ターミナルからコマンドを使って実行する必要がある。
エクスプローラーから、作成したフォルダー(今回は「colab-runtime」)を開いた状態で、何もない部分を右クリックして「ターミナルを起動」を選択する。
作成したフォルダーに移動した状態で、ターミナルが起動するので、以下のコマンドを実行する。
docker-compose up -d
自動的にGoogle Colabのローカルランタイム用のイメージがダウンロードされ、ランタイム環境が起動する。トータル25GB前後あるので、初回はかなり待ち時間が必要で、空き容量にも注意する必要があるのが注意点となる。
STEP 5:Google Colabから接続する
起動したら、後はGoogle Colabから接続するだけだ。右上の「接続」ボタンをクリックし、「ローカルランタイムに接続」を選択する。
表示された接続画面で、以下のように指定すれば、PC上のDockerコンテナとして起動しているローカルランタイムに接続できる。もちろん、「token=」以降の「123123123」の部分は、docker-compose.ymlファイルに指定した内容に合わせて変更する必要がある。
http://localhost:9000/?token=123123123
以上の方法で、Colab上に記述したコードを手元のPCで実行できるようになる。
試しに、Google Colabで、「nvidia-smi」を実行すれば、ローカルのGPUの情報が表示されるはずだ。
なお、次回からコンテナの起動や停止はDocker Desktopから管理できる。Windows起動後、Docker Desktopを起動し(Dockerエンジンが自動的に起動)、コンテナを選択して起動することでローカルランタイムが起動するという流れになる。
もちろん、コンテナを停止しても、永続化したフォルダー(docker-compose.ymlが保存されたフォルダー)を削除しない限り、データも維持される。
誰でも同じ環境で動くのがいい
以上、さまざまなAIを試すためのGoogle Colab用ローカルランタイム環境の作り方を紹介した。
この方法のメリットは、誰もが同じ環境を前提とできる点だ。前述したモデルの中にも、「Open in Colab」ボタンが用意されているケースもあるが、モデルを動かすためのGUI環境なども含め、Google Colabにコピーし、同じ環境で実行することができる。
ライブラリのバージョン違いなどに悩まされることなく、さくっと動かすことができるのは楽だ。
なお、今回のコンテナでは、実行するコードが起動するGUI用にポート7000を開ける設定にしてある。ほとんどのコードは、gradioというPythonのライブラリを使ってGUIを生成する。大抵は、コード末尾に以下のように記載されており、標準設定のままGUIを起動する設定となっている。
app.launch()
コンテナ内で起動する場合、そのままではGUIにアクセスできないので、アプリ側のPythonコードを以下のように変更する必要がある。
app.launch(server_name="0.0.0.0")
※外部アクセスが必要な場合は以下
app.launch(server_name="0.0.0.0", share=True)
これで、「http://loclahost:7860」でgradioのGUIにアクセスできる。画面上に表示されるリンクはhttpsになる場合があるので、必ず手動で「http://loclahost:7860」や「http://127.0.0.1:7860」とアクセスするのがポイントだ。