GPUでは動くことはわかってるFugaku-LLM。
自宅のCPUパソコンで動くのか試してみました。
結果
Fugaku-LLMはCPUパソコンでも動くが遅い。
実行環境
PCスペック
・CPU:Intel Core i5-13500
・メモリ:32GB(DDR4-3200×2枚)
・SSD:NVMe 1TB
・その他:
・GPUなしの普通のデスクトップです。詳しくは後日書くかも。
OSなど
・OS:Ubuntu 22.04 LTS Desktop
・今回は仮想化やコンテナは利用していません。
実行コード
import datetime
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
dt = datetime.datetime.now()
start = 'start: '+str(dt)
print(start)
model_path = "Fugaku-LLM/Fugaku-LLM-13B-instruct"
dt = datetime.datetime.now()
str1 = 'after_model_path: '+str(dt)
print(str1)
tokenizer = AutoTokenizer.from_pretrained(model_path)
dt = datetime.datetime.now()
str1 = 'after_tokenizer: '+str(dt)
print(str1)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, device_map="auto")
dt = datetime.datetime.now()
str1 = 'after_model: '+str(dt)
print(str1)
model.eval()
dt = datetime.datetime.now()
str1 = 'after_model.eval(): '+str(dt)
print(str1)
system_example = "以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。"
instruction_example = "スーパーコンピュータ「富岳」の名前の由来を教えてください。"
prompt = f"{system_example}\n\n### 指示:\n{instruction_example}\n\n### 応答:\n"
input_ids = tokenizer.encode(prompt,
add_special_tokens=False,
return_tensors="pt")
dt = datetime.datetime.now()
str1 = 'after_input_ids: '+str(dt)
print(str1)
tokens = model.generate(
input_ids.to(device=model.device),
max_new_tokens=128,
do_sample=True,
temperature=0.1,
top_p=1.0,
repetition_penalty=1.0,
top_k=0
)
dt = datetime.datetime.now()
str1 = 'after_tokens: '+str(dt)
print(str1)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
dt = datetime.datetime.now()
str1 = 'after_out: '+str(dt)
print(str1)
print(out)
その他
・コードの各所にprint文入れて各所の実行時間をはかりました。
・2回目以降実行のため、
LLMモデルはローカルから読み込んでいます。
実行結果
実行ログ
start: 2024-05-19 14:25:58.486359
after_model_path: 2024-05-19 14:25:58.486378
after_tokenizer: 2024-05-19 14:25:58.829314
Loading checkpoint shards: 50%|████████▌ | 3/6 [00:00<00:00, 2Loading checkpoint shards: 100%|█████████████████| 6/6 [00:00<Loading checkpoint shards: 100%|█████████████████| 6/6 [00:00<00:00, 23.82it/s]
after_model: 2024-05-19 14:26:00.501484
after_model.eval(): 2024-05-19 14:26:00.503511
after_input_ids: 2024-05-19 14:26:00.506017
after_tokens: 2024-05-19 15:53:20.935008
after_out: 2024-05-19 15:53:20.935205
以下は、タスクを説明する指示です。要求を適切に満たす応答を書 きなさい。
### 指示:
スーパーコンピュータ「富岳」の名前の由来を教えてください。
### 応答:
「富岳」は日本のスーパーコンピュータの名前で、富士山の異名でもあります。この名前は、スーパーコンピュータが日本の研究と革新の象徴である富士山にちなんだもので、世界最高性能のコンピュータになることを目指すという決意を示すものです。
結果
・1回の実行に30分以上かかりました💦
・ColabのT4インスタンスでの実行は数分だったため、
想像以上にやばい結果となりました。
考察とこれから
・流石に1回の実行に30分はかかり過ぎという体感があったため、
少し原因調査しました。
仮説1:メモリ不足
Fugaku-LLMは実行に
26~30GB程度のメモリを利用すると言われています。
今回のPCには全体で32GBしかメモリを積んでいなかったため、
SSDへのスワップが発生していたのではないかと考えました。
スクショ
個人的な見解
topを見ていた感じだと、
スワップそんなに発生していないのではないか?
と思います。
ただ、ガベージコレクションはガリガリしていました。
→後日メモリ増やして計測してみます。
仮説2:CPUをうまく使えていない
topを見ると、CPU使用率が100%~120%で全然伸びていませんでした。
スクショ
個人的な見解
マルチコアが全然使えておらずコアが遊びまくっています。
今回遅かった主原因はこれな気がします。
→後日マルチコア対応できるかどうか試してみます。
感想と今後の方針
でも、32GBメモリのCPU環境で
とりあえず最後まで実行できたことにはびっくりしました。
…正直、エラーで止まると思ってた(笑)
ただ、現在の速度では使い物にならないので、
・メモリ増強
・マルチコア対応
・GPU利用
の3方向で、
使い物になる実効速度に挑戦していきたいと思います。
最後に広告
本業の方の広告になってしまうのですが、
会社関係で「メタバース・デジタルツイン講座」やってます。
メタバース・デジタルツインに興味のある人はぜひよろしくお願いします。