見出し画像

RTX 3090+ollamaでどのくらいの速度で推論できるか試してみた

なぜRTX 3090か

RTX 3090は古いグラボではあるのですが、VRAMを24GB搭載しており、結構な速度で推論できるんですね。
Vast.ai(後述)でいろいろなグラボで推論速度を比較評価をしている最中なので、後日記事にまとめるつもりですが、RTX 3090、結構いいんですよ。
安いのに、結構早い。

評価環境

自宅マシンにはグラボが無いので、Vast.aiという世界中にあるグラボを搭載したマシンを、遠隔から時間借りできるサービスを利用して測定を行いました。

手順

まずは、Vast.aiでアカウントを作り、クレジットカード(Stripeが使えます)を登録し、事前に支払いを行っておきます。ちょっとした検証ならば、$5も入れておけば十分です。

次に手元のマシンでSSH鍵ペアをssh-keygenなどで生成し、公開鍵をVast.aiに登録しておきます。Vast.aiでレンタルしたマシンとは基本はSSHで接続します。
(イメージテンプレートでJupyter入りのものを選択すれば、ブラウザコンソールからアクセスすることもできます)

次にVast.aiの検索画面から、各種条件を付けて検索し、お手頃価格のインスタンスをレンタルします。
インスタンス選択時の注意ポイントは、下記2点です。

  • ダウンロード速度が500Mbps以上のものを選ばないと、モデルのダウンロードに時間がかかります。時間課金なので、素早くダウンロードできる回線のものを選びましょう。

  • レンタル時にアタッチするディスクの容量は、落とすモデルが格納できるサイズにしましょう。50GB~100GB程度を用意しないと、モデルをダウンロードする際にディスクがパンクしてしまいます。

「RENT」ボタンをクリックして、インスタンス(Dockerコンテナ)が起動するのを待ちます。起動が完了すると、「INSTANCES」画面に下記のように表示されます。

インスタンスが起動した状態

右上のカギアイコンの隣(>_)のアイコンをクリックすると、下記のようにSSH接続情報が表示されるので、SSH鍵ペアの秘密鍵を指定してSSH接続すればインスタンスに接続できます。

上記のコマンドに加えて、秘密鍵も指定しましょう

あとは、ollamaのインストール、ollamaサーバの起動、モデルのダウンロード、推論、という流れとなります。

評価用方法

推論速度の評価は、下記の4種類のコマンドを1多重から4多重まで実行して、ollamaが出力する推論の"tokens/sec"の値を見てみます。
モデルはMicrosoftのPhi-4を使用しました。

# プロンプト1
ollama run phi4 --verbose "「桜とカラス」というタイトルで、4000文字程度のファンタジー小説を書いて"

# プロンプト2
ollama run phi4 --verbose "Python初心者向けのプログラミングガイドを4000文字程度で書いてください"

# プロンプト3
ollama run phi4 --verbose "DNAにおけるテロメアの役割についての解説を4000文字程度で書いて"

# プロンプト4
ollama run phi4 --verbose "中世から現代まで続くイタリア料理の歴史を4000文字程度で書いて"

評価結果

1多重(桜とカラスのみ)

total duration:       17.823659116s
load duration:        15.833683ms
prompt eval count:    44 token(s)
prompt eval duration: 23ms
prompt eval rate:     1913.04 tokens/s
eval count:           1209 token(s)
eval duration:        17.783s
eval rate:            67.99 tokens/s

2多重(桜とカラス、Python)

#桜とカラス
total duration:       20.813779382s
load duration:        15.925877ms
prompt eval count:    44 token(s)
prompt eval duration: 25ms
prompt eval rate:     1760.00 tokens/s
eval count:           1171 token(s)
eval duration:        20.771s
eval rate:            56.38 tokens/s

# Python
total duration:       30.020013891s
load duration:        21.096132ms
prompt eval count:    39 token(s)
prompt eval duration: 47ms
prompt eval rate:     829.79 tokens/s
eval count:           1748 token(s)
eval duration:        29.95s
eval rate:            58.36 tokens/s

3多重(桜とカラス、Python、テロメア)

# 桜とカラス
total duration:       44.437920775s
load duration:        17.229037ms
prompt eval count:    44 token(s)
prompt eval duration: 50ms
prompt eval rate:     880.00 tokens/s
eval count:           2002 token(s)
eval duration:        44.369s
eval rate:            45.12 tokens/s

#Python
total duration:       43.402948228s
load duration:        19.055744ms
prompt eval count:    39 token(s)
prompt eval duration: 16ms
prompt eval rate:     2437.50 tokens/s
eval count:           1948 token(s)
eval duration:        43.367s
eval rate:            44.92 tokens/s

# テロメア
total duration:       36.468418788s
load duration:        14.61772ms
prompt eval count:    43 token(s)
prompt eval duration: 49ms
prompt eval rate:     877.55 tokens/s
eval count:           1630 token(s)
eval duration:        36.404s
eval rate:            44.78 tokens/s

4多重(全部同時実行)

# 桜とカラス
total duration:       44.471709809s
load duration:        14.691496ms
prompt eval count:    44 token(s)
prompt eval duration: 89ms
prompt eval rate:     494.38 tokens/s
eval count:           1341 token(s)
eval duration:        44.367s
eval rate:            30.23 tokens/s

# Python
total duration:       1m4.100754157s
load duration:        15.063037ms
prompt eval count:    39 token(s)
prompt eval duration: 84ms
prompt eval rate:     464.29 tokens/s
eval count:           2142 token(s)
eval duration:        1m4s
eval rate:            33.47 tokens/s

# テロメア
total duration:       1m0.042508053s
load duration:        17.792788ms
prompt eval count:    43 token(s)
prompt eval duration: 71ms
prompt eval rate:     605.63 tokens/s
eval count:           1924 token(s)
eval duration:        59.952s
eval rate:            32.09 tokens/s

# イタリア料理
total duration:       54.762697522s
load duration:        15.421824ms
prompt eval count:    44 token(s)
prompt eval duration: 46ms
prompt eval rate:     956.52 tokens/s
eval count:           1707 token(s)
eval duration:        54.7s
eval rate:            31.21 tokens/s45

まとめ

ざっくり、120~130 tokens/secの推論スループットが出る、ということが分かりました。
今回レンタルしたインスタンスは $0.186/Hrなので、30分 × $0.186/Hr x 160円/$として、かかった費用は約15円です。(実際にはプラス通信料金も従量課金で引かれますが、大した金額にはならないはず)
いや、RTX 3090速い&安い。

自宅にローカルLLM/SLMが動くマシンが欲しいなぁ、と常々思っておりましたが、推論しかしないので、しばらくはグラボレンタルでいいんじゃなかろうか、と思う次第です。

あ、使い終わったら、インスタンスは消しましょうね。

現場からは以上です。