sparsetune
開発状況: v0.1.11 最終更新: 2026-07-31
sparsetune は、ユーザーの疎行列に対して利用可能な CPU / GPU 線形ソルバを
隔離環境で比較し、再現可能な性能・精度レポートと推奨構成を生成する
クロスバックエンド・オートチューナーです。
ソルバそのものを再実装するのではなく、既存バックエンドを安全かつ公平に比較し、 「この行列を一度解く場合」と「同じ行列を繰り返し解く場合」のそれぞれに適した バックエンドを選びます。
[!IMPORTANT] v0.1.11 は PyPI から利用できます。実GPUでの機能検証には Google Colab GPU validation notebookを 使用できます。2026-07-31 の v0.1.11 Tesla T4 実行結果は GPU機能検証レポートにまとめています。
主な特徴
- ユーザー行列中心 — Matrix Market 形式の疎行列を渡すだけで比較
- CPU / GPU 横断比較 — SciPy(CPU)と CuPy(NVIDIA CUDA)に対応
- サブプロセス隔離 — タイムアウト、OOM、プロセスクラッシュをバックエンド単位で捕捉
- 2 種類の性能評価 — 一回の求解向け
end-to-endと反復利用向けsteady-state - 独立した精度検証 — 各バックエンドの解を CPU 上で再検証
- 再現可能なレポート — ハードウェア、ドライバ、ライブラリのバージョンを記録
- チューニング結果の再利用 —
tuneとsolveを分離し、毎回の再計測を回避
対応環境
| 項目 | v0.1.11 |
|---|---|
| Python | 3.10–3.14 |
| CPU バックエンド | SciPy (scipy:cpu) |
| GPU バックエンド | CuPy (cupy:cuda:N) |
| GPU | NVIDIA CUDA 12.x / 13.x |
| ソルバ | 各バックエンドのネイティブ CG |
| 入力 | Matrix Market coordinate(real / integer) |
inspect は非正方行列も受け付け、形状と構造を診断します。CG を実行する
bench、tune、solve は正方行列だけを対象とします。複素数、密行列形式、
マルチ GPU、マルチ RHS、PyTorch、MPS、GMRES、BiCGSTAB、直接法は対象外です。
インストール
PyPI から CPU 版をインストールできます。
pip install "sparsetune==0.1.11"
CUDA を利用する場合は、環境に合う追加依存関係を指定します。
# CUDA 12.x
pip install "sparsetune[cuda12]==0.1.11"
# CUDA 13.x
pip install "sparsetune[cuda13]==0.1.11"
Python 3.10〜3.14をサポートし、CIで各versionを継続検証します。
必須依存関係は NumPy 1.24 以上と SciPy 1.10 以上です。SciPy 1.10/1.11 の
tol と新しいSciPyの rtol の両CG呼び出し規約に対応します。CuPy は任意依存で、
import sparsetune の時点では GPU 検出などの副作用を発生させません。
Google Colab でGPU検証
このノートブックはproduction PyPIの sparsetune==0.1.11 をインストールし、割り当てられた
NVIDIA GPU上でCPU/GPUの収束、相対残差、計測結果、推奨を検証してJSONへ保存します。
ColabのGPU、CPU割り当て、クロック、セッション寿命は変動するため、結果は機能検証であり、
安定した性能ベースラインではありません。
クイックスタート
1. 環境を確認する
sparsetune doctor
2. 行列を調べる
sparsetune inspect model.mtx --format table
3. バックエンドを比較する
sparsetune bench model.mtx \
--backends scipy,cupy \
--runs 5 \
--rtol 1e-6 \
--format table
4. 推奨構成を保存する
sparsetune tune model.mtx --output model.profile.json
5. 保存した構成で解く
sparsetune solve model.mtx \
--profile model.profile.json \
--rhs rhs.mtx \
--output x.mtx
右辺ベクトルを省略した場合は、x = ones を真の解として b = A @ x を生成します。
--profile の代わりに --backend scipy:cpu のようにバックエンドを直接指定することも
できます。
CLIのstdoutには、成功・失敗とも解ベクトルを含まない小さなJSON metrics
(status、残差、反復回数、計測時間など)を出力します。解ベクトルは --output
指定時だけMatrix Market fileへ保存され、stdoutへ重複出力されません。
--quiet はprogressとmetricsを抑制し、結果はexit codeで判定できます。
Python APIの SolveResult.x は引き続き完全な解ベクトルを保持します。
CLI
| コマンド | 説明 |
|---|---|
sparsetune inspect <matrix> |
形状、非ゼロ要素数、対称性などを表示 |
sparsetune bench <matrix> |
利用可能なバックエンドを比較 |
sparsetune tune <matrix> |
比較結果と推奨構成をプロファイルに保存 |
sparsetune solve <matrix> |
プロファイルまたは指定バックエンドで求解 |
sparsetune doctor |
Python、ライブラリ、CUDA、GPU の情報を表示 |
sparsetune --version |
バージョンを表示 |
代表的なベンチマークオプション:
| オプション | デフォルト | 説明 |
|---|---|---|
--backends |
scipy,cupy |
比較するバックエンド |
--dtype |
float64 |
float32 または float64 |
--measure |
end-to-end,steady-state |
計測モード |
--runs |
5 |
試行回数。中央値を採用 |
--rtol |
1e-6 |
相対収束許容値 |
--atol |
0.0 |
絶対収束許容値 |
--max-iter |
10000 |
最大反復回数 |
--timeout |
300.0 |
バックエンドごとの制限時間(秒) |
--assume-spd |
無効 | SPD と仮定して CG を実行 |
--format |
json |
json、table、csv |
すべてのオプションと出力スキーマは CLI 仕様を参照してください。
Python API
import sparsetune
from sparsetune import SolveStatus
A = sparsetune.load_matrix("model.mtx")
profile = sparsetune.tune(
A,
backends=["scipy:cpu", "cupy:cuda:0"],
dtype="float64",
runs=5,
)
result = sparsetune.solve(A, profile=profile)
if result.status == SolveStatus.CONVERGED:
x = result.x
print(result.backend, result.total_seconds)
else:
print(result.status, result.error)
主な公開 API は list_backends()、load_matrix()、inspect()、
benchmark()、tune()、solve() です。solve() は解ベクトルだけでなく、
バックエンド、反復回数、残差、所要時間、終了ステータスを含む SolveResult を返します。
入力行列と SPD 判定
対応する Matrix Market 入力:
- coordinate 形式
- real または integer
symmetric、general、skew-symmetricinspectでは非正方行列も可。bench、tune、solveでは正方行列
CG は対称正定値(SPD)行列向けの反復法です。sparsetune の事前診断は、
対称性と正の対角成分を確認するスクリーニングであり、正定値性を証明しません。
screen_passed— 対称かつ対角成分が正。CG を実行unknown—--assume-spd指定時のみ、ユーザー責任で実行failed— 非対称または非正方。CG を拒否
ベンチマーク方法
| モード | 評価する時間 | 想定用途 |
|---|---|---|
end-to-end |
backend準備(GPUではHost→Device転送を含む)、求解、同期、解の取得 | 正規化済み行列を一度だけ解く |
steady-state |
デバイス上に行列を保持した状態での求解 | 同じ行列を繰り返し解く |
行列ファイルの読込、CSR正規化、RHS生成は親プロセスで先に行うため、どちらの
モードにも含みません。setup_seconds はbackend準備、solve_seconds は求解と同期、
transfer_seconds は解の取得、total_seconds はこれらを合わせたworker内の実時間です。
steady-stateの順位付けには solve_seconds を使い、解の取得時間は含めません。
各バックエンドは独立した worker プロセスで実行されます。モードごとに1回の
計測外warmupを行い、デフォルトではその後に5回計測して中央値を採用します。
あるモードの全sampleがCPU上の独立残差検証にも合格した converged の場合だけ、
そのbackendを同モードの推奨対象にします。一方のモードの失敗は他方の推奨を
無効にしません。
推奨理由と break-even
CPU が一回の求解で最速の場合、end_to_end は次の形になります。
{
"mode": "end-to-end",
"backend": "scipy:cpu",
"reason": "Fastest converged end-to-end result (0.0031 seconds)",
"speedup": 1.7,
"break_even_solves": null
}
GPU が反復利用で最速の場合、転送・セットアップの初期コストを回収する求解回数も 記録されます。
{
"mode": "steady-state",
"backend": "cupy:cuda:0",
"reason": "Fastest converged steady-state result (0.0012 seconds)",
"speedup": 2.4,
"break_even_solves": 8
}
この例では、同じ行列を 8 回以上解くと GPU の初期コストを回収できる計算です。
break_even_solves は最初の求解を1回目とする正の整数で、steady-stateの節約がない
場合や比較可能なCPU結果がない場合は null です。
時間、speedup、break-even は行列と実行環境ごとに変わるため、実際の JSON レポートを
判断に使用してください。収束した GPU 結果がない場合は CPU が選ばれ、
break_even_solves は null になります。
主な終了ステータス:
converged— 収束し、独立残差検証にも合格accuracy_failed— ソルバは成功を返したが、残差が許容値を超過max_iter/breakdown— 反復上限到達または数値的破綻nan_inf— 解に NaN または Inf を検出oom/timeout/process_crash— 隔離 worker 内の実行エラーunsupported/internal_error— 非対応構成または内部エラー
アーキテクチャ
CLI / Python API
|
v
Matrix Inspector -> Experiment Planner
|
v
Subprocess Runner
|- SciPy Worker (CPU)
`- CuPy Worker (CUDA)
|
v
Independent Validator (CPU)
|
v
Recommender -> Profile Cache / JSON
サブプロセス分離により、バックエンド単位のタイムアウト、CUDA コンテキストの破棄、
メモリアロケータの分離、セグメンテーションフォルトからの親プロセス保護を行います。
bench、tune、プロファイル付き solve が利用するGPU可用性と実行環境IDも
検証済みのプローブサブプロセスから取得します。明示的な環境診断である
list_backends() と sparsetune doctor だけは、呼び出し元プロセスでCUDAを検出します。
doctor、benchmark JSON、profile JSON は同じ実行環境fieldを使用します。CPUは
cpu_model、cpu_cores_physical、blas_implementation、SciPy versionを、
GPUは gpu_uuid、gpu_model、cuda_driver、cuda_runtime、cupy_version を
backend identityとして記録します。取得できないportable fieldは null です。
選択backendのidentity変更はprofile mismatch、Python/NumPy/SciPy/CPU/BLAS変更は
明示的なstale-profile opt-inが必要です。
ロードマップ
次の項目は計画であり、上記の v0.1.11 の対応範囲には含まれません。
| バージョン | 予定内容 |
|---|---|
| v0.1.0 | SciPy / CuPy、ネイティブ CG、隔離実行、CLI、プロファイル(リリース済み) |
| v0.1.11 | 互換性・入力検証・再現性・CI/CD・GPU検証の強化(リリース済み) |
| v0.2.0 | PyTorch CUDA、GMRES / BiCGSTAB、メモリ測定改善 |
| v0.3.0 | MPS 実験対応、統一 CG、AMGX の検討 |
ドキュメント
- 機能仕様書 SPEC v2.1
- 開発ワークフロー
- v0.1.11 リリース候補検証レポート
- Tesla T4 GPU機能検証レポート
- v0.1.11 リリースノート
- Google Colab GPU validation notebook
ライセンス
Metadata
Release files for sparsetune 0.1.11
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| sparsetune-0.1.11.tar.gz | 36.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| sparsetune-0.1.11-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 75.2 kB
Release files / sparsetune-0.1.11.tar.gz
| Download URL | sparsetune-0.1.11.tar.gz |
|---|---|
| Size | 36.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ecb4aed86b98482966a467b83873b9d74366305775d260e5c70149a2fb608988
|
|
BLAKE2b-256 checksum How to use checksums |
63f5f79319b7f269369f29bfcf62bbdea21d580e259217be42badd411e38564f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency logRelease files / sparsetune-0.1.11-py3-none-any.whl
| Download URL | sparsetune-0.1.11-py3-none-any.whl |
|---|---|
| Size | 38.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
1f0a5fe179d698adfc91e1b28cc626d0739a4fec217b6791693066b73510c72b
|
|
BLAKE2b-256 checksum How to use checksums |
cf3e2fb481c4cd9191264cac4cc8bdeea9da9da1505c646e41b5b9b7e5b6262f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency log