« 大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた | トップページ | Meta Quest 3に非純正のヘッドストラップをつけてみた »

2024年5月25日 (土)

先日の「ローカルLLM+RAG」をGPU上+より大規模モデル(13b)でも動かせるようにしてみた

つい先日に「大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡」という記事を書いたばかりですが、あれはCPUが前提でした。

が、やはりもっと大きなモデル使いたいし、GPU対応にもしておきたい、ということで追加でやってみました。

以下、元記事(大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた: EeePCの軌跡)ができているという前提で、その先にやる手順を書きます。

CUDA 12.1の導入

pytorchとllama-cpp-pythonの両方に対応しているCUDAということで、12.1を使うことにしました。

インストールの方法は、

CUDA Toolkit 12.1 Downloads | NVIDIA Developer

からインストーラーをダウンロードし、それをダブルクリックしてインストールするだけです。

なお、最近のpytorchではcuDNNは不要らしいですが、心配な方は、

cuDNN Archive | NVIDIA Developer

から最新の一つ古いくらいのバージョンをダウンロードしておくといいでしょう。

pytorchのGPU対応

pytorchの公式サイト

Previous PyTorch Versions | PyTorch

にある通り、以下のコマンドを入れます。
(CPU版から上書きするコマンドにしてます)

> pip install --upgrade --force-reinstall torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu121

ここではとりあえず、前回と同じバージョンのtorchにしておきました。

llama-cpp-pythonのGPU版インストール

以下のコマンドを入れて、入手します。

> pip install llama-cpp-python --extra-index-url https://abetlen.github.io/llama-cpp-python/whl/cu121 --upgrade --force-reinstall --no-cache-dir

なお、llama-cpp-pythonのバージョンは前回の0.2.20から0.2.75と上がりますが、この方がCPU動作時でも早くていい感じでした。

13bモデルダウンロード

前回同様、gitで13bのモデルをダウンロードします。

> git lfs clone https://huggingface.co/mmnga/ELYZA-japanese-Llama-2-13b-fast-instruct-gguf/ --include "ELYZA-japanese-Llama-2-13b-fast-instruct-q8_0.gguf"

この「-fast-」とついたモデルは、精度そこそこで1.8倍速いらしいので、こっちを使うことにします。

プログラムコードの変更

先の記事にあった「elyza_rag.py」の中身で、以下の3か所を書き換えます。

(旧)

model_path = f"models/ELYZA-japanese-Llama-2-7b-instruct-gguf/ELYZA-japanese-Llama-2-7b-instruct-q8_0.gguf"

(新)

model_path = f"models/ELYZA-japanese-Llama-2-13b-fast-instruct-gguf/ELYZA-japanese-Llama-2-13b-fast-instruct-q8_0.gguf"

(旧)

llm = LlamaCPP(
    model_path=model_path,
    temperature=0.1,
    model_kwargs={"n_ctx": 4096, "n_gpu_layers": 32},

(新)

llm = LlamaCPP(
    model_path=model_path,
    temperature=0.1,
    model_kwargs={"n_ctx": 4096, "n_gpu_layers": -1},

(旧)


EMBEDDING_DEVICE = "cpu"

(新)


EMBEDDING_DEVICE = "cuda"

書き換えたものを、別の名前で保存しておきます。
(ここでは「elyza_rag_13b_gpu.py」としておきます)

実行

あとは、普通に実行です。

> python elyza_rag_13b_gpu.py

GPU対応されたとはいえ、起動直後のインデックス化作業はそこそこかかります(数分)。

なお、我が家はメインメモリーが64GBGPUがGeForce GTX1650Ti (GPUメモリー 4GB)という環境であるため、全然GPUメモリーが足りません。
が、メインメモリーの内、最大で半分までをGPUメモリーとして使える(共有GPUメモリ―として認識)ため、どうにか動きました。

20240525-133250

実行中のメインメモリーはこんな感じ。

20240525-133249

GPUの方も共有を含め、かなり目一杯使ってます。

そんな環境下ですが、前回と同じ質問を投げかけてその回答時間を比較します。
よく見たら、推論時間が回答の直上に書かれていたので、それを貼り付けます。
(CPUでも13bモデルを走らせての比較です。)

(CPU版)

20240525-132219

(GPU版)

20240525-130244

ざっと4分弱 → 2分強程度まで縮まりました。
残念ながらGPUがしょぼいので、さほど高速化の実感はありませんが、それでも速いことは速い。

さて、せっかくモデルのサイズを大きいものにしたので、それを実感できる文例を期待してます。
ということで、前回はおかしな回答か、あるいは回答不可と出た質問文を投げかけてみます。

## Question: ヴェテヒネンでのビスケットの食べ方は?

## Answer:
私は石のように硬いビスケットを豆スープに突っ込むと、少しだけ水分を含んで柔らかくなったそれにかじりつく。歯が折れそうな ほどの硬いビスケットを二欠け程口に含んだところで、豆スープを一気に流し込む。さらに干し肉にもかかじりつくと、今度はその独特の臭みをごまかすため、紅茶で口の中を洗浄する。

うん、まあ、文章を抜き出してきただけのような気がしますが。間違ってはいない。

## Question: ヴェテヒネンの乗員は何人いますか?

## Answer:
26名です。

これは簡単だったかな?でも7bモデルでは「回答できません」的なことを言われました。

## Question: 中央計算局とは?

## Answer:
中央計算局は真四角なコンクリート製で、窓がほとんどない殺風景な建屋だ。近所に並び立つ貴族街の優美で荘厳な屋敷や、窓の多 い軍司令本部の建物と比べると、味気ない場所ににしか見えない。

建物の特徴ではなく、何をするところかを聞きたかったんですが、質問が悪いですかね。

ということで、2分ほどで前回よりも良質な回答ができるようになりました。
が、読ませる文書ファイルがあまり良くないですね。できれば、もうちょっとビジネス文書的なもので試してみたいところです。


面倒なことはChatGPTにやらせよう (KS情報科学専門書)

« 大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた | トップページ | Meta Quest 3に非純正のヘッドストラップをつけてみた »

数値解析系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 大規模言語モデル「ELYZA-7b」と自作小説「計算士と空中戦艦」で「RAG」をしてみた | トップページ | Meta Quest 3に非純正のヘッドストラップをつけてみた »

当ブログ内検索

スポンサード リンク

ブログ村

無料ブログはココログ