🐋

[成功]おうちChatgptと言われているFlexGenをゲーミングノートPCでためす(GPUサポートあり)

2023/03/06に公開

[成功]おうちChatgptと言われているFlexGenをゲーミングノートPCでためす(GPUサポートあり)

おうちで動くchatgptと言われているらしいFlexGenを試してみたくなって
手元にあった下記の環境でいけるかどうか試してみてだめだった内容になります

  • Ubuntu 22.04.2 LTS
  • GeForce RTX 2060 6GB
  • Intel(R) Core(TM) i7-8750H
  • メモリ16GB

➡AWSのEC2インスタンスのg4dn.xlargeに近そうな構成かなと

https://aws.amazon.com/jp/ec2/instance-types/g4/

nvida driverのインストール

下記サイトでapt周りの設定を確認してから

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_network

cuda-driversのみインストールを実施していきます

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
$ sudo dpkg -i cuda-keyring_1.0-1_all.deb
$ sudo apt-get update
$ sudo apt-get -y install cuda-drivers

nvida docker環境を構築

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker

➡インストールガイドの通りすすめる

$ curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker

➡dockerのインストーラを実行する(aptですでにdocker関連のパッケージがインストール済みの場合はsudo apt purge docker*などで先にアンインストールする必要があるかもしれません)

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

➡nvidia-container-toolkit apt レポジトリを設定して

$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo nvidia-ctk runtime configure --runtime=docker
$ sudo systemctl restart docker

➡nvidia-container-toolkitをインストール

$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02              Driver Version: 530.30.02    CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| 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 2060         On | 00000000:01:00.0 Off |                  N/A |
| N/A   36C    P8                2W /  80W|      8MiB /  6144MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+

nvidia-smiをコンテナ内で実行するとこんな感じになるはず

docker rootlessモード

$ sudo apt install uidmap
$ sudo systemctl disable --now docker.service docker.socket

➡必要なパッケージのインストールと、docker デーモンの停止をしておきます

$ curl -fsSL https://get.docker.com/rootless | sh
[INFO] Make sure the following environment variables are set (or add them to ~/.bashrc):

export PATH=/home/{your_user_name}/bin:$PATH
Some applications may require the following environment variable too:
export DOCKER_HOST=unix:///run/user/{your_userid}/docker.sock

➡インストーラを実行すると、実行したユーザに対してrootlessモードがセットアップされます。出力結果の最後に~/.bashrcファイルに環境変数をセットしてくださいとでてくるのでエディタで追記します。

$ source ~/.bashrc
$ docker
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

~/.bashrcを再読込してdockerコマンドがこのように出力されていればとりあえずは動作していそう。

$ systemctl --user enable docker
$ sudo loginctl enable-linger $(whoami)

➡おこのみで、自動起動の設定を(2行目のものはログアウト後にもdocker rootlessモードに居座ってほしい場合は実施)

disable-require = false
#swarm-resource = "DOCKER_RESOURCE_GPU"
#accept-nvidia-visible-devices-envvar-when-unprivileged = true
#accept-nvidia-visible-devices-as-volume-mounts = false

[nvidia-container-cli]
#root = "/run/nvidia/driver"
#path = "/usr/bin/nvidia-container-cli"
environment = []
#debug = "/var/log/nvidia-container-toolkit.log"
#ldcache = "/etc/ld.so.cache"
load-kmods = true
-#no-cgroups = false
+no-cgroups = true
#user = "root:video"
ldconfig = "@/sbin/ldconfig.real"

[nvidia-container-runtime]
#debug = "/var/log/nvidia-container-runtime.log"
log-level = "info"

# Specify the runtimes to consider. This list is processed in order and the PATH
# searched for matching executables unless the entry is an absolute path.
runtimes = [
    "docker-runc",
    "runc",
]

mode = "auto"

/etc/nvidia-container-runtime/config.tomlをこのように書き換えます(デーモンの再起動は不要でした)

$ docker run --gpus all --rm -it nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi

➡先程と同様にnvidia-smiでのgpu memory量などがみれていればrootlessモードでの動作は問題ないはず

FlexGenをためす

https://github.com/piroz/docker-flexgen

こちらを少しアレンジさせていただき、つくったdockerのレポトリをgithubからcheckoutして下記のようにするととりあえず動きました。

chatbot.pyはflexgenのレポジトリに以前あったものを下記のように修正すると動作しました。

https://github.com/piroz/docker-flexgen/commit/216154ad9ce2364926c4cf93a89bba7c5a94fa36

$ cd docker-flexgen
$ docker compose build
$ docker compose run chatbot
Downloading ()okenizer_config.json: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 685/685 [00:00<00:00, 230kB/s]
Downloading ()lve/main/config.json: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 651/651 [00:00<00:00, 299kB/s]
Downloading ()olve/main/vocab.json: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 899k/899k [00:01<00:00, 460kB/s]
Downloading ()olve/main/merges.txt: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 456k/456k [00:01<00:00, 440kB/s]
Downloading ()cial_tokens_map.json: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 221/221 [00:00<00:00, 92.3kB/s]
Initialize...
Load the pre-trained pytorch weights of opt-125m from huggingface. The downloading and cpu loading can take dozens of minutes. If it seems to get stuck, you can monitor the progress by checking the memory usage of this process.
Downloading pytorch_model.bin: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 251M/251M [00:46<00:00, 5.39MB/s]
Fetching 1 files: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:47<00:00, 47.81s/it]
Convert format: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  1.72it/s]
A chat between a curious human and a knowledgeable artificial intelligence assistant.                                                                                                                                                                                                                           
Human: Hello! What can you do?
Assistant: As an AI assistant, I can answer questions and chat with you.
Human: What is the name of the tallest mountain in the world?
Assistant: Everest.

## ここから入力開始、動作はしてそうだが、このモデルはいまいちな印象

Human: What was Japan's population in 2022?
Assistant: Oh, it's so huge, it's the tallest in the world! That's why it's taller than the tallest mountain in the world!

Human: No way
Assistant: Hey, I'm the AI assistant.

# llama_indexのコードなどを参考にprompt を入力してみる(改行のいれかたを間違っているかも)
Human: Context information is below.
---------------------
I am robot.
Your father is dog.
Your mother is flamingo
---------------------
Given the context information and not prior knowledge,
answer the question: Who is your father?Assistant: What are you talking about?
Human: 
Human: What's your name?
Human: Assistant: Stay ahead of me, I am a robot.
Human: Assistant: I have the name of my dog.
Human: Assistant: I am a human.
Human: Human: I will not be born in the next four years.
Human: Assistant: I will be your father.
Human: Assistant: Tell me who my father is!

GPU メモリの消費量は今回動作したfacebook/opt-125mだと500MBほどでした

$ nvidia-smi
Wed Apr  5 06:27:57 2023       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02              Driver Version: 530.30.02    CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| 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 2060         On | 00000000:01:00.0 Off |                  N/A |
| N/A   39C    P2               27W /  80W|    463MiB /  6144MiB |      6%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      2031      G   /usr/lib/xorg/Xorg                            4MiB |
|    0   N/A  N/A      2268      G   ...libexec/gnome-remote-desktop-daemon        1MiB |
|    0   N/A  N/A     20520      C   python3                                     436MiB |
+---------------------------------------------------------------------------------------+

Discussion