はじめに
2025年8月5日、 OpenAIはオープンウェイトの大規模言語モデル gpt-oss シリーズを公開しました。公開直後から開発者コミュニティで話題となっており、その魅力は自分の手元の端末(エッジデバイス)で強力なAIモデルを動かせる点にあります。
例えば gpt-oss-20b モデルは OpenAIの社内モデル「o3-mini」と同等の性能を示し、メモリ16GB程度のデバイス上で動作可能とされています。
gpt-ossにはパラメータ約1200億の gpt-oss-120b(大規模モデル)と、約210億の gpt-oss-20b(中規模モデル)の2種類があります。大きい120bモデルは強力ですが80GB級GPUが必要で、より軽量な20bモデルは量子化(4ビット)の工夫によりファイルサイズ約15GBで、Apple Silicon Macなど比較的手軽なハードウェアでも実行可能です(Apache 2.0 ライセンスで公開)。
また、OpenAIのモデルカードによると、知識のカットオフ(訓練データの知識範囲)は2024年6月と記載されています(つまりそれ以降の最新情報は持っていません。)
本記事では後者の gpt-oss-20b モデルを使用し、Apple Silicon搭載Mac上でGPU (Metal) を活用した動作させ、ローカルに立てたサーバーを利用して 簡易チャットアプリを動かす 例もお見せします。
1. llama.cpp のビルドとセットアップ(Metal 対応)
まずは、Apple SiliconのGPUを使ってLLMを実行できるよう、Metalオプションを有効にした llama.cpp をビルドします。llama.cpp はメモリ効率の良い推論エンジンで、AppleのMetal APIを使うことでMacのGPUを活用できます。
ソースコードの取得
ターミナルで以下のコマンドを実行し、最新の llama.cpp ソースコードを取得します
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
ビルド(Metal を有効化)
Metalサポートを有効にするため、CMakeのオプション LLAMA_METAL=ON を指定してビルドします。これによりApple SiliconのGPU上でモデルを推論できるようになります
mkdir -p build
cd build
cmake .. -DLLAMA_METAL=ON
cmake --build . --config Release
上記により、build/bin ディレクトリ内に実行バイナリ群(llama, llama-chat, llama-server など)が生成されます
2. モデルの準備と配置
次に、llama.cppで利用するモデルファイル(GGUF形式)をダウンロードして配置します。GGUF は llama.cpp 用の最新モデルフォーマットです。
モデルのダウンロード
OpenAIの gpt-oss モデルは Hugging Face 上で公開されています。Webブラウザから直接ダウンロードするか、後述のようにコマンドラインで取得できます。今回は gpt-oss-20b モデル(GGUF量子化版)を使用します。
- オリジナル gpt-oss-120b - 約1170億パラメータ(要80GB GPU)
- オリジナル gpt-oss-20b – 約210億パラメータ(16GB程度で動作可能)
- GGUF量子化版 gpt-oss-20b – llama.cpp 用に4ビット量子化された20bモデル
ダウンロード例
Hugging Faceのモデルファイルは wget 等でも取得できます。例えば上記GGUF版モデルをコマンドラインでダウンロードするには以下を実行します(サイズは約15GBあるのでご注意ください)
# 作業ディレクトリからmodelsフォルダへ移動
cd ../models
# gpt-oss-20b-mxfp4.gguf を取得する
wget https://huggingface.co/ggml-org/gpt-oss-20b-GGUF/resolve/main/gpt-oss-20b-mxfp4.gguf
# ビルドディレクトリに戻る
cd ../build
ダウンロードした gpt-oss-20b-mxfp4.gguf ファイルを、先ほどの llama.cpp/models ディレクトリに配置しておきます
3. OpenAI互換サーバの起動
モデルの準備ができたら、llama.cpp に付属の llama-server を使ってローカルサーバーを起動します。llama-server は OpenAI API と互換性のあるHTTPエンドポイントを提供するサーバープログラムで、これを使うとOpenAIのAPIを呼ぶような感覚でローカルモデルを利用できます。
./bin/llama-server \
-m ../models/gpt-oss-20b-mxfp4.gguf \
--port 8080
4. curl を用いた動作テスト
サーバーが正常に起動したら、OpenAI互換のAPIエンドポイントに対してリクエストを送ることでモデルを利用できます。例えば、curl
コマンドを使って以下のように質問を投げ、レスポンスを確認してみましょう。
curl -s http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-20b",
"messages": [
{"role": "user", "content": "PythonでHello Worldを表示するコードを書いてください。"}
],
"temperature": 0.7,
"max_tokens": 256,
"stream": false
}' | jq -r '.choices[0].message.content'
上記では日本語で「PythonでHello Worldを表示するコードを書いてください。」というユーザーメッセージを送り、jq
コマンドでレスポンスJSONからアシスタントの回答内容だけを取り出しています。実行すると以下のような応答が得られます。
<|channel|>analysis<|message|>We need to provide a Python code snippet that prints "Hello World". The user is Japanese: "PythonでHello Worldを表示するコードを書いてください。" They want a code. Provide code and maybe explanation. Keep it concise.<|start|>assistant<|channel|>final<|message|>```python
# Python で Hello World を表示するシンプルなコード
print("Hello World")
```
上のレスポンスを見ると、まず <|channel|>analysis
としてモデル内部の思考過程(チェイン・オブ・ソート)が出力され、その後 <|channel|>final
に実際の回答となるPythonコードが提示されています。gpt-ossモデルは OpenAI Harmony Response Format でレスポンスを返す仕様になっており、通常アプリ側では final の部分(ユーザー向け回答)だけを表示します。
今回の例では、Hello World
を出力するシンプルなPythonコードがしっかり返ってきていることが確認できました。
5. 簡易チャットアプリの実行
ローカルに立てたOpenAI互換サーバを活用すれば、自作のプログラムからこのモデルを呼び出すことも容易です。ここでは試しに、ターミナル上でやりとりする簡易チャットアプリを動かしてみます。事前に用意したサンプルプログラム(LangChainを利用)を実行し、ローカルの gpt-oss モデルと対話します。
ソースコード
簡易チャットアプリを動作させる
まず、以下のコマンドでサンプルのチャットアプリケーションのコードを取得して起動します(Python環境がセットアップ済みであることが前提です)。
git clone https://github.com/aRaikoFunakami/langchain_gpt_oss.git
cd langchain_gpt_oss
uv sync # 必要なライブラリをインストール
uv run python main.py # チャットアプリを実行
実行すると対話モードのプロンプトが立ち上がり、ユーザーからの入力を受け付けます。
OpenAI互換サーバの起動を忘れないこと
cd llama.cpp/build
./bin/llama-server \
-m ../models/gpt-oss-20b-mxfp4.gguf \
--port 8080
Chat started. Type 'exit' to quit.
You:
では、実際にいくつか質問を投げかけてモデルの応答を見てみましょう。
サンプル出力 1
You: こんにちは
Assistant: こんにちは!どんなお手伝いが必要ですか?
実行時間 (サーバー側ログ抜粋):
prompt eval time = 285.82 ms / 40 tokens ( 7.15 ms per token, 139.95 tokens per second)
eval time = 2239.42 ms / 94 tokens ( 23.82 ms per token, 41.98 tokens per second)
total time = 2525.24 ms / 134 tokens
上記の例では、簡単な挨拶に対してモデルもスムーズに日本語で挨拶を返しています。レスポンス生成は約2.5秒(134トークン生成)で完了しており、ローカル実行としては比較的良好な速度です。
サンプル出力 2
You: スターウォーズの監督を教えて
Assistant: スターウォーズシリーズの主要な監督は以下の通りです(公開順・主要作品別にまとめました)。
| 作品 | 公開年 | 監督 |
|------------------------------------------|--------|-----------------------|
| **『スター・ウォーズ エピソード4/新たなる希望』** | 1977 | ジョージ・ルーカス |
| **『スター・ウォーズ エピソード5/帝国の逆襲』** | 1980 | リチャード・マーロウ |
| **『スター・ウォーズ エピソード6/ジェダイの帰還』** | 1983 | リチャード・マーロウ |
| **『スター・ウォーズ エピソード1/ファントム・メナス』** | 1999 | ジョージ・ルーカス |
| **『スター・ウォーズ エピソード2/クローンの攻撃』** | 2002 | ジョージ・ルーカス |
| **『スター・ウォーズ エピソード3/シスの復讐』** | 2005 | ジョージ・ルーカス |
| **『スター・ウォーズ エピソード7/フォースの覚醒』** | 2015 | J.J. アブラムズ |
| **『スター・ウォーズ エピソード8/最後のジェダイ』** | 2017 | ライアン・ジョンソン |
| **『スター・ウォーズ エピソード9/スカイウォーカーの夜明け』** | 2019 | ジョージ・ルーカス(監督はリード・レイザーが制作に関わるが、公式に監督はジョージ・ルーカス) |
| **『レイ・オブ・ハッピー』**(スピンオフ) | 2018 | レイ・オブ・ハッピー |
| **『フォースの暗闇』**(スピンオフ) | 2018 | ジョン・ファブレック |
> **注**
> - 公式に「監督」と認定されるのは上記表の通りです。
> - ストーリーラインや制作背景に関わる他の重要人物(プロデューサー、脚本家など)は別途多く存在します。
もし「スターウォーズの監督」を特定の映画(例:オリジナル三部作)に絞って知りたい場合は、その作品名を教えていただければさらに詳しく回答します。
実行時間 (サーバー側ログ抜粋):
prompt eval time = 3099.14 ms / 1360 tokens ( 2.28 ms per token, 438.83 tokens per second)
eval time = 20143.76 ms / 651 tokens ( 30.94 ms per token, 32.32 tokens per second)
total time = 23242.90 ms / 2011 tokens
上記の質問では作品ごとの公開年と監督を表形式で詳しく回答しています。長文の回答でしたが、約23秒で2000トークン以上を生成できました。内容を見ると若干事実と異なる部分もありますが(架空の作品名が含まれるなど)、このように日本語でそれらしい回答を生成できることに驚かされます。ローカル実行のLLMであることを踏まえ、出力された情報の正確性には注意が必要ですが、用途によっては十分に活用できるでしょう。
以上のように、OpenAIの gpt-oss-20b モデルをApple Silicon Mac上で動作させ、手軽に試すことができました。GPU対応のllama.cppを使うことで、高価なクラウド環境を用意しなくても手元のMacで高度なAIモデルの推論が可能です。さらに、OpenAI互換APIを立てることで既存のツールやコードからシームレスに利用でき、自作アプリに組み込むことも簡単にできます。興味のある方はぜひチャレンジしてみてください。
補足: 本記事で使用した簡易チャットアプリのソースコードはGitHubリポジトリ に公開しています。
参考資料: