共用方式為


開始使用會話

會話是混合式量子運算的主要功能,可讓您將多個量子運算作業分組在一起。

本文說明混合式量子運算中的會話架構,以及如何建立新的會話。

必要條件

若要建立會話,您需要下列必要條件:

  • 具有有效訂用帳戶的 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] 
    

什麼是工作階段?

會話是提交至單 target一 的一或多個作業的邏輯群組。 每個會話都有附加至該會話中每個作業的唯一標識符。

在工作階段中,客戶端計算資源可能會移至雲端,因而產生較低的延遲,以及使用不同參數重複執行量子線路的能力。 作業可以邏輯方式分組成一個會話,而該會話中的作業可以優先於非會話作業。 雖然量子位狀態不會在作業之間保存,但會話允許作業的佇列時間較短,且運行時間較長的問題。

會話可讓您組織多個量子運算作業,並能夠在量子作業之間執行傳統程序代碼。 您將能夠執行複雜的演算法,以更妥善地組織和追蹤個別的量子運算作業。

您可能想要在會話中結合作業的關鍵使用者案例是 參數化 量子演算法,其中一個量子運算作業的輸出會通知下一個量子運算作業的參數。 這種類型的演算法最常見的範例是 Variational Quantum Eigensolvers (VQE) 和 Quantum Approximate Optimization Algorithms (QAOA)。

支援的硬體

所有量子運算硬體提供者都支援會話。 在某些情況下,在會話內提交的作業會優先於該 target的佇列中。 如需詳細資訊,請參閱 Target 行為

如何建立會話

若要建立會話,請遵循下列步驟:

此範例示範如何在 Visual Studio Code 中使用 Jupyter Notebook 建立內 Q# 嵌程式代碼的會話。 您也可以使用叫用相鄰Q#程式的 Python 程式來建立會話。

注意

會話是使用 Python 進行管理,即使執行內嵌程式代碼也一併執行 Q# 。

  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. 按兩下 [+ 程式代碼 ] 以在筆記本中新增數據格,並匯入 qsharp Python SDK。

    import qsharp
    
  5. 選取您選擇的量子target。 在這裡範例中,您會使用 IonQ 模擬器 作為 target。

    target = workspace.get_targets("ionq.simulator")
    
  6. 選取設定檔target組態、BaseAdaptive_RIUnrestricted

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

    注意

    Adaptive_RItarget 目前在Quantinuum targets上支援配置文件作業。 如需詳細資訊,請參閱 整合式混合式量子運算

  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 作業三次,因此您可以使用 target.submit 將數據提交 Q# 作業 target ,並重複程式碼三次 - 在真實世界的案例中,您可能會想要提交不同的程式,而不是相同的程式代碼。

    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,只要您將作業排入彼此一分鐘內的佇列,您的會話將具有硬體的獨佔存取權。 之後,系統會使用標準佇列和優先順序邏輯來接受和處理您的作業。