対話型量子コンピューティング: セッション
この記事では、対話型量子コンピューティングのアーキテクチャ (セッションとも呼ばれます) と、新しいセッションを作成する方法について説明します。
ハイブリッド量子コンピューティングのこのモデルでは、クライアント コンピューティング リソースをクラウドに移動すると、待機時間が短くなり、異なるパラメーターで量子回路の実行を繰り返す機能が得られる可能性があります。 ジョブは論理的に 1 つのセッションにグループ化でき、そのセッション内のジョブはセッション以外のジョブよりも優先順位を付けることができます。 量子ビットの状態はジョブ間で保持されませんが、セッションではジョブのキュー時間が短くなり、実行中の問題が長くなります。
前提条件
セッションを作成するには、次の前提条件が必要です。
アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントをお持ちでない場合は、無料で登録し、 従量課金制サブスクリプションにサインアップします。
Azure Quantum ワークスペース。 詳細については、「Azure Quantum ワークスペースを作成する」を参照してください。
Python と Pip がインストールされている Python 環境。
Azure Quantum
azure-quantum
パッケージ。 Qiskit または Cirq を使用する場合は、[qiskit] タグまたは [cirq] タグを使用してパッケージをインストールazure-quantum
する必要があります。pip install --upgrade azure-quantum[qiskit]
セッションとは
セッションは、1 つの に送信された 1 つ以上のジョブの論理グループです target。 各セッションには、そのセッション内の各ジョブに一意の ID がアタッチされています。
セッションを使用すると、量子ジョブ間で従来のコードを実行できる複数の量子コンピューティング ジョブを整理できます。 複雑なアルゴリズムを実行して、個々の量子コンピューティング ジョブをより適切に整理および追跡できるようになります。
セッション内のジョブを結合する主要なユーザー シナリオは、1 つの量子コンピューティング ジョブの出力が次の量子コンピューティング ジョブのパラメーターを通知する パラメーター化された 量子アルゴリズムです。 この種類のアルゴリズムの最も一般的な例は Variational Quantum Eigensolvers 、(VQE) と Quantum Approximate Optimization Algorithms (QAOA) です。
サポートされるハードウェア
セッションは、現在 IonQ、 Quantinuum 、 Rigetti のすべての量子コンピューティング ハードウェア プロバイダーでサポートされています。 場合によっては、セッション内で送信されたジョブが、その targetのキューに優先順位が付けられます。 詳細については、「 ターゲットの動作」を参照してください。
セッションの概要
セッションは Python で管理され、QIR 量子プログラム (、Qiskit、Cirq プログラムなど Q#) に対して作成できます。
この例では、Visual Studio Code でJupyter Notebookを使用してインライン コードでセッションQ#を作成する方法を示します。 隣接するQ#プログラムを呼び出す Python プログラムを使用してセッションを作成することもできます。
注意
セッションは、インライン コードを実行 Q# している場合でも Python で管理されます。
VS Code で、[コマンド パレットの表示>] を選択し、[作成: 新しいJupyter Notebook] を選択します。
右上では、VS Code によって、ノートブック用に選択された Python のバージョンと仮想 Python 環境が検出され、表示されます。 複数の Python 環境がある場合は、右上のカーネル ピッカーを使用してカーネルを選択する必要がある場合があります。 環境が検出されなかった場合は、セットアップ情報については 、「VS Code の Jupyter Notebooks 」を参照してください。
ノートブックの最初のセルで、 を実行します。
import azure.quantum workspace = azure.quantum.Workspace( resource_id = "", # add your resource ID location = "", # add your location, for example "westus" )
[ + コード] をクリックしてノートブックに新しいセルを追加し、Python SDK をインポート
qsharp
します。import qsharp
任意の 量子 target を選択します。 この例では、 IonQ シミュレーター を として target使用しています。
target = workspace.get_targets("ionq.simulator")
プロファイルの構成 (または
Unrestricted
)Base
を選択しますtarget。qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Unrestricted
プログラムを作成します Q# 。 たとえば、次 Q# のプログラムはランダム ビットを生成します。 入力引数の使用方法を示すために、このプログラムは整数、、
n
および角度angle
の配列 である を入力として受け取ります。%%qsharp open Microsoft.Quantum.Measurement; open Microsoft.Quantum.Arrays; operation GenerateRandomBits(n: Int, angle: Double[]) : Result[] { use qubits = Qubit[n]; // n parameter as the size of the qubit array for q in qubits { H(q); } R(PauliZ, angle[0], qubits[0]); // arrays as entry-points parameters R(PauliZ, angle[1], qubits[1]); let results = MeasureEachZ(qubits); ResetAll(qubits); return results; }
次に、セッションを作成します。 たとえば、操作を 3 回実行
GenerateRandomBit
するとします。そのため、 を使用target.submit
してデータを使用target
して操作を送信Q#し、コードを 3 回繰り返します。実際のシナリオでは、同じコードではなく別のプログラムを送信できます。angle = [0.0, 0.0] with target.open_session(name="Q# session of three jobs") as session: target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 1", shots=100) # First job submission angle[0] += 1 target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 2", shots=100) # Second job submission angle[1] += 1 target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 3", shots=100) # Third job submission session_jobs = session.list_jobs() [session_job.details.name for session_job in session_jobs]
重要
引数をパラメーターとしてジョブに渡すと、 を呼び出
qsharp.compile
すときに式にQ#書式設定されます。 つまり、引数をオブジェクトとして Q# 書式設定するには注意する必要があります。 この例では、Python の配列は既に [item0, item1, ...] として出力されているため、入力引数は書式設定と Q# 一致します。 他の Python データ構造の場合は、互換性のある方法で に挿入された Q# 文字列値を取得するために、より多くの処理が必要になる場合があります。セッションを作成したら、 を使用
workspace.list_session_jobs
して、セッション内のすべてのジョブの一覧を取得できます。 詳細については、「 セッションを管理する方法」を参照してください。
監視セッション
Quantum ワークスペースの [ジョブ管理 ] ブレードを使用すると、セッションやセッションに関連付けられていない個々のジョブなど、最上位レベルで送信されたすべてのアイテムを表示できます。
- Quantum ワークスペースの [ ジョブ管理 ] ブレードを選択します。
- 種類が Session のジョブを特定します。 このビューでは、列 ID でセッションの一意の ID を 確認し、その 状態を監視できます。 セッションの状態は次のとおりです。
- 待機中: セッション内のジョブが実行されています。
- 成功: セッションは正常に終了しました。
- TimeOut: セッション内に 10 分間新しいジョブが送信されない場合、そのセッションはタイムアウトします。詳細については、「 セッションのタイムアウト」を参照してください。
- 失敗: セッション内のジョブが失敗した場合、そのセッションは終了し、失敗の状態が報告 されます。 詳細については、「 セッション内のジョブ エラー ポリシー」を参照してください。
- 詳細については、セッションの名前をクリックしてください。
- セッション内 のすべてのジョブ の一覧を表示し、その状態を監視できます。
ターゲットの動作
各量子ハードウェア プロバイダーは、セッション内のジョブの優先順位付けを最適に管理するために、独自のヒューリスティックを定義します。
Quantinuum
セッション内で Quantinuum targetにジョブを送信することを選択した場合、ジョブを相互に 1 分以内にキューに入れた場合、セッションはハードウェアへの排他的アクセス権を持ちます。 その後、ジョブは受け入れられ、標準のキューと優先順位付けロジックで処理されます。
関連コンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示