AI超初心者がHugging FaceのAIモデルをGoogle Colabで試す
「そうだ、Hugging Face上で公開されているモデルを動かしてみよう」
と、ふと思い立ちました。
Hugging Faceという言葉を知ったのも最近、という超初心者の私が四苦八苦してようやく動かすことができたので記事にまとめたいと思います。
手順
手順1. Hugging Faceで使いたいモデルを探す
Hugging FaceはAIモデルのGitHubのようなものです。
まずはHugging Faceにアクセスしてモデルを探します。
大きなモデルは動かない可能性があります。 モデルのページで「Model Size」、「Tensor Type」などを確認して、小さめのものから試すとよいでしょう。

「Model Size」、「Tensor Type」がわからない方はこちらのページの「モデルの選び方」を参考にしてください。
手順2. 見つけたモデルがGoogle Colabで動くか確かめる
画面右上の「Use this Model」ボタンをクリックして「Google Colab」があるか確認します。

手順3. 使用許可を得る(オプション)
llama、gemma、mistralなど一部のモデルは使用にあたり許諾を得たり、注意事項に同意する必要があります。
具体的な手続きはモデルによって異なります。 ボタン数クリックで済むものもあれば、個人情報の入力が必要なものもあります。 ぶっちゃけ面倒なので最初に試すなら、手続き不要なモデルにした方がいいと思います。
使用許可の要否はモデルのページの上の方に書いてあるので、確認の上、必要に応じて手続きを行いましょう。 下はllamaの例です。

手順4. サンプルコードを使って動かす
ここからはGoogle Colabのノートブック上でサンプルコードを実行してモデルを動かします。 サンプルコードはいくつかありますが、今回は2つの方法を紹介します。
方法1 説明文の中のサンプルコードを使う
ほとんどのモデルの説明文には、そのモデルを利用するためのサンプルコードが記載されています。 このサンプルコードには簡単な推論まで実行するコードが含まれていることが多く、transformersライブラリの知識がなくてもとりあえず推論まで試せます。 前提知識がない人にはこちらがお勧めです。
まずはモデルの説明文の中からサンプルコードを見つけてコピーします。
次にGoogle Colabで新しいノートブックを開きます。
GPUを選んでランタイムに接続します。(詳細後述)
最後にセルにサンプルコードをペーストとして実行してください。
方法2 「Use this model」ボタンから動かす
以前はここで、「Use this model」から「Google Colab」を選択する方法を掲載していました。
しかしこの方法だとモデルを読み込むコードしか提供されず、推論のコードがありません。
また、transformersライブラリについて少し学ぶと、この手順で提供されるコードはGPUを使わなかったり、不必要にメモリを消費したりと非効率なものが少なくないことがわかりました。
面倒な割に無駄なコストが発生する。 いいところがないので削除しました。
代わりにQuickStartにいいサンプルコードがあったのでそちらを紹介します。 すべてのケースで動作する保証はありませんが、以前のコードよりはまともだと思います。
方法2 QuickStartのサンプルコードを使う
Google Colabで新しいノートブックを開きます。
GPUを選んでランタイムに接続します。(詳細後述)
セルに以下のコードをペーストとして実行してください。
なお「Qwen/Qwen2-7B-Instruct」の部分は自分が利用するLLMの名前に置き換えてください。
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-7B-Instruct", torch_dtype="auto", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B-Instruct")
prompt = ["The secret to baking a good cake is "]
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generated_ids = model.generate(**inputs, max_length=30)
outputs = tokenizer.batch_decode(generated_ids)
print(outputs[0])
generateではなくPipelineを使いたい方はこちらを使ってください。
from transformers import pipeline
pipeline = pipeline("text-generation", model="Qwen/Qwen2-7B-Instruct", torch_dtype="auto", device="cuda")
outputs = pipeline("The secret to baking a good cake is ", max_length=50)
print(outputs[0])
手順5. GPUを解放する
課金枠でGoogle Colabを利用している場合、このままにしているとずっと課金されてしまいます。
無課金枠で利用している場合は課金の心配はありませんが、古いセッションが残っていると次に新しいセッションを作成した際に警告やエラーが出るのでやはり解放した方が無難です。
画面右上の「▼(その他の接続オプション)」から「ランタイムを接続解除して削除」を選択してください。

以上で手順は終了です。
GPUの選び方
ここではGPUを選び、ランタイムに接続する方法を説明します。
画面右上の「▼(その他の接続オプション)」から「ランタイムのタイプを変更」を選択します。 「ランタイムのタイプ」で「Python 3」を選択し、「ハードウェアアクセラレータ」で好みのGPUを選択します。 「保存」を押下します。

Gooble Colabで利用可能なGPUがわからない方は下の記事を参考にしてください。 なお、無課金で選べるGPUはT4 GPUのみで、T4 GPUで動かせるモデルは相当、小さいものに限定されます。 私のように「8ビット量子化」等、小難しい事はわからない方は素直に1000円くらい課金して強いGPUを手に入れた後、動かしながら学んでいった方がよいかと思います。
この時点ではまだGPUは割り当てられていません。 画面右上の「▼(その他の接続オプション)」の左隣りにある「接続」を押下します。 リソースに空きがあれば要求通りのGPUが割り当てられます。 空きがない場合は、一つ下位のリソースが割り当てられます。

下のようにチェックマークに変われば接続完了です。 ここをクリックするとリソース使用状況が大きく表示されて便利です。

割り当てられたリソースが画面右下に表示されるので、確認しましょう。 この例では無事、要求通りA100 GPUが割り当てられています。

REST APIから利用したい場合
Google ColabにはLLMのREST APIを自動で提供する機能はありません。
FastAPIやFlaskなどを使って、自力でREST APIを実装する必要があります。
モデルが読み込めない場合
システムRAM不足でクラッシュする
システムRAMが枯渇するとクラッシュします。 発生時には処理が停止し、画面左下に以下のようなポップアップが表示されます。

まずはGPUを使っているか確認してください。 画面右上の「▼(その他の接続オプション)」で「リソースを表示」を選択し、リソース使用状況を確認します。 モデルを読み込んでいるのに下図のようにシステムRAMばかりが増えて、GPU RAMがまったく増えていなければ、GPUを使っていません。

提供されているサンプルコードがGPUを使わない内容になっていることが疑われます。 もしGPUを使うつもりだったのであれば、コードを変更しましょう。 「手順3 方法2 QuickStartのサンプルコードを使う」のコードや、下の記事の「モデルの読み込み方」を参考にしてみてください。
もしGPUを使わない予定だったのであれば手順1に戻り、同じモデルでより小さいものを探して試しましょう。 それでもダメなら課金してシステムRAM量の多い上位のGPUに変更するしかありません。
GPU RAM不足でクラッシュする
GPU RAMが枯渇するとクラッシュします。発生時には処理が停止し、CUDA(GPU)がメモリ割り当てに失敗したことを知らせるOutOfMemoryErrorメッセージが出力されます。
OutOfMemoryError: CUDA out of memory. Tried to allocate 224.00 MiB. GPU 0 has a total capacity of 22.16 GiB of which 143.38 MiB is free. Process 3246 has 22.02 GiB memory in use. Of the allocated memory 21.83 GiB is allocated by PyTorch, and 1.25 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True to avoid fragmentation. See documentation for Memory Management (https://pytorch.org/docs/stable/notes/cuda.html#environment-variables)
画面右上の「▼(その他の接続オプション)」で「リソースを表示」を選択し、リソース使用状況を確認するとGPU RAMが枯渇していることがわかります。

無駄なキャッシュがGPU RAMを圧迫している可能性があります。 まずはノートブックのセッションを再起動して環境をきれいにしてから再度試します。 そしてGPU RAMが枯渇する処理の直前などで以下のコードを実行してGPU RAMの不要なキャッシュをクリアします。
import torch torch.cuda.empty_cache()
これでも直らないならそのイメージは読み込むことはできません。 手順1に戻り、同じモデルでより小さいものを探して試しましょう。 それでもダメなら課金してGPU RAM量の多い上位のGPUに変更するしかありません。
認証でエラーが出る
llamaなど、一部のモデルはオーナーから承認を得ないと利用できません。
そのようなモデルをgated repoと呼び、承認なしで利用しようとするとエラーが出ます。
ぶっちゃけ面倒なので最初に試すなら、承認不要なモデルにした方がいいと思います。
OSError: You are trying to access a gated repo. Make sure to have access to it at https://huggingface.co/meta-llama/Llama-3.2-1B. 401 Client Error. (Request ID: Root=1-6856b807-2d900bf50f22adfe25e9bfe5;e7fd1a36-19ff-4684-ae7e-01875ee28b8e) Cannot access gated repo for url https://huggingface.co/meta-llama/Llama-3.2-1B/resolve/main/config.json. Access to model meta-llama/Llama-3.2-1B is restricted. You must have access to it and be authenticated to access it. Please log in.
どうしてもgated repoを使いたい場合、まずはHugging Faceのアカウントを作成してTokenを作成します。
次に手順3にもある通り、モデルのページの申請フォームから利用を申請します。 具体的な申請方法はモデルによって異なります。
コードの最初に以下の2行を追加します。
from huggingface_hub import login login()
実行するとHuggin FaceのTokenを求められるので入力します。
以降、問題なくモデルの読み込み、推論が実行されます。