2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Jupyter Notebook + RTX5000シリーズで gpt-oss-20b を試す

Posted at

OpenAIのオープンなモデル登場

OpenAIからオープンなLLMモデルが公開されました。これまでのあまりオープンではないモデルと違い、すべてのパラメータが公開されているモデルで、gemmaやllamaといったモデルと同様の位置づけと理解しています。

以下、OpenAI社のWebサイトに記載されている宣伝文句です。

オープンウェイト&ライセンス
OpenAI は gpt-oss‑20b を Apache 2.0 ライセンス付きで公開しており、商用利用・改変も自由に可能です。
モデルの重みは、Hugging FaceやAzure、AWS、Databricksなどで誰でもダウンロード可能であり、完全に透過的に公開されています。

gpt-oss-20b モデルは、一般的なベンチマークで OpenAI o3‑mini と同様の結果を出し、わずか16GBのメモリを搭載したエッジデバイスで実行でき、デバイス上のユースケース、ローカル推論、またはコストのかかるインフラストラクチャなしに、迅速な反復処理をこなします。

つまり、わずか16GBのメモリを搭載したGPUを持っていれば、ローカルでo3-mini相当のAIが動くということです。

16GBをわずかと言ってしまうところがナニですが、16GBのGRAMを搭載したモデルは、ざっと思いつく範囲で4060Ti, 4070TiSuper, 4080, 4090, 5060Ti, 5070Ti, 5080, 5090あたりでしょう。今回は、5080と5090を使ってテストしてみました。

Hugging Faceでモデルが公開されていますが、ドキュメントをよく見ると以下のような記載がありました。

Native MXFP4 quantization: The models are trained with native MXFP4 precision
for the MoE layer, making gpt-oss-120b run on a single 80GB GPU (like NVIDIA
H100 or AMD MI300X) and the gpt-oss-20b model run within 16GB of memory.

20b(200億)のパラメータは、単純計算で16bit量子化の場合40GBとなります。つまり、16bitの量子化の20bモデルを16GBのメモリで動作させるのは不可能なのですが、gpt-oss-20bは、MXFP4という4bitサイズで量子化されています。つまり、単純計算では10GBのメモリに収まるということです。実際にはオーバーヘッドがあるので、16GB弱のメモリを必要とするのですが、OpenAIの言う通り16GBのGRAMを持つGPUで動作可能ということになります。

ところが、このMXFP4というフォーマットは、RTX5000のBlackwell世代でサポートされたフォーマットになります。つまり、前世代(RTX4000シリーズ、A100など)のGPUではMXFP4は使用できず、そのままでは16GBのGRAMで動かすということができません。

試しに、gpt-oss-20bをgoogle-colabのA100(40GB)でロードしようと試みたところ、out of memoryでクラッシュしました。fp4が使えないGPUでは、bf16でロードされるため、47GB程度のGRAMを必要とするようです。

Jupyer Notebook + RTX5080で動作させる

幸運なことに、私の手元にはRTX5090とRTX5080があるため、これらのGPUでgpt-oss-20bを試してみることにしました。

Step-1 Hugging Faceでモデルを確認

HuggingFaceで、"gpt-oss-20b"で検索したところ、すぐに見つかりました。

https://huggingface.co/openai/gpt-oss-20b

Step-2 サンプルプログラムを実行

トップページに以下のようなプログラム例があったので、google-colab + LocalGPU(5090)の環境で動かしてみました。

!pip install -U transformers kernels torch

from transformers import pipeline
import torch

model_id = "openai/gpt-oss-20b"

pipe = pipeline(
    "text-generation",
    model=model_id,
    torch_dtype="auto",
    device_map="auto",
)

messages = [
    {"role": "user", "content": "Explain quantum mechanics clearly and concisely."},
]

outputs = pipe(
    messages,
    max_new_tokens=256,
)
print(outputs[0]["generated_text"][-1])

実行したところ、"pipelineなんぞ知らん"というエラーでとまります。
transformersが古いようで、-Uオプションではなぜか更新されず、

!pip uninstall -y transformers
!pip install transformers

とやったところ、pipelineは認識してくれました。

MXFP4でロードしてくれない

再び実行したところ、何やら怪しげなメッセージがでます。

MXFP4 quantization requires triton >= 3.4.0 and kernels installed, we will default to dequantizing the model to bf16

案の定、GRAMをどんどん食いつぶしていき、メインメモリまで浸食されてほぼフリーズ状態に。5090の32GBのGRAMはいっぱいになり、メインメモリも28GBほど浸食されました。この状態でピクリとも動かなくなり、JupyterNotebookを再起動しました。

メッセージのとおり、tritonのバージョンが古いようですが、

!pip install -U triton

とやってもうまくいきません。いろいろ調べた結果、以下の方法でインストールできました。

!pip install  -U "triton>=3.4.0"  "git+https://github.com/triton-lang/triton@v3.4.0#subdirectory=python/triton_kernels"

どうやら、toriton_kernelsなるものも必要で、しかもpip単独では見つけられず、gitからインストールが必要でした。

ところが、これでもMXFP4でロードしてくれません。triton#3.4.0をインストールすると、torch@2.8.0を要求されるのですが、インストールされているvllmやtorchvisonと競合してパッケージがうまくインストールされていませんでした。

そこで、競合しそうなライブラリをアンインストールし、なんとかインストールできました。

tramsformersも、pip install -Uでインストールしたバージョンではうまくいかず、

!pip install git+https://github.com/huggingface/transformers kernels

こうやってgithubから最新をインストールすることで、無事にMXFP4でロードすることに成功しました。

私の手元でMXFP4でロードに成功したときの、各モジュールのバージョンです。

transformers: 4.56.0.dev0
kernerls: True
tokenizers: 0.21.1
huggingface_hub: 0.34.2
triton: 3.4.0
triton_kernels: True
torch: 2.8.0+cu128

16GBのGPUでgpt-oss-20bの実行に成功!

四苦八苦の末、なんとか動きました。
ただ、このモデルは、Instruction Tunning前の素のモデルのためか、日本語でプロンプトを入れても英語交じりで答えてきます。品質も日本語で指示するといまひとつで、ITしないと使い物にならない感じです。これはgemmaやlammaでも同じなのですが、o3-mini相当という謳い文句に少々期待してしまいました。
RTX5080(16GB)で、消費メモリは14.0GBでした。OpenAIの公称どおり、16GBのメモリで余裕です!

入力
[ {"role": "user", "content": "gpt-oss-20bの特徴を日本語で300字以内で述べよ。"},]

出力
{'role': 'assistant', 'content': 'analysisWe need to write about gpt-oss-20b, presumably a 20B parameter GPT open-source model. Features: architecture, training data, tokenization, speed, efficiency, safety, fine-tuning, inference, compute requirements. Japanese, 300 characters or less. Need to stay within 300 characters. Let's aim around 280 characters. We can count roughly: each Japanese character counts as 1. Let's produce about 280. We'll avoid exceeding. Let's draft:\n\n"gpt-oss‑20bは20億引数のTransformerベースLLM。大規模テキストで事前学習され、語彙は5万語程度。コンテキストウィンドウは8,192トークンまで。GPU1枚で推論可、低コストで高精度。オープンソースでカスタムファインチューニングが容易。"\n\nCount approximate: let's count: characters:\n\ng (1) p (2) t (3) - (4) o (5) s (6) s (7) - (8) 2 (9) 0 (10) b (11) は (12) 2 ('}


うーむ、gpt-oss-20bのコンテキストサイズは128Kトークンのはずですが、自分の事なのに嘘ついてますよね。(実は128Kが嘘だったりして)最後に意味不明の文字もあるし、ベースモデルをそのままチャットに使うには無理があるという事でしょうか。

Jupyer Notebook用コード

google-colab + Docker + Jupyter Notebookの環境で動作したコードです。

# 競合する可能性のライブラリをアンインストールしておく
!pip uninstall -y vllm
!pip uninstall -y transformers kernels
!pip uninstall -y triton triton_kernels
!pip uninstall -y torch torchvision torchaudio

# 必要なライブラリのインストール
!pip install torch==2.8.0 --index-url https://download.pytorch.org/whl/test/cu128

# 最新のtransformers
!pip install git+https://github.com/huggingface/transformers kernels

# Install triton kernels for mxfp4 support
!pip install  -U "triton>=3.4.0"  "git+https://github.com/triton-lang/triton@v3.4.0#subdirectory=python/triton_kernels"

import transformers, tokenizers, huggingface_hub, kernels
import triton, importlib;
print("transformers:", transformers.__version__)
print("kernerls:", importlib.util.find_spec('kernels') is not None)
print("tokenizers:", tokenizers.__version__)
print("huggingface_hub:", huggingface_hub.__version__)

print("triton:", triton.__version__);
print('triton_kernels:', importlib.util.find_spec('triton_kernels') is not None)

import torch
print("torch:", torch.__version__)

"""
以下のバージョンの組み合わせで動作確認しました。

transformers: 4.56.0.dev0
kernerls: True
tokenizers: 0.21.1
huggingface_hub: 0.34.2
triton: 3.4.0
triton_kernels: True
torch: 2.8.0+cu128
"""

# gpt-oss-20bのロード (Hugging Faceのサンプルプログラム)
# FP4に対応しているGPU(RTX5000シリーズなどのBlackWellベース)ならば、16GB程度のGRAMでロード可能
# それ以外の古いGPUの場合、47GB程度のGRAMが必要)
# 以下のメッセージが出た場合は、FP4でのロードに失敗
# 'MXFP4 quantization requires triton >= 3.4.0 and kernels installed, we will default to dequantizing the model to bf16'
from transformers import pipeline
import torch

model_id = "openai/gpt-oss-20b"

pipe = pipeline(
    "text-generation",
    model=model_id,
    torch_dtype="auto",
    device_map="auto",
)

messages = [
    {"role": "user", "content": "gpt-oss-20bの特徴を日本語で300字以内で述べよ。"},
]

outputs = pipe(
    messages,
    max_new_tokens=256,
)
print(outputs[0]["generated_text"][-1])

実は、HuggingFaceのサンプルプログラムにあるpipelineではなくAutoModelForCausalLMを使うバージョンも作ってきました。個人的には、こちらのほうが馴染みがあります。ライブラリのインストールの部分は共通です。
toransformersが古いと、GptOssForCausalLMでエラーになります。

import transformers
from transformers import AutoModelForCausalLM, AutoTokenizer, GptOssForCausalLM

model_id = "openai/gpt-oss-20b"

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    device_map="auto",
    torch_dtype="auto",
    trust_remote_code=True,
)

messages = [
    {"role": "user", "content": "How many rs are in the word 'strawberry'?"},
]

inputs = tokenizer.apply_chat_template(
    messages,
    add_generation_prompt=True,
    return_tensors="pt",
    return_dict=True,
).to(model.device)

generated = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(generated[0][inputs["input_ids"].shape[-1]:]))

さいごに

今回は、gpt-oss-20bをロードするだけでした。今後は、学習させてgpt-oss-20bの本領を発揮させてみたいと思います。MXFP4をネイティブにサポートしているRTX5090のおかげで、推論速度は充分速いと感じました。
ただ、学習させるのは少々大変そうです。そのうち"IT"モデルがでそうなので、Instruction Tunningはそれまで待ったほうが良いかもしれません。そのあとでLoRA等でFTできればとおもいます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?