v0.7.1 支援矩陣¶
本頁描述目前程式碼的公開契約,不代表所有框架或硬體組合都經過同等程度的 CI 驗證。所有 backend 僅接受 float32 或 float64;套件不會暗中啟用 float16、bfloat16 或 Tensor Core reduced precision。
運算後端¶
| Backend | CPU | GPU | dtype | 作業系統範圍 | 安裝 extra | predict 回傳型別 |
主要限制 |
|---|---|---|---|---|---|---|---|
numpy |
是 | 否 | float32, float64 |
Linux、Windows、macOS;三者均進行基線 CI | 無(基礎安裝) | numpy.ndarray |
device="cuda" 會直接報錯;效能取決於 NumPy 連結的 BLAS/LAPACK。 |
native_cpu |
是 | 否 | float32, float64 |
CPython 3.10–3.13;Windows x86-64、manylinux2014 x86-64/aarch64、macOS x86-64/arm64 wheels | renewable-huber-native-cpu==0.7.1 |
numpy.ndarray |
接受 dense NumPy;adapter 最多建立一次 contiguous copy。可由 auto 在 CPU 上選取,但僅在批次夠大且本機執行期量測支持時;要固定使用請明確指定。安裝 wheel 不需本機 Rust toolchain。 |
cupy |
否 | NVIDIA CUDA | float32, float64 |
具 CUDA 12 相容 CuPy wheel 的 Linux/Windows;GPU correctness 與效能在固定本機主機驗證 | gpu-cupy |
cupy.ndarray |
需要可用 NVIDIA GPU、driver 與 CuPy;無 macOS CUDA;首次 NVRTC/cuBLAS 載入有 warm-up 成本。 |
native_cuda |
否 | NVIDIA CUDA | float32, float64 |
CPython 3.10–3.13 × Windows x86-64 與 Linux x86-64(manylinux_2_28)CUDA 12 wheels;本機固定 GPU 驗證 |
renewable-huber-native-cuda==0.7.1 |
numpy.ndarray |
C ABI 2/Python API 4。Opt-in whole-batch engine;penalty="none" 與 penalty="l1",兩者已於 4114918 在固定主機裝置上驗證(Windows、RTX 5070 Ti SM 12.0、CUDA 12.9、driver 616.64、Python 3.11)。L1 同樣須明確指定,backend="auto" 不會選取 native CUDA。更新與 predict 都可接收 host NumPy,或同裝置、完全相同 dtype、C-contiguous 的 CuPy/PyTorch/TensorFlow eager DLPack input,就地讀取、絕不經 host staging;predict 一律回傳 NumPy。PyTorch CUDA tensor 經 DLPack 進入 native CUDA 的更新路徑已於 2026-10-03 在 33cb075 以 PyTorch 2.9.0+cu129 於同一固定主機驗證(PyTorchDlpackIntegrationTests 實際通過,native runtime 仍為 12090)。TensorFlow eager 的 CUDA DLPack 路徑尚未在裝置上驗證:原生 Windows 的 TensorFlow 自 2.11 起不支援 GPU,需待 WSL2/Linux GPU 主機驗證。cuda_graphs 可安全回退;cuda_fast_math 僅限 float32/TF32 且預設關閉。Wheel 不打包 NVIDIA 函式庫,改以 nvidia-*-cu12 相依套件安裝 CUDA 12 runtime closure,不需設定 CUDA_PATH;需要相容 driver,不需本機 nvcc。 |
torch |
是 | NVIDIA CUDA | float32, float64 |
CPU:Linux/Windows/macOS;CUDA:依 PyTorch wheel 支援的 Linux/Windows | gpu-torch |
torch.Tensor |
device="auto" 使用 CPU;輸入會 detach、移至指定裝置並轉 dtype,不提供 autograd layer,也不支援 MPS device。 |
tensorflow |
是 | TensorFlow 可見的 CUDA GPU | float32, float64 |
依 TensorFlow wheel;CPU backend CI 在 Linux,CUDA 通常為 Linux/WSL2 環境 | gpu-tensorflow |
tensorflow.Tensor |
僅 eager execution,不可直接在 tf.function 內使用;device="auto" 使用 CPU;不支援 Metal/MPS device。 |
Native CPU 的 n_jobs=None 使用 extension 的共享 Rayon pool;n_jobs=-1
使用全部邏輯 CPU,正整數則指定確切 worker 數,後兩者建立 estimator-local
pool。它不會修改 Rayon 全域狀態,也不會改變 NumPy、CuPy、Torch 或
TensorFlow 的 thread 設定;非 native backend 的 n_jobs_ 固定為 None。
當 joblib、GridSearchCV 或應用層已平行執行多個 estimator 時,應把每個
native estimator 設為 n_jobs=1,避免巢狀 pool 造成 CPU 過度訂閱。
Native CUDA 的 cuda_graphs 與 cuda_fast_math 都預設為 False。
Graph capture 不可用時會安全回退 strict stream;fast math 只允許 float32
TF32,不適用 float64。fitted estimator 以 cuda_features_ 回報實際狀態與計數。
表中的 OS 範圍仍受 optional dependency 本身的 Python、driver 與硬體相容性限制。專案 CI 對 NumPy 與 native CPU wheel 執行 Python 3.10-3.13 × Linux/Windows/macOS,並在無 GPU 的 Linux runner 上以 release 同一支腳本建置 manylinux_2_28 CUDA wheel、連同 nvidia-*-cu12 runtime 乾淨安裝並匯入;native CPU release 另產生 Linux aarch64 與 Apple Silicon wheels。Torch、TensorFlow 與 scikit-learn optional job 在 Linux CPU 執行;CuPy/native CUDA correctness、profiling、GPU 乾淨安裝與效能只在固定本機 GPU 主機驗證。Release workflow 可由 main 手動執行 build-only rehearsal,或由受信任 tag 建置正式 artifacts;hosted Windows/Linux runner 只編譯、檢查 fat binary 並在無 GPU 條件下驗證 wheel 可載入。CUDA wheel 包含 SM 75、80、86、89、90、120 SASS,且只保留 SM 120 PTX;使用者安裝 wheel 不需 native build toolchain。
Native CUDA wheel 不封裝 NVIDIA runtime。執行時需要 cudart、cuBLAS/cuBLASLt、
cuSOLVER、cuSPARSE 與 nvJitLink(Windows:cudart64_12.dll、cublas64_12.dll、
cublasLt64_12.dll、cusolver64_11.dll、cusparse64_12.dll、
nvJitLink_120_0.dll;Linux:對應的 .so.12/libcusolver.so.11)。這一組
由 wheel 的 nvidia-*-cu12 相依套件提供,匯入時優先完整載入;只有該組不完整時,
才退回 Windows 的 CUDA_PATH/CUDA_PATH_V*/nvcc 所在 toolkit,或 Linux 的
預設 loader 路徑,不會混用兩個來源。
Backend 與裝置選擇¶
| 設定 | 實際結果 |
|---|---|
backend="auto", device="auto" |
NumPy / CPU,或在 CPU dispatch 條件成立時改用 Rust native CPU |
backend="auto", device="cpu" |
同上 |
backend="auto", device="cuda" |
CuPy / 目前 CUDA device(不套用 CPU dispatch) |
backend="numpy", device="auto" |
NumPy / CPU |
backend="native_cpu", device="auto" |
Rust native CPU / NumPy host arrays |
backend="cupy", device="auto" |
CuPy / 目前 CUDA device |
backend="native_cuda", device="auto" |
Native CUDA / device 0 (explicit opt-in) |
backend="torch", device="auto" |
Torch / CPU |
backend="tensorflow", device="auto" |
TensorFlow / CPU |
明確 backend + device="cuda" |
僅在該 backend 能看到 CUDA GPU 時成立,否則拋出 BackendUnavailableError |
CPU dispatch 規則¶
backend="auto" 且 device 非 "cuda" 時,estimator 會在第一個批次(或
checkpoint 還原後的第一個批次)決定使用 NumPy 或 native_cpu,之後整條串流
不再更換 engine。決策依據只有兩項:本機是否能建立 native engine,以及本機
執行期量測。
- 量測是一組固定的小型 probe(1,024–8,192 列、7–33 個參數),與呼叫端的資料 無關,絕不會對使用者的批次重跑一次完整求解。每個 probe 以配對交錯方式量測 兩個 engine:每一輪都跑完兩者,且輪流交換誰先跑,避免先跑者固定承擔首次 觸碰記憶體與 thread pool 啟動的成本。
- 成本硬上限是這組固定 ladder 本身(
2.01e8work units=probe 數 × 輪數 × engine 數 × 迭代數),在任何主機上都不會超出。0.25秒是軟性的 probe 啟動期限:只在 probe 之間檢查,已開始的 probe 一定跑完,因此實際耗時 可能略微超過該值。 - 只有當批次的
samples × parameters²至少為1.5e8時才會啟動量測;整組 probe 的成本約等於該批次 1.34 次迭代的工作量。 - 量測結果快取在 process 內,不寫入磁碟,也不讀取 CPU 型號字串。快取 key
除了
(dtype, penalty, n_jobs),還包含一組執行環境簽章:排序後的 CPU affinity mask 本身(sched_getaffinity;平台不支援時退回cpu_count只 記數量,再不可用則記為 unknown)、七個*_NUM_THREADS環境變數,以及在 optionalthreadpoolctl可用時讀到的實際 BLAS/OpenMP pool 大小。最後一項可 捕捉 scikit-learn/joblib 不修改環境變數的動態 thread limit。記錄的是 mask 而非只有數量,因此即使被重新綁到「同樣數量但不同」的核心集合,舊量測 也會失效。CPU affinity 或 thread 設定一改變,舊量測會被刪除而非沿用;fork之後子行程也會清空整份快取(子行程常被綁在不同核心上)。已有量測後,samples × parameters² ≥ 5.0e4的批次即可直接套用,不需再量測。 - 模型預測的是
native/NumPy比值,並加上一個保守的不確定度裕度(不是統計上 校準過的信賴區間)。只有保守上界低於 0.85 才會改用 native,每一次判斷都 獨立套用同一個門檻;不存在跨 estimator 的黏著狀態,因此同一形狀在同一 process 內永遠得到相同答案,與詢問順序無關。 - extension 缺失、engine 無法建立、probe 例外、量測不足或外推過遠,一律安靜
回到 NumPy。由
auto選中的 native engine 若在建立或第一次更新時拋出任何 一般例外,也會安靜改用 NumPy;明確指定backend="native_cpu"時則照常 拋出。fitted estimator 以auto_dispatch_回報實際決策與理由。
明確指定 backend="numpy" 或 backend="native_cpu" 完全不觸發這套機制,
明確要求的 native_cpu 不會靜默降級;依失敗位置可能拋出
BackendUnavailableError、BackendContractError、ValidationError 或底層執行例外。
checkpoint 只保存 backend="auto",不保存任何量測結果,因此還原後會在新主機
上重新判斷。完整設計與成本推導見
CPU auto-dispatch RFC。
auto 不會檢查輸入是 NumPy、CuPy、Torch 或 TensorFlow tensor。若要保留框架原生回傳型別,必須明確指定該 backend。一般跨框架轉換沒有零複製保證;唯一例外是明確選擇 native_cuda 的 device-update 與 device-predict 路徑:CuPy/PyTorch 直接實作 DLPack consumer-stream negotiation,TensorFlow eager 則透過 legacy capsule adapter 在 export 前呼叫 tf.experimental.async_wait()(或要求已明確啟用同步 eager execution)。後者仍是零拷貝,但會有必要的 producer synchronization。
輸入整合¶
| 輸入/整合 | v0.7.1 狀態 | 限制 |
|---|---|---|
| NumPy array/一般 array-like | 支援 | X 必須為非空二維有限數值,y 會 reshape 成一維且長度必須相同。 |
| pandas DataFrame/Series | 支援 .to_numpy() 轉換;可安裝 pandas extra |
若 DataFrame 欄名全為字串,第一次訓練會記錄欄名,後續 DataFrame 批次與預測會驗證名稱及順序。未命名 array 仍按位置處理。GPU backend 會先經 NumPy,再複製到裝置。 |
| PyTorch tensor | 明確選擇 backend="torch" 時原生支援 |
輸入會 detach;不保留梯度圖。 |
| TensorFlow tensor | 明確選擇 backend="tensorflow" 時原生支援 |
只支援 eager tensor。 |
| CuPy/PyTorch/TensorFlow CUDA tensor | 明確選擇 backend="native_cuda" 時可零拷貝更新 |
三個 batch input 必須全在同一 CUDA device、dtype 完全相同且 C-contiguous;PyTorch 會以共享 storage 的 detach() view 移除 autograd;TensorFlow 只支援 eager GPU tensor。CuPy 與 PyTorch 路徑已在固定 GPU 主機的裝置上驗證;TensorFlow eager 路徑尚未在裝置上驗證。 |
| SciPy sparse | 明確拒絕 | 不會隱式 densify;呼叫端必須評估記憶體後明確使用 X.toarray()。 |
| pandas sparse | 經 pandas .to_numpy() 轉為 dense |
轉換可能配置完整 dense array,大型資料應先評估記憶體。 |
sample_weight |
fit、partial_fit、score 支援 |
必須是一維、有限、非負且至少一個正值;採 frequency-weight 語意,整數權重等價於重複該列。 |
| scikit-learn adapter | 安裝 sklearn extra 後支援 |
提供 Pipeline、clone、GridSearchCV、cross-validation、sample_weight,CI 會對安裝到的支援版本執行完整 check_estimator。 |
Checkpoint 與重現性¶
.npz不使用 pickle,數值陣列以 NumPy 格式保存;checkpoint 不包含歷史X/y。backend、device與dtype會隨設定保存。load(path)依原設定重建 backend,不會無聲降級。load(path, backend=..., device=..., dtype=...)可明確覆寫還原目標;因此 GPU checkpoint 可在沒有 GPU extra 的環境遷移至 NumPy CPU。- 未提供 override 時,載入非 NumPy checkpoint 需要相同 optional dependency;CUDA 設定也需要可用的相容 GPU。
- v2 checkpoint 保存累積權重與 DataFrame 欄名;v1 checkpoint 仍可讀取,並將每列視為單位權重。
- 以相同 backend、dtype、批次順序與後續資料續跑,才是預期的可重現流程。不同 backend 或 dtype 只保證合理數值容差內的一致性,不保證逐位元一致。
- Renewable 更新依賴前一批 state,因此資料分批方式與順序可能影響有限樣本及浮點結果;一次
fit、不同 batch 切法或重新排序不保證產生相同模型。