domain-ml について
Rust で推論やデータパイプラインを設計する開発者向けの機械学習ドメインスキルです。メモリ使用量、GPU 利用率、モデルの可搬性、再現性などの制約を実装指針にまとめています。
主な機能
- 01テンソルのメモリ効率化
- 02バッチ処理とストリーミング
- 03GPU 利用に関する指針
- 04モデル形式の可搬性に関する指針
- 05機械学習タスク別のクレート提案
活用シーン
- 01Rust 推論パイプラインの設計
- 02学習・推論用クレートの選定
- 03大規模データセットの効率的な処理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill domain-mlインストール後、Claude Code で/domain-mlを入力して読み込まれたか確認します。
詳細
機械学習ドメイン
レイヤー 3:ドメイン制約
ドメイン制約 → 設計への影響
| ドメインルール | 設計上の制約 | Rust での対応 |
|---|---|---|
| 大容量データ | メモリー効率 | ゼロコピー、ストリーミング |
| GPU アクセラレーション | CUDA/Metal のサポート | candle、tch-rs |
| モデルのポータビリティ | 標準形式 | ONNX |
| バッチ処理 | レイテンシーよりスループットを優先 | バッチ推論 |
| 数値精度 | 浮動小数点数の扱い | ndarray、f32/f64 に注意 |
| 再現性 | 決定論的な処理 | シード付き乱数、バージョン管理 |
重要な制約
メモリー効率
RULE: Avoid copying large tensors
WHY: Memory bandwidth is bottleneck
RUST: References, views, in-place ops
GPU の利用
RULE: Batch operations for GPU efficiency
WHY: GPU overhead per kernel launch
RUST: Batch sizes, async data loading
モデルのポータビリティ
RULE: Use standard model formats
WHY: Train in Python, deploy in Rust
RUST: ONNX via tract or candle
下位レイヤーへのトレース ↓
制約から設計へ(レイヤー 2):
"Need efficient data pipelines"
↓ m10-performance: Streaming, batching
↓ polars: Lazy evaluation
"Need GPU inference"
↓ m07-concurrency: Async data loading
↓ candle/tch-rs: CUDA backend
"Need model loading"
↓ m12-lifecycle: Lazy init, caching
↓ tract: ONNX runtime
ユースケース → フレームワーク
| ユースケース | 推奨 | 理由 |
|---|---|---|
| 推論のみ | tract (ONNX) | 軽量でポータブル |
| 学習+推論 | candle、burn | 純粋な Rust、GPU |
| PyTorch モデル | tch-rs | 直接バインディング |
| データパイプライン | polars | 高速で遅延評価 |
主要なクレート
| 用途 | クレート |
|---|---|
| テンソル | ndarray |
| ONNX 推論 | tract |
| ML フレームワーク | candle、burn |
| PyTorch バインディング | tch-rs |
| データ処理 | polars |
| 埋め込み | fastembed |
設計パターン
| パターン | 目的 | 実装 |
|---|---|---|
| モデルの読み込み | 一度だけ読み込み、再利用 | OnceLock<Model> |
| バッチ処理 | スループット | 収集してから処理 |
| ストリーミング | 大容量データ | イテレーター方式 |
| GPU 非同期処理 | 並列処理 | 計算と並行してデータを読み込み |
コードパターン:推論サーバー
use std::sync::OnceLock;
use tract_onnx::prelude::*;
static MODEL: OnceLock<SimplePlan<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>>> = OnceLock::new();
fn get_model() -> &'static SimplePlan<...> {
MODEL.get_or_init(|| {
tract_onnx::onnx()
.model_for_path("model.onnx")
.unwrap()
.into_optimized()
.unwrap()
.into_runnable()
.unwrap()
})
}
async fn predict(input: Vec<f32>) -> anyhow::Result<Vec<f32>> {
let model = get_model();
let input = tract_ndarray::arr1(&input).into_shape((1, input.len()))?;
let result = model.run(tvec!(input.into()))?;
Ok(result[0].to_array_view::<f32>()?.iter().copied().collect())
}
コードパターン:バッチ推論
async fn batch_predict(inputs: Vec<Vec<f32>>, batch_size: usize) -> Vec<Vec<f32>> {
let mut results = Vec::with_capacity(inputs.len());
for batch in inputs.chunks(batch_size) {
// Stack inputs into batch tensor
let batch_tensor = stack_inputs(batch);
// Run inference on batch
let batch_output = model.run(batch_tensor).await;
// Unstack results
results.extend(unstack_outputs(batch_output));
}
results
}
よくある間違い
| 間違い | ドメイン上の違反 | 修正方法 |
|---|---|---|
| テンソルをクローンする | メモリーの浪費 | ビューを使用する |
| 単一の推論 | GPU の利用不足 | バッチ処理 |
| リクエストごとにモデルを読み込む | 処理が遅い | シングルトンパターン |
| 同期データ読み込み | GPU のアイドル状態 | 非同期パイプライン |
レイヤー 1 へのトレース
| 制約 | レイヤー 2 のパターン | レイヤー 1 の実装 |
|---|---|---|
| メモリー効率 | ゼロコピー | ndarray のビュー |
| モデルのシングルトン化 | 遅延初期化 | OnceLock |
| バッチ処理 | チャンク単位の反復 | chunks() + parallel |
| GPU 非同期処理 | 並行読み込み | tokio::spawn + GPU |
関連スキル
| 場面 | 参照先 |
|---|---|
| パフォーマンス | m10-performance |
| 遅延初期化 | m12-lifecycle |
| 非同期パターン | m07-concurrency |
| メモリー効率 | m01-ownership |
コメント
Markdown 対応