Hadoop で Wikipedia のテキスト処理を900倍高速化

今月中に実験の実装が終わるくらいでないと来月の投稿〆切に間に合わないので、今週から研究室のサーバに Hadoop をインストールしている。
研究室にはサーバが20台弱あるのだが、そのうち10台強を使うことにして設定。これくらいの規模だと「大規模」と言うのは憚られるかもしれないが(Yahoo! や Google と比べて、という意味で。)、中規模、くらいには言ってもいいだろうし、たぶん、多くの大学や企業で使える台数もこれくらいだと思うし、大企業にいないとできない研究をするのも大変価値があるが、他の人たちがやる気になれば真似できる研究をするのも(データやインフラ勝負ではなくアイデア勝負になるので苦しくはあるのだが)重要だと考えている。
たとえば、数台でも分散環境の恩恵が受けられる、というのはPFI が出した Hadoop の解析資料で知っていたので、初めて導入したときは参考になったし、こういう情報がそれなりに外に出ているのはありがたい。以前 @ohkura さんが公開していたスライド(コメント欄参照。おーくらさんありがとうございます!)も、これを読んで「おお、MapReduce でこんないろんな自然言語処理/機械学習のアルゴリズムが実装できるのか」とびっくりしたので、自分も書ける部分はこうやって出して行きたいと思う。そういえば、Data Intensive Text Processing with MapReduce が予約可能になっていた。

Data-Intensive Text Processing With MapReduce (Synthesis Lectures on Human Language Technologies)

Data-Intensive Text Processing With MapReduce (Synthesis Lectures on Human Language Technologies)

ちなみに Yahoo! にあるHadoop Tutorialでは1-10ノードが small clusters, 10-40ノードが medium clusters, それ以上が large clusters という分類になっている。
それで、Hadoop を入れて従来の処理がどれくらい速くなったかな、と思って@nokuno さんのWikipediaによるテキストマイニング入門で日本語版のWikipediaの単語頻度を数える問題をやっていたので、比較してみる。彼の設定では単語分かち書きまで済んだ状態でスタートして、そこから858分21秒かかったと書いてあるのだが、研究室のサーバ環境、つまり
  • Quad-core Opteron (2.3GHz) x 8 CPU = 32 CPU コア+256GBのメモリのサーバが5台 (うち28 CPU コアを使用。4 CPU コアは他の人のために残しておく)
  • Quad-core Xeon (2.66GHz, 3.0GHz) x 2 CPU = 8 CPU コア+32GBのメモリのサーバが4台 (こちらは 8 CPU コア全部使う)

のスレーブ計9台で、データを分散ファイルシステムに置いたところから試してみたところ、59秒で終了。ベースになっているマシンの速度が違うので単純に比較はできないが、約900倍高速になっている。900倍と言うと数年間かかる実験が数日で終わる計算なので、実験もしやすいと思う。(参考までに、英語版 Wikipedia で単語の頻度をカウントした場合、5.8GB のデータで103秒であった) ちなみに、こういう単純な処理の速度は CPU コア数に比例するので、同じマシン上で比較すると約200倍高速になる程度であろう。まあ、200倍でも十分速いと思うが……。(@nokuno さん補足ありがとうございます)
研究室のサーバも CPU コア数こそ多いが速度がすごい速いわけではないし、研究室にもメモリこそ少ないが1スレッドならもっと速い計算機も何台かあるのだが、並列化でこれくらい速くなるなら、並列化可能なタスクであればやる価値あるんじゃないかな? (もちろん、本来は1台でやるなら分散ファイルシステムに置く必要がないので、転送するところも時間に含めないといけないのだが、2.4GB の put は数十秒であった)
いずれにせよ、M1 の人たちの研究が本格的に始まる今年の夏休みまでは、自分の大学での時間はこういうインフラ整備に費やそうと思っているので、あとは細々と研究を続けていきたい。
PFI といえば情報科学科 OB 座談会「僕らは技術の王道を駆けて行く」で PFI の創業当時の苦労やどこを目指しているか、大学の授業がいかに役に立ったかという話をいろいろ書いていて、おもしろい。個人的には10年後の技術という話がなるほど、と思う。

岡野原
検索エンジンは、10年前はまったく注目されていない技術だったんですね。研究をやめていった企業も多くて、検索の可能性を信じていた一部の企業や研究者が地道に開発を続けていた。
西川
20年前なら、僕らはデータベースを手がけていたかもしれません。10年前だったら何だったろう。10年後なら……?
岡野原
いまから10年後に成功する技術は、すでに存在していて一見つまらなく見える技術かもしれない、と僕は考えることがあります。例えば、音声認識。グーグルが実用化したけれど、これからもっとおもしろくなると思う。それと、機械翻訳。日本語はまだだけれど、海外の各国語間ではどんどん精度が上がってきています。あと、画像認識には実用化されていないすぐれた技術がたくさんあります。そのあたりが、10年後には爆発的に進歩して、人々の生活を変えていくような気がします。

自分も同感。機械翻訳は自分が NAIST に入学した2005年当時は「機械翻訳を研究テーマにするのはよくよく考えたほうがいい」と言われるくらい、研究にするのは厳しいテーマではあったが、その後5年で大きく様変わりした。ウェブから抽出した大規模データが使えるようになったし、計算機も高速になり、並列分散計算のテクニックも実用化されてきたので、こういう情報科学の粋を極めて体当たりすればブレイクスルーが起きるのだな、と思う。
音声認識、画像認識とくれば、自然言語で認識ってなんだろう、と考えたりするのだが、やはり言語で認識したいのは意味なんじゃないかな? ある言語で書かれた文を、意味が同じ別の言語にするのが機械翻訳だとすると、機械翻訳も意味という問題にタックルしている。現在の統計翻訳の枠組みでは、個別に意味を推定するのではなく、大規模なデータ(対訳文とか)をえいやと放り込んで力づくで翻訳するのが主流であって、意味解析でもきっと今後10年というのはそういう時代なのではないかと考えている(あまりそういう気持ちでやっている人いないかもしれないけど……)。
大規模データを扱うのって、こうやって地道にインフラやツールを整備したり、コツコツデータを取得したり、少しはデータにタグ付けしたり、泥臭い作業がいろいろとあるのだが、学生さんからすると華々しい部分しか見えない(「Google のような検索エンジンを作るのに憧れて自然言語処理に来ました」という人はけっこう多い)のだろうが、面倒くさい部分は誰かが決心して1回やればいいだけのことなので、自分がやれる部分は整備しておいてあげようかな、と思っている。Gentoo Linux のパッケージをしこしこ作っていたときも、世界中で誰かがやればみんな同じことやらないで済むから、それなら自分がやるか、と思ってやっていたので、こういう仕事が好きなのかもしれない。
そういえば PFI ã‚‚今年のサマーインターンの募集を始めたそうなので、腕におぼえのある学生さん、もしくは最先端の研究開発環境の中で世の中にインパクトのある仕事をしたいという学生さん、ぜひどうぞ!