概要

ローカルでLLMを動かすときに気になるのは、「CPUだけで実用になるのか」「GPUはどれくらい効くのか」という点です。
今回はこれを検証するために、Docker上で Ollama + Mistral を動かし、同じプロンプトをCPU実行とGPU実行で比較しました。

今回使用した技術

今回の検証では、ローカルでLLMを動かすための実行基盤としてOllamaを使い、実際に動かすモデルとしてMistralを採用しました。
今回はOllamaとMistralを使うため、ここでそれぞれの技術について簡単に整理しておきます。

Ollamaとは?

Ollamaは、LLMをローカル実行・管理するための軽量ツールです。
CPUとGPUのどちらでも実行可能で、モデルはあらかじめ量子化されており、低メモリで高速推論が可能になります。
今回は、ファイルサイズが比較的小さい下記イメージを使用します。
ollama/ollama:0.9.5

Mistralとは?

Mistralは、自然言語の理解や文章生成ができる大規模言語モデル(LLM)です。
今回は、そのMistralをOllama経由でローカル実行できる形で利用しています。
mistral:latest

何を検証したか

今回の検証では、ローカルのDocker環境上で Ollama + Mistral を動かし、CPU実行とGPU実行でどの程度差が出るのかを確認しました。
具体的には、以下の内容を検証しました。

  • Ollama + Mistral をローカルDocker環境で起動
  • 同一プロンプトで CPU / GPU の応答時間を比較

使用技術と環境

今回の検証で使用した構成と実行環境は、以下の通りです。

LLMサーバー構成

項目 内容
LLMサーバー Ollama
使用モデル Mistral 7B
ホスト環境 Docker

CPU推論環境

項目 内容
OS macOS Sequoia
実行環境 Docker Desktop
CPU Apple M1(8コア)
GPU なし(CPUモードで実行)
RAM 16GB

GPU推論環境

項目 内容
OS Windows 11
実行環境 Docker Desktop
CPU 12th Gen Intel(R) Core(TM) i7-12700
GPU NVIDIA GeForce RTX 3070
RAM 32GB

構成ファイル

検証で使ったファイルは次の3つです。

ファイル構成

.
├── docker-compose.yml
└── ollama
    ├── Dockerfile
    └── entrypoint.sh

docker-compose.yml

version: '3.9'

services:
  ollama:
    build:
      context: ./ollama
      dockerfile: Dockerfile
    ports:
      - "11434:11434"
    volumes:
      - ollama_data:/root/.ollama
    environment:
      - OLLAMA_MODELS=/root/.ollama
      - NVIDIA_VISIBLE_DEVICES=all # GPUのある環境でのみ追加
    runtime: nvidia # GPUのある環境でのみ追加
    networks:
      - internal

volumes:
  ollama_data:

networks:
  internal:
    driver: bridge

Dockerfile

FROM ollama/ollama:0.9.5
RUN apt-get update && apt-get install -y netcat && rm -rf /var/lib/apt/lists/*
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

entrypoint.sh

#!/bin/sh
ollama serve &

echo 'Waiting for Ollama server...'
while ! nc -z localhost 11434; do
  sleep 0.5
done

echo 'Pulling model...'
ollama pull mistral

echo 'Restarting Ollama server in foreground...'
pkill ollama
sleep 1

ollama serve

実行結果

同じプロンプト(「日本の首都は?」)を投げた結果です。

CPU推論環境で実行

$ curl -s -w "\nTotal time:%{time_total}s\n" http://localhost:11434/api/generate -d '{"model": "mistral", "prompt": "日本の首都は?", "stream": false}'
{
    "model":"mistral",
    "created_at":"2025-07-31T03:41:35.940957721Z",
    "response":" 日本の首都は東京です。",
    "done":true,
    "done_reason":"stop",
    "context":[3,1027,29910,29887,29761,30761,30228,30045,30539,4,1027,29910,29887,29761,30761,30228,30045,31134,30704,29998,29894,29712],
    "total_duration":95069480043,
    "load_duration":27107547929,
    "prompt_eval_count":11,
    "prompt_eval_duration":5973519544,
    "eval_count":13,
    "eval_duration":61964287778
}
Total time:95.098789s

GPU推論環境で実行

> curl.exe -s -w "`nTotal time:%{time_total}s`n" http://localhost:11434/api/generate -d '{\"model\":\"mistral\",\"prompt\":\"日本の首都は?\",\"stream\":false}'
{
    "model":"mistral",
    "created_at":"2025-07-31T04:22:05.504069733Z",
    "response":" 日本の首都は東京です。",
    "done":true,"done_reason":"stop",
    "context":[3,1027,29910,29887,29761,30761,30228,30045,30539,4,1027,29910,29887,29761,30761,30228,30045,31134,30704,29998,29894,29712],
    "total_duration":500696900,
    "load_duration":5428969,"prompt_eval_count":11,
    "prompt_eval_duration":1924588,
    "eval_count":13,
    "eval_duration":492462477
}
Total time:0.503693s

比較して分かったこと

今回の検証では、CPU(約95.10秒)とGPU(約0.50秒)で大きな差が出ました。
実際に比べてみると、CPUでも動かすこと自体はできるものの、これだけ待ち時間が長いと、ローカルで生成AIを日常的に使うにはかなり厳しいと感じました。
学習はもちろん、今回の推論のような一見軽く見える処理でも、体感できる差は非常に大きいかと思います。
今回の検証を通して、ローカルで生成AIを実用的に使ううえでは、GPUが前提になると考えてよさそうです。CPUで動かせることは確認できましたが、位置づけとしては本番運用での用途というより、動作確認や簡易的な検証に留めたほうが良いかと思います。