WSL2 で LINE の 3.6B 言語モデルを使ってみる

# 目次
[1. はじめに](#1-はじめに)
[2. 環境](#2-環境)
[3. 環境構築](#3-環境構築)
[4. 実行してみる](#4-実行してみる)
[5. まとめ](#5-まとめ)
[参考文献](#参考文献)

# 1. はじめに
[最近 LINE から LLM が出たみたいです．](https://engineering.linecorp.com/ja/blog/3.6-billion-parameter-japanese-language-model)AI 関連については積極的に情報を追っていないのですが，自分が普段見ている YouTube に出ている shi3z さんだけは追っています．
<iframe width="1280" height="640" src="https://www.youtube.com/embed/ffcj87E7MK4" title="「第二回AIアートグランプリ開催決定！動画音楽シナリオ生成できるAIでも、結局出来ないこととは！？」第2119話 shi3z &amp; drikinの#AIドリフト" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>この動画を見て LINE の LLM 面白そうだなと思ったのが今回のモチベーションです．

# 2. 環境
Windows 11 の WSL2 で動かしました．バージョンや GPU は以下の通り．

- OS: Windows 11 Home 22H2
- WSL2: Debian
- GPU: NVIDIA GeForce RTX 2060

Python と CUDA のバージョンは以下の通り．

```console
$ python --version
Python 3.11.4
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Jun_13_19:16:58_PDT_2023
Cuda compilation tools, release 12.2, V12.2.91
Build cuda_12.2.r12.2/compiler.32965470_0
```

WSL2 に GPU を認識させ，CUDA を入れる方法はご自分で調べてくださいませ．

# 3. 環境構築
Python は pyenv と Anacondaを使い環境を管理しています．

```console
$ conda create -n llm-line
$ pip install transformers accelerate bitsandbytes
$ pip install sentencepiece
$ pip install scipy
```

基本的に conda で入れていたのですが，bitsandbytes が GPU を認識してくれなかったので，すべて pip で入れたところ認識しうまく動きました．WSL2 で動かす時にあたって，このライブラリのソースコードを変更している人もいましたが，私は pip で入れたままで動きました．
scipy は下のコードを実行したときに必要って言われたのでいれました．

# 4. 実行してみる
以下のコードで実行しました．LINE の LLM にはベースモデルの [line-corporation/japanese-large-lm-3.6b](https://huggingface.co/line-corporation/japanese-large-lm-3.6b) と指示モデルの [line-corporation/japanese-large-lm-3.6b-instruction-sft](https://huggingface.co/line-corporation/japanese-large-lm-3.6b-instruction-sft) があるようで，今回はテキストの続きを書いてもらうということでベースモデルを使いました．

```Python:mian.py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer


def main():
    line(
        "line-corporation/japanese-large-lm-3.6b",
        "ゆゆ式で一番かわいいのは"
    )


def line(llm, prompt):
    # トークナイザーとモデルの準備
    tokenizer = AutoTokenizer.from_pretrained(
        llm,
        use_fast=False
    )
    model = AutoModelForCausalLM.from_pretrained(
        llm,
        load_in_8bit=True,
        torch_dtype=torch.float16,
        device_map="auto",
        use_safetensors=False
    )

    # 推論の実行
    input_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
    tokens = model.generate(
        input_ids.to(device=model.device),
        min_length=50,
        max_length=300,
        temperature=1.0,
        do_sample=True,
        pad_token_id=tokenizer.pad_token_id,
    )
    output = tokenizer.decode(tokens[0])
    print(output)


if __name__ == '__main__':
    main()

```

```console:出力
ゆゆ式で一番かわいいのは 唯ちゃんですね、うん 唯ちゃんだけを見て生きる。唯ちゃん最強!   唯ちゃんはすごい!唯ちゃんに一目惚れして2年間ずっと好きな女子です。 唯ちゃん以外愛せなくて辛いですけど( ́・_・`) 唯ちゃんは私の永遠の憧れの人です!めっちゃかわいいー! ゆいかおりは、人気ありますね  声優さんも可愛いですし!  かおりんと、ユイカちゃん可愛いですよね(* ́`)♪私も、唯ちゃんに惚れました!笑かわいい 大好き まじで可愛すぎ! 唯も好きですよ!めっちゃかわいいですよ! ファンはたくさんいますよ!声優も可愛いですよね!

```

どっかのタイミングから声優の話になってて草 私は縁ちゃん派です．そういえば大学の先生でお母さん派とかいう人いたな......

![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600771/bb60c1ee-fc50-be1e-eeb3-e655ef7563ba.png)
実行中の GPU 使用状況．しっかり使ってますね．

# 5. まとめ
LLM をはじめて触ってみましたが，ローカルで AI が動いているというところにまず感動しました．でも出力が出るまでかなり時間がかかる印象です．VRAM の大きい GPU を使うと早かったりするのかな？また，同じ入力でも実行する度に違う出力が出ることも気になりました．LLM ってそんなもんなんかな？高い GPU を使えば出力の精度が上がったり安定したりするもんなんだろうか．
今回は動かしてみただけですが，[こういうやつはそれぞれチューニングするのが楽しかったりするみたいです．](https://note.com/npaka/n/n03ceba1babd6)今の環境ではそんなことする気がおきないな......
でも，日本人によりそった AI って感じがするところに風情があっていいですよね．

# 参考文献
- 36 億パラメータの日本語言語モデルを公開しました，LINE Engineering, https://engineering.linecorp.com/ja/blog/3.6-billion-parameter-japanese-language-model, 2023-08-20 確認
- Instruction Tuningにより対話性能を向上させた 3.6B 日本語言語モデルを公開します, LINE Engineering，https://engineering.linecorp.com/ja/blog/3.6b-japanese-language-model-with-improved-dialog-performance-by-instruction-tuning, 2023-08-20 確認
- LIN Eの 3.6B 言語モデルで遊んだら爆笑した，note (shi3z), https://note.com/shi3zblog/n/nb999c81d01c3, 2023-08-20 確認
- Google Colab で LINE の japanese-large-lm を試す, note (npaka)，https://note.com/npaka/n/ndf326abda939, 2023-08-20 確認
- Google Colab + trl で LINE の japanese-large-lm のQLoRA ファインチューニングを試す, note (npaka)，https://note.com/npaka/n/n03ceba1babd6, 2023-08-20 確認
- 「第二回 AI アートグランプリ開催決定！動画音楽シナリオ生成できる AI でも、結局出来ないこととは！？」第 2119 話 shi3z & drikin の #AIドリフト, YouTube (散財小説ドリキン), https://www.youtube.com/watch?v=ffcj87E7MK4, 2023-08-20 確認