qiskit-hardware について
Qiskit 開発者向けのハードウェアガイドです。実際の IBM Quantum バックエンドでの量子アルゴリズム実行、ノイズ特性評価、パルス制御を扱い、ハードウェアを考慮したトランスパイルと誤差緩和も説明します。
主な機能
- 01Runtime Primitives によるジョブ実行
- 02ハードウェア構成に合わせたトランスパイル
- 03誤差緩和手法の適用
- 04カスタムマイクロ波パルスの定義
- 05T1、T2 などの特性測定
活用シーン
- 01IBM Quantum バックエンドでのアルゴリズム実行
- 02ハードウェアノイズと校正データの確認
- 03デバイス構成に合わせた回路最適化
- 04パルスによる実験信号の定義
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tondevrel/ scientific-agent-skills --skill qiskit-hardwareインストール後、Claude Code で/qiskit-hardwareを入力して読み込まれたか確認します。
詳細
Qiskit - 実機とパルス制御
シミュレーターから実機に移行するには、考え方を変える必要があります。完全に「理想的」な量子ビットではなく、デコヒーレンス、読み出しエラー、クロストークの影響を受ける超伝導回路を扱うことになります。このガイドでは、ノイズの多い中規模量子(NISQ)デバイスから科学的な成果を最大限に引き出す方法を説明します。
使用する場面
- 実際の IBM Quantum バックエンドで量子アルゴリズムを実行する場合。
- ハードウェアのノイズ(T1、T2 緩和時間)を特性評価する場合。
- エラー緩和を実装して結果の精度を高める場合。
- Qiskit Pulse を使用してカスタムマイクロ波パルス(OpenPulse)を定義する場合。
- 特定のハードウェアトポロジー(結合マップ)に合わせて回路を最適化する場合。
- 実環境で量子優位性をベンチマークする場合。
参考ドキュメント
- IBM Quantum Learning: https://learning.quantum.ibm.com/
- Qiskit Runtime Docs: https://docs.quantum.ibm.com/run
- Qiskit Pulse Guide: https://docs.quantum.ibm.com/build/pulse
- 検索パターン:
QiskitRuntimeService、Sampler、Estimator、transpile、InstructionScheduleMap
基本原則
1. Qiskit Runtime(プリミティブ)
ハードウェアを操作する現代的な方法です。生の回路を送信する代わりに、プリミティブを使用します。
- Sampler: 準確率(ビット列)を返します。
- Estimator: オブザーバブルの期待値(例:エネルギー)を返します。
2. トランスパイル(ハードウェアへのマッピング)
物理バックエンドがサポートする「基底ゲート」はごく一部です(例:rz、x、sx、ecr)。トランスパイラーは抽象的な計算をこれらの特定の命令に書き換え、エラー率に基づいて仮想量子ビットを物理量子ビットにマッピングします。
3. エラー緩和
数千個の量子ビットを必要とする誤り訂正とは異なり、エラー緩和では統計的な手法(TREX や ZNE など)を用いて、実行後に結果を「補正」します。
クイックリファレンス:ハードウェアへの接続
インストール
pip install qiskit-ibm-runtime
セットアップとジョブの実行
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler
# 1. Initialize service (requires API key from quantum.ibm.com)
# service = QiskitRuntimeService(channel="ibm_quantum", token="YOUR_TOKEN")
service = QiskitRuntimeService() # Uses saved credentials
# 2. Select backend
backend = service.least_busy(operational=True, simulator=False)
# 3. Run job using Primitives
sampler = Sampler(backend=backend)
job = sampler.run([my_circuit])
result = job.result()
重要なルール
✅ 実行すること
- キャリブレーションデータを確認する - バックエンドは日々変化します。量子ビットを選ぶ前に、必ず
backend.properties()で最新のエラー率を確認してください。 - 「セッション」を使用する - 関連する複数のジョブを
RuntimeSessionでまとめ、キューの待ち時間を最小限に抑えてください。 - optimization_level を設定する - ハードウェアではレベル 3 を使用して、高度なルーティングとゲート融合を有効にしてください。
- 読み出し緩和を適用する - 読み出し(0 を 1 として測定すること)は、最大のエラー要因です。プリミティブで
resilience_level=1を使用してください。 - ダイナミカル・デカップリング(DD)を使用する - 他のゲートを待つ間に状態を失わないよう、「アイドル状態」の量子ビットにパルスを追加してください。
❌ 実行しないこと
- execute() を使用しない - 旧式の
qiskit.executeは、ハードウェアでの使用が非推奨です。SamplerとEstimatorを使用してください。 - 深い回路を実行しない - NISQ デバイスのコヒーレンス時間には限りがあります。回路の深さが 50~100 を超える場合、結果はほぼ純粋なノイズになる可能性があります。
- 結合マップを無視しない - 物理的に接続されていない量子ビット間で CNOT を強制すると、トランスパイラーによって多数の「SWAP」ゲートが追加され、エラーが増加します。
- ハードウェアの準備に qasm_simulator を使用しない - ローカルでのデバッグには、実際のハードウェアノイズを模倣する
FakeBackendオブジェクト(例:FakeManilaV2)を使用してください。
ハードウェアを考慮したトランスパイル
物理量子ビットへのマッピング
from qiskit import transpile
# Basis gates for a specific backend
basis_gates = backend.operation_names
coupling_map = backend.coupling_map
# Optimized transpilation
optimized_circ = transpile(my_circuit,
backend=backend,
optimization_level=3,
initial_layout=[0, 2, 4]) # Manual qubit selection
高度なエラー緩和
Estimator のレジリエンスレベル
from qiskit_ibm_runtime import EstimatorV2 as Estimator, EstimatorOptions
options = EstimatorOptions()
# resilience_level 0: No mitigation
# resilience_level 1: Readout mitigation (TREX)
# resilience_level 2: ZNE (Zero Noise Extrapolation) - expensive but accurate
options.resilience_level = 1
estimator = Estimator(backend=backend, options=options)
低レベル:Qiskit Pulse(OpenPulse)
カスタムマイクロ波信号の定義
from qiskit import pulse
from qiskit.circuit import Parameter
# Define a Gaussian pulse
amp = Parameter('amp')
with pulse.build(backend=backend, name='custom_pulse') as schedule:
pulse.play(pulse.Gaussian(duration=160, amp=amp, sigma=40), pulse.drive_channel(0))
# Attach pulse to a gate
my_circuit.add_calibration('my_gate', [0], schedule, params=[amp])
実践的なワークフロー
1. デバイス上の「最適な」量子ビットを見つける
def get_best_qubits(backend, n_qubits):
"""Finds a linear chain of qubits with lowest error rates."""
props = backend.properties()
# Logic to parse gate_error and readout_error from props
# and find a connected subgraph with minimal noise.
pass
2. Runtime を使用したハードウェア上での VQE
from qiskit_ibm_runtime import Session, EstimatorV2 as Estimator
def run_hardware_vqe(ansatz, hamiltonian, backend):
with Session(backend=backend) as session:
estimator = Estimator(session=session)
# Standard optimization loop (using SciPy)
# Each 'step' runs a job within the same session
pass
3. T1 時間(緩和)の測定
def t1_experiment(qubit, delay_times):
circuits = []
for t in delay_times:
c = QuantumCircuit(qubit + 1)
c.x(qubit) # Flip to |1>
c.delay(t, qubit, unit='us') # Wait
c.measure_all()
circuits.append(c)
# Execute on hardware and fit decay curve
パフォーマンスの最適化
1. ジョブのバッチ処理
複数の回路を単一の run() 呼び出しで送信し、初期化を繰り返すオーバーヘッドを回避します。
2. トランスパイラーパス・マネージャー
トランスパイル時に回路をどのように変更するかを正確に制御するため、カスタムステージを作成します。
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import Unroller, BasicSwap
# custom_pm = PassManager([Unroller(['u3', 'cx']), BasicSwap(coupling_map)])
よくある落とし穴と解決策
キューの待ち時間
実機は需要が高い状態です。
# ✅ Solution:
# 1. Use the 'least_busy' helper.
# 2. Check your IBM Quantum dashboard for reservation windows.
# 3. Use Runtime Sessions to group your jobs.
「脱分極」した結果
ヒストグラムが平坦な線(ランダムノイズ)のようになります。
# ✅ Solution:
# 1. Reduce circuit depth.
# 2. Use 'optimization_level=3'.
# 3. Apply Error Mitigation (resilience_level=1+).
# 4. Check if the backend is currently undergoing maintenance/calibration.
周波数の衝突
隣り合う2つの量子ビットの周波数が似ているため、「クロストーク」が発生します。
# ✅ Solution:
# Select qubits that are physically separated or have
# significantly different frequencies in backend.properties().
Qiskit Hardware は、量子論が物理学の厳しい現実と向き合う場所です。これらのツールを使いこなすことで、今日のノイズの多いデバイスで可能なことの限界を押し広げ、フォールトトレラント時代への道を切り開けます。