會話是混合式量子運算的主要功能,可讓您將多個量子運算作業分組在一起。 會話是提交至單 target一 的一或多個作業的邏輯群組。 每個會話都有附加至該會話中每個作業的唯一標識符。 當您想要依序執行多個量子運算作業時,會話非常有用,並能夠在量子作業之間執行傳統程式碼。
本文說明混合式量子運算中的會話架構,以及如何建立新的會話。
必要條件
若要建立會話,您需要下列必要條件:
具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,請免費註冊並註冊 隨用隨付訂用帳戶。
工作區 Azure Quantum 如需詳細資訊,請參閱 建立 Azure Quantum 工作區。
具備安裝了Python 的Python環境。
函式庫
qdkPython 。 如果你想使用 Qiskit 或 Cirq,你需要安裝azure和qiskit附加套件。pip install --upgrade qdk或
pip install --upgrade "qdk[azure,qiskit]"
什麼是工作階段?
在工作階段中,客戶端計算資源可能會移至雲端,因而產生較低的延遲,以及使用不同參數重複執行量子線路的能力。 作業可以邏輯方式分組成一個會話,而該會話中的作業可以優先於非會話作業。 雖然量子位狀態不會在作業之間保存,但會話允許作業的佇列時間較短,且運行時間較長的問題。
會話可讓您組織多個量子運算作業,並能夠在量子作業之間執行傳統程序代碼。 您將能夠執行複雜的演算法,以更妥善地組織和追蹤個別的量子運算作業。
您可能想要在會話中結合作業的關鍵使用者案例是 參數化 量子演算法,其中一個量子運算作業的輸出會通知下一個量子運算作業的參數。 這種類型的演算法最常見的範例是 Variational Quantum Eigensolvers (VQE) 和 Quantum Approximate Optimization Algorithms (QAOA)。
支援的硬體
所有量子運算硬體提供者都支援會話。 在某些情況下,在階段作業內提交的工作會在該 target的佇列中排定優先順序。 如需詳細資訊,請參閱 目標行為。
如何建立會話
若要建立會話,請遵循下列步驟:
此範例示範如何使用Q#內嵌程式碼在Jupyter Notebook中使用Visual Studio Code建立會話(VS Code)。 您還可以使用程式來建立階段作業,該程式呼叫相鄰的Python程式。
注意
工作階段會使用 Python 來管理,即使在執行 Q# 內嵌程式碼時也是如此。
在 VS Code中,開啟「檢視」功能表,然後選擇「命令選項板」。
輸入並選取 建立:新增 Jupyter Notebook。
在右上角,VS Code 會檢測並顯示選擇給筆記本的 Python 版本和虛擬 Python 環境。 如果您有多個 Python 環境,您可能需要使用右上方的核心選擇器來選取核心。 如果未偵測到任何環境,請參閱 Jupyter Notebook 中的 VS Code 以獲取設定資訊。
在筆記本的第一個儲存格中,執行下列程式碼:
from qdk.azure import Workspace workspace = Workspace( resource_id = "", # add your resource ID location = "", # add your location, for example "westus" )在筆記本中新增儲存格並匯入
qsharpPython 套件:from qdk import qsharp選擇您的 量子 target。 在此範例中,是 targetIonQ 模擬器。
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_RItarget 目前在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]重要
當您將引數作為參數傳遞至作業時,當呼叫Q#時,引數會被格式化為
qsharp.compile運算式。 這意味著您需要將參數格式化為 Q# 物件。 在此範例中,因為 中的 Python 陣列已列印為[item0, item1, ...],所以輸入引數 Q# 符合格式。 對於其他Python資料結構,您可能需要更多處理,才能以相容的方式將字串值插入到Q#中。建立工作階段之後,您可以使用
workspace.list_session_jobs來擷取工作階段中所有作業的清單。 如需詳細資訊,請參閱 如何管理會話。
目標行為
每個量子硬體提供者都會定義自己的啟發學習法,以最佳方式管理會話內工作的優先順序。
Quantinuum
如果您選擇將工作階段內的工作提交至 Quantinuum target,則只要您在一分鐘內將工作排入佇列,您的工作階段就可以獨佔存取硬體。 之後,系統會接受並使用標準佇列和優先順序邏輯處理您的工作。