3日ほど前に通信技術の重要性について書いたせいか、おかしな夢を見ました。必ずしも友好的とは言えない宇宙人のコンピュータを手に入れてその内部を解析する、というお話なのですね。
UFOのOS
軍内部での解析の結果、どうやらこれはUnixに近いOSが使われているらしいということで、Unixに詳しい元ハッカーが、彼を昔から知る将校の前に呼び出される。で、次のような会話が交わされるわけですね。
将校:君もこんなもんをやらんで、グローバル・スタンダードなOSを手掛けておれば、今頃は悠々自適の人生を送っていたのではないかね。君も技術を読み間違ったな。
元ハッカー:技術を読み間違ったのは人類ですよ。現にこいつがここにある。ユニバーサル・スタンダードだ。
グローバル・スタンダードは、地球というローカルな世界で各国政府や企業の思惑が絡んだ結果として決まっている。地球上の各国政府や企業の影響力の及ばない、地球以外の星では、他の技術がスタンダードになるのは当然のこと。つまり、グローバル・スタンダードといえどもローカルなスタンダードなのですね。
これに対して、技術の良しあし、シンプルか複雑かという基準やパフォーマンスという数値で測れば、人類だろうと宇宙人だろうと、理性が伴っている限り、同じ答えが返ってくる。つまり、それこそがユニバーサル・スタンダードだ、というわけなのですね。
まあ、内容に関しましては、パスしておくのが良いでしょうけど、面白い夢を見たものです。
コンピュータアーキテクチャ:三つの未来
この夢を見たもう一つの理由は、最近の米国市場でNVIDIA(エヌビディア)が株価を飛ばしている、大いに話題となっていたからかもしれません。エヌビディアは、グラフィック・プロセッサ(GPU)の世界最大企業なのですね。そして、GPUはAIの演算を行うコンピュータシステムの基幹技術として注目されております。
GPUは、多数の演算器(乗算器と加算器)を相互に接続して構成されております。このプロセッサの本来の目的は、画像データの高速処理だったのですが、AIで大量に行われる演算も行列演算(積和演算)であり、GPUを用いると極めて高速に処理できるのですね。
実は10年以上の昔、情報処理学会が開催したあるシンポジウムで、未来のコンピュータとして3つの技術が候補に挙がっておりました。第一は、当時も多くつくられていたメニーコア(マルチCPU)で、多数のCPUコアを一つのLSI中に格納したり、多数のCPU(LSI)をボード上に並べる、あるいは多数のCPUボードを並べて巨大なコンピュータシステムを作るという方向です。当時の我が国のスーパーコンピュータ「京(けい)」や、その他の高速サーバはおおよそこの方式で作られていたのですね。
これに対して他の二つの方式も注目され、将来はどの方向に進むだろうかということが話題となっておりました。その一つは、前出エヌビディアのグラフィック・プロセッサ(GPU)、もう一つはフィールド・プログラマブル・ゲート・アレイ(FPGA)だったのですね。現時点で答え合わせをするならば、GPUが正解ということになるわけです。
失われたFPGAの可能性
でも、私はFPGA方式を指向した。会社まで作っちゃった。じつは、それ以前の職場で高速演算処理が必要となったのですが、FPGAを使えばこれがいとも簡単にできることがわかっていたのですね。FPGAは文字通りゲート・アレイ、つまり論理要素(ロジック・エレメント)を並べたもので、これをユーザが任意に機能定義して接続することができる、つまり、フィールド・プログラマブル(現場でプログラム可能)というわけです。この大手メーカはザイリンクス(Xilinx、後にAMDが買収)で、ロジックエレメントは実はSRAM(メモリーの一種)だというのですね。つまり、アドレスが入力でデータが出力だと。たしかにこれを使えば、どんな論理演算も可能です。
ところが問題は、その論理設計が難しい。一応HDL(ハードウエア・ディスクリプション・ランゲージ)というC言語風との触れ込みの言語はあるのですが、ほとんどアッセンブラに近い機能しかない。ならば、より抽象性の高いFPGA言語を作ってやれば、FPGAが大量に使われるようになるのではないか、と考えるのはごく普通でしょう。これって、マイクロプロセッサが登場した時の、(未成熟な)ソフトウエア業界と同じではないか、大チャンスですね、というわけです。
で、言語開発は一応やり遂げた。その内容は、情報処理学会のDAシンポジウムで、2010年、2012年、2014年の3回にわたって発表したほか、2014年の情報処理学会全国大会でも発表したのですね。ところが、時代はFPGAには来ない。多分、GPUの方に行ってしまったのでしょう。2016年のHPCSで纏めの発表をして終わりにしようとしたのですが、結果は不採録。仕方がありませんね。このころより、コンサルティングの依頼も増えてまいりましたので、商売の方向転換を図ったというのが実態です。まあ、これはこれで軌道に乗っておりますので、良しとするしかありません。
最近の動きは、ひょっとして...
ところで、最近のMechaAG氏の記事を読んでおりましたら、Normal Floatというのが紹介されておりました。さらにそこからリンクを張られているページ「QLoRA」によれば、4ビットNormalFoatとDouble QuantizationとPaged Optimizersの三つが重要な技術だと。
4ビットNormalFloatは、正規分布の累積値の逆関数を用いてそれぞれの値で代表されるサンプルの数を同じにするように数値を割り当てたもので、たしかにこれでやれば指数関数よりも情報量の落ちは少ない。数値の割り当ては、逐次比較型のAD変換器のようなアルゴリズム(DAコンバータの代わりに変換表が入る)で第二量子化(?)をするのではないかと思いますが、四則演算を表引きで行うなど、演算はかなり複雑になりそうです。
これに対して、仮数部を1に固定した浮動小数点数には、乗算は指数部の加減算で済みますし、加減算はレジスタのビット長を長くとれば良く、演算器が簡素で済むという利点があります。およそ正規分布は、中央部が密で、離れた部分は疎になりますので、中心をゼロにとれば、指数表記することで情報量を落とさずに幅広い数値を小さなビット幅に収めることができます。たしかにNormalFloatよりは同じビット幅に含まれる情報量は少ないのですが、演算が簡素化される利点があります。そして、この手の数値型を扱うには、自由度の高いFPGAが好適ということになります。
このような数値表現は、じつはDA2010の私の論文でも紹介しております、ビット長可変の指数部と、同じくビット長可変の仮数部の、二つの整数で数値を表す方式に類似しております。もちろん4ビットNormal Floatを扱いますシステムも、他の形式の数値も扱うわけですから、これらをまとめれば、同じことになるわけですね。
なぜこんなことをすると効率が格段に改善されるかといいますと、今日のCPUは、ビット長固定の数値表現を採用しております。今日一般に用いられている倍精度浮動小数点数(double)は、十進16桁の分解能を持つのですが、これだけの精度が必要な演算は、現実にはほとんどないのですね。必要もない演算にシリコンの領域を使用し、ノイズでしかないビットを反転するために膨大な電力を消費している。無駄な話です。
無駄の効用と効率化の可能性
なぜこんな無駄が必用かといえば、IPSJ2014で発表した、誤差のキャンセルという問題があり、大きな数と小さな数の加減算が行われた場合、大きな数がキャンセルになる演算がその先に含まれますと、小さな数の精度が生きてくる。大きな数に含まれる誤差で有効桁数を切ってしまいますと、小さな数の有効桁が失われてしまうという問題がありました。
つまり、絶対値の大きな数Aと、絶対値の小さな数Bの加算が行われますと、Bは和の小さな桁にのみ作用しているため、結果を表わす限られたビット幅に含まれないこともある。これが最終結果なら、Bの値はAの無効桁で消されてしまいましたということで片付くのですが、その先の演算で、Aが減算されるようなことがありますと、Bの値が再び生きてくるのですね。
つまり【(A + B) - A】という演算が行われるなら、Bの有効桁が結果の有効桁ということになる。このような演算は、じつは非常にしばしば行われている。たとえば二次方程式【a x2 + b x + c = 0、a ≠ 0】の解の公式【x = (-b ±√b2 - 4 a c) / (2 a)】では、bの絶対値が大きい場合、平方根の値がbの絶対値に近い値となり、加減算(±)の一方でbがキャンセルされてしまいます。その他、連立方程式を解く場合も、左辺と右辺に同じ値を加減算する演算がしばしば行われ、この部分でも誤差のキャンセルが発生する可能性があります。
原理的には十分であるはずの十進7桁の分解能を持つ単精度浮動小数点数で演算すると桁落ちの問題が生じるという事実は、数値演算が始まった比較的初期の段階で認識され、その後は倍精度浮動小数点数の使用が一般的になりました。浮動小数点数といえば、倍精度というのがあたりまえになってしまったのですね。
まあ、実務的にはこれで済んでいるのですが、実を言えば倍精度で問題が起こっていない保証はない。単精度で問題が起こっていたのだから、倍精度だって問題が起こっている可能性はある。ただその頻度が極めて小さいため、気付かれていないだけ、というのが実情でしょう。人類は、危ない橋を渡っております。
実際問題として、倍精度でも桁不足が問題となる例がないわけではない。スカラーポテンシャル法で磁界を計算すると、磁性体とそうでない部分で、取り扱う数値のオーダーが大幅に異なるために誤差のキャンセルが発生し、桁落ちが問題となる。この問題は、ポテンシャルを複数の組に分けて計算するなど、アルゴリズムを工夫することで回避できることが知られております。
誤差キャンセルがある場合に仮数部桁数が不足するという問題は、仮数部のビット幅を拡大しておく以外にも解決のしようがある。誤差のキャンセルが生じないような演算式に組みなおすこともできるのですね。この組みなおしには、今日ではAIという強力な手段がある。10年以上の昔でもReduce等の、数値演算を簡素化するAI(古い意味での)プログラムが存在しました。今日のAI技術を用いれば、新たな演算にも、誤差のキャンセルがあるかないかを見抜いて、最適な演算式に組みなおすことも容易にできるでしょう。
夢は、続く
その他、Paged Optimizersは、大昔のメインフレームでも使用されておりましたオーバーレイということでしょう。実は、FPGAでもそのようなことができると、不採録になりましたHPCS2016論文には記述したのですね。FPGAはSRAMで構成されていますから、そのメモリー容量を何倍かに増やして、アドレス指定してやることで、論理を瞬時に切り替えることができる。
それぞれのSRAMに、論理演算とメモリー内容のロードの双方を可能とするには、デュアルポート(アドレス線とデータ線が2セット用意されている)のSRAMを用いればよい。FPGAでは、デュアルポートRAMは、結構普通に利用されております。この場合、論理演算に使用していないRAM領域は自由に読み書きできますので、SRAM内容を読み書きするためのポートは、メインメモリの適当な空間に割りあてておき、適宜CPUからアクセスすればよいのですね。
こうしてみますと、これまでやってきた仕事もそうそう悪いものでもない。これはどこかで見直しが必要かもしれません。つまりこの先、GPUからFPGAという、もう一波乱がコンピュータアーキテクチャの世界でも起こるかもしれない、ということなのですね。
面白くなってまいりました、となればよいのですが、、、
Xilinxなくなっていたのか