セッションは、複数の量子コンピューティング ジョブをグループ化できるハイブリッド量子コンピューティングの主要な機能です。 セッションとは、1 つの targetに送信する 1 つ以上のジョブの論理グループです。 各セッションには、そのセッション内の各ジョブに一意の ID がアタッチされています。 セッションは、複数の量子コンピューティング ジョブを順番に実行し、量子ジョブ間で古典的なコードを実行する場合に便利です。
この記事では、ハイブリッド量子コンピューティングでのセッションのアーキテクチャと、 Azure Quantumで新しいセッションを作成する方法について説明します。
前提条件
セッションを作成するには、次の前提条件が必要です。
アクティブなサブスクリプションが含まれる Azure アカウント。 Azure アカウントをお持ちでない場合は、無料で登録し、 従量課金制サブスクリプションにサインアップしてください。
あるAzure Quantumワークスペース。 詳細については、「Azure Quantum ワークスペースの作成」を参照してください。
Python がインストールされた Python 環境。
最新バージョンのVisual Studio Code (VS Code)、QDK拡張機能、Python拡張機能、およびJupyter拡張機能がインストールされています。
qdkPython ライブラリ。 QiskitおよびCirqプログラムを送信するには、azure、qiskit、およびcirqの追加プログラムをインストールします。pip install --upgrade "qdk[azure,qiskit,cirq]"
セッションとは
セッションでは、クライアント コンピューティング リソースをクラウドに移動して待機時間を短縮し、さまざまなパラメーターで量子プログラムを複数回実行できます。 ジョブを論理的に 1 つのセッションにグループ化し、セッション以外のジョブよりもそのセッション内のジョブに優先順位を付けることができます。 量子ビットの状態はジョブ間で保持されませんが、セッション内のジョブのキュー時間は短くなります。 キュー時間を短くすると、複雑なアルゴリズムを実行して、個々の量子コンピューティング ジョブをより適切に整理して追跡できます。
セッションは、1 つの量子コンピューティング ジョブの出力を使用して次の量子コンピューティング ジョブの入力パラメーターを定義する、パラメーター化された量子アルゴリズムに役立ちます。 この種類のアルゴリズムの最も一般的な例は、 Variational Quantum Eigensolvers (VQE) と Quantum Approximate Optimization Algorithms (QAOA) です。
サポートされるハードウェア
セッションは、すべての量子コンピューティング ハードウェア プロバイダーでサポートされています。 セッション内で送信されたジョブが、その targetのキューに優先される場合があります。 詳細については、「 ターゲットの動作」を参照してください。
セッションを作成する方法
セッションを作成するには、次の手順に従います。
この例は、Jupyter ノートブック内でインライン コードQ#を使用してセッションVS Codeを作成する方法を示します。
注記
セッションは、インライン コードを実行している場合でも、PythonQ#管理されます。
VS Codeで、[表示] メニューを開き、[コマンド パレット] を選択します。
「
新規作成 」を入力して選択します。 右上の VS Code は、 Python のバージョンと、ノートブック用に選択された仮想 Python 環境を検出して表示します。 複数の Python 環境がある場合は、右上のカーネル ピッカーを使用してカーネルを選択する必要があります。 環境が検出されなかった場合は、セットアップ情報については、Jupyter NotebookのVS Codeを参照してください。
ノートブックの最初のセルで、次のコードを実行します。
from qdk.azure import Workspace workspace = Workspace(resource_id="") # add your resource IDノートブックに新しいセルを追加し、
qsharpPython パッケージをインポートします。from qdk import qsharp量子targetを選択します。 この例では、 target は IonQ シミュレーターです。
target = workspace.get_targets("ionq.simulator")target、、または
BaseAdaptive_RIUnrestrictedプロファイルの構成を選択します。qsharp.init(target_profile=qsharp.TargetProfile.Base)注記
Adaptive_RItarget プロファイル ジョブは現在、Quantinuum targetsでサポートされています。 詳細については、「 Integrated ハイブリッド量子コンピューティングを参照してください。Q# プログラムを記述します。 たとえば、次の Q# プログラムはランダム ビットを生成します。 入力引数の使用方法を示すために、このプログラムでは、整数、
n、および角度の配列 (angle) を入力として受け取ります。%%qsharp import Std.Measurement.*; import Std.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; }次に、セッションを作成します。 たとえば、
GenerateRandomBit操作を 3 回実行し、target.submitを使用してQ# データを使用してtarget操作を送信し、コードを 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]重要
引数をパラメーターとしてジョブに渡すと、引数はQ#呼び出されたときに
qsharp.compile式に書式設定されます。 つまり、引数を Q# オブジェクトとして書式設定する必要があります。 この例では、 Python 内の配列は既に[item0, item1, ...]として出力されているため、入力引数は Q# の書式設定と一致します。 その他の Python データ構造では、互換性のある方法で Q# に挿入された文字列値を取得するために、さらに多くの処理が必要になる場合があります。セッションを作成したら、
workspace.list_session_jobsを使用して、セッション内のすべてのジョブの一覧を取得できます。 詳細については、「 セッションを管理する方法を参照してください。
ターゲットの動作
各量子ハードウェア プロバイダーは、セッション内のジョブの優先順位付けを最適に管理するために独自のヒューリスティックを定義します。
Quantinuum
セッション内で Quantinuum targetにジョブを送信することを選択した場合、互いに 1 分以内にジョブをキューに登録している限り、セッションはハードウェアへの排他的アクセス権を持ちます。 その後、ジョブが受け入れられ、標準のキューと優先順位付けロジックで処理されます。