💬

【Ollama】WSL2+Ubuntu上でローカルLLMを動かす【GTX1660 Super】

に公開

結果を先に書くと、私の環境ではllama3.1:8bをした場合、異常に遅いといった問題なく動くことが確認できました。

ことの始まりと記事の概要

ここ半年近く、「MCP(Model Context Protocol)」が非常に盛り上がっています。これは、「LLMアプリケーションと外部データソースをシームレスに統合するためのプロトコル[1]」というものです。ここでは詳細な例を省きますが、簡単に言うならばLLMがデスクトップPCとしたとき、USBフラッシュメモリや外付けHDD、スマートフォンといった外部のソースに接続する「Type-C ポート」のような立ち位置です。
ようやく今回の記事につながるのですが、MCPでの接続を学習するにあたり、接続してくれるLLMを用意する必要がありました。MCPサーバーのテストであればCorsorを使用しても問題ないですが、最終的にはLLMを使用したサービスを提供したいため、ローカルLLMを選択しました。

本記事では、WSLで動作するUbuntu22.04上で動作させるまでのセットアップ手段と、動作させるLLMの選定までの過程をまとめています。GTX1660 Superでの動作状況もありますので、是非最後までご覧ください!

環境(使用したPC)

  • プロセッサ AMD Ryzen 5 5600 6-Core Processor 3.50 GHz
  • 実装 RAM 32.0 GB
  • GPU NVIDIA GeForce GTX1660 Super
  • 実装 VRAM 6.0 GB
    (本体のメモリから共有されており、タスクマネージャー上ではGPUメモリは22.0GB分ある)
  • システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ
  • OS Windwos11 Home 23H2 10.0.22631.5189
  • WSL 2.4.13.0
  • Ubuntu 22.04.5 LTS

こんな人におすすめ

  • ローカルでLLMを動かしたい
  • Ollamaについて知りたい
  • LLMを組み込んだサービスをローカルで建てたい
  • MCPサーバーの開発環境が欲しい

この記事でやらないこと

  • Linux以外のインストール手順
  • モデルごとのベンチマーク
  • GTX1660 Super以外のGPUとの比較
  • MCPの使用・作成

1. Ollama

1.1 Ollamaの概要

Ollamaとは、Llama3.3DeepSeek-R1 Owen 3などといったLLMを、用意したマシン上で簡単に実行できるオープンソースのソフトウェアです。MacOSやWindwos、Linuxといった主要なOSに対応している上、Docker imageやPython・JavaScript向けのライブラリも用意されています。
https://github.com/ollama/ollama

1.2 セットアップ(インストール等)

Ollamaの公式サイトに、ダウンロードを行えるページがあります。
https://ollama.com/download/linux
Linux版では、インストール用のコマンドが表示されます。

curl -fsSL https://ollama.com/install.sh | sh

実行後、以下のコマンドでインストールできているか確認してみるといいかもしれません。

$ ollama --version
ollama version is 0.6.8

2. LLMのインストールと実行

2.1 PCスペックにあったモデル選定

LLMを実行するうえで、最もネックとなるのがGPUとVRAMです。
私が使用しているGPUは「GTX1660 Super 6GB」。購入したころに、Stable Diffusionを使用した画像生成で遊んだ記憶があり、ある程度の生成AIを実行することはできそうなスペックと認識しています。
では、このようなGPUで実行するのに適している(実行速度と推論の精度が釣り合っている)モデルはどのように探せばよいのでしょう。

マシンスペックを軸としてLLMを選定する際には、パラメータ数が大きな指標となります。

パラメータ数は、LLM を含むニューラルネットワークの「規模」を示す指標です。非常に大雑把に言えば、パラメータ数が多い LLM ほど、より多くの知識を学習し、高い性能を発揮する傾向があります。
(中略)
また、パラメータ数は、モデルを動かすために必要なメモリ(RAM または VRAM)容量と密接に関係します。パラメータ数が多いほど、必要なメモリ量も増加します。
「Ollamaで体験する国産LLM入門」より引用 - https://zenn.dev/hellorusk/books/e56548029b391f/viewer/intro5#パラメータ数

上記引用のように、パラメータ数はニューラルネットワークの「規模」を示す指標で、動作させるメモリ容量にも深く関わります。引用元の紹介では、8GB程度であれば7B(およそ70億)程のパラメータであれば動かすことができそうです。

このような情報を踏まえ、私の環境ではVRAM 6GBに共有メモリ 16GBがGPU用に割り当てられていることから、8bを目安に選ぶことにします。
最終的に、8bにて使用できるllama3.1を使用することにしました。
https://ollama.com/library/llama3.1

2.2 LLMを実行させる

実際にllama3.1を、ローカル環境で実行させます。
ollama run <モデル名>:<パラメータ数>もしくはollama run <モデル名>というコマンドで、モデルのpullと実行を行うことができます。

$ ollama run llama3.1
pulling manifest 
pulling <hash>: 100% ▕███████████████████████████████▏ 4.9 GB                         
pulling ...(中略)                       
verifying sha256 digest 
writing manifest 
success 
>>> Send a message (/? for help

llama3.1を実行する際にはおよそ4.9GBほどのpullが行われました。pull動作が終了すると、メッセージ入力を受け付け始めます。
この際に、/から始まるコマンドを使用することもできます。試しに、LLMの情報を出力する/show infoを実行します。

>>> /show info
  Model
    architecture        llama     
    parameters          8.0B      
    context length      131072    
    embedding length    4096      
    quantization        Q4_K_M    

  Capabilities
    completion    
    tools         

  Parameters
    stop    "<|start_header_id|>"    
    stop    "<|end_header_id|>"      
    stop    "<|eot_id|>"             

  License
    LLAMA 3.1 COMMUNITY LICENSE AGREEMENT            
    Llama 3.1 Version Release Date: July 23, 2024   

8bのllamaが実行されていることが分かりました。

2.3 プロンプトに答えてもらう

いよいよプロンプトに答えてもらいます。

>>> UTAUとはなんですか?
日本で生まれた、歌唱技術のオープンソースソフトウェアです。

すごく短い解答ですが、2秒程度で回答が返ってきました。とはいえ、想定していたよりもかなり早いですし、精度もまあまあです。(UTAU自体はソースコードを公開していないため。おそらくOpenUTAUと混ざっているかと...)
では、もう少し長くなりそうな質問にも答えてもらいます。

>>> fizzbuzzのプログラムをgoで書いてみてください
以下にGo言語を使ってFizzBuzzというゲームを実装する例を見せております。

‘‘‘go
package main

import (
        "fmt"
)

func fizzbuzz(n int) {
        for i := 1; i <= n; i++ {
                if i%3 == 0 && i%5 == 0 {
                        fmt.Println("FizzBuzz")
                } else if i%3 == 0 {
                        fmt.Println("Fizz")
                } else if i%5 == 0 {
                        fmt.Println("Buzz")
                } else {
                        fmt.Println(i)
                }
        }
}

func main() {
        fizzbuzz(100) // 1 から 100 まで実行
}
‘‘‘

上記のプログラムでは、FizzBuzzというゲームを実装するために、以下のようなルールに従っています。

- 3で割り切れるかつ5で割り切れる場合には "FizzBuzz" を出力します。
- 3で割り切る場合には "Fizz" を出力します。
- 5で割り切る場合には "Buzz" を出力します。
- それ以外の場合は数字をそのまま出力します。

このプログラムはGo言語を使って実装されており、`fizzbuzz()`関数内でループ処理を行いながらFizzBuzzというゲームを実行しています。

この質問に対し、かかった時間は30秒ほど。手元にあるgoの実行環境で試したところ、問題なく実行できました。

ちなみに、LLMを実行している際にタスクマネージャーを見ると、VRAMの使用率は100%に非常に近い状態になっているようです。

GPU 0

	NVIDIA GeForce GTX 1660 SUPER

	ドライバーのバージョン:	32.0.15.6094
	ドライバーの日付:	2024/08/14
	DirectX バージョン:	12 (FL 12.1)
	物理的な場所:	PCI バス 5, デバイス 0, 機能 0

	使用率	8%
	専用 GPU メモリ	5.4/6.0 GB
	共有 GPU メモリ	0.2/16.0 GB
	GPU メモリ	5.6/22.0 GB

まとめ

今回は、ローカル環境かつWSL上でLLMを動かすまでの過程と、GTX1660Super(6GB)を使用している場合の動作状況についてまとめました。
WSL上であれば、GPUパススルー等の設定を行わずともLLMを簡単に実行することができましたし、5年ほど前のミドルモデルのGPUでも問題なく解答を生成できていました。
手元でLLMを動かしてみたい方や、クラウドのサービス以外を探していた方を始めとする方々の参考になれば幸いです。

【おまけ】llama3.1:70bは動かせる...?

8bのモデルが思ったよりも速く動いていたので、70bとなるとどうなるんだろうという素朴な疑問を試すために動かしてみました。
pullの時点で、42GBと8bの10倍近いサイズ

pullが終了すると

Error: model requires more system memory (40.0 GiB) than is available (17.1 GiB)

上記のようなエラーが表示されました。どうやらモデルが求めるメモリに対して、実機のメモリが足りていないようです。このような場合は、実行されずにエラーとなって終了される模様...高度なLLMを使用する場合は、よりよい環境にするか、ChatGPTといったサービスを使用する必要がありそうです。

脚注
  1. Model Context Protocol ↩︎

Linux Club - 東京工科大学

Discussion