FastChat-WebUIとVicuna-13b-v1.5をローカルで動かす

n+m番煎じの記事になりますが、少し苦労したところがあるのでメモ代わりに記事を書きました。ローカルLLMはネットワークがなくても動き、費用も発生しないのでAItuberのような長時間連続ライブ配信をするようなときには重宝します。今回は非商用の縛りがなく、規模の大きなLLMであるVicuna-13b-v1.5を動かします。8月初旬に発表された比較的新しいLLMで、ChatGPT-3.5に匹敵する性能があると言われています。

Vicunaについては、すでにnpakaさんが記事を書かれていますし、他にも記事を書いていらっしゃる方がいらっしゃるので参考にさせていただきました。

weblog smart AI gadgets - Llama 2ベースのLLM FastChat/Vicuna v1.5をローカルで動作 (jweb.asia)

環境
CPU: 第3世代 Core i5
MEM: 32G
GPU: Gfoece-4090
OS:      Ubuntu20.04-jp

まずは、リポジトリの説明通りにインストールしました。

git clone https://github.com/lm-sys/FastChat.git
cd FastChat
pip install --upgrade pip  # enable PEP 660 support
pip install -e ".[model_worker,webui]"

リポジトリの表にあるようにモデルは何種類かありますので、自分の環境に合うモデルを選んでインストールシます。VRAMが16Gであれば、7Bになります。13Bは24Gでも動かせません。今回は8bit量子化をすることにして13Bを動かすことを目指します。なので、33Bモデルを除き、どのモデルもVRAM-16Gで動かすことが可能です。7Bですと10Gで動くはずです。

表にあるChat Commanをコピペして動かします。
手頃な7b-v1.5は以下のコマンドです。

python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5

私の環境では
ModuleNotFoundError: No module named 'prompt_toolkit'
というエラーが出て進みません。理由はよくわらないのでですが、prompt_toolkit'はすでにインストールされており、問題は無いように見えます。原因追求は面倒なので、以下の記事でやった環境をクローンしてやり直すことにします。(特に理由はありません。MiniGPT4の環境で試したらできたということです。)

注)知り合いはここでエラーは出なかったといってました。私の環境が何か異常があるのかも。

動かすにはどうするか

体的には以下の環境を利用します。

git clone https://github.com/Vision-CAIR/MiniGPT-4.git
cd MiniGPT-4
conda env create -f environment.yml
conda activate minigpt4

クローンしてアクティベート

conda create -n fc4 --clone minigpt4
conda actibate fc4

そして FastChatに移動し、再度環境構築をやり直します。

cd ..
cd FastChat
pip install -e ".[model_worker,webui]"

再度コマンドを実行

python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5

今度は上手くダウンロードが始まり、起動できました。日本語を入力すると回答も日本語で出てきます。

(fc4) home:~/FastChat$ python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
Downloading (…)okenizer_config.json: 100%|█████| 749/749 [00:00<00:00, 50.8kB/s]
Downloading tokenizer.model: 100%|███████████| 500k/500k [00:00<00:00, 20.1MB/s]
Downloading (…)cial_tokens_map.json: 100%|██████| 438/438 [00:00<00:00, 217kB/s]
Downloading (…)lve/main/config.json: 100%|██████| 615/615 [00:00<00:00, 137kB/s]
Downloading (…)model.bin.index.json: 100%|█| 26.8k/26.8k [00:00<00:00, 7.77MB/s]
Downloading (…)l-00001-of-00002.bin: 100%|█| 9.98G/9.98G [01:48<00:00, 92.1MB/s]
Downloading (…)l-00002-of-00002.bin: 100%|█| 3.50G/3.50G [00:42<00:00, 81.8MB/s]
Downloading shards: 100%|█████████████████████████| 2/2 [02:31<00:00, 75.81s/it]
Loading checkpoint shards: 100%|██████████████████| 2/2 [00:03<00:00,  1.91s/it]
Downloading (…)neration_config.json: 100%|█████| 162/162 [00:00<00:00, 14.7kB/s]
USER: こん にちは
ASSISTANT: こんにちは!何かお手伝いできることがあればお知らせください。
USER: 

GPUの利用状況を見ます。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:01:00.0  On |                  Off |
|  0%   55C    P8    34W / 450W |  14700MiB / 24564MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1142      G   /usr/lib/xorg/Xorg                102MiB |
|    0   N/A  N/A      1814      G   /usr/lib/xorg/Xorg                251MiB |
|    0   N/A  N/A      1962      G   /usr/bin/gnome-shell              100MiB |
|    0   N/A  N/A      5757      G   /usr/lib/firefox/firefox          499MiB |
|    0   N/A  N/A      8968      C   python3                         13724MiB |
+-----------------------------------------------------------------------------+

8bit量子化オプションを使っていないので、14.7Gも専有しています。

fastchat.serve.cl は --helpオプションでオプションが表示されます。

python3 -m fastchat.serve.cli --help

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
usage: cli.py [-h] [--model-path MODEL_PATH] [--revision REVISION]
              [--device {cpu,cuda,mps,xpu}] [--gpus GPUS]
              [--num-gpus NUM_GPUS] [--max-gpu-memory MAX_GPU_MEMORY]
              [--load-8bit] [--cpu-offloading] [--gptq-ckpt GPTQ_CKPT]
              [--gptq-wbits {2,3,4,8,16}] [--gptq-groupsize GPTQ_GROUPSIZE]
              [--gptq-act-order] [--awq-ckpt AWQ_CKPT] [--awq-wbits {4,16}]
              [--awq-groupsize AWQ_GROUPSIZE] [--conv-template CONV_TEMPLATE]
              [--conv-system-msg CONV_SYSTEM_MSG] [--temperature TEMPERATURE]
              [--repetition_penalty REPETITION_PENALTY]
              [--max-new-tokens MAX_NEW_TOKENS] [--no-history]
              [--style {simple,rich,programmatic}] [--multiline] [--mouse]
              [--judge-sent-end] [--debug]

optional arguments:
  -h, --help            show this help message and exit
  --model-path MODEL_PATH
                        The path to the weights. This can be a local folder or
                        a Hugging Face repo ID.
  --revision REVISION   Hugging Face Hub model revision identifier
  --device {cpu,cuda,mps,xpu}
                        The device type
  --gpus GPUS           A single GPU like 1 or multiple GPUs like 0,2
  --num-gpus NUM_GPUS
  --max-gpu-memory MAX_GPU_MEMORY
                        The maximum memory per GPU for storing model weights.
                        Use a string like '13Gib'
  --load-8bit           Use 8-bit quantization
  --cpu-offloading      Only when using 8-bit quantization: Offload excess
                        weights to the CPU that don't fit on the GPU
  --gptq-ckpt GPTQ_CKPT
                        Used for GPTQ. The path to the local GPTQ checkpoint.
  --gptq-wbits {2,3,4,8,16}
                        Used for GPTQ. #bits to use for quantization
  --gptq-groupsize GPTQ_GROUPSIZE
                        Used for GPTQ. Groupsize to use for quantization;
                        default uses full row.
  --gptq-act-order      Used for GPTQ. Whether to apply the activation order
                        GPTQ heuristic
  --awq-ckpt AWQ_CKPT   Used for AWQ. Load quantized model. The path to the
                        local AWQ checkpoint.
  --awq-wbits {4,16}    Used for AWQ. #bits to use for AWQ quantization
  --awq-groupsize AWQ_GROUPSIZE
                        Used for AWQ. Groupsize to use for AWQ quantization;
                        default uses full row.
  --conv-template CONV_TEMPLATE
                        Conversation prompt template.
  --conv-system-msg CONV_SYSTEM_MSG
                        Conversation system message.
  --temperature TEMPERATURE
  --repetition_penalty REPETITION_PENALTY
  --max-new-tokens MAX_NEW_TOKENS
  --no-history
  --style {simple,rich,programmatic}
                        Display style.
  --multiline           Enable multiline input. Use ESC+Enter for newline.
  --mouse               [Rich Style]: Enable mouse support for cursor
                        positioning.
  --judge-sent-end      Whether enable the correction logic that interrupts
                        the output of sentences due to EOS.
  --debug               Print useful debug information (e.g., prompts)

ここにある --load-8bit  オプションを使うと8bit量子化ができます。

python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --load-8bit 

モデルはダウンロード済みなので、すぐに立ち上がります。

python3 -m fastchat.serve.cli --model-path lmsys/vicuna-7b-v1.5 --load-8bit 

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
100%|█████████████████████████████████████████████| 2/2 [00:24<00:00, 12.43s/it]
USER: こんにちは
ASSISTANT: こんにちは!何かお手伝いできることがあればお知らせください。
USER: 

GPU利用状況です。

| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:01:00.0  On |                  Off |
| 30%   46C    P8    34W / 450W |   9112MiB / 24564MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1142      G   /usr/lib/xorg/Xorg                102MiB |
|    0   N/A  N/A      1814      G   /usr/lib/xorg/Xorg                257MiB |
|    0   N/A  N/A      1962      G   /usr/bin/gnome-shell              100MiB |
|    0   N/A  N/A      5757      G   /usr/lib/firefox/firefox          444MiB |
|    0   N/A  N/A     11220      C   python3                          8186MiB |
+-----------------------------------------------------------------------------+

9.1Gに減りました。10GのVRAMを持つGPUでも動くのではないでしょうか。

Vicna-13b-v1.5を8bit量子化で試す

同様に13b-v1.5も試しましょう。 --load-8bitオプションをつけます。

python3 -m fastchat.serve.cli --model-path lmsys/vicuna-13b-v1.5  --load-8bit

大きなモデルなのでダウンロードに時間がかかります。トータルで50Gbyte弱ですね。こんな感じです。

python3 -m fastchat.serve.cli --model-path lmsys/vicuna-13b-v1.5  --load-8bit

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
Downloading (…)okenizer_config.json: 100%|█████| 749/749 [00:00<00:00, 49.3kB/s]
Downloading tokenizer.model: 100%|███████████| 500k/500k [00:00<00:00, 14.4MB/s]
Downloading (…)cial_tokens_map.json: 100%|█████| 438/438 [00:00<00:00, 1.03MB/s]
Downloading (…)lve/main/config.json: 100%|█████| 638/638 [00:00<00:00, 65.7kB/s]
Downloading (…)df14bcd3a6/README.md: 100%|██| 1.97k/1.97k [00:00<00:00, 814kB/s]
Downloading (…)model.bin.index.json: 100%|█| 33.4k/33.4k [00:00<00:00, 12.8MB/s]
Downloading (…)cd3a6/.gitattributes: 100%|██| 1.52k/1.52k [00:00<00:00, 637kB/s]
Downloading (…)neration_config.json: 100%|█████| 192/192 [00:00<00:00, 78.9kB/s]
Downloading (…)l-00003-of-00003.bin: 100%|█| 6.18G/6.18G [03:15<00:00, 31.5MB/s]
Downloading (…)l-00001-of-00003.bin: 100%|█| 9.95G/9.95G [03:39<00:00, 45.3MB/s]
Downloading (…)l-00002-of-00003.bin: 100%|█| 9.90G/9.90G [03:50<00:00, 42.9MB/s]
Fetching 11 files: 100%|████████████████████████| 11/11 [03:51<00:00, 21.04s/it]
100%|█████████████████████████████████████████████| 3/3 [00:52<00:00, 17.35s/it]
USER: こんばんは-00002-of-00003.bin: 100%|▉| 9.90G/9.90G [03:50<00:00, 71.8MB/s]
ASSISTANT: こんにちは!どのようにお力になれますか?
USER:

GPU使用量

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06   Driver Version: 525.125.06   CUDA Version: 12.0     |
|-------------------------------+----------------------+----------------------+
| 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 ...  On   | 00000000:01:00.0  On |                  Off |
|  0%   54C    P8    33W / 450W |  15081MiB / 24564MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1142      G   /usr/lib/xorg/Xorg                102MiB |
|    0   N/A  N/A      1814      G   /usr/lib/xorg/Xorg                257MiB |
|    0   N/A  N/A      1962      G   /usr/bin/gnome-shell               99MiB |
|    0   N/A  N/A      5757      G   /usr/lib/firefox/firefox          438MiB |
|    0   N/A  N/A     11287      C   python3                         14162MiB |
+-----------------------------------------------------------------------------+

15Gなので4060-16Gや4080でも動くはずです。

FastChat web UI を動かす

最期にGUIを動かします。gradioなので、APIが利用できることを期待したいところです。リポジトリには動かし方が書いてあります。
To serve using the web UI, you need three main components: web servers that interface with users, model workers that host one or more models, and a controller to coordinate the webserver and model workers. You can learn more about the architecture here.
ここをよく読まなかったので最初は上手くできませんでした。要するに以下の3種類のサーバがいるということです。
-web servers that interface with users
-model workers that host one or more models
-controller to coordinate the webserver and model workers
この3種類のサーバを独立して動かす必要があります。
ターミナルを3つ開き、以下のように全てFastChatに移動してfc4環境を有効にします。

cd FastChat
conda activate fc4

まず、controllerを動かします。

python3 -m fastchat.serve.controller

2023-08-22 18:21:13 | INFO | controller | args: Namespace(host='localhost', port=21001, dispatch_method='shortest_queue')
2023-08-22 18:21:13 | ERROR | stderr | INFO:     Started server process [11479]

次に別のターミナルで、model worker(s)を動かします。複数動かすとGUIで選択できます。--load-8bitを忘れると4090でも13bは動きません。

python3 -m fastchat.serve.model_worker --model-path lmsys/vicuna-13b-v1.5  --load-8bit

2023-08-22 18:25:20 | INFO | model_worker | args: Namespace(host='localhost', port=21002, worker_address='http://localhost:21002', controller_address='http://localhost:21001', model_path='lmsys/vicuna-13b-v1.5', revision='main', device='cuda', gpus=None, num_gpus=1, max_gpu_memory=None, load_8bit=True, cpu_offloading=False, gptq_ckpt=None, gptq_wbits=16, gptq_groupsize=-1, gptq_act_order=False, awq_ckpt=None, awq_wbits=16, awq_groupsize=-1, model_names=None, conv_template=None, embed_in_truncate=False, limit_worker_concurrency=5, stream_interval=2, no_register=False)
2023-08-22 18:25:20 | INFO | model_worker | Loading the model ['vicuna-13b-v1.5'] on worker 2a851d14 ...
  0%|                                                             | 0/3 [00:00<?, ?it/s]
 33%|█████████████████▋                                   | 1/3 [00:12<00:24, 12.29s/it]
 67%|███████████████████████████████████▎                 | 2/3 [00:32<00:17, 17.10s/it]
100%|█████████████████████████████████████████████████████| 3/3 [00:49<00:00, 17.08s/it]
100%|█████████████████████████████████████████████████████| 3/3 [00:49<00:00, 16.61s/it]
2023-08-22 18:26:10 | ERROR | stderr | 
2023-08-22 18:26:10 | INFO | model_worker | Register to controller
2023-08-22 18:26:10 | ERROR | stderr | INFO:     Started server process [11543]
2023-08-22 18:26:10 | ERROR | stderr | INFO:     Waiting for application startup.
2023-08-22 18:26:10 | ERROR | stderr | INFO:     Application startup complete.
2023-08-22 18:26:10 | ERROR | stderr | INFO:     Uvicorn running on http://localhost:21002 (Press CTRL+C to quit)

最期にGradio web serverを動かします。別のターミナルから以下を入力

python3 -m fastchat.serve.gradio_web_server

2023-08-22 18:30:15 | INFO | gradio_web_server | args: Namespace(host='0.0.0.0', port=None, share=False, controller_url='http://localhost:21001', concurrency_count=10, model_list_mode='once', moderate=False, add_chatgpt=False, add_claude=False, add_palm=False, gradio_auth_path=None)
2023-08-22 18:30:15 | INFO | gradio_web_server | Models: ['vicuna-13b-v1.5']
2023-08-22 18:30:16 | ERROR | stderr | /home/animede/anaconda3/envs/fc4/lib/python3.9/site-packages/gradio/deprecation.py:43: UserWarning: You have unused kwarg parameters in Dropdown, please remove them: {'container': False}
2023-08-22 18:30:16 | ERROR | stderr |   warnings.warn(
2023-08-22 18:30:16 | ERROR | stderr | /home/animede/anaconda3/envs/fc4/lib/python3.9/site-packages/gradio/deprecation.py:40: UserWarning: `height` is deprecated in `Interface()`, please use it within `launch()` instead.
2023-08-22 18:30:16 | ERROR | stderr |   warnings.warn(value)
2023-08-22 18:30:16 | ERROR | stderr | /home/animede/anaconda3/envs/fc4/lib/python3.9/site-packages/gradio/deprecation.py:43: UserWarning: You have unused kwarg parameters in Textbox, please remove them: {'container': False}
2023-08-22 18:30:16 | ERROR | stderr |   warnings.warn(
2023-08-22 18:30:17 | INFO | stdout | Running on local URL:  http://0.0.0.0:7860
2023-08-22 18:30:17 | INFO | stdout | 
2023-08-22 18:30:17 | INFO | stdout | To create a public link, set `share=True` 

Gradioのいつものとおりに、以下をアクセスします。
http://0.0.0.0:7860
GPUの利用状況はコマンドラインの時と同じです。

FastChat WEB UIの画面

入力に対して出力は早く、ほとんどの入力に対して瞬時で出はじめます。

例)
仕事で大事なことはなにですか?箇条書きでお願いします。

仕事で大事なことは以下の通りです。
1. タスクの優先順位付け: タスクの重要度や締り切りを考慮して、優先順位を付けることが重要です。
2. コミュニケーション: チームや上司とのコミュニケーションを円滑にすることで、仕事の進捗や問題点を早期に解決することができます。
3. 時間管理: 自分の時間を効率的に使い、納期を守ることが大切です。
4. 状況の把握: 仕事の進捗状況や問題点を把握し、自分自身やチームの責任範囲を明確にすることが必要です。
5. 継続的な学習: 新しい知識やスキルを習得し、自分自身を継続的に向上させることが大切です。
6. 自己管理: ストレスや疲労を軽減するために、自分自身を管理することが重要です。
7. 目標の設定: 自分自身のキャリアや仕事に対する目標を設定し、それを達成するための計画を立てることが必要です。
これらのポイントを押さえることで、仕事において成果を出しやすくなり

まとめ

発表から20日も経過したモデルですが、現時点でオープンソースの中では最も性能が高いのではないかと思います。FastChatの高速応答もなかなかのものです。