日本語対応軽量LLMの動作検証
近年、自然言語処理の分野では、より小さなパラメータ数でありながら高性能なLLM(Large Language Model)の開発が活発です。
今回は、3.6B(36億)パラメータ以下のLLMに焦点を当て、異なるハードウェア環境での動作速度に加え、生成されたレスポンスの妥当性を検証しました。
検証環境
A ノートPC (ASUS Zenbook S UX5406SA-TU7321GR)
- CPU:Core Ultra 7 258V
- メモリ:32GB
- GPU:Intel Arc Graphics 140V 16GB
※MSHybridグラフィックモードで検証
B ノートPC グラボ有(MSI Stealth-14Studio-A13VG-563JP)
- CPU:Core i7-13700H
- メモリ:32GB
- GPU:NVIDIA GeForce RTX 4070 Laptop 8GB
※xpuを利用するためIntel® Extension for PyTorchをインストール
C デスクトップ
- CPU:AMD Ryzen 9 3900X 12-Core Processor
- メモリ:32GB
- GPU:NVIDIA GeForce RTX 3060 12GB
RTX 4070 Laptop 8GBとRTX 3060 12GBの主な仕様
| GPU |
CUDA コア数 |
ブーストクロック (MHz) |
メモリ容量 |
メモリ インターフェース |
| RTX 4070 Laptop |
4608 |
2175 |
8GB |
128-bit |
| RTX 3060 |
3584 |
1777 |
12GB |
192-bit |
RTX 4070 Laptopは、RTX 3060と比較してCUDAコア数が多く、ブーストクロックも高いため、理論的にはより高い並列処理能力を持つことが期待できます。
一方、RTX 3060はメモリ容量が多く、メモリインターフェースも広いため、より大きなデータを効率的に処理できる可能性があります。
検証対象モデル
以下の5つの日本語LLMを検証対象としました。
- cyberagent/open-calm-1b
- google/gemma-2-2b-jpn-it
- cyberagent/open-calm-3b
- line-corporation/japanese-large-lm-3.6b
- rinna/japanese-gpt-neox-3.6b
検証内容
検証には、以下のプロンプトとテストプログラムを使用しました。
プロンプト
日本の首都は
テストプログラム test_llm.py
import sys
import time
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from torchinfo import summary
from huggingface_hub import login
args = sys.argv
if len(args) == 1:
print("引数なし 処理終了")
sys.exit()
model_name = args[1]
login("YOUR_HUGGINGFACE_TOKEN")
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device = torch.device("xpu" if torch.xpu.is_available() else device)
print("デバイス:" + device.type)
model.tie_weights()
model = model.to(device)
summary(model=model, depth=100)
start_time = time.time()
inputs = tokenizer("日本の首都は", return_tensors="pt")
input_ids = inputs["input_ids"].to(device)
outputs = model.generate(input_ids, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
elapsed_time = time.time() - start_time
print(f"生成時間: {elapsed_time:.2f}秒")
このプログラムは、指定されたLLMをロードし、「日本の首都は」というプロンプトに対する応答を生成するまでの時間を計測します。torchinfoライブラリを用いて、モデルのパラメータ数も確認しました。
実行例
python test_llm.py cyberagent/open-calm-1b
検証結果とレスポンスの妥当性評価
以下に、各モデルのパラメータ数と、各環境での応答生成時間、そして生成されたレスポンスの妥当性評価を示します。
cyberagent/open-calm-1b
===========================================================================
Layer (type:depth-idx) Param #
===========================================================================
GPTNeoXForCausalLM --
・
・
・
===========================================================================
Total params: 1,421,987,840
Trainable params: 1,421,987,840
Non-trainable params: 0
===========================================================================
A
日本の首都はどこか?
「日本のどこがダメなのか?」に対する中国ネット民の驚きの回答
人気の質問
生成時間: 2.65秒
B
日本の首都はどこか?
「日本のどこがダメなのか?」に対する中国ネット民の驚きの回答
人気の質問
生成時間: 0.91秒
C
日本の首都はどこか?
「日本のどこがダメなのか?」に対する中国ネット民の驚きの回答
人気の質問
生成時間: 0.56秒
レスポンスの妥当性:
不適切。質問に対して直接的な回答が得られず、関係のない情報や質問を生成しています。
今回のプロンプトとは相性がよくないです。
google/gemma-2-2b-jpn-it
===========================================================================
Layer (type:depth-idx) Param #
===========================================================================
Gemma2ForCausalLM --
・
・
・
===========================================================================
Total params: 3,204,165,888
Trainable params: 3,204,165,888
Non-trainable params: 0
===========================================================================
A
日本の首都は?
**答え:** 東京
生成時間: 4.84秒
B
日本の首都は?
**答え:** 東京
生成時間: 6.76秒
C
日本の首都は?
**答え:** 東京
生成時間: 1.19秒
レスポンスの妥当性:
適切。質問に対して正確な回答「東京」を生成しています。
cyberagent/open-calm-3b
===========================================================================
Layer (type:depth-idx) Param #
===========================================================================
GPTNeoXForCausalLM --
・
・
・
===========================================================================
Total params: 2,785,039,360
Trainable params: 2,785,039,360
Non-trainable params: 0
===========================================================================
A
日本の首都は、東京です。
東京は、日本の首都です。
「東京」と書いて、「とう、
生成時間: 3.88秒
B
日本の首都は、東京です。
東京は、日本の中心であり、日本の中心です。
東京は、
生成時間: 11.33秒
C
日本の首都は、東京です。
東京は、日本の中心であり、日本の中心です。
東京は、
生成時間: 0.91秒
レスポンスの妥当性:
適切。質問に対して正確な回答「東京です」を生成しています。
冗長な繰り返しが見られますが、生成時のパラメーターの調整で改善できるでしょう。
line-corporation/japanese-large-lm-3.6b
===========================================================================
Layer (type:depth-idx) Param #
===========================================================================
GPTNeoXForCausalLM --
・
・
・
===========================================================================
Total params: 3,713,163,264
Trainable params: 3,713,163,264
Non-trainable params: 0
===========================================================================
A
日本の首都は ウェブ<0x0A>本文: 1000円カットは、1000円という
生成時間: 11.14秒
B
日本の首都は ウェブ<0x0A>本文: 1000円カットは、1000円という
生成時間: 19.48秒
C
日本の首都は ウェブ
本文: 1000円カットは、1000円という
生成時間: 3.11秒
レスポンスの妥当性:
不適切。質問に対して全く関係のない情報を生成しています。
今回のプロンプトとは相性がよくないです。
rinna/japanese-gpt-neox-3.6b
===========================================================================
Layer (type:depth-idx) Param #
===========================================================================
GPTNeoXForCausalLM --
・
・
・
===========================================================================
Total params: 3,607,245,312
Trainable params: 3,607,245,312
Non-trainable params: 0
===========================================================================
A
日本の首都は「お前は、俺の言うことを聞け」 と、命令する。 命令
生成時間: 10.97秒
B
日本の首都は「お前は、俺の言うことを聞け」 と、命令する。 命令
生成時間: 23.04秒
C
日本の首都は「お前は、俺の言うことを聞け」 と、命令する。 命令
生成時間: 3.00秒
レスポンスの妥当性:
不適切。質問に対して関係ないテキストを生成しています。
今回のプロンプトとは相性がよくないです。
推論時のGPU使用率
Intel Arc Graphics 140V 16GB
Intel Arc Graphics 140V 16GB
NVIDIA GeForce RTX 4070 Laptop 8GB
NVIDIA GeForce RTX 4070 Laptop 8GB
NVIDIA GeForce RTX 3060 12GB
NVIDIA GeForce RTX 3060 12GB
※検証後にメモリを64GB増加した状態で再検証しています
考察
今回の検証で分かったこと
GPUの性能が処理速度に大きく影響する
CUDAコア数やクロック数が高いRTX 4070 Laptopよりメモリ数が高いRTX 3060の方が生成時間が短い。
cyberagent/open-calm-1b以外RTX 4070 LaptopよりIntel Arc Graphics 140Vの方が生成時間が短い。
推論はCUDAコア数やクロック数よりメモリ容量が重要なのか?
環境BはMSHybridグラフィックモードで検証しているので、ディスクリート グラフィック モードにすればパフォーマンスがあがるかもしれません。
モデルのパラメータ数と処理速度
一般的に、パラメータ数が多いモデルほど計算量が増え、処理に時間がかかります。
今回の検証でも、パラメータ数が比較的少ないopen-calm-1bが高速に処理される傾向が見られました。
モデルの出力の多様性と妥当性
同じ単純な質問に対しても、モデルによって生成されるレスポンスの質には大きなばらつきが見られました。
gemma-2-2b-jpn-itとopen-calm-3bは比較的妥当な回答を生成しましたが、他のモデルでは不適切な情報や無関係なテキストが出力される結果となりました。
これは、各モデルの学習データや学習方法の違い、タスクに対する適性の違いを示唆しています。
まとめ
今回の検証では、LLMの動作速度が使用するハードウェア環境、特にGPUの性能に大きく依存すること、そしてモデルによって生成されるレスポンスの妥当性に大きな差があることが確認できました。
GPUの選択においては、CUDAコア数やクロック数だけでなく、メモリ容量やインターフェースも考慮する必要があるでしょう。
また、LLMの選定においては、処理速度だけでなく、タスクに対する出力の正確性や適切性を評価することが非常に重要だと感じました。