見出し画像

ローカルで自然言語処理AIを動かしたど~!!!!

【追記】参考になりそうな記事をみつけたのリンク貼り付け手おきます
【追記2】下記のやり方そのままではGPUを使えないので、GPU使用したいときのやり方を追記しておきます。

・ローカルで動く
・学習済みモデルがある
・グラボスペック:RTX3060位
・できれば日本語
の要件で遊べる自然言語処理AI環境で遊びたい。

という需要が自分の中で爆誕しましたのでフォロワ様の情報を参考に環境を作りました。
あくまでテストスクリプトが動いただけなので理屈もクソもないので、詳しい解説は頭の良い方にすべてを任せます。
前提としてWin向けPython環境は整っているものとして書いてます。
整っていない人は頑張れ!

というわけで自分の導入メモを。

①convogptディレクトリを作成

git Cloneで環境を作りたかったのですが、権限エラー?とかでできなかったので手動で作りました。
C:\convogptを作成。ライブラリ用に仮想環境を作成し、有効化します。

以下コマンドプロンプト

cd C:\convogpt
python -m venv env

https://github.com/harubaru/convogptからconvogpt-main.zipをDLして解凍。
convogpt-mainの内容をC:\convogptに丸ごとコピー
ファイル構成はこんな感じになります。

②日本語学習済みモデルをDL

今回はりんなちゃんを使用

cd C:\convogpt\models
git lfs install
git clone https://huggingface.co/rinna/japanese-gpt-1b
cd C:\convogpt

③各種必要なライブラリを仮想環境にインストール

env\Scripts\activate.bat
python -m pip install -r requirements.txt
python -m pip install --upgrade pip setuptools
pip install transformers
pip install sentencepiece

④サンプルスクリプトを書く

"C:\convogpt\rinna.py"

from transformers import T5Tokenizer, AutoModelForCausalLM

class GPTGenerator:
    def __init__(self, model_name_or_path: str):
        self.tokenizer = T5Tokenizer.from_pretrained("models/rinna/japanese-gpt-1b")
        self.model = AutoModelForCausalLM.from_pretrained(
            model_name_or_path
        ).eval()
        self.tokenizer.padding_side = "left"

    def generate(self, prompt: str, max_length: int, count: int):
        output = {}

        input_ids = self.tokenizer.encode(
            prompt,
            return_tensors='pt'
        ).repeat(count, 1)

        output = self.model.generate(
            input_ids=input_ids,
            do_sample=True,
            max_length=100,
            min_length=100,
            top_k=500,
            top_p=0.95,
            pad_token_id=self.tokenizer.pad_token_id,
        )[:, input_ids.shape[1]:]

        output = self.tokenizer.batch_decode(
            output,
            skip_special_tokens=True
        )

        return output

generator = GPTGenerator("models/rinna/japanese-gpt-1b")
text = "こんにちは。よろしくお願いいたします" #入力したい言葉
max_length=100 #返信の文字の長さ
count=1 #返信数
print(generator.generate(text,max_length,count))

⑤サンプルスクリプトを実行

python rinna.py
こんな感じの返事が返ってくると成功です。

理屈はわからん!各種パラメータの意味もわからん!!!!
間違っているところやおかしいところがあったら訂正記事お願いします・・・!!!!!(ぶん投げ

【追記その2】
上記のやり方だとGPUが使えないのでtorchを入れなおす必要があります。以下方法。まず下記の記事の①の手順を実行。
実行できたらtorchを入れなおす。

env\Scripts\activate.bat
pip uninstall torch
python -m pip install -U pip setuptools 
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117

その上で上記のサンプルスクリプトを改造。
"C:\convogpt\rinna_GPU.py"

from transformers import T5Tokenizer, AutoModelForCausalLM
import torch

torch.set_default_tensor_type('torch.cuda.FloatTensor')

class GPTGenerator:
    def __init__(self, model_name_or_path: str):
        self.tokenizer = T5Tokenizer.from_pretrained("models/rinna/japanese-gpt-1b")
        self.model = AutoModelForCausalLM.from_pretrained(
            model_name_or_path
        ).eval()
        self.tokenizer.padding_side = "left"
        if torch.cuda.is_available():
            self.model = self.model.to("cuda")

    def generate(self, prompt: str, max_length: int, count: int):
        output = {}

        input_ids = self.tokenizer.encode(
            prompt,
            return_tensors='pt'
        ).repeat(count, 1)

        output = self.model.generate(
            input_ids=input_ids,
            do_sample=True,
            max_length=100,
            min_length=100,
            top_k=500,
            top_p=0.95,
            pad_token_id=self.tokenizer.pad_token_id,
        )[:, input_ids.shape[1]:]

        output = self.tokenizer.batch_decode(
            output,
            skip_special_tokens=True
        )

        return output

generator = GPTGenerator("models/rinna/japanese-gpt-1b")
text = "こんにちは。よろしくお願いいたします" #入力したい言葉
max_length=100 #返信の文字の長さ
count=1 #返信数
print(generator.generate(text,max_length,count))

import torchを加えて、GPUを使うように設定しているだけです。

        if torch.cuda.is_available():
            self.model = self.model.to("cuda")


いいなと思ったら応援しよう!