Supershipの名畑です。「【ヒプステ】-Battle of Pride 2023-【Cinema Edit】3面ライブスクリーン映像」を見てきたんですが、映画館という場の進化は素晴らしいものがあるなと思いました。
はじめに
Gemma 2を対象とした記事を公開済みですので、よければそちらをご覧ください
Googleから生成AIモデルGemmaがリリースされました。
- Google、オープンな生成AIモデル「Gemma」公開 商用利用OK、Geminiと同じ技術の軽量LLM - ITmedia NEWS
- Gemma が Google Cloud で利用可能に | Google Cloud 公式ブログ
このGemmaを手元のMacBook(M2)で動かしてみました。その過程を記事に残します。
コードはすべてPythonです。
注意
本記事ではgemma-7bを基本として話を進めていますが、モデルのダウンロードや推論の時間がかなりかかるため、まずは動かすことが目的であればgemma-2bで進めていただければと思います。各Pythonコードに2箇所あるgemma-7b-itをgemma-2b-itに置き換えるだけです。
私の環境
PCはMacBook Pro(Apple M2 Proチップ)です。
OSはmacOS 14 Sonomaです。
Pythonのバージョンは3.10.12です。
$ python --version
Python 3.10.12
accelerate、torch、transformersを用いるので、入れておきます。
$ pip install accelerate torch transformers
私の環境でのバージョンはそれぞれ0.27.2、2.2.1、4.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 2やDeciLMといった他のモデルとの比較等、要点がまとまっています。
ライセンスの認証
今回はHugging Face経由でモデルを入手して実行します。
そのためまずはHugging Faceのアカウントを作成します。
アカウントを作成してログイン後、4つあるモデルのいずれかのページに行くとGemmaへのアクセスのためのライセンス承認が求められます。
Acknowledge licenseを押します。
Access Requestのページに遷移しますので、フォームに名前等を記入していきます。
規約も読んで最後のAcceptを押します。
モデルのページに戻ると、以下のようにアクセス認証が得られたことが確認できます。
アクセストークンの作成
モデルをダウンロードする際のユーザー認証のためにHugging Faceのアクセストークンを作成します。
Hugging FaceでSettingsに移動し、さらにAccess Tokensに移動します。
ここでNew Tokenを押します。
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 settingmax_new_tokens
to control the maximum length of the generation.
max_new_tokensの設定を推奨しますという内容でした。
ドキュメントによると、max_lengthは「入力プロンプトとmax_new_tokensの合計値の最大」のようです。
デフォルトだとmax_lengthは20とかなり小さいため、次は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]))
MacBookのGPUを使用するためにdeviceとしてMPS(Metal Performance Shaders) を指定しています。そのためにtorchをimportしています。
また、前述の通り、max_new_tokensに50を指定しました。
結果は以下でした。
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
- The string "
日本語の入力プロンプト
input_text = """
<start_of_turn>user
日本の都道府県を5つ教えてください<end_of_turn>
<start_of_turn>model
"""
「日本の都道府県を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つです。
- 東京都
- 神奈川県
- 千葉県
- 福岡県
- 大阪府
現実には47都道府県ありますが、質問に即した回答ではあります。
最後に
まだまだ結果として誤った部分はあれど、これだけのモデルを商用利用OKとして提供していただけて手元で動かせるのは本当に嬉しいです。
宣伝
SupershipのQiita Organizationを合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。
Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方はSupership株式会社 採用サイトよりご確認ください。