
2026/05/21 22:55
Rosalind:ラップトップ上で全ゲノムパイプラインを実行するためのRust製のゲノミクスツールキット
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Rosalind は、エッジ ハードウェア、病院ワークステーション、フィールドキットにおいて動作するように設計された Rust ベースのゲノム解析エンジンであり、O(√t) 作業メモリアーキテクチャによりわずか 100 MB の RAM でも動作します。高速な L1/L2 キャッシュに状態を保持することでブロックサイズやパーティショニングの選択にかかわらずビット単位の同一結果を決定論的に提供し、大規模な中間ファイルを物質化することなく実装されます。主要機能には FM-index アライメントと SAM/BAM/VCF フォーマットのストリーミングバリアントコールが含まれます。完全な履歴等价性を保証するために、メモリ境界と決定論を確認する CI スクリプトなどの厳格なガードレールによって強化された再計算戦略を採用しています。Rust 1.72+ で構築されており、データ主権が重要なリソース制約環境における臨床ワークフローやアウトブレイクモニタリングを支援します。Apache-2.0/MIT の二重ライセンスの下で利用可能(注:BAM 出力には
libbz2-dev および liblzma-dev というネイティブ圧縮ヘッダーが必要)であり、コマンドラインインターフェースまたは maturin を通じてインストールされる Python バインディングによる即時展開を提供します。プロジェクトには再現可能な SHA256 チェックサムを備えた合成データセットを持つ例が組み込まれており、個人のマシンでの教育および研究を支援しています。本文
Rosalind: 低メモリフットプリントで動作する決定論的ゲノム解析エンジン
Rosalind は、汎用ハードウェアやエッジデバイス上で動作し、ゲノムアラインメント、ストリーミング型の変異検出(Variant Calling)などを実現する Rust 製の解析エンジンです。$O(\sqrt{t})$ のワーキングメモリを確保しつつ、決定論的な再生機能と拡張性を兼ね備えています。従来の高リソース依存のアプローチとは対照的に、病院のワークステーションやノートパソコンでも安定して動作することを目標としています。
概要と特徴
- 低メモリアライメント:
- $O(\sqrt{t})$ のワーキングメモリ(全ゲノム解析において約 100MB)で動作します。
- BWA や GATK などの標準ツールが要求する 50〜100GB 以上の RAM が不要です。
- 決定論性:
- パーティションや実行順序に依らず、ビット単位で同一の結果を出力します。
- 中間データを格納せず、再計算によるフルヒストリー同等性を保証します。
- エッジ対応:
- 8〜16GB のラップトップでも動作し、機密情報(PHI)をオンサイト保持可能です。
- 拡張性:
- Rust プラグインや Python バインディングを通じてワークフローを構築・カスタマイズできます。
クイックスタート (インストールと実行)
前提条件の確認
- Rust: 1.72+(rustup の推奨)
- Python: 3.9+(PyO3 バインディング用;必要に応じて
を設定)PYO3_PYTHON - ライブラリ: BAM 出力用には Debian/Ubuntu (
,libbz2-dev
) または macOS (liblzma-dev
) のヘッダーが必要です。brew install bzip2 xz
ビルド手順
コマンドラインインターフェース(CLI)を構築します。
git clone https://github.com/logannye/rosalind.git cd rosalind cargo test # フルスイートを実行 cargo build --release
利用可否の確認:
cargo run --release -- --help
データセットの生成
外部データを探すことなく、デモ用の小型データセットを生成できます。
python scripts/generate_toy_data.py examples/data/illumina_toy # シェアチェックサム確認 cat examples/data/illumina_toy/SHA256SUMS
実行コマンド例(CLI)
1. リードのアラインメント (SAM 出力)
cargo run --release -- align \ --reference examples/data/ref.fa \ --reads examples/data/reads.fastq \ --format sam \ --max-mismatches 2 \ --reference-offset 0 > examples/data/alignments.sam
2. BAM 出力 (座標ソート済み) 下流のツールに推奨される形式です。
--output は必須です。
cargo run --release -- align \ --reference examples/data/ref.fa \ --reads examples/data/reads.fastq \ --format bam \ --output examples/data/alignments.bam
3. バリアント探索 (VCF 出力) SAM/BAM アラインメントファイルから変異を検出します。デフォルトは VCF が stdout へ出力されます。
cargo run --release -- variants \ --reference examples/data/ref.fa \ --alignments examples/data/alignments.sam \ --mapq-threshold 10 \ --region-start 0 # ディスクに書き出す場合 cargo run --release -- variants \ --reference examples/data/ref.fa \ --alignments examples/data/alignments.sam \ --output examples/data/variants.vcf
注意点: Rosalind は $O(\sqrt{t})$ の FM インデックスを用いて最初の FASTA レコードのみをインデックス化します。追加のレコードは処理対象外(マルチコンチグシーケンシングは未対応です)。
Rust API と Python バインディング
Rosalind を他のプログラム内から呼び出すことも可能です。
Rust API での利用
独自パイプラインへの埋め込みやテスト用として利用します。
アラインメント処理:
use rosalind::genomics::{BWTAligner, AlignmentResult}; fn align_reads(reads: &[Vec<u8>], reference: &[u8]) -> anyhow::Result<Vec<AlignmentResult>> { let mut aligner = BWTAligner::new(reference)?; aligner.align_batch(reads.iter().map(|r| r.as_slice())) }
バリアント検出: 臨床レポートや QC ダッシュボードに出力可能です。
use rosalind::genomics::{AlignedRead, StreamingVariantCaller}; fn call_variants(reads: Vec<AlignedRead>, reference: &[u8]) -> anyhow::Result<Vec<rosalind::genomics::Variant>> { let chrom = std::sync::Arc::from("chr1"); let reference = std::sync::Arc::from(reference.to_vec().into_boxed_slice()); let mut caller = StreamingVariantCaller::new(chrom, reference, 0, 1024, 10.0, 1e-6)?; caller.call_variants(reads) }
Python バインディング (PyO3)
maturin を使用して開発します。
pip install maturin maturin develop --release
スクリプト例:
from rosalind_py import PyGenomicEngine engine = PyGenomicEngine() # 発現定量や QC チャートなどのプラグインを実行 depth = engine.run_rna_seq_plugin( region_start=100_000, region_end=101_000, reads=[(100_020, "ACGTACGT"), (100_050, "TTTACGT")], block_size=512, )
技術的保証と原理
$O(\sqrt{t})$ メモリの仕組み
Rosalind は以下の手法により、巨大なデータセットを最小限のメモリで処理します。
- ブロック分解: ワークロードを $\sqrt{t}$ サイズの決定論的なブロックに分割します。全リードキャッシュせず、一度に 1 ブロックのみを保持します。
- 高さ圧縮ツリー: 子サマリーを高さ $O(\log\sqrt{t})$ でマージし、ポインタなし DFS を使用します。
- ローリング境界 (Rolling Boundary): 最新のブロックサマリーのみを更新・保持し、古いサマリーは破棄します。これによりメモリ使用量が定数化されます。
- ワークスペースプーリング: コンポーネント間で単一の割り当てを共有し、メモリの頻繁な確保解放(アロケータチャーン)を防ぎます。
主要な保証事項 (Guarantees)
- 決定論的な再生: パーティションや実行順序に関わらず、同じ入力で同じ結果が得られます。
- パーティション不変性: ブロックサイズの変更でも出力内容は変化しません。
- フルヒストリー同等性: 中間データを格納せず、必要なだけ再計算することで、メモリ削減のみで行われます(情報損失はありません)。
- 拡張性の保証: プラグインやバインディングも、コアエンジンと同じメモリ保証と決定論性を継承します。
検証とテスト戦略
Rosalind は厳密なテストを通過したことを確認する必要があります。
| コマンド | 目的 |
|---|---|
| $O(\sqrt{t})$ メモリ上限の検証 |
| スケーリング特性とメモリ Bound の破棄確認(Exit code) |
| 複数実行でのビット単位の完全同一性の確認 |
| VCF 出力の安定性チェック(スナップショット比較) |
スナップショット更新
期待される結果に変更があった場合のみ、ゴールデンテストファイルを更新してください。
ROSALIND_UPDATE_SNAPSHOTS=1 cargo test
ライセンスとサポート
- ライセンス: Apache-2.0 + MIT デュアルライセンス
- バグ報告・機能リクエスト: GitHub Issues をご使用ください。
- コミュニティ: Discord サーバー(近日公開)にてプラグインやデータセットに関する共有が可能です。