研究が"飛ぶ"瞬間

#研究が"飛ぶ"瞬間

※注意

- **本記事は事実と異なる可能性があります。**

#自己紹介

私は物理屋出身の修士一年。
いろいろあって昨今のITブームに乗っかり、大学院からコンピュータサイエンスを専攻しているありふれた大量生産型の若者である。
現在の専門は並列処理だ。

#研究テーマを決める

##背景

###機械学習とGPU

近年注目を集めている機械学習には、膨大な計算能力が必要である。(聞き飽きた)
単純に計算を始めると、数日～数十年かかる問題も少なくない。
この問題を解決する一つの手法が**GPU(Graphics Processing Unit)を利用した並列処理**である。
もともとGPUは画像描画のための計算ユニットであり、単純な計算のみを行うことができる**計算コアが数千個**搭載されている。
これは一般的なCPU(Central Processing Unit)のコア数に比べて**数百～数千倍多い**。(CPUのコア数は１～数十個程度)

機械学習の人たちはここに目を付けた。
機械学習の計算の多くは行列積などの比較的簡単な計算処理であるため、簡単な計算ができる演算コアが大量にあるGPUととても相性がいいことに気が付いたのである。(周知の事実)
一方で、GPUは前に述べたようにもともと描画機能しか搭載されていなかったので、計算に利用するには少し敷居が存在した。
これを解決しつつあるのがNVIDIA社のCUDAのようなGPUの計算利用のためのプログラミング言語である。(詳細は省く)
研究者たちはこれらを利用して、機械学習の膨大な計算をGPUで並列処理させることで計算時間の短縮を実現した。

研究者たちはGPUの利用によって恩恵を受けてきたのだが、時が経つにつれ問題が生じてきた。
その問題とは、**GPUに搭載されているメモリが小さい**ことである。
PCが何かの計算をするときは、計算に必要なデータを一度すべてメモリ上に用意しなければならない。(厳密には異なると思うが、そこは勘弁)
そして、メモリ上のデータを演算ユニットが参照&更新して計算が進むのが一般的である。
しかし、GPUはその性質上GPU専用メモリを大きくすることができなかった。(最新のものは比較的大きくなってきている)
また、機械学習では膨大なデータを用いて計算するため、この点でGPUの利用に限界が出てきた。

研究者たちはこの問題を解決するために、同時に複数のGPUを利用し始めた。
並列計算の並列化(モデル並列)である。

###Grid Computing
**Grid Computing**とは、Wikipediaによると

>グリッド・コンピューティングは、インターネットなどの広域のネットワーク上にある計算資源（CPUなどの計算能力や、ハードディスクなどの情報格納領域）を結びつけ、ひとつの複合したコンピュータシステムとしてサービスを提供する仕組みである。提供されるサービスは主に計算処理とデータの保存・利用に大別される。一箇所の計算センターや、一組のスーパーコンピュータでは足りないほどの大規模な計算処理や大量のデータを保存・利用するための手段として開発されている。

そう、世界中のネットワークに接続されている計算資源を利用して、**地球規模の巨大な一つのコンピューティングサービス**を提供しようというものである。
これの考えは古くからあり、2000年代後半に流行ったものである。
また、最近になって少し再注目されている(いた？)。
皆さんは聞いたことがないだろうか。

**`自宅のPCでコロナウイルスの解析に協力できる`**、と。

これはまさに**Grid Computing**である。
おそらく先の噂は**Folding@home**プロジェクトのことだろう。
Folding@homeは現在ワシントン大学などを中心に開発管理されているらしい。(詳細省く)

**世界中の人々が所有している計算資源を利用して、ボランティアに参加できるということである。**
(あなたは寝ていても、YouTubeを見てごろごろしていてもボランティアに参加しているのである。社会に貢献しているのである。すばらしいじゃあないか。)

Grid Computingはとてもロマンのある分野であるが、残念ながらみなさんもお気づきのとおり現在は**Cloud Computing**にとってかわられている。(つまり、時代遅れの分野だということだ)

###研究テーマの決定
現在、私の研究室はGPUの並列処理を一般的な計算に利用するいわゆる**GPGPU(General-Purpose Graphics Processing Unit)**が専門である。
大学院進学当時、上記の分野において先人たちの研究功績が存在していることを知った。
私はロマンを感じ、自身の研究テーマを**GPUのGrid Computing**に決めた。

#GPUのGrid Computingでは何が問題か(少し技術的内容)

##問題点

さて、**GPUのGrid Computing**利用する際に、何が問題となるのか。(**研究の基本であり、最も重要なことである**)

もちろん、ネットワークを介してデータを転送する必要があるので、スーパーコンピュータのような集中した場所に計算資源がある場合と比べて性能は悪い。

それ以上に問題なのが、描画性能の低下である。
**GPUが機械学習などの計算をしている間、GPUの描画性能が低下し、PCの画面がカクカクする**のである。

これは重大な問題だ。
確かに、GPUを汎用計算資源としてのみ利用する場合、GPUの描画性能が低下したとしても何も問題はない。(それよりも機械学習の性能をいち早く知ることが大事なはずだ。)
しかし、**GPUのGrid Computing**の場合は話が違う。

社会に貢献できるからと言って、**APEX**や**荒野行動**を**5 fps**でプレイすることに我慢できるだろうか？
(5秒でアンインストールするだろう)

##先行研究の概要
そこで研究者らは、マウスやキーボードの入力などを監視し、GPUが利用されていないときにGPGPU計算を行うようにした。

また、GPU提供者側のタスク(ゲームや動画編集)がなにをしているのかがわからないので、GPGPU側のコード上で現在のGPU使用状況を繁忙状態か遊休状態か検知するようにして、GPU提供者側のアプリケーションに依存せずにGPGPU計算も実行できるようにした。

さらに、**GPU提供者側のアプリケーションのGPU遊休時間(GPGPU計算ができる時間)で最も高頻度に発生しているのはマイクロ秒単位**であることを発見し、GPGPU計算のタスク粒度(GPUへ一度に投げる計算の最小単位)を小さくすることでより効率的にGPU Grid Computingを行えるようにしてきたのである。

---

私は、指導教員と話していく中で、これらのGPU使用検知の**アルゴリズム改善**や**PyTorchから利用できるようにwrapperを作成していこう**という流れになっていた。(自分の中で問題点や改善方法などは少し見つけられていた)

#大学院に進学してから何をしていたのか

なぜこの章を挟むのかって？

他人の後悔や失敗談は皆さんが一番好きなものでしょう？
(そして、反面教師として本記事で最も有益な内容だと思う。)

##やはり研究をなめていたといわざるを得ない

今年は歴史的にみても稀有な年になっているのは言うまでもない。(今となってはこれも言い訳に聞こえる)

冒頭でも述べた通り、私は今年の３月までは物理を勉強し、量子コンピュータの研究(量子RAM、量子サポートベクターマシン、量子状態トモグラフィーなど)をしていた。
※**量子コンピュータは従来のコンピュータサイエンスと全く異なるものである(と考えている)**

そのため、コンピュータサイエンスについては独学で何とか大学院入試にギリギリ合格できる程度の知識しかない。(現在進行形)

愚かな若者は大学院で一からコンピュータサイエンスについて学ぼうと考えていたのだ。(ああ、愚か。)

もちろん大学院でも講義は行われているし(今日も受講してきた)、体系的に学べることはたくさんあるだろう。
しかし、当然ながら**コンピュータサイエンスを学んできた人にとっては**、だ。

**コンピュータサイエンスと同時並行に勉強するものではない。**(リンゴが木から落ちるくらい当たり前のことだ。)

不可能だと言っているわけではないが、ほかの問題が生じる危険性がとても高くなる。

これらのことは、確かに理解はしていた。(頭の中では。)

ただ、好奇心は人より少し強い方で、知りたいことは数多くあった。
専門ではないが文部科学省が主催している(?)セキュリティに関するプログラムenPiT Security Seccapに参加している。

当然、それらのプログラムを修了するには大学院とは別の単位を取得しなければいけない。

そんなこんなで、大学院一年目の前期はコロナで研究室に行くこともできず、大学院とプログラムの単位取得にいそしんだ。



##最大の過ち

ところで、大学院生の皆さんは**博士課程に進学しますか？博士課程に進学しますか？**

私はその選択を選ぶ予定はなかった。(なくなった。身の程を知った。この小さな頭では、それを認識できただけでも幸運だと言っておこう。)

今思えば、私は勘違いしていたのかもしれない。

ソフトウェアエンジニアの就活では、まずこれまでの開発経験を聞かれる。(残念ながらガクチカとは程遠い。)
そう、一番初めに尋ねられるのだ。

**「あなたは何をしてきましたか？あなたは何ができますか？」**

何もできない私はこの問題に立ち塞がれた。
そして、**最大の過ち**を起こすのである。

**「経験を積まなければいけない！夏はインターンシップに参加しなければ！」**

**"運良く"**夏はインターンシップに参加することができた。

研究？もちろん、やってい(るつもりだっ)たよ。
でも、経験を積まないと！そうでしょ？



#その時、研究は"飛んだ"

夏も過ぎ、**”経験”**も積み充実した(ような気がする)時間を過ごしてきた。
さて、これから本格的に研究だ！

読者の皆さんは、先に述べた研究の話を覚えているだろうか。
私の記憶はもっと薄れていた。(そもそも何もしていなかっただけかもしれない。)

しかし、コンピュータサイエンスもロクに学んでいない私は先輩の提案手法を手元で行うのも一苦労。
Visual Studio？？何それおいしいの？

上で述べたように、この研究テーマは古く、先輩の引継ぎ資料が**10年以上前**なんてよくあること。(みんなもそうでしょ？)

二週間かけてようやくコンパイルが通った！(謎の構文エラーをコメントアウトして一件落着！)

さて、まずは問題の再現だ。

CUDAのサンプルコードから描画アプリを実行して、先輩のGPGPUコードを実行して、よし、描画アプリのfpsが下がったぞ！
描画アプリが表示したレナを見てクリック、これが噂の**"レナ"**か。

...

**そう、その時、研究が飛んだのである**

正確には、研究がお蔵入りになっていたことに気づいたのだ。

先輩のGPGPUアプリは実行されたままであるにもかかわらず、描画アプリの**"レナ"**をActive ウィンドウ(最前面のウィンドウ)にしたとたん、fpsが元の値に戻ったのだ。
そして、GPGPU計算がとても遅くなっている。(この時実行したGPGPU計算に特別な補助動作は含まれていない。fpsを低下させるために実行したのだ。)

「...あれ？」

もちろん何度も試したが、同じような挙動になる。
そして、気が付いた。(もちろん担当教員にも報告した)
NVIDIA社のdriverアップデートによって**研究の始まりであった問題**が改善されていたのだ。


**正確に言うと(まだ検証段階ではあるが)、NVIDIA社のdriverによってactive なウィンドウを自動で検知し、そのウィンドウのfpsを最大化するようにGPUタスクスケジューリングされていたのだ。**

したがって、たとえ**APEX**や**荒野行動**をしている最中にGPU Grid Computingによって大規模な計算が割り当てられたとしても、**fpsが下がることがなくなったのだ**。(状況によると思います。検証中)

担当教員「...改善されてますね。...」


#まとめ
こうして私の研究は**"飛んだ"**のである。

今後はGPGPUによるfps低下は発生しないと仮定して、分散並列計算のタスク割り当てアルゴリズムについて研究していこうと思っている。

商業製品を利用した研究ではよくあることなのかもしれない。
しかし、すべて自己責任ではあるが、大学院一年１０月に研究が飛ぶことは私にとってはショックな出来事だった。
また、後悔も反省も大きかった。

もしあなたがまだ研究を始めていない若者であれば、私と同じような過ちは繰り返さないように気を付けてほしい。

---

私は大学院を卒業できるのだろうか。
そういえば、指導教員がそろそろGeforce RTX 3080に変えると言っていたな...

---