Meta の Llama 2 を Colab から実行する手順（Hugging Face）

## はじめに
Llama 2をColabで実行する時の手順。
シンプルにLlama 2を使ってみたい時とか、自分でFine-TuningしたLlama 2を動かす時なんかに。

## 概要
・MetaのLlama 2をColab上で動かす手順
・ステップバイステップでまとめた

## 手順

### １．アカウントを準備する
はじめにアカウントの準備をします。

まだアカウントがなければ、下記ページからGoogle ColabとHugging Faceのアカウントを作成しておきます。

・Google Colab

https://colab.research.google.com/?hl=ja

・Hugging Face

https://huggingface.co/

## ２．アクセストークンを作成する

Hugging Faceのアカウントを作成したら、Colabからアクセスするためのトークンを発行しておきます。
`Settings`から`Access Tokens`をひらき、`New Token`を押下。
発行されたトークンをコピーしてとっておきましょう。

![Untitled1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93776/7c7045c6-4102-e401-0f15-fdf06e0c8550.jpeg)

### ３．Llama 2の利用申請をする

次にLlama 2の利用申請をします。

下記のページをひらきます。

https://ai.meta.com/llama/

画面中央の`Download the Model`をクリック。
`Request access to the next version of Llama`というページがひらくので、必要事項を入力して、Terms and Conditionsを確認、問題なければ画面下の`Accept and Continue`を押します。

![Untitled2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93776/1519a445-982c-2455-a7f5-f4658bd70cef.jpeg)

「Get started with Llama2」というタイトルの、アクセス許可のメールを待ちます。
自分の時は1〜2分くらいでメールが来ました。

### ４．Llama 2のモデル利用申請をする

次に、Hugging Faceから今回使用するLlama 2の利用申請をします。

今回はMeta公式のLlama 2を使うので、まずは下のページをひらきます。

https://huggingface.co/meta-llama

`Models`から使いたいモデルを選択して、モデルの詳細ページに移動します。
下では`Llama-2-7b-chat-hf`を選択してます。

![Untitled3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93776/e180697c-7d95-af9c-19d6-7a6752176ac4.jpeg)

開いたページで`Submit`を押下すると、`Your request to access this repo has been successfully submitted, and is pending a review from the repo's authors.`と表示されます。

あとは承認されるのを待ちます。

自分の環境だと、こちらも数分ほどで承認メールが届きました。
承認されると、先ほどのモデルの詳細画面に`Gated model You have been granted access to this model`と表示されます。

![Untitled4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93776/442cd64d-d4f1-872e-1c79-43e26f3512b0.jpeg)

### ５．Llama 2を実行する

準備が整ったので、ColabからLlama 2を動かしてみます。

まずはColabで新規ノートブックを作成し、ランタイムは`T4 GPU`を選択します。

:::note warn
デフォルトだとランタイムは`CPU`になっていると思いますが、忘れずに`T4 GPU`に変更します。これを忘れるとエラーで先に進めません
:::

あとは下記のコードを実行していくだけ。
GitHubにもソースコードをあげているのでご参考まで。

https://github.com/yn01/test-of-llama2/tree/main/ipynb

transformersやbitsandbytesなどを`pip install`
```
!pip install transformers sentencepiece accelerate bitsandbytes scipy
```

ライブラリのインポート
```
import torch
from torch import cuda,bfloat16
from transformers import AutoTokenizer,AutoModelForCausalLM
import transformers
```

モデルを指定する
```
model_id = "meta-llama/Llama-2-7b-chat-hf"
```

Hugging Faceのアクセストークンを指定。`hf_`からはじまる文字列です
```
token = ''
```

量子化
```
quant_config = transformers.BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type='nf4',
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=bfloat16
)
```

モデルの読み込み
```
model = transformers.AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    token=token,
    quantization_config=quant_config,
    device_map="auto"
)
```

トークナイザーの読み込み
```
tokenizer = AutoTokenizer.from_pretrained(
    model_id,
    token=token
)
```

パイプラインを立ち上げる
```
pipeline = transformers.pipeline(
    model=model,
    tokenizer=tokenizer,
    task="text-generation",
    repetition_penalty=1.1
)
```

回答生成させる
```
prompt = """USER:What is a digital SLR camera?
SYSTEM:"""
sequences = pipeline(
    prompt,
    do_sample=True,
    temperature=0.8,
    top_p=0.9,
    top_k=40,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
    max_length=300,
)
print(sequences[0]["generated_text"])
```

以上です。