AIの進化を、ニュースで終わらせない。

技術・研究 · ·

TensorFoldは先読みと検証でローカルAIの生成を速める

TensorFoldはMacや対応するNVIDIA GPUでモデルを動かす推論ランタイムだ。先読みを検証する仕組みと量子化の違い、必要なメモリ、対応モデルを解説する。開発元の測定では単独生成で速くても8同時要求ではvLLMを下回り、用途によって評価が変わる。

同じAIモデルでも、文章を生成するソフトによって待ち時間や必要なメモリは変わる。TensorFoldは、次に出る文章を先に予測し、本体のモデルで確かめてから採用する推論ランタイムだ。対応するMacやNVIDIA GPUで、手元のモデルをアプリから呼び出せる。

ただし、速さは使い方で変わる。開発元のCUDA測定では、単独の生成はvLLMより速い一方、8件を同時に処理すると全体の生成速度は下回った。「exact」という設計上の条件も、量子化前のモデルと同じ答えを保証するものではない。仕組み、機材、比較条件を分けて見ていこう。

この記事は2026年10月2日に確認したTensorFold v0.6.1の技術解説である。対象はashhart/TensorFoldで、同名のtensorfold.aiとは別のプロジェクトだ。LATENTではモデルの導入や性能測定を行っていない。

モデルを動かす役割 / 先読みが速さにつながる理由 / exactの範囲 / 対応機材とモデル / メモリの見積もり / 同時利用で変わる性能 / 導入の前提 / ライセンス / 出典

TensorFoldは学習済みのモデルを動かすソフト

AIモデルには、学習で得た数値の集まりである「重み」が保存されている。推論ランタイムは、その重みを読み込み、入力を処理して次の出力を計算するソフトだ。TensorFold自体に新しい知識を学習させたモデルが含まれるわけではない。

TensorFoldはApple siliconではMLX、対応するNVIDIA GPUではCUDAを使う。どちらもGPUで計算するためのソフトウェア基盤で、TensorFoldはモデルの構造に合わせた計算処理と先読みの検証を実装している。

アプリとの接続にはOpenAI互換APIを用意する。チャット、文章補完、Responses APIの窓口を備え、接続先は既定でhttp://127.0.0.1:8080/v1となる。対応するクライアントなら、接続先とモデルIDを指定してローカルモデルを呼び出せる。ただし、互換とはAPIの形式の話であり、OpenAIのモデルやサービス全機能を再現する意味ではない。API仕様

先読みが当たれば本体の計算をまとめられる

言語モデルは文章を「トークン」という単位で扱う。トークンは単語や単語の一部、記号などに対応し、日本語の1文字や英語の1語と常に一致するわけではない。通常の生成では、そこまでの文章をもとに次の1トークンを選び、その処理を繰り返す。

投機的デコードは、軽い処理で先の候補を作り、本体のモデルでまとめて検証する方法だ。TensorFoldでは、その実行条件で本体が選ぶトークンと一致した候補だけを採用する。予測が外れた先は採用せず、確定した位置から生成を続ける。

MTPはMulti-Token Predictionの略で、複数の先のトークンを予測する仕組みを指す。TensorFoldではモデルに付属するMTPの予測部分や、別に用意したDFlash2などを候補作成に使う。すでにある文脈から続きをコピーして候補にする方法もある。使える方式はモデルごとに違う。

複数の候補を一度に確かめるほうが、本体を1トークンずつ何度も動かすより安く済めば速くなる。ただし、候補を作る時間と検証の時間もかかる。採用される候補が少なければ利益は小さく、GPUの計算資源を別の要求に使ったほうが全体の処理量を増やせる場合もある。設計上の条件と測定方法

exactが保つのは同じ条件で生成するトークン列

TensorFoldが掲げるexactnessは、同じ重み、ランタイム、設定のもとで結果をそろえる条件だ。先読みを使う生成と1トークンずつの生成、保存した文脈からの再開と最初からの処理、同時実行と単独実行をそれぞれ比較する。並列処理に対応する範囲で、計算の順序や丸め方が変わって出力がずれないようにしている。

確率が最も高い候補を選ぶ方法はgreedy、確率に従って候補を選ぶ方法はsamplingと呼ぶ。一般の投機的デコードで「確率分布を保つ」と言う場合、各候補が選ばれる確率を保つことと、毎回同じ文章になることは別だ。TensorFoldの文書はさらに、seedという乱数選択の基準、絶対位置、トークンIDを使い、同じ条件ならsamplingでも先読みの有無によらず同じトークン列にする、と定めている。seedを省略した場合は入力から導く。評価時の条件

この一致は、MLXとCUDAの間、量子化形式の間、複数GPUに計算を分けるrank数の間には及ばない。他の推論実装との一致も別の検証になる。量子化は重みなどを少ないビット数で表す処理で、元の数値を丸める場合がある。量子化後の重みで先読みと通常生成が一致しても、元の高精度モデルと同じ答えになる証明にはならない。

CUDA文書のQwen3.8-27B NVFP4測定は、この違いをよく表す。同じ保存済み重みでも、既定の--precision checkpointでは内部のfp32参照計算とのtop-1一致率が92.9%、--precision fullでは98.9%だった。後者は中間の計算値にbf16を使う設定だ。両設定とも、それぞれの内部では先読みと通常生成の一致を保つ。

ここでのtop-1は、8系列の各4,095位置で「次に最も出そうなトークン」が参照計算と一致した割合を指す。系列はwikitext-2の文章4本とCPythonのコード4本で、参照も同じ保存済み重みによるfp32計算である。92.9%を回答の正答率と読んだり、両者の差を総合的な品質低下率と読んだりはできない。精度の測定条件

使える機材と重み形式はモデルごとに決まる

前提はPython 3.11以降。Mac側のv0.6.1パッケージはMLX 0.32.2以上0.32.4未満を指定する。CUDA側はGPUの機能世代を表すcompute capabilityが8.9以上で、RTX 40系、Hopper、Blackwellなどが対象となる。RTX 30系は起動時に拒否される。

ただし、対応するコードがあることと実機確認済みであることは分けたい。NVFP4の経路はRTX PRO 6000 Blackwell Max-QとDGX Sparkで測定されている一方、SM 8.9、9.0、10.0向けのビルドはBlackwell上で計算を確認した段階で、対象カード上では未実行と記されている。CUDA実装と対応範囲

代表的なモデル文書上の実行環境選ぶ前に確認する点
Qwen3.8-27BMLXとCUDACUDAではDFlash2を用意するか、--no-draftsで通常生成を選ぶ。NVFP4は1rank。
Qwen3.8 Flash NextMLXとCUDAMTPの有無と重み形式を確認する。CUDAの2rankでは同時生成を受け付けない。
Nemotron 3.5 LightningMLXとCUDACUDAは4-bit/group-64形式。MTPを使わない場合は--no-draftsを明示する。
GLM-5.3-Flash256 GB MacのMLXと2rankのCUDACUDAは要求を1件ずつ処理する。任意のDFlash2には別の利用条件がある。
Gemma 4 26B-A4BMLX4-bitのgroup-32または64など、指定された重み構成に限る。
DeepSeek-V4-Flash256 GB MacのMLX専用のDSparkまたはMTPを使える。この版の同ファミリーにCUDA実装はない。

これは代表例で、Ternary Bonsai 2などにも個別の対応がある。Hugging Faceの任意のモデルを読み込めるわけではなく、GGUF形式は読めない。モデル名だけでなく、変換済み重みの形式と補助モデルの組み合わせを対応表で確かめる必要がある。

Windowsネイティブ版は実験段階だ。文書には実際のWindows PCで要求を処理した確認がまだなく、WSL2も未実行と明記されている。Windowsで手順が書かれていることを、動作保証と受け取ることはできない。Windowsの確認状況

重みが収まっても長い会話には追加のメモリが要る

4-bitの数値は16-bitの数値の4分の1のビット数で表せる。そのため量子化で重みを小さくできるが、尺度を表す補助データや高精度のまま残す部分もある。TensorFold公開のQwen3.8-27Bモデルカードでは、重みサイズは16.06 GB、14.95 GiBとされる。これはPC全体で必要になるメモリ量ではない。

実行中は重みに加え、過去のトークンを計算し直さず参照するKVキャッシュやモデル固有の状態、先読み用モデル、一時的な計算領域が必要になる。会話を長くしたり同時利用を増やしたりすると、追加の領域も増える。OSやほかのアプリの使用量も残しておく必要がある。独立したGPUでは、GPU専用のVRAMとPC本体のRAMを別々に見積もる。Macの統合メモリではCPUとGPUが同じ物理メモリを使うため、別々の空き容量として足すことはできない。

TensorFoldは量子化された重みを扱い、会話の再利用や要求の受付をメモリ予算に合わせて管理する。Flash NextのCUDAでは、任意のint8またはint4 KVキャッシュで保存量を減らす選択もある。ただしキャッシュの量子化も計算条件の変更であり、高精度キャッシュと同じ出力を保証する話ではない。

大きなモデルの例では、DeepSeek-V4-FlashのMLXレシピは常駐する重みを約151 GiBと記載する。M3 Ultraの256 GB機でDSparkを使い、64kと128kの入力を処理した測定では、サーバーのピークは165 GiBだった。これは特定条件での開発元測定で、すべての長さや同時利用を満たす必要容量ではない。DeepSeekの容量と測定条件

READMEの容量別の表には、現在もTBD、つまり未確定の欄が多い。64 GB機の数値はTensorFold 0.3.5.1とMLX 0.31.2による過去の測定で、v0.6.1の再確認ではない。Hugging FaceカードにあるMLX-VLMやoMLXの測定値も、それぞれの実行ソフトの結果として読む必要がある。メモリ表と未確認事項

単独生成の速さは同時利用の処理量を保証しない

v0.6.1のCUDAレシピには、開発元がRTX PRO 6000 Blackwell Max-Qを電力上限250 Wで測った比較がある。モデルはnvidia/Qwen3.8-27B-NVFP4。同じ重みと34,816トークンの文脈上限を使い、TensorFoldのDFlash2とvLLMのMTP=3を比べている。回答は256トークンで、生成速度は2回の中央値だ。

下表の単位はトークン毎秒。各セルはコード / チャットの順で、4件と8件は同時要求の合計値である。TensorFold欄は既定のcheckpoint演算で、BlackwellではNVFP4層にFP4、FP8層にFP8の計算を使う。bf16を使うfullの測定も原表にあるが、下表の倍率には含めていない。

同時要求と選び方TensorFoldvLLMTensorFold / vLLM
1件 greedy272.8 / 182.9151.4 / 130.61.80 / 1.40
1件 sampling274.1 / 162.2134.2 / 115.72.04 / 1.40
4件 greedy675.8 / 466.5557.3 / 451.71.21 / 1.03
4件 sampling654.9 / 420.5535.3 / 422.61.22 / 0.99
8件 greedy858.0 / 656.81,009.5 / 907.50.85 / 0.72
8件 sampling834.5 / 584.1896.8 / 730.60.93 / 0.80

単独では1.40〜2.04倍、4件では0.99〜1.22倍、8件では0.72〜0.93倍だった。TensorFold自体の合計生成量は同時要求を増やすと上がるが、8件ではvLLMのほうが多く生成している。1人が回答を待つ場面と、複数人に合計でどれだけ返せるかは、分けて評価したい。

入力を初めて読むcold prefillも別の処理だ。2k、8k、16k、32kトークンの入力で、TensorFoldは順に6,990、7,484、7,100、6,296トークン毎秒。vLLMは7,390、7,804、7,350、6,491で、比率は0.95〜0.97倍だった。こちらは最終ビルドで各長さ3入力の測定と記される。生成が速くても、最初のトークンが届くまでの待ち時間まで一律に短くなるとは言えない。

vLLMのGPUメモリ使用率設定は通常0.29、8件では0.32。比較表にvLLMの版や生成試験の正確な入力トークン数は記されていない。公開の測定手順は最初のトークン以降の生成速度を測るため、入力処理や待ち行列を含む総所要時間とは区別する。上の数値はすべてプロジェクト側の報告であり、LATENTによる独立測定ではない。比較表の原文

導入前にモデル形式と空き容量を確かめる

MacではPythonの仮想環境にTensorFoldを導入する手順がある。CUDAではNVIDIAのPyTorchコンテナを使う方法と、対応RTX向けに仮想環境へPyTorchやCUDAコンパイラーを入れる方法が案内されている。コンパイラーはPyTorchのCUDA版に合わせる必要があり、tensorfold[cuda]という追加パッケージ指定は存在しない。

モデルを選ぶ段階ではtensorfold modelsで候補を一覧し、tensorfold info MODELで設定を確認できる。infoは重みを取得しない。一方、pullは重みをダウンロードし、serveも不足分を取得する。先にモデルカードのファイル容量、対応する先読みモデル、利用条件を確かめたい。

起動後は表示された文脈上限を確認し、/healthと/v1/modelsで状態とモデルIDを確かめてからクライアントを接続する。まず短い会話を1件だけ動かすと、モデルを載せられるかと、長い会話や同時要求を処理できるかを分けて確かめられる。設定値や手順はv0.6.1のRUNBOOKで確認できる。

本体とモデルと先読み用の重みは利用条件が異なる

TensorFoldのランタイムはv0.6.0からApache-2.0で、v0.5.0以前のリリースはMITだった。v0.6.0より前に書かれたコードのMIT告知も残されている。本体にはモデル重みが付属せず、モデルや先読み用の重みにはそれぞれのライセンスが適用される。第三者ライセンスの告知

特にGLMの任意の補助モデルincoai/GLM-5.3-Flash-DFlash2は、モデルカードでCC BY-NC-ND 4.0を掲げる。非商用と改変物の共有禁止の条件があるため、本体のApache-2.0だけを読んで商用利用できると判断することはできない。該当するモデルカード

TensorFoldを選ぶ利点は、対応する手元の機材でAPIを提供し、先読みや会話の再利用によって待ち時間を減らせる可能性にある。採用を判断するなら、まず動かしたい重み形式が対応表にあるかを確認する。そのうえで、自分の入力の長さと同時利用数に近い測定を読み、メモリと利用条件を照合する。単独の最高速度だけでは、その判断はできない。

出典と確認範囲

GitHubの資料はv0.6.1のコミット17c73e189f5e6a5304cda7ea37f086f9c49b4788に固定した。GitHub APIの公開時刻は2026年10月1日20:19:24 UTC、日本時間では10月2日5:19:24。記事はこの版の説明であり、当日に新規公開されたプロジェクトという意味ではない。

  1. READMEとリリースノート。対応モデル、exactness、容量表の確認範囲。
  2. RUNBOOKとpyproject.toml。導入、PythonとMLXの条件、Windowsの未確認状況。
  3. CUDAレシピとDeepSeek-V4-Flashレシピ。性能値は開発元の測定として引用。
  4. レシピ共通の設計条件とAPI仕様。生成列の一致、sampling、測定方法。
  5. LICENSEと第三者ライセンスの告知。本体とモデルの条件を区別。
  6. TensorFoldのHugging Face公開一覧。本文で参照したQwenカードに加え、Flash Next、GLM、Nemotron、DeepSeekのDSparkとMTPのカードを保存して確認。カードの別ランタイムによる測定はTensorFoldの性能値に転用していない。

残る不確実性は、未検証のGPUとWindows環境、現行版の容量別の確認結果、比較相手のvLLMの版などだ。モデルの全形式や長さを網羅した評価、LATENTによる品質・性能の追試は実施していない。