これは matten を紹介する全 4 回シリーズの最終回です。これまでの記事では ライブラリが生まれた背景、数値計算コア、dynamic feature による取り込み を紹介しました。今回はコンパニオン crates と、より重要なこととして、matten を使うのをやめる適切なタイミングについてです。
3 つのコンパニオン crates
matten ワークスペースはコアと並んで、3 つの小さなコンパニオン crates を公開しています。それぞれスコープが狭く、閉じています。いずれもコアの matten crates への依存は追加しません。
matten-ndarray — ndarray へのブリッジ
matten-ndarray は matten::Tensor と ndarray::ArrayD<f64> の間を変換します。それだけです。
use matten::Tensor;
use matten_ndarray::{from_arrayd, to_arrayd};
let t = Tensor::new(vec![1.0, 2.0, 3.0, 4.0], &[2, 2]);
let arr = to_arrayd(&t)?; // Tensor -> ArrayD<f64>
let back = from_arrayd(arr)?; // ArrayD<f64> -> Tensor
これは「受け渡しの瞬間」のために存在します。概念実証がある程度成長し、ホットパスで ndarray のパフォーマンスが必要になったとき、フラットな Vec<f64> データはそのまま移行できます。ステータス:プロダクションレディ。
matten-mlprep — 小さな前処理ヘルパー
matten-mlprep は、数値テンソルをどこか別のツールに渡す前に準備するための、シンプルで決定論的な関数を少し提供します。
use matten::Tensor;
use matten_mlprep::{add_bias_column, standardize_columns, train_test_split};
let x = Tensor::new(vec![1.0, 3.0, 5.0, 7.0], &[4, 1]);
let z = standardize_columns(&x)?; // 列ごとに平均 0、標準偏差 1 に
let z = add_bias_column(&z)?; // 切片列(1.0)を先頭に追加
let (train, test) = train_test_split(&z, 0.75)?;
minmax_scale_columns も使えます。モデルの学習、自動微分、乱数、隠れた状態は一切ありません。それらが必要になったら、本格的な ML crates を使ってください。この crates は意図的に前処理の手前で止まっています。ステータス:プロダクションレディ候補。
matten-data — 列名指定で CSV からテンソルへ
matten-data は、ヘッダー行付きの CSV ファイルからクリーンな数値テンソルへの変換を、列を名前で選びながら行うためのヘルパーです。
use matten_data::Table;
let csv = "sales,cost,note\n10,2,a\n20,,b\n30,4,c";
let tensor = Table::from_csv_str(csv)?
.select_columns(["sales", "cost"])? // 列を名前で選択
.fill_missing(0.0)? // 欠損値を明示的にクリーニング
.try_numeric()? // 変換
.to_tensor()?; // -> matten::Tensor, シェイプ [3, 2]
この crates は設計上 CSV 専用です。JSON の取り込みが必要であれば、コアの matten crates にある from_json や from_json_dynamic を使ってください。ステータス:プロダクションレディ候補。
次のステップへ移行するタイミング
ここがこの記事で一番大事な部分かもしれません。
matten は初期段階の作業を想定しています。アルゴリズムを試す、データパイプラインの概要を描く、Rust での数値アイデアを素早く形にする。そういった用途です。いずれプロジェクトがその役割を超えることもあるでしょう。いつそうなるかについて、具体的に書いておきます。
ndarray や nalgebra にホットパスを移す のは、そこのベンチマーク結果が気になり始めたときです。同じ環境で測ると、matten の 64×64 行列積は ndarray や nalgebra の同等処理に比べておおむね 7〜9 倍の時間がかかります。一度だけ実行する計算なら問題ないことが多いですが、タイトなループの中で繰り返し呼ばれるなら話が変わります。matten-ndarray ブリッジでデータを受け渡せます。
ndarray に直接移行する のは、ストライドビュー、ゼロコピースライス、BLAS 連携が必要になったときです。matten のスライス API はデータをコピーします。ndarray のビューはしません。
専用の ML フレームワーク(Candle、Burn、tch-rs)に移行するのは、自動微分、モデルの学習、GPU アクセラレーションが必要になったときです。matten-mlprep は前処理をカバーしています。それらの代わりにはなりません。
matten をそのまま使い続ける のは、問題が小さく、データがメモリに十分収まり、実行時間よりも開発者の時間の方が貴重である間です。
このライブラリはまだ pre-1.0 です。数値計算コアは実用上安定しており、コンパニオン crates は production-ready 候補です。v1 は、開発者 / メンテナーが準備できたと判断したときにリリースします — スケジュールで決めるものではありません。フィードバックや Issue はリポジトリでご連絡ください。