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

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

ハイブリッド量子コンピューティングのこのモデルでは、クライアント コンピューティング リソースをクラウドに移動すると、待機時間が短くなり、異なるパラメーターで量子回路の実行を繰り返す機能が得られる可能性があります。 ジョブは論理的に 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) です。

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

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

セッションの概要

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

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

注意

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

  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. [ + コード] をクリックしてノートブックに新しいセルを追加し、Python SDK をインポート qsharp します。

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

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

    qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Unrestricted
    
  7. プログラムを作成します 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;
    }
    
  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 確認し、その 状態を監視できます。 セッションの状態は次のとおりです。
    • 待機中: セッション内のジョブが実行されています。
    • 成功: セッションは正常に終了しました。
    • TimeOut: セッション内に 10 分間新しいジョブが送信されない場合、そのセッションはタイムアウトします。詳細については、「 セッションのタイムアウト」を参照してください。
    • 失敗: セッション内のジョブが失敗した場合、そのセッションは終了し、失敗の状態が報告 されます。 詳細については、「 セッション内のジョブ エラー ポリシー」を参照してください。
  3. 詳細については、セッションの名前をクリックしてください。
  4. セッション内 のすべてのジョブ の一覧を表示し、その状態を監視できます。

ターゲットの動作

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

Quantinuum

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