概要

Hugging Faceで公開されているLLMモデルをGoogle Colabで動かしてみました。
この記事では、公開モデルの量子化から推論までを、できるだけシンプルにしてみました。

各種説明

まずは、今回扱うサービスやモデル、量子化の考え方について簡単に整理しておきます。

Hugging Faceとは

Hugging Faceは、機械学習モデルやデータセットを公開・共有できるプラットフォームです。
LLMの配布先として広く使われており、モデルのダウンロード、ドキュメント確認、利用条件の確認を行えます。

今回使ったモデル

今回使うモデルは meta-llama/Meta-Llama-3-8B-Instruct です。
Meta Llama 3系のInstructionモデルです。

量子化とは

量子化は、ざっくり言うとモデルを軽くして動かしやすくする仕組みです。
LLMはサイズが大きく、そのままだとメモリ(VRAM)を多く消費します。
そこで、モデルの中の数値を少ない情報量で持つようにすると、全体の容量が小さくなります。
今回の4bit量子化もこの考え方で、主な目的は次のとおりです。

  • メモリ使用量を減らして、動かせる環境を増やす
  • レイテンシーが改善される場合がある

実行手順

ここからは、実際にGoogle Colab上でモデルを量子化し、推論を行うまでの流れを順に確認します。

事前準備

まずは環境変数をセットします。

  • BASE_MODEL: 使うモデル名
  • HF_TOKEN: Hugging Faceでアカウント作成後、トークンを作成して指定
  • MODEL_PATH: モデル保存先

※ 推論コードでは .cuda() を使っているため、CUDAが使えるGPU環境を前提にしています。

BASE_MODEL = meta-llama/Meta-Llama-3-8B-Instruct
HF_TOKEN = hf-***
MODEL_PATH = /content/drive/MyDrive/{任意のフォルダ名}

ライブラリをインストール

pip -q install autoawq transformers

モデルを量子化して保存

以下のコードで、モデルを取得して4bit量子化し、保存します。

from transformers import AutoTokenizer
from awq import AutoAWQForCausalLM
from google.colab import drive, userdata

drive.mount("/content/drive")

base_model = userdata.get("BASE_MODEL")
hf_token = userdata.get("HF_TOKEN")
model_path = userdata.get("MODEL_PATH")

tokenizer = AutoTokenizer.from_pretrained(base_model, token=hf_token)
model = AutoAWQForCausalLM.from_pretrained(base_model, token=hf_token)

model.quantize(
    tokenizer,
    quant_config={"w_bit": 4}
)

model.save_quantized(model_path)
tokenizer.save_pretrained(model_path)

quant_config={"w_bit": 4}は4bit量子化の設定です。
重みデータを軽量化する設定になります。

量子化後はモデルとトークナイザを同じ場所で管理します。

量子化済みモデルで推論

保存したモデルを読み込んで、実際にプロンプトを投げます。

from transformers import AutoTokenizer
from awq import AutoAWQForCausalLM
from google.colab import userdata

model_path = userdata.get("MODEL_PATH")

tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoAWQForCausalLM.from_quantized(model_path).cuda()

prompt = """日本語で答えてください。
質問: AWSって何ですか?
回答:"""

inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
input_len = inputs["input_ids"].shape[1]

output = model.generate(
    **inputs,
    max_new_tokens=100,
    do_sample=False,
    eos_token_id=tokenizer.eos_token_id
)

generated_tokens = output[0][input_len:]
text = tokenizer.decode(generated_tokens, skip_special_tokens=True).strip()
# 最初の1文だけ取得
answer = text.split("。")[0].strip()

print(answer)

この推論処理は、入力文をテンソル化してgenerate()に渡し、生成結果を文字列に戻す流れです。
input_lenは入力プロンプト部分を除いて新規生成分だけを取り出すために使っています。
max_new_tokens=100は回答の最大長、eos_token_idは終了トークンを明示して生成停止を安定させるための設定です。
最後にsplit("。")[0]で先頭1文だけを取り出し、短く表示しています。

実行結果

AWS(Amazon Web Services)は、Amazonが提供するクラウドコンピューティングサービスです

まとめ

Hugging Faceの公開モデルは、LLMを短時間で立ち上げて、すぐに検証を始められます。
今回の検証例では十分な品質で、用途次第では十分に実用的だと感じました。
一方で、外部の最新情報を扱うユースケースでは、モデル単体では限界があるため、検索やRAGなど外部データ連携の仕組みを組み合わせる必要があります。
また、ChatGPTやClaudeなど外部サーバーに機密情報を出したくない場合は、公開モデルを使って自社環境内に推論サーバーを立てることも有力な選択肢かと思います。