大規模言語モデル（LLM）をGoogle Colaboratoryで試してみた

# はじめに
こんにちは！あるいはこんばんは！
[MYJLab Advent Calendar 2023](https://qiita.com/advent-calendar/2023/myjlab)の8日目です。

昨日は、@nightcountrycooperさんの、[【Nginx&Golang&MySql】Dockerで開発環境の構築](https://qiita.com/nightcountrycooper/items/390265d0ebfcfbaeea9a)という記事でしたね。goには触れたことがなかったので、開発環境の構築を知ることができてよかったです。
<br>
今日は、大規模言語モデル（Large Language Model）について書いていきたいと思います。

卒業研究の敵、ChatGPT。
<strong>「ChatGPTでよくない？」</strong>
この考えで大抵の案はボツになりました。こいつは色々できすぎやしませんか？？？

そんな敵対心から、あえてGPT-3.5およびGPT-4以外の大規模言語モデルについて触れていこうかな、と思います。
実行環境はGoogle Colaboratoryです。（実行するときは「ランタイム」→「ランタイムのタイプを変更」でGPUを設定してください）

それでは、本編へ進んでいきましょーーー

# CyberAgentLM
「[CyberAgentLM](https://huggingface.co/cyberagent)」は、株式会社サイバーエージェントによって開発された大規模言語モデルです。最大68億パラメータで、日本語に対応しています。

それでは早速、実行していきましょう！

``` python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b", device_map="auto", torch_dtype=torch.float16)
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-7b")

inputs = tokenizer("書き出し部分", return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        top_p=0.9,
        repetition_penalty=1.05,
        pad_token_id=tokenizer.pad_token_id,
    )
    
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
```
これだけで実行できます。お手軽ですね。
実行すると、”書き出し部分”の続きが生成されます。
では、いくつか実行結果を見ていきましょう。
<br>
まずは、自己紹介をしてもらいましょう。
``` 
書き出し：「自己紹介をはじめます。私の名前は、」
自己紹介をはじめます。私の名前は、上村一栄です。私は長野県生まれで、現在47歳になります。現在は、長野の自宅で仕事をしています。職業は通訳案内士というもので、国家試験に合格した日本語を話す外国人に付き添って、英語で日本の観光地をご案内する仕事を業務としています。2016年4月までは、京都に住んでおりました。
``` 

だれやねん、長野県在住47歳の上村さんって。
でも、本当に実在しそうな人の自己紹介文になっています。かなりよい性能かも。
<br>
<br>
計算もしてもらいましょうかね。
``` 
書き出し：「3×8×2は、」
3×8×2は、どちらの面からしても4分の一ずつ。つまり、正方形の面積を求める公式と同じになります。
そこで、この公式を長方形やひし形にも応用してみましょう。上の図のように、横の長さは同じですが縦の長さが違う場合も考えてみます。このとき、次の式から成り立つことを覚えておきましょう。
``` 
ちょっと何言ってるか分からないですね。
なんか新しい公式を生み出しています。学会発表済んでますかね、数学界隈が驚愕ですよ。
<br>
<br>
季節柄、次はクリスマスについて生成してもらいましょう。
``` 
書き出し：「今年のクリスマスは、」
今年のクリスマスは、もっと楽しく。そしてお財布も潤うステキなプレゼントを『サリュ』で探しましょう♪
``` 
広告みたいな文面が生成されました。しかも、ちょっとグレーな香りが漂ってきます...
「お財布も潤うステキなプレゼント」ってなんですか！？壺かなんかですよねきっと。
「素敵」を「ステキ」ってカタカナ表記にしてるのもまたなんかね…
<br>
<br>

ありもしないようなことを生み出すのが本当に得意です、この方は。
最後に盛大に法螺でも吹いてもらいましょうか。自慢を聞いてみます。
``` 
書き出し：「私の自慢は、」
私の自慢は、自分の足で歩いて人生を歩んできたことです。足が不自由になり病院から杖歩行をすすめられましたが、私は「自分で歩きたい」と頑固に反対しました。そこで理学療法士の先生に相談して義肢装具士の方を紹介していただきました。そして今の義足をみつけました。
``` 
えええええええええ
上村さん...大変な人生を歩んでこられたのですね...😢
<br>
以上、こんな感じでCyberAgentLMに文章生成してもらってみましたー。


# Weblab-10B
「[Weblab-10B](https://huggingface.co/matsuo-lab/weblab-10b)」は、東京大学松尾研究室によって開発された大規模言語モデルです。100億パラメータサイズで、日英2ヶ国語に対応しています。なお今回は、無料版Google Colabでも動かせるよう、軽量な4bit量子化モデル（[こちら](https://huggingface.co/dahara1/weblab-10b-instruction-sft-GPTQ)）を使っていきます。

それではこちらも早速、実行していきましょう！

``` python
!pip install auto-gptq

import torch
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM

quantized_model_dir = "dahara1/weblab-10b-instruction-sft-GPTQ"
model_basename = "gptq_model-4bit-128g"

tokenizer = AutoTokenizer.from_pretrained(quantized_model_dir)

model = AutoGPTQForCausalLM.from_quantized(
        quantized_model_dir,
        model_basename=model_basename,
        use_safetensors=True,
        device="cuda:0")
```

``` python
prompt_text = "指示文"
prompt_template = f'以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。\n\n### 指示:{prompt_text}\n\n### 応答:'

tokens = tokenizer(prompt_template, return_tensors="pt").to("cuda:0").input_ids
output = model.generate(input_ids=tokens, max_new_tokens=100, do_sample=True, temperature=0.8)
print(tokenizer.decode(output[0]))
```
こちらもこれだけで実行できます。
では、いくつか実行結果を見ていきましょう。
<br>
まずは同様に自己紹介をしてもらいましょう。
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示：自己紹介をしてください

### 応答：どうして
```
ええ…　初っ端から反抗されました。
見知らぬ人とは馴れ馴れしくするな、って教わって育ったんでしょうね。きっと。
<br>
<br>

次は質問のレベルを少し落としてみますか…
好きな食べ物を聞いてみましょう。
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示：好きな食べ物は何ですか

### 応答：アプリ
```
もはや食べ物じゃないですね。
まあ、好みは人それぞれ！
<br>
<br>

はい。気を取り直して次いきましょう。そろそろまともな回答を期待していますよ！！

今度は計算させてみましょう。
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示：1+1を計算してください

### 応答：1
```

うそでしょ…
これはとんだ問題児です。
<br>
<br>

諦めつつ、季節柄こんな質問もしてみました。
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示：クリスマスにすることは何ですか？

### 応答：クリスマスも何か食べるのだが・・・。
```

お！？やっと会話っぽくなったぞ。
なんか語尾おかしいけどおいときましょう。会話を続けてみます。

↓<br>
↓<br>
↓<br>
↓<br>
↓<br>
```
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示：クリスマスに食べるものは何ですか？

### 応答：にゃー
```

<br>
<strong>🐈≺ にゃー</strong>
<br>

なんじゃそりゃ！！！！！！！！！！！！！！！！！
ネコ食べるん？？？それともネコ語しゃべってるん？？？
<br>
以上、Weblab-10Bとのやりとりでしたー。

# おわりに
今回は、CyberAgentLMとWeblab-10Bという2つの大規模言語モデルをGoogle Colabで試してみましたが、いかがだったでしょうか。
両氏、遺憾なくその暴れっぷりを発揮してくれてとても楽しかったです。

ちなみに、今回の書き出し文と指示文をChatGPTに投げかけたところ、すんなりと回答が返ってきました。なんかもうね、ChatGPTに任せとけばいいんじゃないの！？って感じです。

技術的に有益な記事かというと微妙ですが、楽しく読んでいただけたのであれば幸いです。
<br>
p.s.
ふざけてないですからね。本当に、「にゃー」になったんです。
![スクリーンショット (246).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616250/c15b413c-55d8-1e02-fab5-27f3abe6a957.png)

# 参考
・[CyberAgentLM](https://huggingface.co/cyberagent)
・[Weblab-10B](https://huggingface.co/matsuo-lab/weblab-10b)
・[dahara1/weblab-10b-instruction-sft-GPTQ](https://huggingface.co/dahara1/weblab-10b-instruction-sft-GPTQ)