対話型量子コンピューティング: セッション

この記事では、対話型量子コンピューティング (セッションとも呼ばれます) のアーキテクチャと、新しいセッションを作成する方法について説明します。

ハイブリッド量子コンピューティングのこのモデルでは、クライアント コンピューティング リソースをクラウドに移動できるため、待機時間が短くなり、さまざまなパラメーターで量子回路の実行を繰り返す機能が得られます。 ジョブは論理的に 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、QuantinuumRigetti のすべての量子コンピューティング ハードウェア プロバイダーでサポートされています。 場合によっては、セッション内で送信されたジョブが、その targetキューに優先順位が付けられます。 詳細については、「ターゲットの動作」を参照してください

セッションの概要

セッションは Python で管理され、QIR 量子プログラム (Qiskit、Cirq プログラムなど Q#) 用に作成できます。

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

Note

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

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

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

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

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

    import qsharp
    
  5. 任意の 量子 target を選択します。 この例では、IonQ シミュレーターを次のようにtarget使用しています。

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

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

    Note

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

  7. プログラムを記述します Q# 。 たとえば、次 Q# のプログラムはランダム ビットを生成します。 入力引数の使用を示すために、このプログラムは整数と角度nangleの配列を入力として受け取ります。

    %%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;
    }
    
  8. 次に、セッションを作成します。 たとえば、操作を 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# 必要になる場合があります。

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

セッションの監視

Quantum ワークスペースの [ジョブ管理] ブレードを使用すると、セッションやセッションに関連付けられていない個々のジョブなど、最上位レベルで送信されたすべてのアイテムを表示できます。

  1. Quantum ワークスペースの [ジョブ管理 ] ブレードを選択します。
  2. Session 型 のジョブを識別します。 このビューでは、列 ID でセッションの一意の ID を 確認し、その状態を 監視できます。 セッションの状態は次のとおりです。
    • 待機中: セッション内のジョブが実行されています。
    • 成功: セッションは正常に終了しました。
    • タイムアウト: セッション内に 10 分間新しいジョブが送信されない場合、そのセッションはタイムアウトします。詳細については、「セッションタイムアウト」を参照してください
    • 失敗: セッション内のジョブが失敗した場合、そのセッションは終了し、状態が [失敗] と報告されます。 詳細については、「セッション内のジョブエラーポリシー」を参照してください
  3. 詳細については、セッションの名前をクリックしてください。
  4. セッション内のすべてのジョブ一覧を表示し、その状態を監視できます。

ターゲットの動作

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

Quantinuum

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