transformers,gpt2-large-japaneseをローカル環境で利用する

## はじめに
かの有名な自然言語処理の参考書籍「[大規模言語モデル入門](https://www.amazon.co.jp/%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E8%82%B2%E7%9F%A2/dp/4297136333/ref=sr_1_4?adgrpid=145403684286&dib=eyJ2IjoiMSJ9.8J2HQBhizFRVxS0QZufV902eiBQp2NmRIJwoYMpPlGfF8b0dbU3hWlhjxgbQ-cgzqYBDM0HiiFEnFkrxv3oO5HK2_5j5Hf1vVSgtOR_-Q0EPvvXzWRViWf0j1_DFVEMK6ujXvVKAEZzos1ZW7eU2H3L4LD0o82lUxlPlneB8qxlsF5Vt5D-2w6e_RS8RsaMh96mYB3Ic7zcqwrNRPcUlNaJQuAAoCUk-Un1ROtxeK0-DrYRO1F8Piniiq5vl1eRxmKaBi9X1tEhjIevIUQ_DtJul5UlvhJ2pNHRPR4GLa6E.yeNpIcuA_wkxrc_lr2RgRBmnRq4c_nVp-4FoiO1DT2s&dib_tag=se&hvadid=679093390007&hvdev=c&hvqmt=e&hvtargid=kwd-2089171931005&hydadcr=1789_13657226&jp-ad-ap=0&keywords=%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E5%85%A5%E9%96%80&qid=1727353841&sr=8-4)」を学習し始めました。
この書籍はPython×Google colaboratory(Colab)でソースコードを実際に動作させます。
そんな構成で大規模言語モデルについて学んでいこうというものです。
Colabを利用するのは無料で、環境構築をしなくて済むというメリットがあります。

だがしかし、問題点もあります。
Colabにはセッション、ランタイムというものがあり、
- pip install
- import

上記のような操作は一定時間でリセットされてしまいます。
つまり、上記を含むコードを再び実行しなければ実行していない状態と同じになります。

もちろん、このような書籍は1日ですべての内容を終えることはできるはずもなく、必然的に日をまたいだ勉強になります。けれど、日を空けるごとに毎回上記のコードを実行して数分をとられるとストレスがかかります。

この対策として利用するパッケージの**transformers**や**言語モデル**をローカル環境で保存します。これにより、余計な手間を省き、ストレスを軽減して勉強を捗らせよう、という目論見でtransformersをローカル環境で利用する準備を行っていきたいと思います。


<img src = 'https://m.media-amazon.com/images/I/91D8pDhoI5L._SL1500_.jpg' width = 50%>

## そもそもtransformerとかって何？
Transformerは機械翻訳のモデルとして考案されたニューラルネットワークです。我々が日々利用している機械翻訳に利用されているものです。Chat GPTなんかも自然言語処理の分野でTransformerの技術を元に作られています。これらは自然言語処理と呼ばれる分野です。詳しくは下記のURLから調べてください。

https://huggingface.co/learn/nlp-course/chapter1/2?fw=pt

## 免責事項
他の記事ではtransformersは仮想環境での構築推奨など書いてあります。
ライブラリや環境の関連などは詳しくないため、他の記事を同時に参照して各自の責任でお願いします。

## 環境
- Visual Studio code(1.93.1)
- Windows 11
- Python(3.11.4)

## すること
- 仮想環境の構築
- transformersのインストール
- モデルのダウンロード

## 仮想環境の構築
ソースコードのデータを入れるフォルダに`cd`コマンドで移動してください。
そして、以下のコマンドを入力してください。
様々なフォルダやファイルが自動生成されれば完了です。
```
python -m venv .env
```

続いて、仮想環境の有効化です。
以下のコマンドで問題なく動けば終了。
```
.venv\Scripts\Activate
```

ただ、なぜか今の環境ではエラーが出てしまったので、同様の人はちょっとしたVScodeの設定をしてください。`settings.json`のどこかに以下を書き込み、上記のコマンドを実行すれば動作するはずです。
```json:settings.json
{
    "terminal.integrated.env.windows": {
        "PSExecutionPolicyPreference": "RemoteSigned"
    }
}
```
これについては下記の記事を参考にしました。

https://qiita.com/startours777/items/2d35f2c6de12071a4c77#:~:text=PC%E3%82%92%E6%96%B0%E8%AA%BF%E3%81%97%E3%81%9F%E3%81%AE

## transformersのインストール
ここからが本番です。
transformersはPythonのライブラリでpipを利用してインストールできます。
ただ、ここで`abeja/gpt2-large-japanese`というモデルを利用するため、ここで必要なパッケージも同時にインストールします。
```
pip install transformers[ja,sentencepiece,torch] pandas
```
これで完了です。

では、
インストールできたか以下のコマンドでチェックしましょう。
```
pip list
```
```:出力結果
transformers       4.45.0
```
しっかりインストールできてますね。

### 簡易的な実行
ローカル環境で利用する前に、
そもそもネット接続でしっかり利用できるのか確認します。
実行してから多少の時間はかかると思います。
```python:gpt.py
from transformers import pipeline

generator = pipeline('text-generation', model='abeja/gpt2-large-japanese')
outputs = generator('日本で一番高い山は')
print(outputs[0]['generated_text'])

```
```:出力結果
日本で一番高い山は富士山で、高さは3,310mになります。山の高さは日本一で、日本人の誇りになります。 一説には世界で一番高い山はアメリカのサンフランシスコから見えています。それもそのはず
```
GPTというモデルを利用しているので、文字列を与えるとそれっぽい文章を生成してくれます。どんどんと、意味不明な文章が生成されていきます。

ちなみに、国土交通省がウェブサイトに載せている情報では富士山の高さは[**3,776.24m**](https://www.cbr.mlit.go.jp/fujisabo/bosai/fuji_info/fuji_info-top.html)になります。

なにはともあれ、インストールしたライブラリが正しく動作することを確認できました。

## モデルのダウンロード
さて、実際に今のをローカル環境だけで完結させたいと思います。
これはダウンロードに数分時間がかかりました。
```python:
from huggingface_hub import snapshot_download

snapshot_download(repo_id = 'abeja/gpt2-large-japanese')
```
huggingface_hubは`pip transformers`するとき、同時にインストールされています。
`snapshot_download`に関してはモデルのリポジトリのデータをすべてダウンロードします。これらに関する仕様については以下のURLから辿って確認してください。

https://huggingface.co/docs/huggingface_hub/v0.21.4/en/guides/download#download-an-entire-repository

ちなみに、
ここでダウンロードしたデータは`C:\Users\ユーザー名\.cache`のフォルダに保存されています。任意の場所にデータを配置する場合には以下のような引数を指定します。この場合にはカレントディレクトリ内の`gpt2-large-japanese`というディレクトリにデータが配置されます。
```python:
from huggingface_hub import snapshot_download

snapshot_download(repo_id='abeja/gpt2-large-japanese', local_dir='./gpt2-large-japanese')
```

## ローカル環境での実行
確認したい方はここでネット接続を切断してみてください。
最初に実行したときとほとんど変わらないコードですが、ローカルにあるデータを参照して実行されています。
```python:
from transformers import pipeline

generator = pipeline('text-generation', model='./gpt2-large-japanese')
outputs = generator('日本で一番高い山は')
print(outputs[0]['generated_text'])
```
```:出力結果
日本で一番高い山は何と言っても富士山 だと思います ^^; 今までで1番高い山は、三重県にある鈴鹿サーキットで標高2,763mですね 1月17日に行ったのですが、山頂
```
先ほどと内容は違いますが、しっかりと生成できています。これで、ローカル環境でtransformers(主にgpt2-large-japanese)を利用することができるようになりました。他にも様々なモデルがあるので下記のページにあるモデルを眺めて興味があればダウンロードしてもよいかもしれませんね。

以上、transformers,gpt2-large-japaneseをローカル環境で利用するを閉めたいと思います。
また機会があればお会いしましょう。

## 参考記事
書籍

https://www.amazon.co.jp/%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E8%82%B2%E7%9F%A2/dp/4297136333/ref=sr_1_4?adgrpid=145403684286&dib=eyJ2IjoiMSJ9.8J2HQBhizFRVxS0QZufV902eiBQp2NmRIJwoYMpPlGfF8b0dbU3hWlhjxgbQ-cgzqYBDM0HiiFEnFkrxv3oO5HK2_5j5Hf1vVSgtOR_-Q0EPvvXzWRViWf0j1_DFVEMK6ujXvVKAEZzos1ZW7eU2H3L4LD0o82lUxlPlneB8qxlsF5Vt5D-2w6e_RS8RsaMh96mYB3Ic7zcqwrNRPcUlNaJQuAAoCUk-Un1ROtxeK0-DrYRO1F8Piniiq5vl1eRxmKaBi9X1tEhjIevIUQ_DtJul5UlvhJ2pNHRPR4GLa6E.yeNpIcuA_wkxrc_lr2RgRBmnRq4c_nVp-4FoiO1DT2s&dib_tag=se&hvadid=679093390007&hvdev=c&hvqmt=e&hvtargid=kwd-2089171931005&hydadcr=1789_13657226&jp-ad-ap=0&keywords=%E5%A4%A7%E8%A6%8F%E6%A8%A1%E8%A8%80%E8%AA%9E%E3%83%A2%E3%83%87%E3%83%AB%E5%85%A5%E9%96%80&qid=1727353841&sr=8-4

自然言語処理について

https://huggingface.co/learn/nlp-course/chapter1/2?fw=pt

環境構築について

https://qiita.com/mizutan/items/e79f3ef6b8b833891ee3#:~:text=Hugging

https://qiita.com/startours777/items/2d35f2c6de12071a4c77#:~:text=PC%E3%82%92%E6%96%B0%E8%AA%BF%E3%81%97%E3%81%9F%E3%81%AE

モデルのダウンロードについて

https://huggingface.co/learn/nlp-course/chapter1/2?fw=pt

https://qiita.com/Miki7/items/706a1a94e92ac580a124#:~:text=%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE