概要
・Windows11/WSL2でのQiskit環境構築手順は需要がありそうなので記載します。
・IBM Community Japanの2024年ナレッジモール研究に参加した際に使用したQiskit環境の構築手順となります。
IBM Community Japan / ナレッジモール研究
・Qiitaの書き方がまだわかっておらず練習を兼ねているため、今後も修正をしていきます。
本ドキュメントの範囲
(0) シミュレータ実行と実機実行の違い
(1) IBM Quantum Platformでのアカウント登録/API Token取得
(2) API Token登録
(3) ライブラリのimport
(4) 量子回路の作成
(5) 量子回路の実機(IBM Quantum Platform)実行
(6) 実行結果の取得
(7) 実行結果を確率分布図で確認
(0) シミュレータ実行と実機実行の違い
シミュレータ実行と異なり、実機の実行では以下が異なります。
・IBM Quantum PlatformのAPI Tokenが必要になる。
・QiskitでAPI Tokenを登録する必要がある。
・実機での実行前にpass managerで回路の最適化を行う。
(シミュレータで最適化を行う場合はtraspileを使用する。)
・backendとして実機を選択する必要がある。
(1) IBM Quantum Platformでのアカウント登録/API Token取得
IBM Quantum Platformのサイトで、ユーザーアカウントを登録してAPI Tokenを取得します。
API Tokenはログオン後、画面の右上に表示されています。
(2) API Token登録
API Token登録用のコードは専用のコードを1つ作っておくと便利です。
<your_token>の個所をAPI Tokenに置き換えたうえでコードを実行します。
<>の部分は不要です。
★コードをgithubなどで公開された場所にアップロードしないように気を付けてください。
# import
from qiskit_ibm_runtime import QiskitRuntimeService
# API Tokenを設定
QiskitRuntimeService.save_account(
channel='ibm_quantum',
overwrite=True,
set_as_default=True,
token='<your_token>')
# QiskitRuntimeServiceインスタンス生成
# IBM Quantum Platformを使用する場合はchannel='ibm_quantum'
service = QiskitRuntimeService(channel=('ibm_quantum'))
[これより、量子回路の実行を行います。]
(3) ライブラリのimport
シミュレータでのqiskit.primitivesが、
実機で実行するためのqiskit_ibm_runtimeと
回路の最適化を行う generate_preset_pass_managerに置き換わります。
# ライブラリのimport
# 量子回路作成のために必要
from qiskit import QuantumCircuit
# IBMQ実機での実行に必要
from qiskit_ibm_runtime import QiskitRuntimeService, Sampler
# passManager(IBMQ実機での量子回路最適化で使用)
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# 確率分布を表示するために必要
from qiskit.visualization import plot_distribution
(4) 量子回路の作成
量子回路はシミュレータ実行時のものと同一です。
量子ビットq0とq1がもつれます。
# 量子回路の初期化
circuit = QuantumCircuit(2) # 量子ビット2個 古典ビット2個を準備
# 量子回路の組み立て
circuit.h(0) # アダマールゲートを適用
circuit.cx(0,1) # CNOTゲートを適用
# 測定
circuit.measure_all() # すべての量子ビットを測定する。()
# 量子回路の素描
circuit.draw(output="mpl") # 量子回路をmpl形式で表示
(5) 量子回路の実機(IBM Quantum Platform)実行
インスタンス生成 -> backend設定 -> passManager -> 量子回路の実行の順で実施します。
処理待ちとなることが多いため、job idを出力することで状態確認の際に使用します。
#--- 量子回路の実行(IBM Quantum)
# QiskitRuntimeServiceインスタンス生成
service = QiskitRuntimeService()
# 下記は参考のため記載。実行しなくてもよい
# アカウントで利用可能なバックエンドのリスト
# API TOKEN登録時にchannel=('ibm_quantum')を設定しているので
# 利用可能な実機のリストが出力される。
print(f'accessible backends : {service.backends()}')
# backend設定
# service.least_busyを使うことで、処理能力的に一番余裕のある実機が選ばれる。
backend = service.least_busy(operational=True, simulator=False)
print(f'#------')
print(f'Selected in-use backend : {backend}')
#---passManagerによる量子回路の最適化
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circ = pm.run(circuit)
# IBM Quantum : JOB(1)
# 量子回路の実行
sampler = Sampler(backend)
job = sampler.run([isa_circ])
# IBM Quantum : JOB(2)
# job idの出力
job_id = job.job_id()
print(f'#------')
print("job id:", job_id)
実行イメージ
アクセス可能な実機が ibm_brisbane、ibm_kyiv、ibm_sherbrookeの3台あり、
job id: cy70k1mnrmz00085pcp0がアサインされ、ibm_kyivで実行されていることがわかります。
下記のコードを実行するとJOBの状態を確認できます。
PENDING:処理の順番待ちで未実行。
RUNNING:実行中
DONE :完了
一度にすべてのコードを実行してしまうと、処理が返ってこなくなることが多いので、
コード実行はここまでにとどめておいて、状態確認を何度も繰り返し実行することで
JOBがDONEになるまで待つのもありです。
# IBM Quantum : JOB(3)
# JOB処理状態の確認
job.status()
[IBM Quantum PlatformでのJOB状態確認]
IBM Quantum PlatformでもJOBの状態を確認することができます。
IBM Quantum Platform -> Dashboard -> Recent workloadsでJOBの実行状態を確認できます。
job id: cy70k1mnrmz00085pcp0のStatusが"In progress"となっておりibm_kyivで実行中です。
該当JOBの行をクリックすると詳細のページが表示されます。
その他、いろいろと面白い情報があるので触ってみてください。
(6) 実行結果の取得
qiskit_ibm_runtime / Sampler実行結果の取得はシミュレータのPrimitiveResult形式で一緒です。
# IBM Quantum : JOB(4)
# 実行結果の取得
result = job.result() # PrimitiveResult形式の結果を取得
counts = result[0].data.meas.get_counts() # PrimitiveResultから回路実行結果を抽出
print(counts) # 結果をテキスト表示:measure_all()の場合、'meas'で結果を取得
(7) 実行結果を確率分布図で確認
確率分布図を出力するコードはシミュレータと一緒です。
理論上では量子ビットq0とq1がもつれているため、出力は00か11になるはずですが、
実機のノイズにより01、10のパターンが少しだけ含まれています。
# 確率分布を表示
plot_distribution(counts)
[その他]
# Qiskitバージョン情報
import qiskit
print(f'qiskit version : {qiskit.__version__}')
# Pythonおよび実行環境情報
import sys, platform
print(f'python version : {sys.version}')
print(f'platform : {platform.uname()}')
続きます。
Qiskit環境構築
【uv版】
(1) Linuxの導入/設定
(2) uvの導入/Python仮想環境の作成
【poetry版】
(1) Linuxの導入/設定
(2) Python仮想環境の作成
【uv/poetry共通】
(3) vscodeからのPython仮想環境接続
(4) シミュレータでの量子回路実行
(5) IBMQ実機での量子回路実行
(6) メンテナンス