0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[2025年9月版] Qiskit環境構築 [共通] (5) IBM Quantum 量子コンピュータ実機による量子回路の実行

Last updated at Posted at 2025-09-11

概要

IBM Quantumの量子コンピュータ実機で、Qiskitの量子回路を実行する方法を解説します。

ポイント
2025年7月から、"IBM Quantum Platform"がIBM Cloud内のサービスとして統合されました。
量子コンピュータの実機を使うためには下記が必要になります。

  • IBM Cloudアカウントの有効化。(要クレジットカード登録。本人確認が必要な場合も有り。)
  • IBM Quantum PlatformでのAPIキー作成
  • IBM Quantum Platformでのインスタンス作成とCRN(Cloud Resource Name)の取得

この記事では「IBM Cloudへのアカウント登録」から「実機でのQiskitコードの実行」までを解説します。

< 登録編 >

手順 内容
1 IBMidを作成する(IBM共通アカウント)
2 IBM Cloudアカウントを有効化する(クレジットカード登録・本人確認)
3 IBM Quantum Platformにサインインする(IBMidアカウントでアクセス可能)
4 APIキーを作成する(Qiskitから接続するための認証情報)
5 インスタンスを作成してCRNを取得する(実機利用に必須)

< 実行編 >

手順 内容
0 シミュレータ実行と実機実行の違い
1 QiskitからIBM Cloudに接続する(APIキーとCRNの登録)
2 実行する量子回路を用意する
3 実機にジョブを送信する
4 実行結果を取得する
5 [参考] 完了済みジョブを再取得する(retrieve)

1.登録編

本章ではGUIのすべての画面遷移を追うのではなく、以下の3点に絞って説明します。

  • ポイントとなる画面
  • 基本的な流れ
  • 入力・保存しておくべきパラメータ

1. IBMidを作成する(IBM共通アカウント)

※すでに旧IBM Quantum Platformのアカウントを持っている場合は、IBMidの新規作成は不要です。
※IBM Cloudのサイトから直接IBMidを作成することもできます。
※googleのアカウントでもログオン

  • IBMidは、IBMが提供する共通アカウントで、IBM CloudやIBM Quantum Platformを含むIBMのサービスにサインインするために必要です。
  • IBM Cloudアカウントは、このIBMidにクレジットカード登録・本人確認を紐づけることで有効化されます。

作成手順

  1. IBM公式の登録ページにアクセスして、"サインイン"をクリックします。
    My IBM

    image.png

    参考:IBMidの作成方法 (IBM公式サポートページ)

  2. メールアドレス・氏名・パスワード等を入力してアカウントを作成します。
    あとは道なりに登録していってください。
    登録の途中で、指定したメールアドレスに確認コードが行きます。
    image.png

2. IBM Cloudアカウントを有効化する(クレジットカード登録・本人確認)

  • IBM Quantumの実機を利用するには、IBMidに紐づいたIBM Cloudアカウントを有効化する必要があります。
  • 具体的には"Pay-As-You-Goアカウント(従量課金アカウント)"の有効化が必要になります。
    参考:IBM Cloud Pay-As-You-Go account
  • アカウントの登録にはクレジットカード登録が必要ですが、これまで通り1か月あたり10分間の無料枠もあります。

各種セキュリティについて

  • IBM Cloudは本来的には商用クラウドとして設計されているので、支払金額が膨大になるリスクがあります。
    月10分間の無料インスタンス枠で守られてはいますが、個人で使う場合は操作に注意しましょう。
    自分も膨大なdepth数の量子セルオートマトンの処理を従量課金で実行したら破産するかも🙀
  • アカウントが不正利用された場合も多額の請求が発生するリスクがあります。
    認証については、IBMidとして使用したメールアドレスやIBM CloudののIAM設定(アクセス制御)も含めて最大限のセキュリティ確保を推奨します。
    ※ 無料インスタンスの範囲で利用する分には料金は発生しません。
  1. IBMid で IBM Cloud にサインインします。
    ※IBMidがgoogleアカウントと一致している場合は、googleの認証でもサインイン可能です。

    image.png

  2. 「IBM Cloud アカウントの作成」からアカウントを作成します。
    再度IBM CloudにてEメールの検証を行います。

    image.png

  3. 多要素認証の登録を行います。
    いろいろ選べます。道なりで登録してください。。

    image.png

  4. 本人確認のため、クレジットカード情報の登録が必要です。
    クレジットカードおよび本人確認を実施します。

  • クレジットカード登録が必須
    サインイン直後に本人確認があり、これをキャンセルすると強制的にサインアウトされるため、実質的に手続きを完了する必要があります。
  • クレジットカードの有効性確認
    登録時には、クレジットカードの有効性確認が行われます。具体的には、Visa加盟店(海外)から148円が振り込まれ、その直後に同額が引かれました。
  • クラウドクレジットの付与
    初回登録後に、200ドル分のクラウドクレジットが自動的に付与されました。ただし、セキュリティや請求への不安もあるため、私は使用しませんでした。
  • IBM Quantum 実機利用の料金
    Openインスタンスを利用する場合、月10分までの枠内であれば料金は発生しません。無料プランの範囲内でIBM Quantum実機を利用する分には課金されない仕組みになっています。

    image.png

補足:クレジットカード登録がうまく通らない場合

登録済みメールアドレスから verify@us.ibm.com に問い合わせるとサポート対応してもらえます。
コードが出ている場合はコードも添えてください。
場合によっては日中にIBMから英語で+1で始まる電話番号から電話がかかってきたり、追加の情報や本人確認書類(政府が発行する顔写真付きの身分証2種類の画像)を求められることがあります。
QGSS25のDiscordを見ると、「アメリカ国外のクレジットカード」の「個人アカウント」はこの扱いになっているような印象があります。

[エラー例:その1]
クレジット・カード情報を確認できませんでした。
コード: REG-PAYGO-UPGRADE-xxxxxxxxxxxx

[エラー例:その2]
クレジット・カードの認証に問題がありました。
登録済みのEメールアドレスから verify@us.ibm.com にお問い合わせください。
コード: REG-PAYGO-UPGRADE-xxxxxxxxxxxx

[エラー例:その3]
処理がスタックして反応なし。

補足:クレジットカード未登録アカウントの有効期限

  • 自分の場合
    2025年7月開催のQGSS25開始前にクレジットカード登録を済ませていたため、今でも問題なく利用することができています。
  • カード未登録のまま利用していた場合
    QGSS25の参加者にはクレジットカード登録無しでもインスタンスを作成できる特別な措置が用意されていました。このようなクレジット登録なしのアカウントが今現在ではexpire(失効扱い)となっています。実際に、新Platformに入っただけでほとんど使っていなかった別のIBMidがこの状態になっています。この場合はクレジットカード登録手続きすら出来ないのでIBM Cloudサポートに相談するしかないと思います。

・IBM Quantum Platform
image.png

・IBM Cloud
image.png

3. IBM Quantum Platformにサインインする(IBMidアカウントでアクセス可能)

  1. IBM Quantum Platformにアクセスして、"Sign in"をクリックします。
    IBM Quantum Platform

    image.png

  2. IBMidを入力します。
    IBM Quantum実機を利用する場合は、"Select a regigon"で"Washington DC (us-east)"を選ぶ必要があるらしいです。(真偽は不明。インスタンス作成時の話と混同している可能性あり。とりあえずus-eastで問題なし。)
    image.png

  3. IBM Quantum Platformにサインインしました。
    image.png

4. APIキーを作成する(Qiskitから接続するための認証情報)

  1. "API key"から"Create +"をクリック

    image.png

  2. "APIキーの名前"と"Description"を決めます。
    どちらも文字列なので好きに決めていいです。

    image.png

  3. APIキーが作成されました。

APIキー文字列を確認できるのはこのタイミングだけなのでしっかり取得しておいてください。
後から見ようと思っても、参照する手段がないので作り直すしかなくなります。

APIキーを取得して管理します。
 ・"COPY"ボタンを押すと、クリップボードにAPIキーがコピーされます。
 ・"Download"ボタンを押すと、APIキーが含まれる"apikey.json"がダウンロードされます。
  終わったら"close"ボタンでウィンドウを閉じます。

image.png

5. インスタンスを作成してCRNを取得する(実機利用に必須)

🌠無料プランで作成できるインスタンスの数は1つです。

  1. インスタンス作成画面に行きます。
    画面左上のシマシマをクリックしてメニュを出し、"Instances"をクリック。

    image.png

    image.png

  2. インスタンスの設定をしてNextをクリック
    (1) Instance nameは何でもいいですが、使用できる文字に制限がありますので下の注意書きを読んで決めてください。
    (2) "Select pricing plan"では"Open (Free)"を選びます。これが月10分の無料枠になります。
      ※Pay-as-you-goは、実機の処理1秒につき$1.60の価格のようです。
       月10分の960 US$無料枠はありがたいですね、、、
    (3) licence agreementsを確認してチェック入れます。

    image.png

  3. "customize allocated QPUs"はスルーでNext
    "customize allocated QPUs"をONにすると、右の"Allocated QPUs"でどれを有効化するか個別に選べます。
    OFFのままであれば、リスト上のすべてのQPUs (IBM量子コンピュータ実機)が有効になるのでOFFのままでいいと思います。

    image.png

  4. "Create instances"ボタンクリックでインスタンスが作成されます。

    image.png

  5. インスタンスCRNの取得
    画面左上のシマシマのアイコンメニューからHOMEに戻ると、インスタンスが作成されています。
    インスタンス右の"CRN Copy"ボタンをクリックして、クリップボードにCRNをコピーします。
    厳重に管理してください。

    image.png

  6. 以上で < 登録編 >は終わりです。これで量子コンピュータ実機を使用する準備が整いました。

2.実行編

0. シミュレータ実行と実機実行の違い

シミュレータ実行と異なり、実機の実行では以下が異なります。

  • IBM Quantum Platformの"API Key"およびインスタンスの"CRNキー"が必要。
  • Qiskitで"API Key"および"CRNキー"を登録する必要がある。
  • 実機での実行前にpass managerで回路の最適化を行う。
    (シミュレータで最適化を行う場合はtraspile)
  • backendとして実機を選択する必要がある。

1. QiskitからIBM Cloudに接続する(APIキーとCRNの登録)

準備

  • QiskitからAPIキーを登録するための専用 Jupyter Notebook を用意すると便利です。
    サンプルでは"loadApiToken_IBMQ.ipynb"を作成しました。

登録

  • IBM Cloudから取得した「APIキー」と「CRN」を、"QiskitRuntimeService.save_account()"で端末に保存します。これによりコード中にAPIキーやCRNを直接書かずに済みます。
  • 保存時に"name"を付けておくと、実行時に複数インスタンス(例:無料/有料)を明示的に使い分けることができます。
    アカウントに名前を付けた場合の使用例
    service = QiskitRuntimeService(name="IBMQ_open_instance")
    

保存時にnameを省略した場合のデフォルトアカウントについて

  • nameを省略すると、"default-<チャネル名>"という名前で保存されます。
    保存済みアカウントが「1つだけ」の場合は、引数無しの"QiskitRuntimeService()"でそのアカウントがデフォルトとして選ばれます。
  • 複数アカウントがある場合はqiskitがどのアカウントを使えばよいかわからなくなるため、必ず"name"か"channel"を指定してください。
    "name"を指定した場合は特定のアカウント、"channel"のみを指定した場合は"channel"のデフォルトのアカウントが選択されます。
  • 自分の場合は「確実に無料インスタンスを使っている」と分かるように、常に"name"を付けています。

保存場所とセキュリティ上の注意点

  • ローカルPCの場合
    • Linuxでは、"~/.qiskit/qiskit-ibm.json`"に平文のJSONとして保存されます。
    • 便利ですが、誤って公開リポジトリに含めないよう注意(".gitignore"推奨)してください。
  • クラウド環境(Google Colab, qBraidなど)の場合
    • 基本的にはクラウド環境からは実機と接続しない方がいいと思います。
    • クラウドストレージ上にも平文のJSONが残ることになるため、"save_account()"による保存はセキュリティのリスクがあります。
    • もし接続するにしても、"save_account()"を使わずに、「ipynbの先頭セルで直接変数に代入し、実行後にそのセルを削除する」方がましかもしれません。
    • 設定ファイルを経由しないのでname変数は不要。
      クラウド環境ではipynbの先頭セルで変数をセットして、実行後にセルを消す。
      your_api_key = "<your_api_key>"
      your_crn = "<your_crn>"
      

ローカルPCでのアカウント保存

サンプルコードの修正点
  • <your_api_key>と<your_crn>を置き換えます。山カッコ<>の部分は不要です。

  • <service_name>は、apiキーとCRNを結びつけるラベル名です。好きな文字列を決めてください。

  • コードやJSONファイルをGitHubなど公開リポジトリにアップロードしないよう注意。

  • QiskitRuntimeService.save_accountは戻り値を返しません。必要に応じて確認用に日時を出力してください(必須ではありません)。

    loadApiToken_IBMQ.ipynb (API Token登録)
    # import
    from qiskit_ibm_runtime import QiskitRuntimeService
    
    # APIキーおよびCRN登録
    your_api_key = "<your_api_key>"
    your_crn = "<your_crn>"
    service_name = "<service_name>"
    
    QiskitRuntimeService.save_account(
        channel="ibm_quantum_platform",
        token=your_api_key,
        instance=your_crn,
        name=service_name,
        overwrite=True,
    )
    
    # datetime
    from datetime import datetime
    import pytz
    print("Registered at (Tokyo):", datetime.now(pytz.timezone("Asia/Tokyo")).strftime("%Y-%m-%d   %H:%M:%S"))
      
    

    実行イメージ
    image.png

クラウド環境でのアカウント保存

  • 基本的にはクラウド環境からは実機と接続しない方がいいと思います。
  • もしやるのであればipynbの先頭セルで変数を設定した後、セルを削除する方式の方がましかもしれません。設定ファイルを経由しないので"name"は不要です。
クラウド環境ではipynbの先頭セルに変数をセットして、実行後にセルごと消す。
your_api_key = "<your_api_key>"
your_crn = "<your_crn>"

参考:使用したライブラリのバージョン

[参考] ライブラリは下記のバージョンを使用しています。
qiskit version : 2.1.2
qiskit_ibm_runtime version : 0.41.1
python version : 3.12.11

loadApiToken_IBMQ.ipynb (API Token登録)
# Qiskitバージョン情報
import qiskit
print(f'qiskit version : {qiskit.__version__}')

import qiskit_ibm_runtime
print(f'qiskit_ibm_runtime version : {qiskit_ibm_runtime.__version__}')

# Pythonおよび実行環境情報
import sys, platform
print(f'python version : {sys.version}')
print(f'platform : {platform.uname()}')

実行イメージ
image.png

2. 実行する量子回路を用意する

APIキー登録専用のjupyter notebookとは別に、ipynbを作成します。
サンプルでは"cnot_IBMQ.ipynb"を作成してセル単位で紹介していきます。

(1) ライブラリのimport
シミュレータでのqiskit.primitivesが、
実機で実行するためのqiskit_ibm_runtimeと
回路の最適化を行う generate_preset_pass_managerに置き換わります。

CNOT_IBMQ.ipynb : ライブラリのimport
# ライブラリの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        

実行イメージ
image.png

(2) 量子回路の作成
量子回路はシミュレータ実行時のものと同一です。
量子ビットq0とq1がもつれます。

CNOT_IBMQ.ipynb : 量子回路の作成
# 量子回路の初期化
circuit = QuantumCircuit(2) # 量子ビット2個 古典ビット2個を準備

# 量子回路の組み立て
circuit.h(0)    # アダマールゲートを適用
circuit.cx(0,1) # CNOTゲートを適用

# 測定
circuit.measure_all() # すべての量子ビットを測定する。

# 量子回路の素描
circuit.draw(output="mpl") # 量子回路をmpl形式で表示 

実行イメージ
image.png

3. 実機にジョブを送信する

オブジェクト生成 -> backend設定 -> 最適化(passManager) -> 量子回路の実行の順で実施します。
処理待ちとなることが多いため、job idを出力することで状態確認の際に使用します。

(1) オブジェクトの生成から回路の最適化
QiskitRuntimeService(name="xxx")にAPIキーとCRNのペアに付けた名前を指定します。

CNOT_IBMQ.ipynb : オブジェクトの生成から回路の最適化まで
#--- 量子回路の実行(IBM Quantum)
# QiskitRuntimeServiceオブジェクト生成
# 保存時に付けたアカウント名を"name=アカウント名"で指定する。
service = QiskitRuntimeService(name="reconCatIBMQ")

# アカウントで利用可能なバックエンドのリスト
# 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'Selected in-use backend : {backend}')

#---passManagerによる量子回路の最適化
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circ = pm.run(circuit)

実行イメージ
アクセス可能な実機が ibm_torino、ibm_brisbaneの2台あり、
ibm_brisbaneが選択されたことがわかります。

image.png

クラウド環境の場合

ローカルPCと同じく QiskitRuntimeService を使いますが、"save_account()"を使わずに先頭セルで設定した変数を直接渡します。
下記のコードで"QiskitRuntimeService"のオブジェクトを生成してください。

CNOT_IBMQ.ipynb : クラウド環境での実行
service = QiskitRuntimeService(
    channel="ibm_quantum_platform",
    token=your_api_key,
    instance=your_crn,
)

(2) 実機にジョブを送信する
大きな回路の場合は処理行列待ちが発生することがあるので、念のためjob idとdatetimeを出力しています。

CNOT_IBMQ.ipynb : 実機へのジョブ送信
# IBM Quantum : JOB(1)
# 量子回路の実行
sampler = Sampler(backend)
job = sampler.run([isa_circ])

# IBM Quantum : JOB(2)
# job idの出力
job_id = job.job_id()
print("job id:", job_id)

# datetime
from datetime import datetime
import pytz
now = datetime.now(pytz.timezone("Asia/Tokyo"))
print(f"[Job submitted] id : {job_id} at {now.strftime('%Y-%m-%d %H:%M:%S %Z')}")

実行イメージ
job id: d31frse6dbus73d78l90がアサインされて実行されたことがわかります。
image.png

(3) ジョブ実行状態の確認

  • 下記のコードを実行するとJOBの状態を確認できます。
     PENDING:処理の順番待ちで未実行。
     RUNNING:実行中
     DONE  :完了
  • 一度にすべてのコードを実行してしまうと、処理が返ってこなくなることが多いので、
    コード実行はここまでにとどめておいて、状態確認を何度も繰り返し実行することで
    JOBがDONEになってから後続を実施するとjupyterがスタックしないので便利です。
CNOT_IBMQ.ipynb : JOB処理状態の確認
# IBM Quantum : JOB(3)
# JOB処理状態の確認
job.status()

実行イメージ
image.png

[IBM Quantum PlatformでのJOB状態確認]

IBM Quantum Platformのhome画面からでもJOBの状態を確認することができます。

ibm_brisbaneで実行されたjob id: d31frse6dbus73d78l90は、2秒間の処理でStatusが"Completed"になりました。
(job idすべてが表示されていませんが、、createdを降順でソートしているのでリストの一番上が最後に実行したものになります。)
image.png

該当JOBの行をクリックすると詳細のページが表示されます。
その他、いろいろと面白い情報があるので触ってみてください。
image.png

4. 実行結果を取得する

(1) 実行結果の取得
qiskit_ibm_runtime / Sampler実行結果の取得はシミュレータのPrimitiveResult形式で一緒です。

CNOT_IBMQ.ipynb : 実行結果の取得
# IBM Quantum : JOB(4)
# 実行結果の取得
# PrimitiveResult形式の結果を取得
result = job.result()          

# PrimitiveResultから回路実行結果を抽出                 
counts = result[0].data.meas.get_counts()       

 # 結果をテキスト表示:measure_all()の場合、'meas'で結果を取得
print(counts)        

実行イメージ
image.png

(2) 実行結果を確率分布図で確認
確率分布図を出力するコードはシミュレータと一緒です。
理論上では量子ビットq0とq1がもつれているため、出力は00か11になるはずですが、
実機のノイズにより01、10のパターンが少しだけ含まれています。

CNOT_IBMQ.ipynb : 確率分布図
# 確率分布を表示   
plot_distribution(counts)

実行イメージ
image.png

5. [参考] 完了済みジョブの実行結果を再取得する(retrieve)

実機での実行結果はしばらくの間IBM Quantumにて自動保存されているので、
JOBIDをキーにして実行結果を再取得できます。
これにより、Python kernelの再起動をまたいで実行結果を取得できたり、
90日前の実施結果を取得たりできます。
また、パソコンのディスクに実行結果を保存することができます。
参考:Save and retrieve jobs

下記コードのjobidを取得したJOBIDに置き換えます。

CNOT_IBMQ.ipynb : JOB実行結果のretrieve
#--- retrieve
job_id = 'jobid'

# 指定したjobidの結果をretrieve
job = service.job(job_id)
job.result()

# IBM Quantum : JOB(4)
# 実行結果の取得
# PrimitiveResult形式の結果を取得
result = job.result()          
          
counts = result[0].data.meas.get_counts()       
print(counts)    

実行イメージ
image.png

[その他]

CNOT_IBMQ.ipynb : その他
# Qiskitバージョン情報
import qiskit
print(f'qiskit version : {qiskit.__version__}')

import qiskit_ibm_runtime
print(f'qiskit_ibm_runtime version : {qiskit_ibm_runtime.__version__}')

# Pythonおよび実行環境情報
import sys, platform
print(f'python version : {sys.version}')
print(f'platform : {platform.uname()}')

実行イメージ
qiskit version : 2.1.2
qiskit_ibm_runtime version : 0.41.1
python version : 3.12.11 (main, Aug 18 2025, 19:19:11) [Clang 20.1.4 ]
image.png

お疲れさまでした!
✨😺✨

Qiskit環境構築まとめ

【uv版】
  (1) Linuxの導入/設定
  (2) uvの導入/Python仮想環境の作成
  (3) vscodeからのPython仮想環境接続

【poetry版】
  (1) Linuxの導入/設定
  (2) Python仮想環境の作成
  (3) vscodeからのPython仮想環境接続

【qBraid版】
  qBraid Labで最新Qiskit環境を作る
  qBraid Labのデフォルトpython仮想環境を利用する

【共通】
  (4) シミュレータでの量子回路実行
  (5) IBMQ実機での量子回路実行
  (6) 環境のメンテナンス手順

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?