えちょ記

語らないブログ

レイテンシ≒0の魔法

さて、その放置していた記事です。去年の4月頃には記事にしてたんですねぇ。当時はこのキーワードでググッてもあまり引っかかるものはありませんでしたが、今日確認してみたらかなりの勢いで引っかかってきました。ソロソロ、世の中に出てくるかな、かな?

実時間応答と超並列演算の狭間で

今考察しているのは実時間応答が可能なAI。だからスループット(計算量)だけじゃなくレイテンシ(応答性)についても考慮したアルゴリズムを考えなきゃいけない。超並列演算ではスループットはカバーできるけど、逆にレイテンシに関しては通信の関係でどんどん遅延が積み重なってしまうわけで。そもそも意識子のやり取りは逐次処理だぞ?次にどこに飛ばすのかを計算してたりしたらとんでもない遅延が発生して、とてもじゃないが実時間応答なんて出来ない。
‥‥いえ、実はここに、今回の考察で最大の魔法を仕組んでいます。

ミーム(意識子)の受信から送信まで

ミームを受け取ると、各コアは乱数と分岐テーブルを参照して、次に分岐する場所を決定してミームを投げ返すのが基本動作。この動作について箇条書きしてみる。

  1. ミーム受信
  2. 乱数発生
  3. 分岐テーブル参照
  4. ミームの状態変異と次の分岐先決定
  5. ミームを送信

つまり、通信時間を除けば、コアで発生するレイテンシはこれだけの要素があるわけです。このうち割と重い処理が乱数発生。テーブル参照はそんなに重い処理ではないかな?

その計算は本当に入力に依存しているのか?

さて、このうち2〜4の計算についてよく考えて見ましょう。この計算ですが、実は入力が無くても計算できます。だって元々乱数しか使って無いから。先でも後でも、そもそも入力は乱数ですからいつ計算しておこうが問題ありません。だから「次にこのミームを受信したらこのミームを送信しよう」というバッファを用意しておいて、先に計算だけしておくことが可能です。
無理の無いサイズのバッファに演算結果だけ保管しておいて、実際にミームを受信した段階で引き出しから次のミームを取り出して送信すればいい。だから、実際の受信処理についてはここまで作業を減らすことが可能です。

  1. ミーム受信
  2. 受信意識子に対応するバッファから意識子を取り出す
  3. ミーム送信

受信から送信までに行う処理は、バッファから1つ次の意識子を取り出すだけ。事実上送受信の間に計算処理が無く、通信時間以外のレイテンシ要素をほぼ0に出来ます。

通信量に対して演算量を極限まで増やすのが超並列のコツ

今回の考察に限りませんが、並列処理を適用する場合のアルゴリズム考察のキモは「相互依存の除去」と「通信量削減」です。モンテカルロ法をうまく適用すると、必要演算量のかなりの部分を外部入力に頼らずに行えますので、並列処理適用の余地が驚異的に高くなります。
また、CPUパワーの量が「結果の質」に繋がるという、極めて実時間応答に向いた仕様となります。通常のアルゴリズムは、全ての計算が終わらないと「答え」に到達出来ませんが、モンテカルロの場合、計算量が足りない場合は「嘘っぽいけどそれなりの答え」となります。
「答えが分からない」ではなく「答えが薄い」というのは、極めて人間っぽいよね!だから私は、最初の本格的な感情搭載AIはモンテカルロ法を必ず使ったものになると、かなり無責任に断言するのです。