Fugaku-LLMをCPUパソコンで動かしてみた ～CPUでもFugaku-LLMは動くのか！？～

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の結果はこんな感じ。
![スクリーンショット 2024-05-19 151547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154954/d049d340-7f60-7f5f-0b64-4891b9426605.png)


#### 個人的な見解
topを見ていた感じだと、
スワップそんなに発生していないのではないか？
と思います。
ただ、ガベージコレクションはガリガリしていました。
→後日メモリ増やして計測してみます。

### 仮説2：CPUをうまく使えていない
topを見ると、CPU使用率が100%～120%で全然伸びていませんでした。

#### スクショ

実行中のtop1のスクショはこんな感じ。
![スクリーンショット 2024-05-19 151600.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154954/2e1375c7-76d8-ba31-e950-3cee82606f9c.png)


#### 個人的な見解
マルチコアが全然使えておらずコアが遊びまくっています。
今回遅かった主原因はこれな気がします。
→後日マルチコア対応できるかどうか試してみます。


# 感想と今後の方針
でも、32GBメモリのCPU環境で
とりあえず最後まで実行できたことにはびっくりしました。
…正直、エラーで止まると思ってた（笑）

ただ、現在の速度では使い物にならないので、
・メモリ増強
・マルチコア対応
・GPU利用
の3方向で、
使い物になる実効速度に挑戦していきたいと思います。

## 最後に広告
本業の方の広告になってしまうのですが、
会社関係で「メタバース・デジタルツイン講座」やってます。
メタバース・デジタルツインに興味のある人はぜひよろしくお願いします。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3135343935342f30363931353939332d313534382d323234642d373830322d3664363763333330306431662e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154954/df6b3347-8b36-7fa3-2e1d-2ca296e98145.png)

https://www.kcc.knowledgewing.com/icm/srv/course-application/init-detail?cd=FLM&pcd=FLMC&cscd=UMT01L