スキップしてメイン コンテンツに移動

Rのコードを multicore を使って、テスト駆動開発でマルチコア化するよ

multicore パッケージを利用してマルチコア化してみます。とは言っても、sapply, lapply を mclapply にするだけの簡単なお仕事ですが、せっかくなので testthat を使ってマルチコア化する際にテスト駆動開発で実装していきます。

まずは、そのへんのアップルストアで購入可能な MacBook Air を購入しましょう。今回はこれでやります。Rも Mac 版の dmg を普通にインストールしましょう。次にパッケージをインストールします。

sudo R
install.packages(multicore)
install.packages(testthat)
q()

インストールが簡単なのがよいですね。MPIとかそういうものをごちゃごちゃ設定する必要なないです。

今回は非有界区間のモンテカルロ積分によって、標準正規分布の累積分布関数を計算します。まずは for で書きます。

とりあえず、マルチコア化は置いておいて、みんな大好き apply 系関数に書きかえてみましょう。もちろん、まずテストを書きます。set.seed で乱数をシードを固定して、testthat で単体テストします。

  R
  library("testthat")
  test_file("test_mci.r")
もちろん失敗します。 sapply 版を実装します。 テストが通りました。 リストで返ってくるので、unlist するバージョンも作ります。またテストを書きます。 失敗を確認してから、実装を開始します。 テストが通ります。

前置きが長いですが、いよいよ、multicore 化です。でも先にテスト書きます。 テストが通らないことを確認し、実装します。 テストが通ることを確認してください。では速度比較をしてみます。 4 cores なのですが2倍程度は速くなりました。おもったより unlist のコストがかかってないですね。ちなみにコア数は、
> library(multicore)
> multicore:::detectCores()
でわかります。
ちなみに 16 CPU cores のマシンで実行したら 6 倍程度の高速化でした。
             for sapply sapply.unlist mclappy
user.self  9.633  8.722         8.692   0.004
sys.self   0.111  0.300         0.223   0.014
elapsed    9.744  9.021         8.915   1.521
user.child 0.000  0.000         0.000  16.199
sys.child  0.000  0.000         0.000   0.949

foreach もありますが、multicore パッケージは、新しい文法を覚える必要がないので便利ですね。常に mclapply 使っておこうか、という気になります。

コードは以下にすべて置いてあります。

https://github.com/dritoshi/learning_multicore_pkg

参考:
CRAN: multicore
Rによる計算機統計学

コメント

  1. foreachは並列計算のバックエンドを選べるのでマルチコア以外の状況(クラスタ化とか)が出てくるときには、バックエンドを変えるだけで対応できるので便利ですね。
    plyr::llply(.parallel=TRUE)とかはforeachをラップしてるので、lapplyと同じ文法で、いろんな並列バックエンドに対応しようと思ったらplyr::llplyも選択肢に入ってきそうです。

    返信削除
  2. ありがとうございます。foreach もいじってみようと思っています。今は core の数だけ R を起動して、GridEngine ようなジョブスケジューラに投げる、という力技をやっているので。

    返信削除

コメントを投稿

このブログの人気の投稿

DNAを増幅するサーマルサイクラーを自作してみたよ

DNAをPCR法で増幅するために必要なサーマルサイクラーを自作してみました。自作と言っても、いわゆる、PCの自作と同じでパーツを組み立てていく感じです。購入から組み立ての様子を簡単に紹介します。モチベーション ラボには様々なレクリエーションがあります。例えば、単にどこかに遊びに行ったり、スポーツ大会したり、ひたすら合宿形式でプログレスのプレゼンをするミーティングするなどがあります。それもよいのですが、せっかくなので、普段の研究時間ではトライできないが、研究に関わる hack を行う、というイベントを企画してみました。夏休みの自由研究や社会科見学的なノリです。 うちのラボでは、PCRを使ったウェットの実験技術の開発をしてきました。しかし、サーマルサイクラーのハードウェアの仕組みを体験的に理解している訳ではありません。そこで、サーマルサイクラーを作ってみました。 欧米で始まっている、自宅のガレージやキッチンでバイオロジーを行うムーブメント、バイオパンク、DIYbio を体験しておきたいというのもありますし、Arduino などオープンハードウェア、Maker のムーブメントを体験するのも目的の一つです。ハードウェア開発が思っているほどハードルが下っていることを体験できて、かつ、将来、ウェットの開発だけでなく、装置開発などもできたら、ラッキー、ぐらいの気持ちでやってみました。 購入 今回作ったのは、組み立て式で、かつ、仕様などや設計図が公開されているOpenPCRというサーマルサイクラーです。ハードウェアの仕様・設計図、制御ソフトウェアなどの情報がすべて公開されており、部品からも自作することが可能です。今回は、「設計図から部品や回路のパーツを作り、それらを組み立てる直前のもの」を購入しました。 ChaiBio https://www.chaibio.com/ OpenPCR https://www.chaibio.com/products/openpcr なぜか http://openpcr.org/ で購入できなかったので、eBay にある ChaiBio で買いました。 OpenPCR - eBay http://www.ebay.com/itm/111096418574 本体価格は $599 で、送料が $76.05 で、輸入費用が $41.55 でした。合計 $716.6 だったので、日…

シーケンスアダプタ配列除去ツールまとめ

FASTQ/A file からシーケンスアダプター配列やプライマー配列を除くためのプログラムをまとめてみる。

まず、配列の除去には大別して2つの方向性がある。ひとつは、アダプター配列を含む「リード」を除いてしまう方法。もうひとつは除きたい配列をリードからトリムする方法である。後者のほうが有効リードが増えるメリットが、綺麗に除ききれない場合は、ゲノムへのマップ率が下がる。
気をつける点としては、アダプター/プライマーの reverse complement を検索するかどうか。paired end の際には大事になる。クオリティでトリムできるものや、Paired-end を考慮するものなどもある。アダプター/プライマー配列の文字列を引数として直接入力するものと、multi fasta 形式で指定できるももある。

From Evernote: シーケンスアダプタ配列除去ツールまとめTagDust
http://genome.gsc.riken.jp/osc/english/software/src/nexalign-1.3.5.tgz http://bioinformatics.oxfordjournals.org/content/25/21/2839.full
インストール: curl -O http://genome.gsc.riken.jp/osc/english/software/src/tagdust.tgztar zxvf tagdust.tgz cd tagdust/ make sudo make install rehash
使いかた: tagdust adapter.fasta input.fastq -fdr 0.05 -o output.clean.fastq -a output.artifactual.fastq
解説: 入出力形式は fastq/a が使える。リード全体を除く。速い。アダプター配列を fasta 形式で入力できるのが地味に便利で、これに対応しているものがなかなかない。Muth–Manber algorithm (Approximate multiple string search) を利用。FDRを指定できる。GPL3

もうひとつの Nikaido Lab. が始動します

ろくに更新していないこのブログで公表するものどうかと思いましたが、SNS以外で個人の立場として近況を書けるところはここだけなので、ここに書きます。

2020年4月1日より、国立大学法人 東京医科歯科大学難治疾患研究所 ゲノム応用医学部門 ゲノム機能情報分野の教授職を拝命致しました。東京医科歯科大学 大学院医歯学総合研究科 修士課程 医歯理工保健学専攻/博士課程 生命理工医療科学専攻 ゲノム機能情報の教授も兼務し、教育にも従事します。理研のラボも残しつつ2組織3拠点体制で研究、それに教育に励んでいきます。

両方で研究をすることを許して頂いた理研と大学の関係各位に深く御礼を申し上げます。またPI不在が多くなるにも関わらず、いろいろと工夫してラボ運営や研究に参加してくれている理研のメンバーにも大変感謝しています。また事前にお知らせしたかった方々も大勢おりましたが、ばたばたしており直接お話できずに申し訳ありません。

ゲノム分野の新しいバイオインフォマティクス技術は、ゲノム科学の新しい計測技術の側に現れます。その理由は新しいデータには新しいデータ科学の課題があるからです。そのデータの側にいればまっさきにアクセスできオリジナリティを発揮しやすくなります。しかし、それだけではありません。そもそも、データをどのように出すべきなのか、あるいは、データ解析技術を前提すれば新しい計測技術が作れないか(計算と計測の融合)、という1歩、2歩と踏み込んだバイオインフォマティクスとゲノム科学の関係が最先端の研究現場にはあります。このようにして生み出された技術は、新しい生命現象を観測し解き明かし、やがては疾患の理解や制御、診断に役に立つでしょう。

理研ではこのような立場から新しい1細胞RNA-seq法とそのデータ解析技術を開発し、社会実装もしてきました。これは異なるタレントの研究者が揃って共同し生み出せたものです。しかし、アイディアの量に対して人材は常に少ない状況です。また大きなプロジェクト(と家庭と任期)を抱えている研究員では、なかなか気軽にいろいろなことを試すのが難しい状況もあります。このような背景から、研究速度や規模が圧倒的に速くなっているゲノム科学やそのバイオインフォマティクス研究で、国際的な存在感を出すことが難しくなっています。

ここ数年は、このような研究に興味を持ち参加してくれる人を…