Gemmaの日本語モデルを使う

## Gemmaについて
**Gemma** は Google が開発した**軽量なオープンモデルファミリー**です。

https://ai.google.dev/gemma

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/05bfbd8e-175b-19cd-032c-eef15db54793.png)

### Gemini との違い
**Gemini** は Google が開発したマルチモーダルな生成AIモデルです。
大きくは、 Gemini が**マルチモーダル**なのに対し、Gemma は**基本としてはテキストに対応**しています。その代わり Gemma は軽量でオープンソースとして使えるため、研究開発には向いています。

https://gemini.google.com/app?hl=ja

2024年12月時点の両者の比較になります。
| 特徴 | Gemma | Gemini |
|:-----------|:-----------:|:------------:|
| モデル       | 軽量、オープンソース        |  大規模、商用        |
| 利用用途     | 開発や研究など      | 高度な研究やアプリケーション向け  |
| サイズ       | 2～27B        | 1.56T        |
| アクセス     | 改変、再配布可能          | Google APIやGoogle Cloudで利用           |
| 互換性      | TensorFlow、PyTorch、JAXなど       | Google独自のインフラ、ツールに対応      |
| チューニング    | インストラクション・チューニング  | 多くのリソースが必要      |

※"B"は10億(Billion)、"T"は1兆(trillion)

### Llamaへの対抗
これはオープンソースな LLM として Mata 社の **Llama** と比較されることがあります。
パラメータ数や **MMLU** というベンチマークで Llama や Mistral を超えることが示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/d4f949d0-a630-c5ed-d0cf-5aa9db7edbc8.png)

https://storage.googleapis.com/deepmind-media/gemma/gemma-2-report.pdf

## ファミリーとは
Gemma にはファミリーモデルと呼ばれる派生モデルがあります。


### 1. **PaliGemma**：
視覚言語モデル(VML)。オートセグメンテーションなどができる

### 2. **RecurrentGemma**：
長い文章に対応したモデル。[Griffin](https://arxiv.org/abs/2402.19427) をベースにしている

### 3. **DataGemma**：
ハルシネーション対策を目的としたLLM。ナレッジとして[Data Commons](https://datacommons.org/) と連携している

### 4. **CodeGemma**：
コード生成に特化したLLM

## 日本語モデルを使うには
日本語のモデルは **"jpn"** が付いています。他にも韓国語などがあります。
リソースは **HuggingFace** が充実しています。

https://huggingface.co/google/gemma-2-2b-jpn-it

デプロイ方法は現在4パターンです。今回は **Inference Endpoints** について説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/5a3e29af-0022-88f7-79ca-1a4ded2dceb5.png)

### Inference Endpoints
まずは HuggingFace の `Access Token` を取得しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/1c8b14fb-f043-5371-294c-2b0278c1cc77.png)

先ほどモデルのページから`deploy`→`Inference Endpoint(dedicated)`へと進みます。

![スクリーンショット 2024-12-17 092348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/78b93c11-2ae5-8c67-c012-193059c87a58.png)

このような画面からエンドポイントを使うのに必要な設定していきます。

:::note warn
- 決済情報：クレジットカード情報を入れます
- マシンの選択：AWSやAzureなどの計算リソースを選びます
:::

他にもこまごました設定がありますが初めての場合はいじらなくて大丈夫です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/d1ecfaac-ab73-59cc-6fad-b0eb43396021.png)

設定が終わると、Endpointの準備をします。

![スクリーンショット 2024-12-17 092840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/22d334e1-198a-7bec-974e-5eb15d4eb5a5.png)

完了したら早速エンドポイントを使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/98f3f03f-b839-e944-e5eb-512be8a16e62.png)

#### サンプルコード

```python
# 取得したエンドポイント
API_URL = "https://XXXXXXXXXXXXXXXX.aws.endpoints.huggingface.cloud"

headers = {
  "Accept" : "application/json",
  "Authorization": "Bearer hf_XXXXXXXXXXXXXXXX", # HuggingFaceのアクセストークン
  "Content-Type": "application/json"
}


def query(payload):
	response = requests.post(API_URL, headers=headers, json=payload,verify=False )
	return response.json()
```

## おまけ： Kaggler は kaggle アカウントがあれば使える！

https://www.kaggle.com/models/google/gemma-2-2b-jpn-it

こちらの指示に従ってライセンスを取得します。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/c06f2e61-ff12-6f26-4110-27ac68c843f1.png)

登録できると自由に **Notebook** で使うことができます。
Kaggle上に限らず、**Google Colaboratory でも Kaggle のシークレットキーを設定すれば扱うことができます**。

```python 
import os
from google.colab import userdata, drive

# vars as appropriate for your system.
os.environ["KAGGLE_USERNAME"] = userdata.get("KAGGLE_USERNAME")
os.environ["KAGGLE_KEY"] = userdata.get("KAGGLE_KEY")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/986141/cb33c060-2e66-b387-b60e-ec70ad84bb62.png)