
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が動くマシンが欲しいなぁ、と常々思っておりましたが、推論しかしないので、しばらくはグラボレンタルでいいんじゃなかろうか、と思う次第です。
あ、使い終わったら、インスタンスは消しましょうね。
現場からは以上です。