量子コンピューティング

Qiskit SDK v1.2がリリースされました!

記事をシェアする:

主な新機能の最新情報や非推奨となった機能、Qiskitを世界で最も高性能な量子SDKとし続けるために進めている取り組みを含めて、Qiskit SDK v1.2のリリースの技術的要点をご紹介します。

2024年8月21日にQiskit SDK v1.2のリリースを発表しました!この最新マイナー・リリースには、業界をリードするQiskit SDKの性能と機能をさらに強化する多数の改善点が含まれています。ここでは重要なハイライトをまとめますが、いつものようにさらなる詳細については完全なリリースノートをこちらでご確認ください。

今年頭に行われた最初のメジャー・バージョンのリリースでv1.x時代への移行を始めて以来、私たちは Qiskit SDKを世界で最もパワフルで高性能な量子SDKにするということに徹頭徹尾集中してきました。私たちの目標は、研究者や開発者が実用規模の計算タスクを効率的に走らせるための高性能なツールとしてQiskitを使うことができるようにすることです。この力点は、Qiskitトランスパイラーの性能と全体的な品質に大きな改良を加えた新しいv1.2リリースについても同じです。

 

要点

このブログで触れる重要な更新点は次の通りです。

  • まず、この最新リリースで導入された主な変更や機能改良の詳細について見ていく前に、v1.2がPython 3.8をサポートする最後のQiskit SDKになるということに注意して頂くことが重要です。今年この後にQiskit v1.3がリリースされた時に、要求するPythonの最小バージョンはPython 3.9になります。
  • Qiskit SDK v1.2リリースによって、ゲートや演算子など量子回路の全ての構成要素は「酸化され」、すなわち Rust言語へと移行され、回路の構築や操作の高速化を果たしました。さらに、この変更によって合成のライブラリは回路をRustで構築するようになり、Clifford、permutationや、linear functionなどの演算を合成する際に著しい高速化を実現しました。
  • また、Sabreレイアウト・アルゴリズムにおける密なレイアウトの試行の追加や、ユニタリ覗き穴的最適化(unitary peephole optimization)の実装を通して、トランスパイル結果として得られる回路の品質が改善しました。
  • generate_preset_pass_manager()関数をインポートする際の利便性を改善しました。

主な新しい性能改善点

今年、Qiskit SDKは、実用規模の量子計算タスクを実行する際のパワフルで高性能なツールであるということを明確にしました。そしてIBMは、このツールの性能をさらに改善するための新機能開発や改良を続けています。そのためにQiskit v1.2リリースで導入された変更点を見てみましょう。

もしそれらの変更点やこのブログでは言及できなかったQiskit v1.2の新機能についての詳細をご確認されたい場合は、こちらの完全なリリースノートをご参照ください。

回路構成要素への変更点

上述したように、QuantumCircuitオブジェクトを構成する要素の多くがRustで書き換えられました。特に、Qiskit SDKの標準的なゲート・ライブラリは、Rustネイティブな表現を持っており、これによって回路の構築と操作が大幅に高速化されました。

この作業によって、Qiskitの多くの部品がPythonとまったくインタラクションすることなくRustから実行できるようになり、Qiskitソフトウェア・スタックの他の部品についても高速化の筋道が開かれました。実際に、新しいQiskit SDK v1.2リリースで、トランスパイル速度に明確な改良が実現しました。また、合成ライブラリも大幅に高速化し、回路を完全にRustで生成することができるようになりました。

以下にあるのは、400量子ビット回路の構築にかかる時間を、量子もつれのレイヤー数の関数としてプロットしたグラフです。v1.0と比べて、およそ2.8倍の高速化を見ることができます。

import numpy
from qiskit import QuantumRegister, QuantumCircuit

qr = QuantumRegister(400)
qc = QuantumCircuit(qr)
depths = [10, 14, 21, 30, 44, 65, …, 5179474] # For incresenly deeper circuits

for depth in depths:

while len(qc) < depth:

for k in range(400):

qc.h(qr[k])
qc.rz(numpy.pi, qr[k])

for k in range(4001):

qc.cx(qr[k], qr[k + 1])

 

さらに、Rustにおけるメモリ管理の効率性のおかげで、非常に大規模な回路のコピーの実行速度も大幅に改善されました。

 

回路合成とトランスパイルの改善

前述した回路構成の変更はまた、Qiskit SDKの回路合成とトランスパイル処理のさらなる改善も可能にしました。合成ライブラリの大部分が今やRustで回路を構成します。これによって、permutationの合成改善や、Cliffordの改善、1量子ビットおよび2量子ビット・ユニタリ演算子の合成など、合成処理の実行時間の非常に大きな改善が実現しました。

これらのパフォーマンス改善の規模を見てみるために、いくつかの実行時間尺度を計測し、Qiskit SDKの以前のマイナー・リリース二つと比較してみましょう。まず、1万通りのランダム入力に対する2量子ビット・ユニタリ合成の実行時間の平均です。

 

import statistics
import time
from qiskit.synthesis.two_qubit import TwoQubitBasisDecomposer
from qiskit.circuit.library import CXGate
from qiskit.quantum_info import random_unitary
decomp = TwoQubitBasisDecomposer(CXGate(), euler_basis=“ZSXX”)
unitaries = [random_unitary(4) for _ in range(10000)]
runtimes = []
for mat in unitaries:

start = time.perf_counter()
decomp(mat)
stop = time.perf_counter()
runtimes.append(stop – start)

print(f“Mean runtime per unitary: {statistics.geometric_mean(runtimes)} sec.”)
print(f“Total runtime for 10k unitary matrices: {sum(runtimes)} sec.”)

 

ここでは、v1.2.0の最新機能によって、v1.0.2に対しておよそ100倍、v1.1.1に対しておよそ5倍の改善が実現を見ることができます。

Rustへの移行の中で、Clifford合成アルゴリズムのひとつ(synth_clifford_greedy)も改善され、v1.1.1とv1.0.2に比較しておよそ500倍の実行時間改善が実現しました。

さらにQiskit v1.2の最適化レベル2ではトランスパイルのチューニングが追加されました。Qiskit SDK v1.3ではレベル2がデフォルトの最適化レベルになります。この新しいチューニングは、量子ビットのレイアウトを選択しSabreアルゴリズムでルーティングする際に、より良い初期値を選択します。同時に、このチューニングはトランスパイルの品質に大幅な改善をもたらしました。

以下の例で、 square_heisenberg_n100を異なる目標ゲートにトランスパイルする際に、v1.xのマイナー・リリースごとに回路の深さが一貫して浅くなってきていることが確認できます(このベンチマークテストのコードはこちら)。

これまでのリリースと同様に、Qiskit SDK v1.2でも以前のv1.xマイナー・リリースに対して実行時間の改善がありました。つまり、上の square_heisenber_N100 の例では、トランスパイルの際に出力される回路の質だけでなく、トランスパイルの処理時間も速くなっているということです。

 

主な新機能

このリリースで提供された様々な機能改善の中で、特にこの利便性改善は強調に値します。すなわち、これから、generate_preset_pass_manager()関数のパス・インポートに二つの新しい選択肢が追加されます。

これは、トランスパイル・パイプラインを構築する際に最も頻繁に使われる関数であるという、この関数の重要性を正確に反映するために行われた変更です。いまやこの関数は次の二つの方法のどちらでもインポートすることができます。

方法1:

from qiskit import generate_preset_pass_manager

 

方法2:

from qiskit.transpiler import generate_preset_pass_manager

 

デフォルトの qiskit.transpiler.preset_passmanagersパスに加えて、上のどちらのやり方も使うことができます。

 

覗き穴的トランスパイル最適化

トランスパイラーに対する重要な改善点の一つは、最適化レベル2と3ではレイアウトとルーティングの前の initステージの際に、2量子ビット・ユニタリ覗き穴的最適化を利用するようになり、これが実行時間と品質の改善をもたらしていることです。これまでのリリースでこの最適化は、レイアウトとルーティングの後にしか実行されませんでした。

2量子ビット・ユニタリ覗き穴的最適化は、回路における2量子ビット・ブロックを集め、ユニタリ行列表現に置換します。そして、この行列は、元のブロックよりも少ないゲート数で合成されます。この手法を initステージに加えるために、レイアウトとルーティングの前にConsolidateBlocksパスを走らせ、ゲートのブロックを行列表現に置き換えます。

これにはいくつかの利点があります。まず回路のゲート数を減らし、演算数も減るためレイアウトとルーティングの問題が単純になります。そして、より大きい2量子ビット・ブロックを見つけやすくなる可能性があります。もしルーティングが先に行われてしまうと回路に追加されたスワップ・ゲートが大きなブロックを分割してしまうかもしれないので、ConsolidateBlocksをルーティング以前にも行うようにしたというわけです。

さらに、新しいトランスパイラー・パスとして、Split2QUnitariesを追加しました。これはConsolidateBlocksによって生成された2量子ビット・ユニタリ行列に追加の分析を行い、二つの1量子ビット・ゲートのテンソル積とみなせるものがその中にないか調べ、あれば2量子ビット・ブロックを二つの1量子ビット・ユニタリ行列に分解します。この最適化は、ルーティング・ステージが実行されて回路にスワップ・ゲートが追加された後には検出するのが難しいことがあります。

新しい回路機能

qiskit.circuitライブラリには、いくつかの新しいクラスと機能が追加されました。たとえば、Quantum Fourier Transformsをネイティブに表現するqiskit.circuit.library.QFTGateクラスや、標準ライブラリのゲートを用いてランダムなClifford回路を生成する新しいqiskit.circuit.randomモジュールなどがあります。

この新しいQFTGateゲートは、トランスパイルまで合成を遅延させるという量子フーリエ変換の新しい実装になります。既存のqiskit.circuit.library.QFTクラスは生成された時に回路をすぐに合成するので、その点が異なります。こちらのqiskit.circuit.library.QFTクラスも後方互換性のためにまだ利用可能です。しかし、トランスパイルまで合成を遅延させるということは、QFT回路がどのように合成されるかを制御する選択肢が増え、目標バックエンドにあわせた、より良い実現化を可能にします。

この新しいQFTGateクラスは二つの新しいHLS合成プラグイン を Qiskitにもたらします。すなわち、 QFTSynthesisFullQFTSynthesisLineです。前者はall-to-allの接続性を仮定してQFT回路を合成するのに対し、後者は線形のnearest-neighborな接続性を仮定してQFT回路を合成します。QFTの実行はしばしば量子位相推定のようなより大きなアルゴリズムの一部であるので、合成をトランスパイラまで遅延させることによって、その特定の回路でQFTを使うために最適な合成の選択をすることができるようになります。

最後に、qiskit.circuitモジュールには、新しいrandom_clifford_circuit()関数が追加されましたが、これは量子ビット数と総ゲート数を入力として、標準ライブラリのゲートでランダムなClifford回路を生成します。この関数のシンプルな利用例は次の通りです。

 

from qiskit.circuit.random import random_clifford_circuit

random_circuit = random_clifford_circuit(num_qubits=2, num_gates=6)
random_circuit.draw(output=‘mpl’)

 

新たに非推奨とされた機能

非推奨プリミティブ

バージョン表示のないリファレンス・プリミティブ実装は非推奨とされました。プリミティブやリファレンス・プリミティブ実装を呼び出す時には、バージョン(V1やV2)によって明示的に指定しなければならなくなりました。さらに、PrimitiveV1リファレンス実装とそれに結びつけられたエイリアス(別名)は非推奨とされ、それに対応するV2実装の利用が求められます。しかし、V1定義 (例、BaseSamplerV1)は非推奨ではありません。必要な変更には次のようなものがあります。

  • qiskit.primitives.Estimatorの代わりに、対応するV2のStatevectorEstimatorを利用してください。
  • qiskit.primitive.Samplerの代わりに、対応するV2のStatevectorSamplerを利用してください。
  • qiskit.primitives.BackendEstimator の代わりに、BackendEstimatorV2を利用してください。
  • qiskit.primitives.BackendSampler の代わりに、BackendSamplerV2を利用してください。
  • BaseEstimatorエイリアスはもうBaseEstimatorV1への別名にはなりません。V1かV2のバージョンを明示的に指定してください。
  • BaseSamplerエイリアスはもうBaseSamplerV1への別名になりません。V1かV2のバージョンを明示的に指定してください。

BackendV1の非推奨化

BackendV1クラスは非推奨とされ、Qiskit v2.0リリースで削除されます。BackendV1オブジェクトをまだ提供しているプロバイダー・パッケージを利用しているならば、そのパッケージは新しいBackendV2インターフェースを使うように更新される必要がいずれ生じます。それを行う際には、バックエンドの詳細を問い合わせるのに複数の異なるアクセス・パターンがあることをご理解ください。より詳しい情報については移行ガイドをご参照ください。

 

Qiskit SDK v1.3の予告

このブログ記事はQiskit SDK v1.2についてのものですが、Qiskit v1.3では、そこへの移行に先立って準備をしておいて頂いた方がいい重要な変更がいくつかあります。それらには次のものが含まれます。

Python 3.8のend-of-life

前述のように、v1.2.0はPython 3.8をサポートする最後のリリースになります。Qiskit v1.3がリリースされた時には、サポートされるPythonの最小バージョンはPython 3.9になります。これは、Qiskit v1.3のリリース予定以前にPython 3.8が今年の10月にend-of-lifeを迎えるからです。

デフォルト最適レベルの変更

次のマイナー・リリースであるQiskit v1.3.0では、transpile()関数のデフォルト最適レベルが1から2に変更されます。最適化レベル2はgenerate_preset_pass_manager()関数のデフォルトにもなります(この関数にはこれまでデフォルト最適化レベルがありませんでした)。これはトランスパイラー・パスの最近の性能向上によって、この値が多くの場合に、トランスパイル実行時間と結果として得られる回路の品質の間の最適なトレードオフを提供する、大部分のユーザーにとって適切な値になると考えられるからです。

以上が、最新リリースの一番重要なポイントでした。今後のQiskitのバージョンについてアイデアを提供したいときには、新機能の要望やバグの報告するGitHubイシューをオープンすることができます。次のリリースについての情報を確認するには、Qiskit SDKのマイルストーンを参照してください。

このリリースに貢献した多くの人に特別な感謝を申し上げます。(アルファベット順に):


(このテキストをコピーするには英語ブログをご参照ください)

このブログ投稿はKaelyn Ferrisが執筆したものですが、Abby Mitchell、Blake Johnson、Jake Lishman、Luciano Bello、Matthew Treinish、Robert Davisによる貢献がありました。

 


この記事は英語版IBM Researchブログ「Release news: Qiskit SDK v1.2 is here!」(2024年8月21日公開)を翻訳し一部更新したものです。

今道 貴司
監訳:今道 貴司
IBM Quantum、シニア・リサーチ・サイエンティスト
Quantum Algorithm Engineering team
立花 隆輝
監訳:立花 隆輝
IBM Quantum, クライアント・テクニカル・リード、シニア・テクニカル・スタッフ・メンバー
量子コンピューターの社会実装に携わる。
More 量子コンピューティング stories

宇宙の極限状態をシミュレーションする実用規模の量子計算

ワシントン大学とローレンス・バークレー国立研究所による最新の研究で、エネルギーが極めて高い状態における基礎的な物理学実験のシミュレーションを、近い将来に可能にすると期待されるスケーラブルな手法を発表しました。 素粒子物理 […]

さらに読む

量子ユーティリティーとは?

歴史上初めて量子コンピューターが、愚直な古典シミュレーションを超える規模で問題解決能力を示し始めました。これに代わる選択肢は、問題に特化して丁寧に手作りされた古典近似手法だけです。今、量子コンピューターの機能を活用するこ […]

さらに読む

Qiskit SDKの設計理念

Qiskit SDKの開発を方向づけてきた理念や設計上の意思決定を明らかにしている新しい論文が公開されました。これは研究者が論文でQiskitを参照する際にちょうどよい引用可能な資料にもなっています。 Qiskitは最初 […]

さらに読む