🔖

vicuna-13b v1.1 日本語動作メモ(v1.0 は ROCm で動作検証もあるよ)

2023/04/06に公開

ふぇ.. vicuna-13b すごぽよっぽそうね...
試したい!

https://metaversesokuhou.blog.jp/archives/19950392.html

まず野良モデル(v1.0)試しましたが, あんまりうまくいかず....
v1.1 ではいい感じになりました!

環境

CUDA

  • Ubuntu 20.04 LTS
  • CPU mem 256 GB
  • 3090 x 2

ROCm

  • Ubuntu 20.04 LTS
  • CPU mem 128GB
  • rocm 5.4.3
  • Radeon VII x 2
  • pytorch2 rocm 5.4.2

インストール

https://github.com/lm-sys/FastChat

に従って, fschat と transformers インストールするだけです.

ROCm の場合, pytorch2 rocm 使うため, fschat, transformers インストールしたのち,

$ pip3 install -U torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.4.2

と, -U をつけて torch を強制アップデートするようにします.

v1.0 野良モデルで実行(古い情報. なんか変...)

コードを見るとわかりますが, --model-name の文字列を huggingface transformers(ややこしい名前であるが, LLM など transformer 系の ML モデルをぺろっと呼んで処理できるようにするライブラリ) の from_pretrained に渡しているだけなので, 野良アップロードの名前を指定すればいけます.

https://github.com/lm-sys/FastChat/blob/c5d8f06b21ee91f471971b1e1130ee6ad8f60781/fastchat/serve/cli.py#L145

$ python3 -m fastchat.serve.cli --model-name ***** --num-gpus 2

で動かしました!(モデル名は頑張って探してネ)

|   0  NVIDIA GeForce ...  Off  | 00000000:65:00.0  On |                  N/A |
| 36%   34C    P5    45W / 160W |  14467MiB / 24576MiB |     10%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:B3:00.0  On |                  N/A |
|  0%   49C    P5    52W / 160W |  13811MiB / 24576MiB |     90%      Default |
|                               |                      |                  N/A |

3090 では 14 GB づつくらい.

======================= ROCm System Management Interface =======================
================================= Concise Info =================================
GPU  Temp (DieEdge)  AvgPwr  SCLK     MCLK    Fan     Perf  PwrCap  VRAM%  GPU%
0    28.0c           19.0W   700Mhz   350Mhz  19.61%  auto  100.0W   85%   0%
1    29.0c           55.0W   1546Mhz  800Mhz  19.61%  auto  100.0W   81%   31%
================================================================================
============================= End of ROCm SMI Log ==============================

Radeon VII (ROCm) ではメモリ消費は 85% くらいでした.

fastchat のデフォメモリ割り当て設定が 1 GPU あたり 13GB でしたので, 妥当なところでしょうか.

Human: hi
Assistant: Yes, it is true.
Human: 日本語話せますか?
Assistant: はい、日本語は、日本の専門的な文化です。
Human: how far from Tokyo to New York?
Assistant: 日本語: 約1450km
Human: 富士山について教えてください。
Assistant: 1. Tokyo to New York: 約1450km
2. Tokyo is located in the Kansai region of Japan, while New York is located in the state of the same name.
3. The distance between Tokyo and New York is approximately 1450 km.
4. The population of Tokyo is approximately 13 million, while the population of New York is approximately 8.4 million.
5. Tokyo is located in the Eastern time zone, while New York is located in the Eastern time zone.
6. Tokyo is located in the Kanto region of Japan, while New York is located in the Kantō region.

微妙に日本語扱えるようですが, 英語と組み合わせせると, 履歴を使っているためかおかしくなりました.

日本語だけで試してみます!

Human: こんにちは!
Assistant: このウェブサイトでする。

7. 合作: 人类与其他 countries and organizations can cooperate to develop renewable energy sources, with shared investments and resources.

8. ありが取りにした: イ

9. あり:探索���

10. 探索���

11. あり: 探索���

12. �������

13. ������

14. ��������

15. �������

16. ��������
Human: 日本語で質問します。
Assistant: 日本語の質の問いは、単独人の人々の生活に生じるからという質に
Human: 日本の首都について教えてください。
Assistant: ​1. Tokyo is the capital of Japan.
2. The country's official language is Japanese, but many other languages are also widely spoken, such as English, Chinese, and Spanish.

うーん... プロンプト調整しないとダメかしらん.

3090 x 2 も, Radeon VII x 2 も, 最初の反応に数秒(最大 20 秒くらい)まち, その後の生成は 2 tokens/sec という感じでした.
RWKV みたいに爆速とはいきませんでした.

Vicuna v1.1 を動かす

2023/04/27 時点で, v1.1 が最新なので v1.1 試します.
vicuna の問題ではない理由で tokenizer に不都合あったのが改善されているっぽい?
(上の v1.0 での結果がおかしいのもそれが理由かも? vicuna v1.0 も tokenizer 修正入れると改善あるかも)

主に separator が変わっています.

https://github.com/lm-sys/FastChat/blob/main/docs/vicuna_weights_version.md

  • transformers>=4.28.0
  • fschat >= 0.2.0

が必要です. 2023/04/27 時点では最新版入れればバージョン要件満たします.

13B を変換します. llama の weight は Meta に申請して取得か頑張って Internet から探してネ.
(野良? or 黙認? の huggingface 変換版が huggingface に転がってはいるが...)

まず llama weight を huggingface での形式に変換します.
(transformers の git repo clone しておく)

python src/transformers/models/llama/convert_llama_weights_to_hf.py \
    --input_dir /path/to/downloaded/llama/weights --model_size 13B --output_dir /output/path/llama-hf-13b

tokenizersモジュール(の sentense-piece の protocol-buffers あたり)が原因で, protocol-buffers 関連でエラーでることがあります
(protocol-buffers も sensence-piece もホント困り者よね... 自前 tokenizer 開発し, sensence-piece と決別し幸せになりたい)

とりあえずは export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python として pure Python 実装で対応します.
pure Python だと遅いとありますが, 13B でも数分で処理終わるので実務上は問題ないでしょう.

その後 vicuna weight を錬成します.

python3 -m fastchat.model.apply_delta \
    --base-model-path /path/to/llama-hf-13b \
    --target-model-path /output/path/to/vicuna-13b \
    --delta-path lmsys/vicuna-13b-delta-v1.1

lmsys/vicuna-13b-delta-v1.1 の重み差分(delta)は huggingface から落としてきてくれます.

あとは普通に動かすだけです.

ただ, 著者環境では日本語の場合はデフォでは streamling 表示してくれなかったので,

--style rich をつけました(一部 temrinal では動かないようだが, gnome-terminal + tmux はいけた)

https://github.com/lm-sys/FastChat#inference-with-command-line-interface

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17   Driver Version: 525.105.17   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 ...  Off  | 00000000:65:00.0  On |                  N/A |
| 36%   38C    P5    55W / 160W |  20477MiB / 24576MiB |     58%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  NVIDIA GeForce ...  Off  | 00000000:B3:00.0  On |                  N/A |
|  0%   47C    P5    44W / 160W |   5575MiB / 24576MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

メモリ使用量は 3090 x 2 で 20 GB + 5.5 GB という感じ.

Alpaca の instruction とは異る色になりましたが(alpaca instruction データでは 赤、緑、黄), とりま破綻のない日本語は生成されました.

三原色とは、白黒、赤、青の3つの原色を指します。彼らは、単に色を表すだけでなく、コンセプトや感情などを表すため 
にも重要な役割を果たしています。                                                                              

白黒は、清潔さや平和、または死亡や荷物を表すことができます。赤は、熱や感情、アレルギー、または恐怖を表すことが
できます。青は、信頼や安全感、リラックスした状態、または遠い気分を表すことができます。                        

三原色は、コンセプトアート、プログラミング、デザインなどに広く使われており、彼らの構成から、人々が感情や意味を
伝えることができるようになっています。

ただ RWKV に比べればやっぱり遅いですね...

参考までに 7B

USER:                                                                                                         
三原色について教えて                                                                                          
                                                                                                              
ASSISTANT:                                                                                                    
三原色とは、色の種類や色の構成に関する基本的な概念です。三原色とは、色を表すために使われる三つの原色、赤、青、
緑のことを指します。これらの原色は、色を表すために使われる光の強度や透明度、反射率などを考慮して決まっています
。                                                                                                            
                                                                                                              
具体的には、赤は光の赤色の一種であり、青は光の青色の一種であり、緑は光の赤色と青色の相互作用によって生じる色の
一種です。これらの原色は、色を表すために使われる光の強度や透明度、反射率などを考慮して決まっています。        
                                                                                                              
三原色は、色の種類や色の構成に関する基本的な概念です。これらの原色は、色を表すために使われる光の強度や透明度、
反射率などを考慮して決まっています。  

レスポンス上がり, RGB と応答いけました. ただ無駄に複製された感の文章になっちゃいましたね.

まとめ

遅くはありますが, そこそこ日本語でもいい感じの結果を得ることはできそうです.
Alpaca-jp や ChatGPT 日本語訳したのでファインチューンしたらより日本語度上がるかも?

また, LLM の 4bit, 3bit などもいろいろ検証されつつあり(ものによっては, LLM の場合低ビットのほうが性能よかったりする), それがうまく実現されれば 13B でも 4080 などの 16 GB メモリな 1 GPU で動くようになるでしょうが(さすがに 8 GB, 12 GB は厳しいカナ. CPU memory offload と組み合わせればいけるかも), 低ビット化の熟成にはもうちょっと時間かかりそうです(意訳: みんな 4080/4090 or RX6800/RX700XT 複数枚買いな).

4080 or 4090 を漢の無金利 5 年ローンで調達し, LLM しつつ空き時間は GPU マイニングや AI 計算代行業して元を取るといいかも.

Discussion