この記事は、インテルの The Parallel Universe Magazine 28 号に収録されている、HPC 分野での R の使用について紹介した章を抜粋翻訳したものです。
R はハイパフォーマンス・コンピューティング (HPC) に適していないと言い切る人もいれば、その可能性は否定しないものの HPC での R の使用に懐疑的な人もいます。
しかし、世界は変化しています。データ解析は、新しく注目を集めている分野です。データサイエンスに求められるものが、具体的な利点であっても、あるいは利益であっても、R は HPC 分野において優れた能力を発揮します。HPC は、データ解析アプリケーションとそのユーザーに対応するため変化しています。そのような状況において、圧倒的な人気を誇る R が注目されるのは当然と言えます。すでに多くの開発者が HPC 環境でのR の利用に取り組んでいます。
この記事は、R に馴染みはないが、興味がある読者を想定しています。皆さんの動機は、アプリケーションのニーズを満たすため、皆が R を使用しているから、あるいは顧客からの R ソリューションに対する要求の高まりなど、さまざまでしょう。どのような動機であっても、皆さんがこの記事を手に取ってくださったことを嬉しく思います。ここでは、皆さんが HPC に精通しており、インテル® コンパイラーを使用しているという前提で説明します。
これらの前提を基に、まず、R の基本について述べ、できるだけ中立的な立場から R の優れた点をいくつか紹介します。数千ノードの分散コンピューティングで R を使用して、テラバイトのスピードを達成する話のほうが面白いかもしれません。それも可能ですが、R は HPC 分野においてあまりよく知られていないため、高度なトピックをカバーする前に基本的なトピックをカバーしたいと思います。
最初に、R を選択し、パフォーマンスに関心がある開発者であれば、知っておくべき簡単な歴史と基本事項を説明します。その後、コンパイル済みコードを R に統合する方法を示し、並列コンピューティングについて述べたいと思います。この記事は、概要を示すことを目的としているため、それぞれのトピックについてここでは詳しく取り上げません。この記事が、実際に R を試してみるきっかけになればと願っています。
R の歴史
1976 年、当時の Bell Labs の John Chambers が取り組み始めた S が R のルーツです。S は、Fortran コードの対話型インターフェイスとして設計されました。Fortran も長い歴史がありますが、R も同じです。R は、1990 年代に無料版の S として Ross Ihaka と Robert Gentleman によってリリースされました。厳密には、R は S 言語の方言です。実際、1980 年代に作成された多くの S コードが R でも動作します。
R は奇妙な言語です。以下は、そのことを示すコード例です。
## [1] "double" typeof(2) ## [1] "double" # 1:2 は数字 "1 2" のベクトル typeof(1:2) ## [1] "integer"
上記のコードをよく観察すると、1:2 はインデックスであると仮定できます。しかし、ほかにも奇妙なところがあります。一般に、: は予測が付きにくいものです。”1″:”2″ は、整数 1 と 2 のベクトルを返します。つまり、文字から整数へ ASCII 変換を行っているだけなのでしょう。例外として、”A”:”B” はエラーになります。また、: は常に整数を扱うとは限りません。例えば、1.5:2.5 とすることができます。
R には非常に活発なコミュニティーがあり、CRAN (Comprehensive R Archive Network) 上では 10,000 を超える、数値計算から最先端の統計およびデータサイエンス手法、インタラクティブなデータ解析 Web サイトの構築 (Shiny) まで、さまざまなパッケージが配信されています。R のパッケージ・インフラストラクチャーは素晴らしく、どれも問題なく動作します。ここまで、「当然のことだ」と思って読み進めてこられたPython* 開発者の皆さんも、どのようにしたら、プログラミングの知識がない統計学者達が問題なく動作するパッケージ・フレームワークを作成できるのか不思議ではありませんか?
R は人気があると前述しましたが、2016 年に発表された IEEE Spectrum* (英語) のプログラミング言語のランキングにおいて、R は C# と JavaScript* を抜いて第 5 位でした。プログラミング言語のランキングに R がランクインしたことは非常に興味深いです。R の支持者であっても、R がひどいプログラミング言語であることを公言しています。R は特殊ではあるものの、データ解析に非常に優れているため、それを上回る価値があると評価されたのかもしれません。
言い換えれば、R は映画「パイレーツ・オブ・カリビアン」のジャック・スパロウに似ているかもしれません。これまでに聞いたことのないような最悪の言語かもしれませんが、それについて聞いたことはあるでしょう。
手を掛けずに向上
アメリカのコメディアン W. C. Fields はかつて、「私がこれまでに会った中で一番の怠け者は、パンケーキが勝手にひっくり返るようにポップコーンを入れていたよ」と言っていました。この怠け者は、素晴らしいエンジニアになれたでしょう。何だかんだ言っても、誰かがやってくれるのであれば、わざわざ自分でする必要はないのですから。
R では、このように手を掛けずにパフォーマンスを向上するいくつかの方法があります。最初に、これは驚くべきことではありませんが、R を適切なコンパイラーでコンパイルすると、パフォーマンスが少なからず向上します。R は C、Fortran、および R で記述されているため、インテル製ハードウェアでインテル® コンパイラー (icc や ifort) を使用すると良いでしょう。インテル® デベロッパー・ゾーンには、インテル® コンパイラーで R を使用する方法に関して役立つ記事 (https://software.intel.com/en-us/articles/build-r-301-with-intel-c-compiler-and-intel-mkl-on-linux?utm_campaign=cmd_13241-1&utm_source=pum28&utm_medium=pdf&utm_content=schmidt_article_build_r_intel_compilers_link3) があります。
これは、R で優れたパフォーマンスを引き出すための強力な最初のステップと言えます。ベースの R を構成し ている R コードについてはどうでしょうか? R 2.13.0 以降にはバイトコード・コンパイラーが含まれており、それ を使用してバージョン 2.14.0 以降の内部コードをコンパイルできます。ユーザーコードに関しては、以前はバイ トコード・コンパイラーを使用する方法を自力で見つける必要がありましたが、2017 年 4 月にリリースされた R 3.4.0 から JIT が含まれるようになり、それまでのバイトコード・コンパイラーの使用に関する推奨事項の多 くは意味のないものになりました。