LoginSignup
18
19

Googleによる生成AIモデル「Gemma」をMacBook(M2)で動かしてみた

Posted at

Supershipの名畑です。「【ヒプステ】-Battle of Pride 2023-【Cinema Edit】3面ライブスクリーン映像」を見てきたんですが、映画館という場の進化は素晴らしいものがあるなと思いました。

はじめに

Googleから生成AIモデルGemmaがリリースされました。

このGemmaを手元のMacBook(M2)で動かしてみました。その過程を記事に残します。

コードはすべてPythonです。

注意

本記事ではgemma-7bを基本として話を進めていますが、モデルのダウンロードや推論の時間がかなりかかるため、まずは動かすことが目的であればgemma-2bで進めていただければと思います。各Pythonコードに2箇所あるgemma-7b-itgemma-2b-itに置き換えるだけです。

私の環境

PCはMacBook Pro(Apple M2 Proチップ)です。
OSはmacOS 14 Sonomaです。

Pythonのバージョンは3.10.12です。

$ python --version
Python 3.10.12

acceleratetorchtransformersを用いるので、入れておきます。

$ pip install accelerate torch transformers        

私の環境でのバージョンはそれぞれ0.27.22.2.14.38.1でした。

$ pip list | grep -e accelerate -e torch -e transformers
accelerate         0.27.2
torch              2.2.1
transformers       4.38.1

モデル

gemma-7b(70億パラメータ)とGemma 2B(20億パラメータ)があります。そしてそれぞれにinstruct-tuned(指示調整)されたものが用意されています。

モデル毎の概要は「Welcome Gemma - Google’s new open LLM」をご覧ください。Llama 2DeciLMといった他のモデルとの比較等、要点がまとまっています。

ライセンスの認証

今回はHugging Face経由でモデルを入手して実行します。
そのためまずはHugging Faceのアカウントを作成します。

アカウントを作成してログイン後、4つあるモデルのいずれかのページに行くとGemmaへのアクセスのためのライセンス承認が求められます。

gemma_1.png

Acknowledge licenseを押します。

gemma_2.png

Access Requestのページに遷移しますので、フォームに名前等を記入していきます。
規約も読んで最後のAcceptを押します。

モデルのページに戻ると、以下のようにアクセス認証が得られたことが確認できます。

gemma_3.png

アクセストークンの作成

モデルをダウンロードする際のユーザー認証のためにHugging Faceのアクセストークンを作成します。

Hugging FaceSettingsに移動し、さらにAccess Tokensに移動します。

ここでNew Tokenを押します。

gemma_4.png

Nameはわかりやすくgemmaとしました。Roleは読み取りだけなのでreadにしました。

トークン情報をハードコーディングするのはセキュリティ的によろしくないので、自環境の環境変数にセットしました。

まず設定ファイルを開きます。私の環境ではzshrcです。

$ open ~/.zshrc

生成したアクセストークンの値を記録します。
私はHUGGING_FACE_TOKENという名前にしました。

export HUGGING_FACE_TOKEN=ここにアクセストークンの値を書く

サンプルコードの実行(CPU)

まずはMacBookにてCPU向けサンプルコードを動かしてみました。
アクセストークンに関する部分だけコードを変更しています。

from transformers import AutoTokenizer, AutoModelForCausalLM
import os

hf_token = os.getenv("HUGGING_FACE_TOKEN")
tokenizer = AutoTokenizer.from_pretrained("google/gemma-7b-it", token=hf_token)
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b-it", token=hf_token)

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt")

outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))

モデルに対して「Write me a poem about Machine Learning.」という文字列を渡しています。
訳すと「機械学習についての詩を書いてください」ですね。

初回はモデルのダウンロードが必要となります。上記コードは7b-itですが、サイズとしては約17GBでした。時間がかかります。

結果は以下でした。

In the realm of data, a tale unfolds,

訳すと「データの領域で、物語が展開されます」です。
内容はinputに即していますが、非常に短いです。

実行時に下記の警告が出ていました。

UserWarning: Using the model-agnostic default max_length (=20) to control the generation length. We recommend setting max_new_tokens to control the maximum length of the generation.

max_new_tokensの設定を推奨しますという内容でした。

ドキュメントによると、max_lengthは「入力プロンプトmax_new_tokensの合計値の最大」のようです。

デフォルトだとmax_length20とかなり小さいため、次はmax_new_tokensとして50を指定してみることにします。max_new_tokensを指定すればmax_lengthも上書きされます。

サンプルコードの実行(GPU)

次にGPU向けサンプルコードを動かしてみます。

コードは以下です。

import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
import os

hf_token = os.getenv("HUGGING_FACE_TOKEN")
tokenizer = AutoTokenizer.from_pretrained("google/gemma-7b-it", token=hf_token)
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b-it", device_map="auto", token=hf_token)

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt").to(torch.device("mps"))

outputs = model.generate(**input_ids, max_new_tokens=50)
print(tokenizer.decode(outputs[0]))

MacBookGPUを使用するためにdeviceとしてMPS(Metal Performance Shaders) を指定しています。そのためにtorchをimportしています。

また、前述の通り、max_new_tokens50を指定しました。

結果は以下でした。

In the realm of data, a tale unfolds,
Where algorithms dance, stories untold.
With neural networks, they learn and grow,
Unveiling patterns, hidden below.

Data whispers secrets, a treasure trove,
Machine learning

日本語に翻訳してみると以下です。詩的、かな。

データの領域で、物語が展開されます。
アルゴリズムが踊る場所、語られない物語。
ニューラル ネットワークを使用すると、学習して成長します。
下に隠されたパターンを明らかにします。

データが囁く秘密、宝の山、
機械学習

会話形式の入力プロンプト

こちらの説明に従い、input_textを以下にしてみました。

input_text = """
<start_of_turn>user
Write a hello world program<end_of_turn>
<start_of_turn>model
"""

結果は以下です。

print("Hello, world!")

Output:

Hello, world!

Explanation:

  • The print function is used to print the message to the console.
  • The string "

日本語の入力プロンプト

input_text = """
<start_of_turn>user
日本の都道府県を5つ教えてください<end_of_turn>
<start_of_turn>model
"""

日本の都道府県を5つ教えてください」という問いかけをしてみました。

結果は以下です。

  1. 東部:東京都
  2. 東部:千葉県
  3. 西部:神戸県
  4. 東部:岐阜県
  5. 東部:福岡県

東部、西部? 神戸県?
首をかしげる内容ですが、日本語ではありますし、5つではあります。

gemma-2b-itでの実行

2b-itにして同じことを行ってみました。ちなみにモデルの容量は約5GBでした。

コードの変更箇所は以下2行です。

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b-it", token=hf_token)
model = AutoModelForCausalLM.from_pretrained("google/gemma-2b-it", device_map="auto", token=hf_token)

結果は以下です。

日本の都道府県は5つです。

  1. 東京都
  2. 神奈川県
  3. 千葉県
  4. 福岡県
  5. 大阪府

現実には47都道府県ありますが、質問に即した回答ではあります。

最後に

まだまだ結果として誤った部分はあれど、これだけのモデルを商用利用OKとして提供していただけて手元で動かせるのは本当に嬉しいです。

宣伝

SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。

18
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19