はじめに
近年、OpenAIは公式にオープンウェイトモデル「gpt-oss」シリーズを発表し、話題となっています。これにより、大規模言語モデルをより手軽に利用・検証できる環境が広がりつつあります。本記事では、Macのローカル環境においてOllamaを用いてgpt-oss-20bモデルを実際に動かし、その挙動や性能、APIの違いについて検証した結果を紹介します。
大規模モデルをローカルで動かす際のハードウェアやAPI仕様の制約を踏まえ、どのような運用が現実的かを示すことを目的としています。同じ環境での試行を検討されている方々にとって、有用な参考情報となれば幸いです。
gpt-ossとは
OpenAIによる初の公式なopen‑weightモデルで、GPT‑2以降で初めてモデルウェイトが公開されたシリーズです。
提供されているバージョンとしては二つ提供されています。
- gpt-oss-120b: 117Bパラメータで高性能。単一のH100 GPU上で稼働可能。
- gpt-oss-20b: 21Bパラメータで軽量。16GB GPUなど比較的低リソース環境にも対応
以下、OpenAIのWebサイトより抜粋
gpt-oss-120b は、競技コーディング(Codeforces)、一般的な問題解決(MMLU および HLE)、ツール呼び出し(TauBench)において OpenAI o3‑mini を上回り、OpenAI o4-mini に匹敵または上回ります。さらに健康関連のクエリ(HealthBench)と競争数学(AIME 2024 & 2025) では o4-mini よりも優れたパフォーマンスを発揮します。gpt-oss-20b は、サイズが小さいにもかかわらず、同評価において OpenAI o3‑mini に匹敵または上回り、競争数学と健康では上回ります。
参考サイト
事前準備
今回はMac OSのターミナルからOllamaを使ってローカルPC上でgpt-oss-20bを使っていこうと思います。同じ環境で、試してみようと思う方がいらっしゃいましたら以下の手順もご参考にしてみてください。
実行環境
- os: MacOS
- チップ: Apple M2
- メモリ: 16GB
- Python: 3.11.9
- ollamaのインストール
brew install ollama
- ollamaのバージョンアップ
brew upgrade ollama
- ollamaサーバーの立ち上げ
ollama serve
- gpt-oss-20bモデルファイルのプル
ollama pull gpt-oss:20b
実際に動かしてみる
- 必要ライブラリのインストール
pip install openai
- Pythonファイルの作成
OllamaではエンドポイントがOpenAI 互換 APIによるリクエストとOllama独自のエンドポイントによるリクエストの二通りがあります。今回は、モデルの応答速度比較の意味も込めてどちらのコードも実行して試しました。両者の違いとしては使用ライブラリやレスポンス構造、データ取得方式などに違いがあります
OpenAI互換API: https://ollama.com/blog/openai-compatibilityOpenAI 互換 APIのリクエスト
from openai import OpenAI import time start_time = time.time() print(f"start_time:{start_time}") # OpenAI互換APIの呼び出し client = OpenAI( base_url="http://localhost:11434/v1", api_key="ollama" # 任意の文字列でOK ) response = client.chat.completions.create( model="gpt-oss:20b", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Explain what MXFP4 quantization is."} ] ) print(response.choices[0].message.content) end_time = time.time() print(f"\nend_time:{end_time}") response_time = end_time - start_time print(f"response_time:{response_time}")
Ollama独自APIのリクエスト
import requests import json import time start_time = time.time() print(f"start_time:{start_time}") response = requests.post( "http://localhost:11434/api/chat", json={ "model": "gpt-oss:20b", "stream": True, "messages": [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "GPTシリーズについて説明してください。"} ] }, stream=True ) for line in response.iter_lines(): if line: json_data = json.loads(line.decode("utf-8")) print(json_data["message"]["content"], end="", flush=True) end_time = time.time() print(f"\nend_time:{end_time}") response_time = end_time - start_time print(f"response_time:{response_time}")
- レスポンス速度比較
- OpenAI API互換
レスポンス:500エラー
https://github.com/ollama/ollama/issues/4131
どうやらollamaの仕様で重いモデルを動かし、時間が経つとタイムアウトになるらしく、gpt-ossのモデルの重さでは処理しきれなかったみたいです。
raise APITimeoutError(request=request) from err openai.APITimeoutError: Request timed out.
- Ollama独自API
- レスポンス: gptモデルの歴史についてかなり長めかつ詳細に出力されました!(内容については長いため割愛させていただきます。)きちんと検証したわけではありませんが数回実行した限りだと直感的にはかなり的を射た回答ができているように感じます。
- GPU使用率: 最高70% 大体40~50%で推移
- レスポンス速度 :2877秒(約50分) ※生成内容やPCの性能によってばらつきありそうです。
- OpenAI API互換
終わりに
今回、OpenAIが公開したgpt-ossモデルをMac環境でOllamaを使って実際に動かしてみました。モデルの重さやPC環境の制約により、OpenAI互換APIではタイムアウトが発生しやすい一方で、Ollama独自APIではより長時間の処理が可能で、しっかりと応答を得られることが分かりました。
今回の検証を通じて、ローカル環境で大規模言語モデルを動かす際には、
- 使用するAPIの種類(OpenAI互換API vs Ollama独自API)の違いを理解すること、
- モデルのリソース要求に応じた適切な設定やAPI選択を行うこと、
- ハードウェア性能やタイムアウトの制約を考慮した運用が重要であること、
が特に重要であることを実感しました。
今後もローカルでの大規模モデル活用は進んでいくと思われるため、こうした環境構築やAPIの使い分けの情報はより多くの方に共有していきたいと考えています。
この内容が、同じようにローカル実行を試みる皆さまの参考になれば幸いです。引き続き最新の情報を追いながら、より良いモデル活用環境の構築に取り組んでいきたいと思います。