StrataをWindows 11で試す。RTX 5070 Ti 16GBとメモリ32GBで動かした

StrataをWindows 11で動かし,RTX 5070 Ti 16GBとメモリ32GBでQwen3.8-Flash-Next Q2_0から回答を返せました.繰り返し測定の生成速度は,依頼別の中央値で約50~76tokens/sでした.

ただし,初回は遅く,RAMもほぼ全量を使う場面がありました.日本語で説明を頼んでも中国語の語句が混ざります.大きなモデルが起動するところと,欲しい回答が得られるところは分けて確認しました.

Strataは何をするソフトか

Strataは,対応する大規模言語モデルを自分のPCで動かすための実行環境です.デスクトップアプリとTerminal版があり,チャットのほか,OpenAI互換・Anthropic互換APIで外部のクライアントから呼び出せます.StrataのコードはMITライセンスで,モデルの利用条件は配布元のライセンスに従います.公式リポジトリで公開されています.

今回動かすのは,Qwen3.8-Flash-NextをISTA-DASLabが量子化したQ2_0です.Qwenが回答を生成するモデル,Strataがその計算を実行する側,Q2_0が重みの保存形式,という関係になります.「Strataという新しいAIモデルを入れる」と考えると,少し混乱します.

Qwen公式のモデル説明では,本体は125B,1トークンで使うのは6Bで,別に51Bのn-gram埋め込みと4BのMTPがあります.Bは10億なので,本体だけで約1,250億パラメータです.

このモデルはMoE(Mixture of Experts)型です.48層の各MoEに512個のエキスパートがあり,ルーターが入力に応じて10個を選びます.これとは別に共有エキスパートも使います.全エキスパートを毎回計算する構造ではありません.ただし,「毎回使うのが一部」でも,次にどれが選ばれるか分からないので,残りの重みを捨ててよいわけではありません.

Strataは,GPUで共通処理とよく使うエキスパートを計算し,GPUにないエキスパートはCPU側でも計算します.n-gramの参照テーブルはSSDに置いて必要な行を読みます.RAMが足りない場合はエキスパートもファイルから読む方式になります.「大きなモデルを16GBへ全部圧縮して載せる」という仕組みではなく,PC全体で置き場所と仕事を分担しています(公式の仕組み説明,メモリ動作の説明).

今回の構成と,モデルの選び方

検証日は2026年11月4日です.Windows上で直接実行しました.

項目 構成
OS Windows 11 Home 26H2,ビルド26300.9711
CPU Intel Core i7-14700F,20コア/28スレッド
RAM 32GB(OSから見える容量は31.8GiB)
GPU NVIDIA GeForce RTX 5070 Ti 16GB
NVIDIAドライバー 610.88
保存先 ローカルのNVMe SSD
Strata 0.2.10,Control/推論エンジン0.1.56
Python Terminal配布物に同梱の3.12.15
モデル Qwen3.8-Flash-Next,ISTA-DASLab Q2_0
起動条件 コンテキスト8,192,並列1,画像入力なし,ローカル接続
高速化・メモリ設定 DFlash2,VRAM予備1,152MiB,エキスパートはmmap

以前のOllamaで4B・8B・12Bを動かした記事と同じGPUですが,今回はVRAMへ全体が収まらない規模を扱います.モデルと入力条件が異なるため,以前の記事のtokens/sと並べてエンジンの優劣を決める比較にはしません.

Q2_0は元のモデルを低いビット幅で保存した量子化版です.容量を減らす代わりに,元の重みを厳密には再現しません.ファイル名の「Q2」だけから,モデル全体がちょうど2bitで保存されているとも限りません.

公式のモデル一覧では,Q2_0のエキスパートだけで約34GBあります.このPCのRAMでは,OSやほかのアプリの分も考えると全量を置けません.低メモリ動作でどうなるかを確認する構成です.

Terminal版を入れて起動する

今回はGUIインストーラーではなく,v0.2.10のGitHub ReleasesにあるWindows x64用Control配布物を展開して使いました.Pythonと必要なパッケージが同梱されているため,PythonやCUDA Toolkit,コンパイラーは追加していません.

PowerShellで,作業用フォルダーへ移動して実行します.strata-runtimeは新しく作るフォルダー名です.

$release = 'https://github.com/Niko1221/Strata/releases/download/v0.2.10'
$archive = 'strata-control-0.1.56-windows-x86_64.zip'
Invoke-WebRequest "$release/$archive" -OutFile $archive
$actual = (Get-FileHash -Algorithm SHA256 $archive).Hash
$expected = 'EF74F429C60341048A68249D41699142A1EC3716CEE322621875E823F4EAD873'
if ($actual -ne $expected) { throw 'SHA-256が一致しません' }
Expand-Archive -LiteralPath $archive -DestinationPath .\strata-runtime
$strata = (Resolve-Path .\strata-runtime\bin\strata.cmd).Path
& $strata --version
& $strata update --check --no-engine --feed $release

SHA-256は同じリリースのinstall-manifest.txtと照合しました.続く確認では,組み込み鍵で署名された更新フィードを読めました.アプリのバージョンは0.2.10ですが,Controlとエンジンのバージョンは0.1.56です.数字が違っていても,ここでは取り違えではありません.

この環境では,初回のモデル準備がFileNotFoundErrorで止まりました.不足していると表示されたのは,補助的に取得するllama.cpp内のGgufMetadataReaderImpl.ktです.エラーになった展開先は262文字で,Windowsのパス長制限に当たっていました.STRATA_INSTALL_DIRで短い場所を指定して再実行すると,同じ取得済みモデルと同じ補助ZIPで準備を続けられました.OSの設定やStrataのコードは変更していません.

再現時は作業フォルダー自体を深い場所に置かず,準備用の保存先を指定します.新しいPowerShellを開いた場合も,起動前にこの変数を設定します.

$env:STRATA_INSTALL_DIR = Join-Path (Get-Location) 'strata-install'

モデルを取る前に,起動プランを表示します.--data-dirへ相対パスを渡すと,This is not a full pathで止まりました.ここでは作業フォルダーから絶対パスを組み立てています.

$modelDir = Join-Path (Get-Location) 'strata-models'
& $strata launch --family qwen --model q2_0 `
  --context 8k --parallel 1 --vision off `
  --data-dir $modelDir --feed $release --plan --output json

この版のプランでは,モデルが66.4GB,先のトークンを予測するDFlash2が1.2GB,合計約67.6GBでした.別にCUDA版エンジン約628MBと,展開・準備用の空き容量が必要です.ダウンロード量と実行時のRAM使用量は別の値なので,混同しないようにします.

初回の自動設定では,モデル読み込み後のVRAM空きが688MiBしかなく,エンジンに余裕不足の表示が出ました.そこでVRAMの予備領域を1,152MiBへ増やしています.下はこの変更を含む起動コマンドです.

& $strata launch --family qwen --model q2_0 `
  --context 8k --parallel 1 --vision off `
  --data-dir $modelDir --access local --port 8080 `
  --set vram-reserve-mib=1152 `
  --save-preset 'Strata Q2 8K local' --feed $release --yes --no-tui

最初にGPUに合うエンジンが取得され,署名と各ファイルの検証,エンジンの試験起動が行われました.その後にモデルの取得と準備が続きます.--no-tuiは対話画面を開かない指定です.起動コマンドが戻った後も,サーバーはバックグラウンドで動きます.

RAMが足りないため,初回準備では約34.0GBのexperts.binも作成されました.最終的にモデル関連フォルダーは約102.8GBです.約68GBのダウンロードだけを見て保存先を決めると,この追加分を見落とします.

最初のモデル起動コマンドから稼働確認までは,パス長の修正も含め約28分でした.Terminal自体の取得時間は含みません.更新した設定では,モデル読み込み後に1,155MiBのVRAM空きを確認できました.GPUには6千個台のエキスパートを置き,残りは--mmap-expertsでファイルから読む動作です.CPU側は13ワーカーでした.

起動ログではSTRATA_ROUTE_TAIL_SKIP=7も既定で有効でした.これは,検証ウィンドウ内で順位が低い未キャッシュのエキスパートを一部省略する最適化です.今回はこの既定動作を有効にしたまま測っています.

ローカルAPIから回答させる

/healthはstatus=ok,loaded=trueを返し,/v1/modelsにはqwen3.8-flash-next-q2_0が現れました.ダウンロード完了や起動コマンドの終了だけでなく,読み込み済みであることを確認します.

& $strata launch --status
Invoke-RestMethod 'http://127.0.0.1:8080/health'
Invoke-RestMethod 'http://127.0.0.1:8080/v1/models'

$request = @{
  model = (Invoke-RestMethod 'http://127.0.0.1:8080/v1/models').data[0].id
  messages = @(@{role='user'; content='VRAMとメインメモリの違いを日本語で3文で説明してください。'})
  max_tokens = 256
  temperature = 0
  chat_template_kwargs = @{enable_thinking=$false}
} | ConvertTo-Json -Depth 6
$reply = Invoke-RestMethod -Method Post `
  -Uri 'http://127.0.0.1:8080/v1/chat/completions' `
  -ContentType 'application/json; charset=utf-8' `
  -Body ([Text.Encoding]::UTF8.GetBytes($request))
$reply.choices[0].message.content

enable_thinking=falseは,回答前の推論出力を無効にする指定です.速度を測るときも同じ条件にしました.指定なしの既定動作とは条件が異なります.

応答の待ち時間と,出てきた内容

VRAMとRAMの説明,XORチェックサム関数の生成,MoEの説明を順番に3回ずつ依頼しました.測定前の1回は別に記録しています.温度は0,seedは42,推論出力は無効です.リクエストは1件ずつ送りました.

依頼 本文開始の中央値 完了までの中央値 生成速度の中央値
VRAMとRAMの説明 0.466秒 4.58秒 54.5tokens/s
Python関数の生成 0.771秒 1.52秒 50.2tokens/s
MoEの説明 0.722秒 3.78秒 75.6tokens/s

本文開始は,HTTPリクエスト開始から最初の空でない本文差分を受信するまでです.生成速度はStrataが返すtimings.predicted_per_secondで,入力処理時間を含みません.tokens/sは文字数/秒ではありません.9回ともfinish_reason=stopで,出力上限による途中終了はありませんでした.

最初に送ったVRAMの説明は,本文開始まで3.62秒,完了まで23.83秒,生成速度13.2tokens/sでした.表はその後の繰り返しです.同じ入力と出力の傾向を繰り返すため,入力キャッシュやエキスパートのファイルキャッシュが効きます.Pythonの短い38トークンの出力でも,生成速度は14.1→50.2→81.3tokens/sと変わりました.毎回この表の中央値で返るわけではありません.

回答内容も見ました.VRAMの説明では,たとえば次の一文が返りました.原文のままです.

メインメモリ(RAM)はCPUがデータ処理に使用する広範なワークスペースです。一方、VRAMはGPU専用的高速記憶領域であり、主に3D图形渲染、纹理存储、およびAI模型运算所需的临时数据を保存するために設計されています。

日本語を指定しても,3回とも中国語の語句が混ざりました.温度と推論設定を省略し,推論出力が有効な通常設定でも同じ依頼を追加で1回送りましたが,39.4秒後の本文にも中国語が混ざりました.元精度のモデルや別の量子化形式,最適化を切った条件との比較はしていないので,この結果だけから原因までは決められません.

MoEの説明は日本語の文章でしたが,「計算するのが一部」という話から,重みの保存容量まで同じ割合で減ると受け取れる説明になっていました.今回RAMやSSDを使って動かしていることからも,計算量と保存しておく重みの量は分けて読む必要があります.

一方,生成されたPythonコードは3回とも次の形でした.

def xor_checksum(data: bytes) -> int:
    result = 0
    for byte in data:
        result ^= byte
    return result

コードを確認してから実行し,空入力,0x00,0xFF,既知のバイト列,0~255の全バイト,長さの異なる乱数列など,1関数あたり106入力を調べました.3出力の計318回ですべて期待値と一致しました.確認したコード生成の範囲は,この短い1関数までです.

メモリも約1秒間隔で記録しました.これはOSやデスクトップ,ほかのアプリ,ファイルキャッシュを含むPC全体の値で,モデル単体の占有量ではありません.

観測した値 最大値
初回準備中のRAM使用量(総容量-Available) 31.8GiB
測定中のRAM使用量(同上) 31.7GiB
測定中のGPUメモリ使用量(nvidia-smi) 15,124MiB

RAM 32GBでも回答は返りましたが,余裕のある動作ではありませんでした.準備中には空きRAMが数十MiBまで減る場面もあります.VRAM 16GBだけで完結するモデルのようには扱えません.

測定に使ったスクリプトはGitHubのStrata実験フォルダーへ置いています.プロンプトとリクエスト条件を含み,応答本文,待ち時間,使用トークン数,入力キャッシュ数,生成速度をJSONへ保存します.生成したコードを自動実行する処理はありません.

同じPowerShellで作業を続ける場合は,次のように再測定できます.$strataは上で展開した起動コマンドの絶対パスです.

git clone --depth 1 --single-branch --branch strata-windows11 https://github.com/matrizea/yuyuyuroom-ai-experiments.git ai-experiments
$runtimeRoot = Split-Path (Split-Path $strata -Parent) -Parent
$python = Join-Path $runtimeRoot 'python/python.exe'
& $python .\ai-experiments\experiments\strata-windows11\measure_strata.py --output .\strata-results.json

使い終わったら,この起動コマンドで立ち上げたモデルを止めます.次回は保存したプリセットで起動できます.

& $strata launch --stop
& $strata launch --preset 'Strata Q2 8K local' --no-tui

今回の起動は--access localで,接続先は127.0.0.1:8080です.モデルとエンジンの取得にはインターネットを使いますが,回答の計算はこのPCで行います.外部サービスやWeb検索を接続した場合の通信まで含めて,「Strataなら何をしても外へ出ない」とは扱いません.

Ollamaの小型モデルと必要容量を比べる場合は,ローカルAI用PCのVRAM・RAM・SSD容量を整理した記事も参照してください.