IBM Cloud Docs
始めに

始めに

このチュートリアルでは、 Qiskit Runtime サービス・インスタンスをセットアップし、サービス・インスタンスにログインし、量子コンピューターで最初のジョブを実行する手順について説明します。

新しい IBM Quantum Platform インターフェースがアーリーアクセスモードでリリースされました。 IBM Quantum サービスをご利用になるには、そのインターフェースのご利用を開始されることをお勧めいたします。 IBM Cloud を基盤としているため、移行は簡単です。 詳細は 移行ガイドをご覧ください。

  • Qiskit Runtimeをセットアップする必要がある IBM Quantum プログラムからのエンティティー・アップグレードの場合、クラウド・アカウント、サービス・インスタンス、およびユーザーのセットアップ手順については、 オープン・プランからのアップグレード を参照してください。
  • 組織の構造がより複雑な場合は、 組織のための Qiskit Runtime を参照して、サービス・インスタンスのセットアップとユーザーの処理に関するより柔軟な手順を確認してください。
  • Qiskit Runtime サービスを初めて個別にセットアップする場合、または管理者によってインスタンスに招待されている場合は、引き続きこのトピックの手順を実行してください。

サービス・インスタンスの作成

Qiskit Runtime サービス・インスタンスを既に作成した場合、または管理者から招待された場合は、次のステップにスキップします。 インスタンスへのアクセス権限が既にあるかどうかを判別するには、 IBM Cloud 「インスタンス」ページを確認してください。 1 つ以上のインスタンスが表示されている場合は、スキップして Qiskit パッケージのインストール に進むことができます。

  1. Qiskit Runtime プロビジョニング・ページから、アクセスする必要があるものに応じて、適切なサービス・プランを選択します。 これらのプランについて詳しくは、「 Qiskit Runtime プラン 」のトピックを参照してください。

    • Lite(非推奨): Qiskit Runtime のご利用開始をサポートする無料のシミュレーター専用プラン。 Qiskit Runtime の使用について学習するには、回線を効率的に実行するために用意されている事前作成プログラムのいずれかの例とチュートリアルに従ってください。
    • 標準: アクセスするための従量課金モデルIBM QPU とシミュレーター。 ライト・プランで使用可能なすべてのシミュレーターへのアクセスを維持しながら、実際の量子ハードウェアで実行することで、独自のプログラムを作成し、 Qiskit Runtime のすべての利点を活用します。
  2. 必要事項を入力し 、「作成」 をクリックします。

Qiskit パッケージのインストールまたは更新

開発環境で以下のパッケージをインストールまたは更新します。 これらを使用すると、回路を作成し、 Qiskit Runtimeを使用してプリミティブ・プログラムを処理することができます。 詳しい手順については、 Qiskit のインストールとセットアップのトピックを参照してください。 常に最新バージョンになるように、 Qiskit リリース・ノート を定期的に確認 (またはこれらのコマンドを再実行) してください。

pip install -U qiskit を使って Qiskit0.xから1.0以降にアップグレードすることはできません。 詳細および手順については、Qiskit1.0移行ガイドを参照してください。

パッケージが既にインストールされている場合でも、必ずこれらのコマンドを実行して、最新バージョンがあることを確認してください。

# Installs the latest version of the Qiskit meta-package for circuit creation.
pip install qiskit -U
# Installs the latest version of the Qiskit Runtime package, which is needed to interact with the Qiskit Runtime primitives on IBM Cloud.
pip install qiskit-ibm-runtime -U

サービスに対する認証

サービスに対して認証を行うには、 IBM Cloud API キーと CRN を指定して QiskitRuntimeService を呼び出します。

from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService(channel="ibm_cloud", token="<IBM Cloud API key>", instance="<IBM Cloud CRN>")

アクセス資格情報の検索

  1. API キーを見つけます。 「API キー」ページで、API キーを表示または作成し、認証に使用できるように安全な場所にコピーします。
  2. クラウドリソース名(CRN)を確認します。 「インスタンス」ページ を開き、インスタンスをクリックします。 開いたページで、アイコンをクリックして CRN をコピーします。 認証に使用できるように、安全な場所に保存してください。

オプションで資格情報をディスクに保存

オプションで、資格情報をディスク ( $HOME/.qiskit/qiskit-ibm.json ファイル) に保存します。 資格情報をディスクに保存しない場合は、新規セッションを開始するたびに資格情報を指定する必要があります。

資格情報をディスクに保存すると、今後 QiskitRuntimeService() を使用してアカウントを初期化できます。

from qiskit_ibm_runtime import QiskitRuntimeService

# Save account to disk and save it as the default.
QiskitRuntimeService.save_account(channel="ibm_cloud", token="<IBM Cloud API key>", instance="<IBM Cloud CRN>", name="account-name", set_as_default=True)

# Load the saved credentials
service = QiskitRuntimeService(name="account-name")

保存した資格情報を更新する必要がある場合は、 save_account を再度実行し、 overwrite=True と更新した資格情報を渡します。

クラウドの Quantum Qiskit API の使用手順については、API 資料の authentication セクションを参照してください。

セットアップのテスト

Sampler を使用して単純な回線を実行し、ご使用の環境が正しくセットアップされていることを確認します。

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2 as Sampler

# Create empty circuit
example_circuit = QuantumCircuit(2)
example_circuit.measure_all()

# You'll need to specify the credentials when initializing QiskitRuntimeService, if they were not previously saved.
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)

sampler = Sampler(backend)
job = sampler.run([example_circuit])
print(f"job id: {job.job_id()}")
result = job.result()
print(result)

プログラムの実行

Qiskit Runtime は、 プリミティブ・プログラム を使用して量子コンピューターとのインターフェースを作成します。 以下のプログラムが公開されています。 V2 プリミティブの変更について詳しくは、「 V2 プリミティブへのマイグレーション 」を参照してください。

  • 試料: ユーザーが入力として回路を指定し、各ショットからの出力(ビット文字列)を返すことを可能にします(V2 )、または準確率(V1 )。 これにより、ユーザーは、破壊的干渉のコンテキストで複数の関連データ・ポイントの可能性をより効率的に評価することができます。
  • 見積担当者: ユーザーは、特定のパラメーター入力の期待値および分散を効率的に評価するために、回路および観測値のリストを指定し、リスト間で選択的にグループ化することができます。 これは、多くのアルゴリズムに必要な量子演算子の期待値をユーザーが効率的に計算して解釈できるように設計されています。

この例では、サンプラー・プリミティブを使用します。

# Prepare the input circuit.
from qiskit import QuantumCircuit

bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all()

# Execute the circuit
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit_ibm_runtime.fake_provider import FakeManilaV2

# Run the sampler job locally using FakeManilaV2
backend = FakeManilaV2()

from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_bell = pm.run(bell)

sampler = Sampler(backend)

job = sampler.run([(isa_bell,)])
result = job.result()

pub_result = result[0]
# Get counts from the classical register "meas".
print(f" >> Counts for the meas output register: {pub_result.data.meas.get_counts()}")

ISA 入力

より高速で効率的な結果を確実に得るために、2024年3月1日以降、回路と観測可能オブジェクトはQPUでサポートされている命令のみを使用するように変換する必要があります(*命令セットアーキテクチャ (ISA)*提出前に回路と観測可能なデータ(Qiskit Runtimeプリミティブ。 変換回路の説明については、 転置の資料 を参照してください。

この変更には、以下の重要な影響があります。

  • 特定のバックエンドで使用可能な回線と突き合わせるために転置が行われるため、バックエンドを指定する 必要があります。 バックエンドを指定しないと、エラーが表示されます。

    以前は、バックエンドを指定しなかった場合は、アクセスできる最も使用頻度の低い QPU が使用されていました。 最も混雑していない QPU を使用するには、次のようなコードを使用します。backend = service.least_busy(operational=True, simulator=False)

  • プリミティブは、レイアウト操作またはルーティング操作を実行しなくなります。 したがって、これらのタスクを参照する入れ替えオプションは、効果を持たなくなります。 ユーザーは引き続き、 optimization_level=0 を使用して、プリミティブが入力回線の最適化を行わないように要求することができます。

ISA 回線および観察事項を生成するためのコード例:

from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

# Create a new circuit with two qubits (first argument) and two classical
# bits (second argument)
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)

# Set up six different observables.
observables_labels = ["ZZ", "ZI", "IZ", "XX", "XI"]

from qiskit.quantum_info import SparsePauliOp
observables = [SparsePauliOp(label) for label in observables_labels]

# Convert to an ISA circuit and layout-mapped observables.
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)
observables = [
    observable.apply_layout(isa_circuit.layout) for observable in observables
]

次のステップ