次の方法で共有


セッションの概要

セッションは、複数の量子コンピューティング ジョブをグループ化できるハイブリッド量子コンピューティングの主要な機能です。

この記事では、ハイブリッド量子コンピューティングでのセッションのアーキテクチャと、新しいセッションを作成する方法について説明します。

前提条件

セッションを作成するには、次の前提条件が必要です。

セッションとは

セッションは、1 つの targetに送信された 1 つ以上のジョブの論理グループです。 各セッションには、そのセッション内の各ジョブに一意の ID がアタッチされています。

セッションでは、クライアント コンピューティング リソースがクラウドに移動され、待機時間が短くなり、さまざまなパラメーターで量子回線の実行を繰り返す機能が得られる場合があります。 ジョブは論理的に 1 つのセッションにグループ化でき、そのセッション内のジョブはセッション以外のジョブよりも優先順位を付けることができます。 量子ビットの状態はジョブ間で保持されませんが、セッションを使用すると、ジョブのキュー時間が短くなり、実行時間が長くなります。

セッションを使用すると、量子ジョブ間で従来のコードを実行する機能を使用して、複数の量子コンピューティング ジョブを整理できます。 複雑なアルゴリズムを実行して、個々の量子コンピューティング ジョブをより適切に整理して追跡できるようになります。

セッションでジョブを組み合わせる必要がある主要なユーザー シナリオは、 パラメーター化 量子アルゴリズムです。このアルゴリズムでは、1 つの量子コンピューティング ジョブの出力によって次の量子コンピューティング ジョブのパラメーターが通知されます。 この種類のアルゴリズムの最も一般的な例は、 Variational Quantum Eigensolvers (VQE) と Quantum Approximate Optimization Algorithms (QAOA) です。

サポートされるハードウェア

セッションは、 すべて 量子コンピューティング ハードウェア プロバイダーでサポートされます。 場合によっては、セッション内で送信されたジョブが、その targetのキューに優先順位が付けられます。 詳細については、「 Target 動作」を参照してください。

セッションを作成する方法

セッションを作成するには、次の手順に従います。

この例では、Visual Studio Code で Jupyter Notebook を使用してインライン コード Q# セッションを作成する方法を示します。 隣接するQ# プログラムを呼び出す Python プログラムを使用してセッションを作成することもできます。

Note

インライン コードを実行している場合でも、セッションは Python で管理 Q# 。

  1. VS Code で、[表示] > [コマンド パレット] を選択して、[作成: 新しい Jupyter Notebook] を選択します。

  2. 右上の VS Code は、Python のバージョンと、ノートブック用に選択された仮想 Python 環境を検出して表示します。 複数の Python 環境がある場合は、右上のカーネル ピッカーを使用してカーネルを選択する必要があります。 環境が検出されなかった場合は、VS Code の Jupyter Notebooks のセットアップ情報を参照してください。

  3. ノートブックの最初のセルで、

    import azure.quantum
    
    workspace = azure.quantum.Workspace(
        resource_id = "", # add your resource ID
        location = "", # add your location, for example "westus"
    )
    
  4. [ + Code をクリックしてノートブックに新しいセルを追加し、Python SDK qsharp インポートします。

    import qsharp
    
  5. 任意の quantum target を選択します。 この例では、targetとして IonQ シミュレーターを使用しています。

    target = workspace.get_targets("ionq.simulator")
    
  6. BaseAdaptive_RI、またはUnrestrictedtarget プロファイルの構成を選択します。

    qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted
    

    Note

    Adaptive_RItarget プロファイル ジョブは現在、Quantinuum targetsでサポートされています。 詳細については、「 Integrated ハイブリッド量子コンピューティングを参照してください。

  7. 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;
    }
    
  8. 次に、セッションを作成します。 たとえば、GenerateRandomBit操作を 3 回実行し、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# に挿入された文字列値を取得するために、より多くの処理が必要になる場合があります。

  9. セッションを作成したら、 workspace.list_session_jobs を使用して、セッション内のすべてのジョブの一覧を取得できます。 詳細については、「 セッションを管理する方法を参照してください。

Target の動作

各量子ハードウェア プロバイダーは、セッション内のジョブの優先順位付けを最適に管理するために独自のヒューリスティックを定義します。

Quantinuum

セッション内のジョブを Quantinuum targetに送信することを選択した場合、セッションは、互いに 1 分以内にジョブをキューに入れた場合に限り、ハードウェアへの排他的アクセス権を持ちます。 その後、ジョブが受け入れられ、標準のキューと優先順位付けロジックで処理されます。