みんな割と未来の予言はよくするが、あんまりその結果を振り返らんよなぁ。

現在のディープラーニングのブームをどう捉えるか、というか、 プログラマのキャリアという点でどう接していくか、を考えるにあたり、 過去のブームを考えてみるのは良いんじゃないか、という気がした。

最近並列GCや並行GCの章を読んでいて、 一昔前の大きなブームとしてはParallel computingがあったなぁ、と思い出した。 ということでこの事について、専門にしてなかった部外者プログラマの目にどう映ったかを記しておきたい。

なお、「XXXだと言われていた」はあんまりソースとかを確認したりはしてません。 なんとなく自分はそう聞いていた気がしたしそう思ってた、程度のものです。

かつて思っていたことと当時の状況

Parallel computingはだいたい10年くらい前の時点ではその後の大きなトレンドとして明らかに存在しているように思えた。 自分の居た会社では、確か2007年にとある大規模アプリの時期バージョンをどうしよう?みたいな議論をしていた時には、この辺はかなりいろいろな具体的数字を元に予想が回覧されていたし、社外でもおおまかな認識は一緒だったように思う。

コアが4つくらいになってみると、 いまいちアプリはその分早くなってない。 今後クロックが上がらないのはすでに明らかで、 集積度が上がっていく間はコア数が上がっていくのが自明に思えた。 消費電力的にもコアが増えていくしかない。

当時4コアで8コアくらいは視野に入っていたので、 その次は16コアくらい。 フィージビリティとしては256くらいまでは当時でもすでに確認されていた気がする。 16コアはそのまま進展していれば4年とか6年後とか、そのくらいのタイミングで出ても不思議では無い段階なので、そんな遠い未来じゃなく割と近い未来としてやってくるのを想定していた(なおこの予想が間違っていたのだが、その話は後述)。

一方でParallel computingというか通常のマルチスレッドプログラムが、 どうやらすごく難しいものであり、 ちょっと大規模なものを普通のプログラマが作るのは無理なんじゃないか、という気も当時既にしていた。 さらにいわゆるタスク並列では16コアを使い切るのは難しそうで、 データ並列を実現していくしかなさそう、という結論にも既になっていた。

また、GPUが今後主流になっていく可能性も高いと思われていて、 その場合にはheterogeneousなParallel computingが主流になる可能性もある。 この場合にもプログラミングのパラダイムから変わっていかないとどうにもならない空気が漂っていた。

そういう訳でプログラミングのパラダイムから大きく変わるんじゃないか、と思われていた。 ハードウェア、プログラミング、アプリケーション、多くの領域に大きな影響のある、業界の革命のようなことが起こると思われていた。

どれもそれなりに根拠のあることで、過去にバズってたものの中では割とまともなものに属すると思うし、その影響範囲のデカさも今のDLの応用と匹敵するか、またはさらに大きいと思っていた人は多いと思う。

現在の視点で自分の中ではどういう結論だったのか、というのを書いてみたい。 なお、自分はこの分野の専門家じゃないし、現状の最先端の状況をウォッチしている訳でも無い。 むしろそういうところからは離れた一プログラマにどのくらい影響が実際には出たか、みたいな記録になると良いと思ってこのポストを書いている。

コアは8コアくらいだった

当時の感じでは2019年は16よりは多くなってる感じだったし、256コアくらいになってても不思議じゃない印象だったが、現在はだいたい8コア、と言えると思う。 Pixel 3が8コアとかだし。

サーバーとかは現在だと割と32コアとかあるので当時のコア数の増加の予想は、技術的にはかなり正確だったと言える。 だが、当時の予言は我々一般のユーザーが普段使っているメインの環境がそうなる、という話だったので、現代の視点では対象はやはりスマホとタブレットだろう。 だから当時の予想の結果としては今は8コアと言うのが妥当と思う。

4コアよりは多いので、アプリは複数のコアを作らないといけなくなった、という予想は当たっている。 一方でタスク並列ではパフォーマンスが出ないのでデータ並列でアプリケーションを組むようになり、ソフトウェア開発の環境に大きな変革がある、という予想は当たってない。 普通にタスク並列している。

なんでコア数がかつて予想されたペースで増えてないか、というと、主流がスマホに移ったから、というのが大きい気もする。 当時はPCのことしか考えてなかった。スマホとか無かったし。

現在世の中は、かつて思ってたほどはPCに力を入れてないので、ノートPCとかのコア数の伸びは大して増えなかったし、ノートPCのコア数自体、もはや我ら庶民にはあまりrelevantでは無い。

このスマホの移行のときに少しコア数の増加は停滞した、というか数年分くらい戻った。 PCはクアッドコアのときにスマホはシングルコアだった。 ひとまずこの移行でコア数的には何年か後退した感じはある。 なんで減ったかはいろいろあるが、消費電力がそれまでより、よりシビアになったとか、いろいろな事情がそこにはある。

だが一方で現在の8コアという数字もかつてよりは実際に増えているから、コア数が増える、という予想はそれなりに当たってはいる。 またスマホ上でのコア数の増加も、最近はかつて予想してたペースになってきた気がする。だから今後はかつて思ってたペースに回帰するかもしれない。

ただハード屋とこの話をしてたら、別に今だってコア数増やすことはできるんだが、ソフト屋が嫌がるじゃん、みたいなことを言っていた。 それはまぁそうかもしれない。この辺の事情はよくわからない。

以上を乱暴にまとめると、コア数がすぐにたくさんの時代が来てしまう、みたいな予想は、 当時騒がれていたほどはすぐにはこなかったが、 全く来てないほどこなかった訳でも無い。

GPGPUの使用は一般的になったが、皆が使うものでは無かった

かつては思っていなかった機械学習という分野が流行し、GPGPUの利用はかつてよりは遥かに進んだ。 かつて予言されていたくらいには一般的になったと思う。

だが、かつて騒がれていた内容としては、計算資源の増加がGPGPU的なものに偏るなら、普通のアプリケーションデベロッパがそれを活かしてユーザーにより多くの価値を提供しないといけない、という感じだった。でも実際は、普通のアプリはGPGPUの資源を有効利用できていない。

どんなアプリでもGPGPUを使うように、プログラムの環境自体が変革する、というのは正しくなかった。 普通の人はあまりGPGPUを使わずに、機械学習だけが使う。

だがその一部の分野のGPGPU使用量はまったく想像していなかった規模で、 使われている量自体は当時騒がれていたレベル以上に使われていると思う。 だから計算資源のGPGPUが占める割合みたいなのは当時の予想以上の規模で大変動した。 だが、その影響が一部のクラウド業者の機械学習プラットフォームまわりに集中する、というのは予想してなかった。当時は機械学習なんて言葉すら知らなかったし、クラウドなんて言葉も無かった。 サーバーやホスティングサービス自体は普通にあったし、クラウドというのは予想外の何かが起きたという感じはしないが、GPU資源をここまでクラウドが買い占める未来は考えてなかった。

つまり、今後は計算リソースに占めるGPGPUの割合が増していく、 という予想は、定量的な部分まで含めてかなり正しかった(むしろ予言は少し過小だった、というくらいGPGPUは増えた)。 だが、それを普通のアプリ開発者も使わざるをえない、という予想は正しくなかった。 GPGPUを使えるようにプログラムモデルが根本から変わる、という予言も正しくなかった。 だが機械学習の世界だけでは正しかったが。

GPGPUというハードウェアだけに着目すると予言はかなり正確だったと思うが、 それの与えるプログラマへのインパクトはかなり間違っていた。

皆のソフトウェアパラダイムの抜本的な変革は起きなかった

計算資源を使うには、全員がデータ並列なソフトウェアを書くようになって、 その為一般のプログラマのプログラミング行っている環境でのプログラミングパラダイムが大きく変わる、と騒がれていたが、これは起きなかった。

async-awaitやチャンネルとかactorとかRxとか、いくつかの影響は出たが、 当時思っていたようなレベルの変革は起きていない。 さすがにシングルスレッドではもう駄目だが、UIスレッドと裏スレッドの2つくらいでアプリを書いている人もまだまだいるだろう。 こういう並列性ではやっていけない、というのが予言だったが、それは誤っていたと思う。

これはコア数がまだ8コア程度だから、というのはあると思う。 しかも8コアが今年出始めた、くらいなので、二年後くらいにはまた状況も変わってるかもしれない。 だが当時の予言では2019年よりは前に既に来ているくらいには、もう「すぐやってくる」未来という話だった。 これはやってこなかった、と言ってしまっても良いと思う。

一方で、PyTorchやTensorFlowは当時考えてたレベルの変革にかなり近いものとは思う。 機械学習をやる人全員が使うような基礎的なレベルでの変革であり、プログラムパラダイムの変化。

ただ機械学習以外には影響が無かった、というのは当時の予言とは大きく違う。 もっとこういうのが、全プログラム領域に広がると思っていたが、結果としては機械学習という一部の人たちだけが並列性を使いこなすことになった。 なお、TPUEstimatorは当時思ってたのにかなり近いものである。

みんなが必要になるという予言は誤っていたが、少数の人たちにとっての変革はかつて騒がれたようなレベルで起きて、しかもその少数の人たちの使う計算資源の量はかなりの規模だった。つまり、計算資源の規模あたりでの「みんな」という予言は正しい。

これも予言と実際の差分はなかなか興味深い。 言ってたことは起きてないが、完全に間違っていた訳でも無いし、言ってないことは結構起きた。 そして計算資源の増加とその計算が走る範囲的な物量の観点で見ると、当時言ってたような変革は起きている。

なんか物量的な予想はかなり正確なんだよなぁ。

プログラマ視点でのテクノロジーのbetはどうか?

当時、これから重要になりそう、と思っていたテクノロジーを頑張って勉強しておいたら、役に立ってたか?というようなことを考えてみる。

Java Concurrentとかは結構学ぶ意義はあった。 Androidのアプリで4コアくらいになったときくらいからは結構Java Concurrentまわりは使っている。 当時はJava Concurrentよりもっと先進的な何かが生まれてそれを使う時代が来るとは思っていたが、そうはいっても当時最先端だったJava Concurrentは学ぶ意義はあったし、 このときに学んだメモリの可視性とか並列プログラミングの基礎みたいなのは実際に必須の教養になったとは言える。

ウェイトフリーとかロックフリーとかのガチな並列性のライブラリやアルゴリズムを自分で作れるようになるレベルで理解する、というのは、今のところ当時思っていたほど重要にはならなかった、と言えると思う。 ただ最近のAndroidのGCの進歩とかをちゃんとキャッチアップすると必要になるので、 全くいらない訳でも無い。 当時はもっとみんなが今のGCとかと同じくらいの並列性に直面する、と思っていたのだが、その予想は間違っていた。ただGCの人は当時思ってたくらいの並列性に直面しているので、一部の分野ではかなり予想通りのことは起きた。

PLINQとかCCRは学んだ意義はほぼ無かった。プロミスまわりのライブラリとか出てきたときに多少理解の助けにはなったが、まぁやらんでも良かった気はする。

OpenCLやCUDAのようなものは、当時はこれらを発展させたような何かが生まれてそれが普遍的に使われると思っていたが、そういうことは起こってない。 一方でOpenCLやCUDAは使わないという程でも無い。 まぁまぁTensorFlowのカーネルとか追っていくときには読む羽目になるし、 勉強しておいて損した、という程でも無い。 実際に自分はOpenCLやCUDAを実務で使ったことがある。 その程度には普及した。

またGPGPUプログラミングを理解しておくことは機械学習界隈ではTPUEstimatorとか新しいものを理解するときには役には立っているので、やって無駄だった、という気はしない。 当時思ってたほどの重要性は無いが。

MapReduceとかは当時思っていた程度に重要度を発揮して、クラウドまわりの進歩に寄与している。 ただ当時はそのへん はまぁまぁ起こる未来として思っていて、 「これからは並列プログラミングだ!」みたいな流行りはそういうサーバーサイド以外の世界も全部そうなる、という話だったので、ちょっとトピック外の話題な気がする。

プロミスまわりのエコシステムだとかRxだとかチャンネルだとかasync-awaitだとかは当時は無かったものなのでここでのトピック外。

乱暴なまとめ

スマホと機械学習のことを考えずに考えられた当時の未来の予想は、あんまり現代の視点では役に立たない程度にはずれている。 だが一方で物理的な限界とかハードウェア的なトレンドとか物量的な予想はそう大ハズレという訳でも無い。 というよりもかなり正確だったと言って良い。

騒がれる程の極端な変化は起こらなかったが、トレンドというか方向性は割と正しく予想されていたようにも思う。

また、当時は予想もされていなかった分野では、 当時騒がれていたことの根拠はうまく吸収されているように思う。 例えば増大していく計算資源をプログラマは使わないといけない、計算資源はこんな比率で増える、だからきっとプログラムパラダイムのレベルでそういうのを扱えるようになる。 だがその使用がまんべんなく広がるんじゃなくて、一部の人たちがめっさ大量に使う、というのが予想外だった。

予言の根拠になっているものたちは割としっかりした根拠であり、今から見ても妥当だったようだ。 だが予言の結果はあんまり当たってないので、そこは話半分で聞いておくのが良いのかもしれない。 結局機械学習とスマホを知らない状態で今のコンピューティングリソースを語っても意味のあることは言えない。

並列まわりのテクノロジーにベットしておくのは、みんなが必須になる!という予言ほどの必要性は無いが、それなりの必要性は実際にもあったので、多少はやっておいても良い気はする。