見出し画像

ELYZA-japanese-Llama-2を使ってみた

ELYZA-japanese-Llama-2-7b-instructをローカルで使ってみました。
導入までの流れは、いろいろなサイトなどで紹介されていますが、一応、私のやった作業は以下の通りです。
ちなみにパソコンの環境は以下の感じです。
CPU 13th Gen Intel(R) Core(TM) i9-13900HX
GPU GeForce RTX 4060 Laptop
RAM DDR5 32GB
Storage M.2 NVMe, SSD 1TB

① GITのインストール
 https://git-scm.com/download/win  からダウンロードしてGITの環境を作りました。
② CUDA Toolkitのインストール
 パソコンのセットアップ時にアップデートしたと思いますが、念のため、入れなおしました。
 https://developer.nvidia.com/cuda-toolkit  
③ PyTorch のインストール 
https://pytorch.org/  から、コマンドを確認してPIPでインストールしました。

④Hugging Faceのライブラリの導入
工程としては、本当は①のあとなんでしょうが、こちらも行いました。
こちらは、ネット見つけた以下のコードで行いました。
pip install transformers datasets
pip install git+https://github.com/huggingface/accelerate

実際のLYZA-japanese-Llama-2-7b-instructの導入
導入するにあたっては、Pythonで以下のコードを実行しました。

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
tokenizer = AutoTokenizer.from_pretrained("elyza/ELYZA-japanese-Llama-2‐7b-instruct")
model = AutoModelForCausalLM.from_pretrained(
"elyza/ELYZA-japanese-Llama-2-7b-instruct",
torch_dtype=torch.float16,
device_map="auto",
)

ネットで調べて、上記のコードでもって、ELYZA-japanese-Llama-2-7b-instructというモデルを導入しました。
7Bなんで軽いほうではありますが、公式サイトの説明では、「事前学習済みモデルに事後学習 (instruction tuning) を実施したモデル」となっていたので、軽い中では、少し重いほうかなと思います。

実際に動かしてみて

公式のサイトのコードをそのまま使用してみました。
ただし、太字の部分の質問のところのみ変更しています。
ちなみに、Python公式のIDLEShellで動かしてみてます。
(とりあえず、一番素直な環境かなと。)

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

B_INST, E_INST = "[INST]", "[/INST]"
B_SYS, E_SYS = "<<SYS>>\n", "\n<</SYS>>\n\n"
DEFAULT_SYSTEM_PROMPT = "あなたは誠実で優秀な日本人のアシスタントです。"
text = "アメリカと日本は、どちらが面積が広いですか?"

model_name = "elyza/ELYZA-japanese-Llama-2-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto")

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

prompt = "{bos_token}{b_inst} {system}{prompt} {e_inst} ".format(
bos_token=tokenizer.bos_token,
b_inst=B_INST,
system=f"{B_SYS}{DEFAULT_SYSTEM_PROMPT}{E_SYS}",
prompt=text,
e_inst=E_INST,
)

with torch.no_grad():
token_ids = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")output_ids = model.generate( token_ids.to(model.device), max_new_tokens=256, pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id, )
output = tokenizer.decode(output_ids.tolist()[0][token_ids.size(1) :], skip_special_tokens=True)
print(output)

結果

もちろん、ちゃんと動いたのですが、
質問:
「アメリカと日本は、どちらが面積が広いですか?」
実際の回答:
「日本の面積は、約377,639km2です。
アメリカ合衆国の面積は、約9,826,675km2です。
よって、アメリカの方が面積が広いです。」
という簡単な質問とその回答に、2分くらいかかりました。
回答内容も、少し面積にずれがあるような…
GPUが4060ラップトップ(8GB)では、性能的にこんなものなんでしょうか。
ただ、20万程度のパソコンでも、そこそこのGPUが乗っていれば、完全ローカルで動くことが確認できました。
たぶん、GPUのメモリがせめて今の倍、16GBくらいであれば結構いけそうに思います。
プログラミングの補助や、文章要約、Pythonなどを使用したデータ処理、分析の自動化などを、完全ローカルで行いたい場合に、有効なものと考えます。
私が勤めている医療機関でもそうですが、AIの導入を妨げているのは、CHATGPTなどが、基本的にクラウド環境で、かつ、クラウド上で何が行われているか、使わない人からすればよくわからないから不安という点が一番大きいと思います。
それが、ローカルで動かせるのであれば、かなり、導入しやすくなると思います。

※ちなみに、上の写真は、アンコールワット遺跡の元となったといわれているベンメリア遺跡です。
アンコールワットの近くの町である、シェムリアップから、1時間半くらいかかりますが、もし、アンコールワットに行かれるのであれば、ぜひ行ってみてください。アンコールワット以上に胸に響くものがありました。




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