最近では、生成系AIも徐々に多様化してきて、ローカルLLM
の使用も流行ってきていますね。個人利用であれば、OpenAI
のChatGPT
などのSaaS型の生成AIでも問題ないのですが、企業活動になるとそう言ってもいられない事象があるのはもっともかもしれません。
今回は、先日まで設定を行っていた作成した中古ゲーミングPCのUbuntu24.04 LTS
上にDocker
(CUDA Toolkit設定済)を使用していますが、Docker
が使用できるようであればCPUのみでも実行可能です(処理スピードの点は注意)。また、WindowsのDocker
やWSL
でもほぼ同様に使用できると思います。
参考
ただ、環境構築やCLI上からプロンプトを打ち込むのは結構面倒なので、今回はローカルLLM
をWebUIから操作することのできるopen-webui
という環境も使用して一般的なチャットインターフェースを持った生成系AIの形で利用できるようにしてみたいと思います。
ローカルLLM
とは?
ローカルLLM
はクラウドではなく、ローカル環境(オンプレミス)で動作する大規模言語モデルのことを指すようです。
今回はこのローカルLLM
を使用する仕組みとしてOllama
を使用してみたいと思います。
Ollama
とは…
Ollamaは、オープンソースの大規模言語モデル(LLM)をローカルで簡単に実行できるツールです。LLama3やLLava、vicuna、Phiなどのオープンに公開されているモデルを手元のPCやサーバーで動かすことができます。
このような形でLLM
部分のみを変更することで、1システムで切り替えて使用できるというのがOllama
のメリットだと思います。更に今回はDocker
のコンテナを使用することで更に手軽に使用できるようにしてみたいと思います。
コンテナの作成
これから必要となるollama
とopen-webui
の2つのコンテナを作成します。
ollamaコンテナ
の設定と作成
DockerHub
にollama
のイメージがあるのでそれを使用します。データなどの永続化も考慮して-v
でローカルストレージのマウントもしておきましょう。
まず、データの永続用のディレクトリ(今回は~/ollama
にしています)を作成します。また、このコンテナとの通信に使用するポートは11434ポート
を使用するため、ホスト側と共有できるように-p
を使用してください。以下の様コマンドを実行しします。今回のコンテナではGPUの機能を使用するので--gpus=all
も追加しています。
GPUのある環境では
$ mkdir ~/ollama # ホストとのファイル共有ディレクトリ作成 $ docker run -d --gpus=all -v ~/ollama:/ollama -p 11434:11434 --name ollama ollama/ollama
GPUの無い環境(CPUのみでの動作)では
$ mkdir ~/ollama # ホストとのファイル共有ディレクトリ作成 $ docker run -d -v ~/ollama:/ollama -p 11434:11434 --name ollama ollama/ollama
2回目の以降のコンテナの起動
$ docker start ollama
これでollamaコンテナ
が作成できました。
open-webuiコンテナ
の設定と作成
続く、open-webuiコンテナ
についても同じくDockerHub
にイメージがあるので、そこから取得します。ファイルの永続化もできるようにマウントも忘れずに(今回はディレクトリを~/open-webui
としています)。
このコンテナは、先ほど作成したollamaコンテナ
とも通信を行います。そのため、--add-host=host.docker.internal:host-gateway
を使用しています。これはこのコンテナからホスト側のポートを経由して通信を行うという意味です。図にすると以下の様になります。これでもわかりにくいですが…。このような方法を取っているのはollamaコンテナ
の操作も楽にできるようにする工夫だと思ってもらえれば大丈夫です。
【ホストのブラウザ】<---(3000→8080)--->【open-webuiコンテナ
】<---><Host Gateway><---(11434→11434)--->【ollamaコンテナ
】
$ mkdir ~/open-webui # ホストとのファイル共有ディレクトリ作成 $ docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v ~/open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
open-webuiコンテナ
を作成できました。こちらはWebサーバの役割を行うので、起動後に触る必要はなく、Webブラウザでアクセスをするだけになります。
作成後はDocker Desktop
などからコンテナ起動を行うことも可能です。
これで必要となるDocker
の2つのコンテナは準備できました。早速実行していきましょう!
Ollama
の動作テストを行う
この2つのコンテナが動作している前提で動作を行っていきます。Ollama
はコンテナ上にあるollamaコマンドにLLMモデル
を指定することで該当のLLM
を動作させることができます。
例えば、llama3
をLLM
として使用するには以下のコマンドを実行します。ollamaコンテナ
でollama run llama3
というプロセスを実行させています。
# LLMにllama3を使用する場合 $ docker exec -it ollama ollama run llama3
その他のLLMモデル
を使う例も載せておきます。使用可能なLLMモデル
に関しては以下を参照してください。各モデルのページに起動コマンドが書かれています。
# LLMにphi3:3.8bを使用する場合 $ docker exec -it ollama ollama run phi3:3.8b
# LLMにgranite-codeを使用する場合 $ docker exec -it ollama ollama run granite-code
LLMモデル
がコンテナ内にない場合には、Pullをしてダウンロードを行ってくれるのでダウンロードが終わるまで待機しましょう。2回目以降はダウンロードは行われません。
コマンド実行後(Pullが終わったら)には、対話型のプロンプトがでるので、テキストを入力すると返答が帰ってきます。
この例では日本語と指定しましたが、英語で返答されています。
これでOllama
の動作テストは無事にできました。
Webブラウザ経由で動作確認を行う
ここまでできたら今度はopen-webuiコンテナ
へWebブラウザからアクセスを行ってみます。
アクセス後にユーザー認証画面がでてきますが、ネットワーク上にアクセスはしないので適当なデータでも大丈夫です。
ログインするとWebUIが表示されます。
画面上部で使用するモデルを選択して
プロンプトを入力すると
実行結果が表示されました。
では、今回は少し目線をかえてIBMさんの新しいLLMモデル
であるGranite
を使用してみようと思います。
Granite
は
Granite Code Modelsは、IBMが開発した116種類のプログラミング言語で訓練された LLM で、コード生成、バグ修正、コード説明、ドキュメント化などの幅広いタスクに対応できるように設計されています。これらのモデルは、エンタープライズソフトウェア開発の生産性向上を目指しており、3Bから 34B までのモデルサイズがあります。
とのこと、主にビジネスを見据えたのLLMモデル
といっていいでしょう。
再掲(既に起動している場合には実行は不要)
# LLMにgranite-codeを使用する場合 $ docker exec -it ollama ollama run granite-code
このLLMモデル
は英語のみ対応なので、プロンプトに日本語を入力すると、途中で日本語から英語に変えられてしまいました。英語の入力を行えばもちろん問題なく返答してくれるので、マルチリンガル化を待ちたいと思います。
LLMモデル
を切り替えるには、コンソールから再度、LLMモデル
を指定してollama
を起動してください。
上記のモデルに切り替えてみます。
再掲(既に起動している場合には実行は不要)
# LLMにphi3:3.8bを使用する場合 $ docker exec -it ollama ollama run phi3:3.8b
Web-UI上でモデルの切り替えを行って、
プロンプトを入力すると、シームレスにモデルの切り替えができます。
コンテナの停止(システムの停止)
終了するにはコンテナの停止を行います。Dockerデスクトップでも停止できますし、以下のようなコマンドで停止させることもできます。※以下のコマンドでは全てのコンテナを停止させるので注意してください。
$ docker stop $(docker ps -q)
#おわりに
今回はDockerコンテナを使用してUbuntu上にローカルLLM
の環境を構築してみました。LLMモデル
も簡単に変更できる点やWebUIを使用する事もできるので非常に使いやすい環境です。今後はLLMもコンパクトなサイズのバリエーションも増えてくるので、ますますローカルLLM
の世界も広がっていくのではないかと予想しています。
参考リンク