logo

2024518

Fugaku-LLMを自宅PCで動かしてみた

スパコン「富岳」で学習したという「Fugaku-LLM」を自宅 PC で動かしてみました。既に多くの方が Colab とか Ollama とかで試しているみたいですので n 番煎じですが、自分でも触ってみたかったので。

https://github.com/SogoKato/run-fugaku-llm

環境

  • Windows 11
  • WSL 2 + Docker Desktop
  • GeForce RTX 2070 (8GB RAM)
  • AMD Ryzen 7 3700X
  • 32GB RAM

ぜんぜん最新じゃない GPU では、どれくらい時間がかかるのでしょうか……?!

やりかた

やり方は上記リポジトリにまとめていますが一応ここにも載っけておきます。

PyTorch が入った、Fugaku-LLM 開発元もテストに使ったぽいイメージを利用します。

docker run --gpus all \
  -v $(pwd):/workspace \
  -v /home/${USER}/.cache/huggingface/hub:/root/.cache/huggingface/hub \
  -it --rm nvcr.io/nvidia/pytorch:20.12-py3

以後のコマンドはコンテナの中で実施します。
まず、必要なものを pip install します。なんかエラー出たのでフラグつけてます。

pip install transformers accelerate --use-feature=2020-resolver

モデルをダウンロードするために Hugging Face にログインします。

huggingface-cli login

以下のスクリプト(Hugging Face に掲載のものと同じ)を作成して、実行します。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_path = "Fugaku-LLM/Fugaku-LLM-13B-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, device_map="auto")
model.eval()

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")
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
)
out = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(out)

time コマンドを使って時間を測ったところ、この時は25分35秒でした。長い時だと32分くらいだったりもしました(いずれもモデルダウンロード済みの2回目以降の結果です)。
なかなか実用的じゃない結果ですね。。

root@4d5f84a5e6d8:/workspace# time python3 main.py
/opt/conda/lib/python3.8/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
  warnings.warn(
Loading checkpoint shards: 100%|█████████████████████████████████████| 6/6 [00:01<00:00,  4.43it/s]
/opt/conda/lib/python3.8/site-packages/huggingface_hub/file_download.py:1132: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
  warnings.warn(
WARNING:root:Some parameters are on the meta device device because they were offloaded to the cpu and disk.
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。

### 指示:
スーパーコンピュータ「富岳」の名前の由来を教えてください。

### 応答:
「富岳」は日本の理化学研究所と富士通が共同で開発したスーパーコンピュータで、富士山の異名である「富嶽」に由来している。この名前は、スーパーコンピュータが日本の研究コミュニティや産業界に広く受け入れられ、広く使用されることを願って付けられた。また、富士山が高く評価され、愛されている日本の象徴であることから、この名前が選ばれた。

real    25m35.436s
user    4m53.496s
sys     4m50.370s

おまけ

今回、Ollama というのを知ったので簡単に試してみたのですがなぜか「真岡」連発で、望んだ結果が得られませんでした(なんで??)。もう少し調べて再挑戦したら記事更新したいと思います。

試した手順

Fugaku-LLM-13B-instruct-0325b-q5_k_m.gguf をダウンロードしておく

Modelfileollamaで Fugaku-LLM を動かす から拝借しました(Fugaku-LLMをollamaで利用する からお借りしても結局「真岡」だったのは同じ)。

$ docker run --gpus all \
  -v $(pwd):/workspace \
  -v /home/${USER}/.ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  -it --rm ollama/ollama:0.1.38
$ docker exec ollama \
  ollama create fugaku-llm-13b-instruct -f /workspace/Modelfile
transferring model data 
using existing layer sha256:b6999c1a64a531726fa1a6f10459f477c1016cc72212401fc9affbb29b1bc7fb 
using existing layer sha256:a4e0782577a830dbeb8403285a149e70b5cdc22cbd149b733084be91a229abe2 
using existing layer sha256:7062f767f7a9e848e484bc1df8c7b13fa08482ba42ffc3eba985d8f7a7e00eed 
using existing layer sha256:015be5bf83215a3cfe0918304447348731d6421e9d1e840c5c25938a88ea9fb3 
using existing layer sha256:e513a77c156e5870c681a34d831367325595410e4223085d847714c17b6afddc 
writing manifest 
success
$ docker exec -it ollama \
  ollama run fugaku-llm-13b-instruct
>>> スーパーコンピュータ「富岳」の名前の由来を教えてください。
真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡真岡

2024-05-18 追記

どうやら GPU の設定がうまく行っていないっぽく、--gpus all なしで起動したら、ちゃんとした回答が来た。48秒。30分かけた上の回答よりは洗練されていない感じするけど、圧倒的に速い。llama すごい。

>>> スーパーコンピュータ「富岳」の名前の由来を教えてください。
「富岳」は日本のスーパーコンピュータの名前で、「富士山」を意味する。この名前は、富士山が日本で最も高く、最も有名な山であることから選ばれた。スーパーコンピュータの名前として富士山が選ばれたのは、その「富岳」は日本のスーパーコンピュータの名前で、「富士山」を意味する。この名前は、富士山が日本で最も高く、最も有名な山であることから選ばれた。スーパーコンピュータの名前として富士山が選ばれたのは、その美しさと威厳のある姿が、スーパーコンピュータに求められる高い性能と信頼性を象徴しているからである。富岳」という名称は、日本のハイテク産業と日本の科学技術の優秀さを世界に示す役割も果たしている。

Docker Desktop なので NVIDIA Container Toolkit は必要ないはず。実際、ちゃんと認識されてる。Docker Desctop の再始動や更新も関係なし。GPU のメモリ不足説が濃厚か。

$ docker run -it --gpus=all --rm nvidia/cuda:12.4.1-base-ubuntu20.04 nvidia-smi
Fri May 17 17:22:11 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.10              Driver Version: 551.61         CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 2070        On  |   00000000:07:00.0 Off |                  N/A |
|  0%   42C    P8              9W /  175W |     588MiB /   8192MiB |      3%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A        38      G   /Xwayland                                   N/A      |
|    0   N/A  N/A        40      G   /Xwayland                                   N/A      |
+-----------------------------------------------------------------------------------------+

2024-07-01 追記

よく見たら ollama の README に以下の記載があったので、GPU のメモリ不足ということで結論にします。

Note: You should have at least 8 GB of RAM available to run the 7B models, 16 GB to run the 13B models, and 32 GB to run the 33B models.

参考文献