コラム:量子コンピュータ用のソフトウェアを作るのは難しい?そのために、何ができるだろうか

By Yuval Boger, Chief Marketing Officer, Classiq Technologies


多くの企業が、量子コンピューティングが世界に変革をもたらす可能性があると認識しています。輸送ルートを最適化する大幅なコスト削減、新しい化合物の発見による新規収入源の確保など、量子コンピューティングが持つ潜在的な影響は、すでに無視することはできません。


量子コンピューティングに関わるチームを結成している企業では、控えめな「希望リスト」があるようです。それは、社内で専門知識を育み(アウトソースに頼らず)、試作サイクルを短くし、量子アルゴリズムをスケールアップすること、別分野の専門家を招き入れることなどなど。


しかし一様に失望したり、時には驚いたりしながら、有用で洗練されたソフトウェアの開発はとても難しいことに気が付きます。それは何故でしょうか、そのような時、どうすればよいのでしょうか。


[ Translating classical into quantum is difficult(量子への変換は難しい) ]


アルゴリズムをC言語からPythonに変換するのは簡単です。しかし従来のアルゴリズムを、量子コンピュータ上で効率的に実行できるようにするのは、非常に難しいのです。理由の一つは、繰り返し、条件分岐、ランダムアクセスメモリなど従来の制御構造が、量子プログラミングには存在しないか、まったく別の形になってしまう。もう一つの理由は、量子の威力は、その特性である「重ね合わせ」「エンタングルメント」「干渉」に由来するものだからです。量子コンピュータが、古典コンピュータよりも、何らかの利点を提供するためには、アルゴリズムの設計者は量子論で考える必要があります。。グローバーのアルゴリズム(探索)が、従来のアルゴリズムとは似ても似つかないのはそのためです。


現在の量子コンピュータには、実用的に多くの限界があります。長時間の計算を行うことが出来ず、相対的に量子ビット数が少なすぎる。そのためNISQ時代の実用的なアルゴリズムは、一部を量子コンピュータで実行し、別の部分(特に制御)を古典コンピュータで実行するというハイブリッドのアルゴリズムになっています。これにより、量子アルゴリズムにはさらに複雑さが加わります。


アルゴリズムではなく、数値計算の方法(金融オプションのデリバティブ等)を出発点とする場合でも、この方法が量子化可能であると特定することも困難です。そのレシピは、より単純な機能ブロックとして表現するのが通常です。「QFTを実行する」であったり、「レジスタの各ビットについて、前のビットがすべて0であれば、アキュムレーターの量子ビットに角度Xの制御された回転を適用する」など。例としては、ウォール街にある大手企業の量子チームが書いた学術論文を参考にしてください。アルゴリズムを機能ブロックに分割し、それを量子コンピュータで実装する複雑さは容易に理解できるでしょう。


[ The complexity at the functional block level(機能ブロックでの複雑性) ]


機能ブロックが定義されると、次にはまた新しい難問がでてきます。


従来と同じように、特定の操作を実装する方法は複数あります。Wikipediaを見ると、高速なもの、効率的なもの、シンプルなものと、合計で43種類の数値のソートアルゴリズムが掲載されています。現時点では、量子の選択肢はそれほど多くないかもしれません。しかし設計者は、どの実装を使うかを決めなければなりません。たとえば、QFT加算器とリップル加算器のどちらを使用しますか?似ているようで、より浅いもの(ステップ数が少ない)や、より多くの量子ビットを必要とするものがあり、同じではありません。また、実装においても、可換ブロックの順序や、そのブロックを並列なのか直列で実行するのかなど、設計者には柔軟な対応が求められます。


多くの量子ブロックでは、補助的な量子ビット(アンシラ量子ビットと呼ばれることもある)を使用しています。その量子ビットは、特定の操作を助けるために、あるいは、量子回路を可逆的にするために使用されます。まだ測定されていない量子ビットで、後に回路で使用されるものは「未計算」である必要があります。アンシラ量子ビットを、単に0でリセットすることはできません。これは他の量子ビットと絡み合っている可能性があり、影響を与えてしまうからです。このようにアンシラ量子ビットを未計算の状態に保つためにも、各ブロックの複雑さが増大することになります。付け足していうと、より多くのアンシラ量子ビットを使用して、実装が簡単になる可能性もあります。


もう一つの要因は、回路の精度です。例えば、ガウス分布の近似値を求める計算がありますが、分布の近似はどの程度の精度が必要でしょうか?精度を高めるには、量子ビットの数を増やしたり、回路を深くしたりする必要があります。


[ System-level complexity(システムレベルの複雑性) ]


機能ブロックは設計完了だ、ならば、後はそれらをつなぎ合わせればOK、と言いたくなります。技術的にはその通りですが、ハードワークは始まったばかりです。結合に十分な量子ビットはありますか?結果として得られた回路は長すぎてノイズに埋もれませんか?アルゴリズムの設計者は、機能レベルの要件だけでなく、システムレベルの制約にも対処する必要があります。どの機能は他の機能と並行して実行し、どの機能を直列に実行しなければならないのでしょうか?


もう一つの問題点は、ターゲット・ハードウェアのネイティブ・ゲートセットに関して。ハードウェアが持つ固有ゲートを使用することが好ましいので、量子コンピュータによって異なるゲートへの対応が必要となります。設計者は、ハードウェアを検討するか、それぞれのコンピュータに合わせて、複数のバージョンを考慮しなければなりません。


特定のハードウェアに対して、どのゲートがネイティブであるかを理解するだけでなく、他のハードウェア属性を認識し、設計することも有効です。例えば、キュービット間の接続レベルは、必要な量子ビットのスワップ数に影響を与えることがある、また例えば、超伝導量子コンピュータは、原子をベースにする量子ビットよりも接続性が低いなど。

ハードウェア・ノイズと忠実度のモデルも考えてよいでしょう。もし、すべての量子ビットが同じように作られてなく、あるものは他のものよりもノイズが多いとすれば、より多くの量子ビットを使用する浅い回路ではなく、より少ない量子ビットを使用する深い回路を設計することに意味があるのかもしれません。


メモリ管理を考えてみましょう。アンシラ量子ビットの使用という新たな問題が発生します。どの量子ビットが再利用可能なのか、またどのように再利用するのがベストかを理解する必要があります。一度使用したアンシラ量子ビットは、後に出力用のビットとして使えるかもしれません。一つの機能ブロックで複数のアンシラ量子ビットを使用した場合、他のブロックに十分な容量は残っていますか?残っているなら元の状態に戻されていますか?また、再利用の必要がないアンシラ量子ビットは、計算をクリアする必要がない場合、ゲート数や回路の深さを減らすことができます。


精度に関しても大事な点があります。あるブロックで精度の低い近似値が使用されている時、続いて精度の高い計算が行われることに意味があるのだろうか、それとも両者のバランスはこれで良いのか?など、精度の観点からも納得できる設計が必要です。


つまり最も重要なポイントは、システムレベルの制約に対処し回路を最適化するには、個々の機能ブロックに戻り修正する必要があるということです。ブロックレベルとシステムレベルの最適化は、相互に依存しています。このことが、量子コンピュータ用のソフトウェアを書くのがとても難しくなる理由の一つです。


それにしても、なぜ最適化が必要なのでしょうか。競合他社よりも、6カ月早くコードを実行できるからです。1台のコンピュータで、資産のポートフォリオを50ではなく100最適化できるからです。少ないリソースでより多くのことが実行できるからです。アポロ11号に搭載されたコンピュータには、わずか72kのROMと、32kのRAMしかありませんでした。与えられたハードウェアから最大のパフォーマンスを引き出すには、そのことに熟練している必要があります。


[ But wait, there’s more…beyond the system level(いや待って、 システムレベルを超えてみると) ]


一般的なデスクトップマシンは、約30量子ビットの回路をシミュレートできます。スーパーコンピュータであれば、50量子ビットのマシンをシミュレートできるかもしれません。それでは新たに発表された127量子ビットのIBMマシンのような大規模な回路はどうでしょうか。シミュレートできない量子回路をデバッグできるでしょうか。


古典的なソフトウェアの開発では、ブレークポイントを設定して変数の状態を検査できます。続ける前に新しい値を設定することができます。量子コンピュータでこれを実現することはできるのでしょうか。益々洗練されていく量子プログラムですが、デバッガがないことに追い込まれていくのでしょうか?


設計者はデバッグの前段階でさえ、考えているアルゴリズムがコンピュータに適合するかどうか知りたいと考えています。最適な量子ビットの数は?回路の深さ?実行するのに最適なハードウェアは?こういった知識を持っていれば、より強力なコンピュータを数年待つのか、あるいは現在のコンピュータに収まるようにアルゴリズムを単純化することができるかもしれない。必要なリソースを見積もる能力は、コードを書く多大な労力を費やす前に、プロジェクト推進の合否を決定することができ、大きな時間の節約ができるでしょう。


[ The Classiq approach(Classiqのアプローチ) ]


これらはなんとも難しい問題ですが、重要な問題でもあります。量子コンピューティングは、科学実験としては素晴らしく刺激的ですが、実用的なアプリケーションにはならないのかもしれません。簡単な回路を手作りして「おもちゃの量子問題」を解決している間は、量子との約束は果たされません。


これらの問題を解決するためのヒントを求めて、Classiqのチームが検討を始めたとき、チップデザイン(デジタル集積回路を組み立てるプロセス)には、同様の問題がたくさんあることに気づきました。たとえば、チップのトランジスタ数はどんどん増えています。intel 4004は、商用生産された最初のマイクロプロセッサで、2,000個をわずかに超えるトランジスタを搭載していました。最新のi7チップには、40億を超えるトランジスタが搭載されています。このような大規模なチップを手作業で設計し、最適化することはできません。


チップには、メモリ、USBコントローラ、グラフィックプロセッサなどの上位の構成要素があります。また、カウンタやシフトレジスタ、データラッチなどの下位レベルのブロックもあります。これらのブロックの設計、テスト、スケールアップは、トランジスタレベルで行うことはできません。そこで、VHDLやVerilogなどのハードウェア記述言語(関数型言語)が開発され、設計者が回路の振る舞いを表現できるようになり、それをもとに古典コンピュータがゲートレベルの回路を合成することができるようになったのです。


これらはすべて統合され、共同で最適化される必要があります。RAMに使用するトランジスタが多すぎると、GPUに十分な空きがなくなります。接続を可能にするために、USBの接続性を考えてチップの端に配置する必要があります。また、メモリアクセスの信頼性を高めるには、タイミングを監視しなければいけません。回路合成ツールは、これらの制約を考慮して、要件を満たすように多くの選択肢を検討していきます。


Classiqでは、チップデザインの歴史と最新技術を理解した上で、量子アルゴリズムの設計でも同様のプロセスを構築することを目指しました。

エンジニアが求める動作を表現するための設計言語、各構成要素の複数の実装を可能にするモジュラーアプローチ、機能モデルを量子のビットやゲートに変換する合成エンジン、さらにはシミュレーションできないほど大規模な回路の解析を容易にする独自の検証・デバッグツールも用意しました。量子の設計は、「何が起こるか」「どのような制約を満たすか」という「What」に集中し、強力な古典コンピュータは「どのように」「これらの要求を複雑で最適な量子回路に合成するか」という「How」に集中するという分業体制を実現したかったのです。私たちは成功したと思っていますが、量子エコシステムの他のプレーヤーと協力しながら、さらに改善していくことを楽しみにしています。



(翻訳:Hideki Hayashi)

提供:Quantum Computing Report