開始使用會話
會話是混合式量子運算的主要功能,可讓您將多個量子運算作業分組在一起。
本文說明混合式量子運算中的會話架構,以及如何建立新的會話。
必要條件
若要建立會話,您需要下列必要條件:
具有有效訂用帳戶的 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# 。
在 VS Code 中,選取 [檢視]>[命令選擇區],然後選取 [建立:新增 Jupyter Notebook]。
在右上方,VS Code 會偵測並顯示針對筆記本選取的 Python 版本和虛擬 Python 環境。 如果您有多個 Python 環境,您可能需要使用右上方的核心選擇器來選取核心。 如果未偵測到任何環境,請參閱 VS Code 中的 Jupyter Notebook 以取得設定資訊。
在筆記本的第一個數據格中,執行
import azure.quantum workspace = azure.quantum.Workspace( resource_id = "", # add your resource ID location = "", # add your location, for example "westus" )
按兩下 [+ 程式代碼 ] 以在筆記本中新增數據格,並匯入
qsharp
Python SDK。import qsharp
選取您選擇的量子target。 在這裡範例中,您會使用 IonQ 模擬器 作為 target。
target = workspace.get_targets("ionq.simulator")
選取設定檔的target組態、
Base
、Adaptive_RI
或Unrestricted
。qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted
注意
Adaptive_RI
target 目前在Quantinuum targets上支援配置文件作業。 如需詳細資訊,請參閱 整合式混合式量子運算。撰寫程式 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
作業三次,因此您可以使用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#建立工作階段之後,您可以使用
workspace.list_session_jobs
來擷取工作階段中所有作業的清單。 如需詳細資訊,請參閱 如何管理會話。
Target 行為
每個量子硬體提供者都會定義自己的啟發學習法,以最佳方式管理會話內工作的優先順序。
Quantinuum
如果您選擇在會話內將作業提交至 Quantinuum target,只要您將作業排入彼此一分鐘內的佇列,您的會話將具有硬體的獨佔存取權。 之後,系統會使用標準佇列和優先順序邏輯來接受和處理您的作業。