ハードウェア
Masao Tokunari、Tamiya Onodera(2024年6月14日)
このコースは、東京大学で実施されたライブコースをもとにしています。
このレッスンの講義PDFは2つに分かれています。パート1をダウンロード、パート2をダウンロード。静的な画像のため、一部のコードスニペットは非推奨になっている可能性があります。
1. はじめに
このレッスンでは、現代の量子コンピュータハードウェアについて学びます。
まず、いくつかのバージョンを確認し、関連するパッケージをインポートします。
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
import statistics
from qiskit_ibm_runtime import QiskitRuntimeService
2. バックエンドとターゲット
Qiskit は、量子デバイスに関する静的および動的な情報を取得するための API を提供します。デバイスとのインターフェースには Backend インスタンスを使用し、これには Target インスタンス(命令セット・アーキテクチャー(ISA)やそれに関連するプロパティや制約などの重要な特徴をまとめた抽象的なマシンモデル)が含まれます。 これらの Backend インスタンスを使って、IBM Quantum® Platform のCompute resources ページに表示される情報の一部を取得してみましょう。まず、対象のデバイスに対する Backend インスタンスを作成します。以下では、「ibm_kyoto」、「ibm_kawasaki」、または最も空いている Eagle マシンを選択します。QPU へのアクセスは異なる場合がありますので、それに応じて Backend 名を更新してください。
service = QiskitRuntimeService()
# backend = service.backend("ibm_kawasaki") # an Eagle, if you have access to ibm_kawasaki
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
) # Eagle
backend.name
'ibm_strasbourg'
デバイスの基本的な(静的な)情報から確認していきましょう。
print(
f"""
{backend.name}, {backend.num_qubits} qubits
processor type = {backend.processor_type}
basis gates = {backend.basis_gates}
"""
)
ibm_strasbourg, 127 qubits
processor type = {'family': 'Eagle', 'revision': 3}
basis gates = ['ecr', 'id', 'rz', 'sx', 'x']
2.1 演習
Heronデバイス "ibm_strasbourg" の基本情報を取得してみましょう。まず自分で試してから、以下のコードで確認してください。
a_heron = service.backend("ibm_strasbourg") # a Heron
# your code here
print(
f"""
{backend.name}, {a_heron.num_qubits} qubits
processor type = {a_heron.processor_type}
basis gates = {a_heron.basis_gates}
"""
)
ibm_strasbourg, 133 qubits
processor type = {'family': 'Heron', 'revision': '1'}
basis gates = ['cz', 'id', 'rz', 'sx', 'x']
2.2 結合マップ
次に、デバイスの結合マップを描画します。ご覧のとおり、ノードは番号付きの量子ビットを表しています。エッジは、2量子ビットエンタングルゲートを直接適用できるペアを示しています。このトポロジーは「ヘビーヘックス格子(heavy-hex lattice)」と呼ばれています。
# This function requires that Graphviz is installed. If you need to install Graphviz
# you can refer to:
# https://graphviz.org/download/#executable-packages for instructions.
try:
fig = backend.coupling_map.draw()
except RuntimeError as ex:
print(ex)
fig

3. 量子ビットの特性
Eagleデバイスには127個の量子ビットがあります。そのうちいくつかの特性を取得してみましょう。
for qn in range(backend.num_qubits):
if qn >= 5:
break
print(f"{qn}: {backend.qubit_properties(qn)}")
0: QubitProperties(t1=0.000183686508736532, t2=0.00023613944465408068, frequency=4832100227.116953)
1: QubitProperties(t1=0.00048794378526038294, t2=9.007098375327869e-05, frequency=4736264354.075363)
2: QubitProperties(t1=0.00021247781834456527, t2=7.81037910324034e-05, frequency=4859349851.150393)
3: QubitProperties(t1=0.0002936462084765663, t2=0.00011400214529510604, frequency=4679749549.503852)
4: QubitProperties(t1=0.00044229440258559125, t2=0.0003181648356339447, frequency=4845872064.050596)
量子ビットのT1時間の中央値を計算してみましょう。結果をIBM Quantum Platformのデバイスページに表示されている値と比較してみてください。
t1s = [backend.qubit_properties(qq).t1 for qq in range(backend.num_qubits)]
f"Median T1: {(statistics.median(t1s)*10**6):.2f} \u03bcs"
'Median T1: 285.43 μs'
3.1 演習
量子ビットのT2時間の中央値を計算してみましょう。まず自分で試してから、以下のコードで確認してください。
# Your code here
t2s = [backend.qubit_properties(qq).t2 for qq in range(backend.num_qubits)]
f"Median T2: {(statistics.median(t2s)*10**6):.2f} \u03bcs"
'Median T2: 173.10 μs'
3.2 ゲートエラーと読み出しエラー
次に、ゲートエラーについて見ていきます。まず、Target インスタンスのデータ構造を調べます。これは、キーが操作名であるディクショナリです。
target = backend.target
target.keys()
dict_keys(['measure', 'id', 'sx', 'delay', 'x', 'for_loop', 'rz', 'if_else', 'ecr', 'reset', 'switch_case'])
値もまたディクショナリになっています。'sx'操作に対する値(ディクショナリ)のいくつかの項目を見てみましょう。
for i, qq in enumerate(target["sx"]):
if i >= 5:
break
print(i, qq, target["sx"][qq])
0 (0,) InstructionProperties(duration=6e-08, error=0.0007401311759115297)
1 (1,) InstructionProperties(duration=6e-08, error=0.0003163759907528654)
2 (2,) InstructionProperties(duration=6e-08, error=0.0003183859004638003)
3 (3,) InstructionProperties(duration=6e-08, error=0.00042235914178831863)
4 (4,) InstructionProperties(duration=6e-08, error=0.011163151923589715)
'ecr'と'measure'操作についても同様に確認してみましょう。
for i, edge in enumerate(target["ecr"]):
if i >= 5:
break
print(i, edge, target["ecr"][edge])
0 (0, 14) InstructionProperties(duration=6.6e-07, error=0.01486295709788732)
1 (1, 0) InstructionProperties(duration=6.6e-07, error=0.015201590794522601)
2 (2, 1) InstructionProperties(duration=6.6e-07, error=0.00697838102630724)
3 (2, 3) InstructionProperties(duration=6.6e-07, error=0.008075067943986797)
4 (3, 4) InstructionProperties(duration=6.6e-07, error=0.0630164507876913)
for i, qq in enumerate(target["measure"]):
if i >= 5:
break
print(i, qq, target["measure"][qq])
0 (0,) InstructionProperties(duration=1.6e-06, error=0.0078125)
1 (1,) InstructionProperties(duration=1.6e-06, error=0.155029296875)
2 (2,) InstructionProperties(duration=1.6e-06, error=0.057373046875)
3 (3,) InstructionProperties(duration=1.6e-06, error=0.02880859375)
4 (4,) InstructionProperties(duration=1.6e-06, error=0.01318359375)
ご覧のとおり、読み出しエラーは2量子ビット操作のエラーより大きく、2量子ビット操作のエラーは1量子ビット操作のエラーより大きい傾向があります。
データ構造を理解したところで、'sx' ゲートと 'ecr' ゲートのエラーの中央値を計算してみましょう。こちらも IBM Quantum Platform のデバイスページに表示されている値と比較してみてください。
sx_errors = [inst_prop.error for inst_prop in target["sx"].values()]
f"Median SX error: {(statistics.median(sx_errors)):.3e}"
'Median SX error: 2.277e-04'
ecr_errors = [inst_prop.error for inst_prop in target["ecr"].values()]
f"Median ECR error: {(statistics.median(ecr_errors)):.3e}"
'Median ECR error: 6.895e-03'
4. 付録
Qiskitの人気機能の1つが可視化機能です。回路ビジュアライザー、状態・分布ビジュアライザー、ターゲットビジュアライザーなどが含まれています。前のJupyterノートブックでは最初の2つをすでに使用しました。ここでは、ターゲットビジュアライザーの機能をいくつか使ってみましょう。
from qiskit.visualization import plot_gate_map
plot_gate_map(backend, font_size=14)

from qiskit.visualization import plot_error_map
plot_error_map(backend)

# Check Qiskit version
import qiskit
qiskit.__version__
'2.0.2'