NVIDIA GTX２枚刺しでDollyV2-7bとチャットしてみた。

# はじめに
Dollyさんである。大規模言語モデル。Transformerモデル。
今回のお話は、前半が、GPUを2枚刺しにするまでのお話。マシンがXeon２発でC612チップセットだから２枚刺しは電源容量さえ気をつければ大丈夫なはず。
後半のお話は、Dollyさんとのチャットをしてみた感想。

昨日までGPUのVRAMが８GBのGTX1080を１枚搭載したマシンで、手元で動かしたい系の機械学習モデルをいくつか動かしてみたが、まずGTX1080ごときでは会話したくなるようなスピードではもはや動作しない。話しかける文章を書き込んだ後、トイレに立って帰ってきたらなにかもそもそとPCが画面に表示し始める、という感じだったりする。そして８GBメモリに収まるようなパラメタの少ない奴らでは、会話にならない。こちらのコトバが通じていない感、聞いてない感が半端ない。ChatGPTの一人勝ち間違いない現状だが、自分の手元でそれに近い動きができるものならやってみたい。ロマンである。

# VRAMか新世代GPUか
ロマンを追うには、まずはどうあがいてもマシンのハードウェアの改訂が必要だ。GTX1080一枚ではだめなことはわかった。８GBのVRAMも心許ない時代になっている。GoogleColabのPro契約という離れ業もあるが、数時間もクラウドサービスにアクセスしたままにして辛抱するほどの肝っ玉を持っていない。機械学習がものすごくゆっくり進行しているように見えて、もし自分のコードが間違っていて無限ループしているだけだったら？終わるまで待っていたら破産しそうだ。
ハードウェアを買い換える。VRAMを増やしたい。が、VRAMが16GB以上あるRTXシリーズとかTESLAとかって・・・。高価。
と諦めかけていたのだが、ヤフオクを見ていて見つけてしまった「例のグラボ」。なんと1枚6000円。性能はGTX1080と同等、VRAM８GBとな。これを追加して動かせば、数字のうえではCUDAコア２倍、VRAM２倍である。しかし、それで性能まで２倍になるとは思えない。（というか、何の時間を持って速度比較すればいいのかわからない。）GTX1080を買うよりも確実に安い、そして、RTX3000番台でも8GBより多いメモリを積んだ製品はワタシが購入できるようなお値段ではない。
そういうわけで、ワタシはメモリ容量増強を優先し、しかもその増強をPytorchのMultiGPU処理に頼ることとして「例のグラボ」を落札したのだった。「例のグラボ」とは、MSI社性 NVIDIA P104-100 である。数年前、マイニング用として登場し、公の仕様ではグラッフィックの出力ポートがなくメモリも４GBとされていたものの、実は裏の金具を外すとHDMIポートがついていたり、BIOSを書き換えることでメモリが８GB使えるようになっていたりした変わり者だ。

https://crypto.watch.impress.co.jp/img/ctw/docs/1136/998/html/vc06.jpg.html

https://crypto-mining-tibikojo.blogspot.com/2021/02/p104-1004gbbios8gbeth20210209.html

# PCに追加
落札したP104-100が今日届いた。開封して驚いたことにゃ、８ピン電源と６ピン電源の両方の口がある、ってこたぁ全部で14ピン・・・っていうか電気くうなぁとか思いながらとにかく増設する（以前から電源は確保できるようなものを使っている。）。
Ubuntu22.04 で認識。ドライババージョンは 525。　だがどうせ、CuNNは6.1でしか動かない。もとからGTX1080刺さってるましんだから、導入は難しくなかった。

# いよいよ、プログラムを動作させる
早速だが、例によって例のごとく、先達の力を借りる。巨人の肩に乗りまくり。

https://qiita.com/riversun/items/7c45580f1a098b041528

こちらのQiitaでは、なんとAWSでTeslaT4ｘ４のインスタンスで12b（=12Billion = 120億）パラメータのモデルを動かしたそうだ。この場合、２８GB程度のVRAMが必要らしい。いったん、ここで紹介されているコードのまま手元のマシンで実行したが、当然のごとくOutOfMemoryとなって何もできない。
だが、Dollyさんには、7b（=7Billion = 70億）パラメータモデルも誕生していた。

https://huggingface.co/databricks/dolly-v2-7b

そこで、 main.py の 13行目にある、モデルの指定を変えてみる。
```python
model_name = "databricks/dolly-v2-7b"
```

これだと、モデルサイズが11GB程度なので、なんとかメモリに載るはず・・・。よし、起動した。
ちょっとした挨拶をしましたら、なんとか返事がありました。

よし、ちょっと長めの文章を書いてやれ、と意地悪をすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/0c2325fc-7563-2c15-9f84-7f3657d674e1.png)

あれ？なんでしょう？コンソールを見てみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/a7d6b03e-6478-0380-5b02-d7db9fe2e452.png)

え？メモリ不足でスカイ？モデルはVRAMに乗り切っているけど、そこにさらに入力データを載せようとすると割当てがもらえない、ってことかな？というわｋで、エラーにかいてあるアドバイスのとおり、max_split_size_mb について調べ、さらにStable Diffusion Web UI で似たような現象の対処記事も参考にガベージコレクションの設定もしてみることにした。。

https://www.kageori.com/2022/11/stable-diffusion-web-uiruntimeerror.html

いったん、Ctrl+c　でｄOlly-chat（ main.py ）を停止して、次の通り環境変数をセットして再実行。
```shell
$ PYTORCH_CUDA_ALLOC_CONF="garbage_collection_threshold:0.6, max_split_size_mb:64"
$ python3 main.py
```

これで、さっきと同じ長文英語を入力したところ、１回目は勝手にサマライズして返事してくれた。（サマライズしてほしい、とは書いてない）。２回目はオウム返しだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/ce702b81-7f27-a2f8-d61f-6fd83fd8585d.png)


元の文章：　スペースこみ　1079文字
The Report reinforces the scientific view that CO2 is the primary GHG that needs to be drastically reduced to achieve the global temperature goal as agreed in the Paris Agreement. Addressing the Plenary Session at G7 Ministers' Meeting on Climate, Energy and Environment in Sapporo, Japan he said the global goal of reaching net zero by 2050 requires enhanced descaling of emissions by the Developed Countries. Shri Yadav said to save our planet from the challenges of climate change, pollution, loss of biodiversity, we need collective action guided by the founding principles of the Rio Conventions. He said we do hope that the Developed Countries will make good their commitments on finance for combatting climate change and provide for the same for dealing with the environmental degradation and biodiversity loss. Shri Yadav said reaching targets on carbon neutrality and increased ambition will not fly unless they are made keeping Equity and CBDR-RC consideration in view as well as unless the Developed Countries meet their commitments to provide means of implementation.


DollyV2-7bの返答 １回目： スペースこみ　547文字
Addressing the Plenary Session at G7 Ministers' Meeting on Climate, Energy and Environment in Sapporo, Japan, Mr. Yadav pointed out that the global goal of reaching net zero by 2050 requires enhanced descaling of emissions by the Developed Countries. He also underscored the importance of solidarity and partnership in this cause. He said we do hope that the Developed Countries will make good their commitments on finance for combatting climate change and provide for the same for dealing with the environmental degradation and biodiversity loss.

DollyV2-7bの返答 ２回目：　スペースこみ　1079文字
The Report reinforces the scientific view that CO2 is the primary GHG that needs to be drastically reduced to achieve the global temperature goal as agreed in the Paris Agreement. Addressing the Plenary Session at G7 Ministers' Meeting on Climate, Energy and Environment in Sapporo, Japan he said the global goal of reaching net zero by 2050 requires enhanced descaling of emissions by the Developed Countries. Shri Yadav said to save our planet from the challenges of climate change, pollution, loss of biodiversity, we need collective action guided by the founding principles of the Rio Conventions. He said we do hope that the Developed Countries will make good their commitments on finance for combatting climate change and provide for the same for dealing with the environmental degradation and biodiversity loss. Shri Yadav said reaching targets on carbon neutrality and increased ambition will not fly unless they are made keeping Equity and CBDR-RC consideration in view as well as unless the Developed Countries meet their commitments to provide means of implementation.

DollyV2-7bの返答 ３回目： スペースこみ　697文字
The G7 Minister’s statement reinforces the scientific view that CO2 is the primary GHG that needs to be drastically reduced to achieve the global temperature goal as agreed in the Paris Agreement. It also recognizes that to reach net zero emissions by 2050 the Developed Countries will have to enhance their descaling of emissions. The statement also recognizes that to save our planet from the challenges of climate change, pollution, loss of biodiversity, we need to have collective action guided by the principles of the Rio Conventions. It also hopes that the Developed Countries will take collective action to combat climate change and address environmental degradation and biodiversity loss.


この要約の返事が帰ってくるまでに約100秒。サマライズは微妙。元の文章は、Mr. Yadavが会議で発言したことを伝える文章である。だが、３回目のようなMr.Yadavの名称を出さないサマライズは、ちょっと物足りなく感じる。固有名詞にアテンションが効いてないのか？

さて、ここで「What does Mr Yadav mean?」と聞いてみたが・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/c9a0127c-f489-4654-cd27-ab1665a9972b.png)

残念ながら、Mr．Yadavはそんなことは言っていない。前段で話していたことと脈絡のない情報を出力してしまうのは、チャットとしてはあまりかしこいとは言えない。ここは、前段までの会話をメモリにとどめておいて何らか紐付けながら会話を続けるような仕組みを実装する必要がありそうだ。

次に一般知識を聞いてみた。

元の文章：
Can you morphologically analyze the input text?

DollyV2-7bの返答：
You can try some basic morphological analysis using spaCy. For example, you can ask spaCy to generate part-of-speech tags, look up the detected parts of speech, and then search for the most frequent parent forms of those parts of speech.

Here is an example:

from spacy importDocManager, MorphLemma, NER, CorpusReader, CorpusProcessor, Puzzle, LEX, JunkensteinMorphologicalAnalysis

corpus = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vehicula fermentum leo. Sed et tellus ipsum. Morbi euismod tempor risus, eget gravida tellus interdum sollicitudin. Phasellus consectetur, ipsum vitae euismod sodales, metus nibh blandit lacus, eu euismod. Fusce et metus quis tortor elementum congue at velit. Fusce id arcu quam, sit amet vestibulum tortor fermentum. Donec vel urna vel arcu bibendum sodales. Fusce condimentum element


最終段落で、corpus の定義を書き始めたのがなんだかよくわからないが、spaCyを使えば？と提案しているように読み取れなくもない。「Can you？」で質問しているのに、YesともNoとも答えないところが会話っぽくない。しかし、 morphologically anaryze についての知識は持っているようだ。

その他、次のように同じ質問を繰り返したりしてみた。質問を２度繰り返したが、都度回答は異なり、それぞれ３秒程度で返ってきた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/eac437fa-978d-e4ad-61e7-451c046c8efe.png)
なるほど、これは嘘ではないらしい。

https://en.wikipedia.org/wiki/Gettysburg_Address#:~:text=The%20Gettysburg%20Address%20is%20a,months%20after%20the%20Union%20armies

https://www.nps.gov/articles/000/-with-malice-toward-none-lincoln-s-second-inaugural.htm


ちなみに動作中の nvidia-smi
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/699890/df802a82-d76f-9d94-f776-566959ce5597.png)

２枚のメモリを使い切っていて、２枚刺しの恩恵はありそうだ。

## 考察
ChatGPTは、チャットに合わせてさまざまなタスクを依頼することができるが、Dollyにはそんな機能はない。また、質問に対して主体性を持って答えるような言い回しや、連続したチャットの処理（時系列的会話処理とでもいおう）ができない。チャットをする、会話しているというような感じはあまりしない。
参考にしたサイトの会話サンプルやここで試した文章から、今回利用したDollyのモデルは、短文で質問をし、モデルが格納している知識情報を引き出すことを楽しむいわば辞書型の道具のようなもの、という印象をうけた。チャットとして使うには、モデルの改善の他に会話を続けさせるための工夫が必要だと思われる。


## まとめ
GTX1080とP104-100の２枚刺しでは、それぞれのグラボで７GB以上のメモリをPytorchが確保し、11GBの今回のモデルを読み込んで使えたものの、1000文字程度の長文に対して2分以上回答が来なかった。いっぽう、短い文章で知識を問うような質問にはDollyV2モデルは答えてくれている。ただし、チャットボットとして連続した会話をするためには工夫が必要そうだ、ということがわかった。

## おまけ。
Autobot, Transform! とは叫ばない。そんなオプティマスな機能はいまのところ感じられない。Transformerで何をどう学習させたら良いのだろうか・・・。