如何管理您的會話
在本文中,您將瞭解如何管理您的會話。 透過工作階段,您可以將一或多個作業分組到單 target一 ,這可讓您有效地管理作業。 如需詳細資訊,請參閱 開始使用會話。
必要條件
具有有效訂用帳戶的 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]
注意
會話是使用 Python 進行管理,即使執行內嵌程式代碼也一併執行 Q# 。
監視會話
您可以使用 Quantum 工作區中的 [作業管理 ] 刀鋒視窗來檢視所有最上層提交的專案,包括會話和與任何會話無關的個別作業。
- 選取 Quantum 工作區中的 [ 作業管理] 刀鋒視窗。
- 識別會話類型的作業。 在此檢視中,您可以在 [標識符] 數據行中看到會話的唯一標識符,並監視其狀態。 工作階段的狀態如下:
- 如需詳細資訊,請按兩下會話的名稱。
- 您可以在會話內查看 [所有作業] 列表,並監視其狀態。
擷取和列出會話
下表顯示 Python 命令,以取得指定工作階段的所有工作階段和所有作業的清單。
Command | 描述 |
---|---|
workspace.list_sessions() 或 session.list_sessions() |
擷取 Quantum 工作區中所有工作階段清單。 |
workspace.get_session(sessionId) 或 session.get_session(sessionId) |
擷取標識碼為 sessionId 的會話。 每個會話都有唯一標識符。 |
workspace.list_session_jobs(sessionId) 或 session.list_session_jobs(sessionId) |
擷取會話中標識碼 sessionId 為的所有作業清單。 每個會話都有唯一標識符。 |
例如,下列程式代碼會定義函式,以取得作業數目下限的會話。 然後,針對該會話,它會列出所有作業、作業總數,以及前 10 個作業。
def get_a_session_with_jobs(min_jobs):
all_sessions = workspace.list_sessions() # list of all sessions
for session in all_sessions:
if len(workspace.list_session_jobs(session.id)) >= min_jobs:
return session
session = get_a_session_with_jobs(min_jobs=3) # Get a Session with at least 3 jobs
session_jobs = workspace.list_session_jobs(session.id) # List of all jobs within Session ID
print(f"Job count: {len(session_jobs)} \n")
print(f"First 10 jobs for session {session.id}:")
for job in session_jobs[0:10]:
print(f"Id: {job.id}, Name={job.details.name}")
開啟/關閉會話的手動方法
建議您遵循開始使用會話中的步驟來建立新的會話。 您也可以手動建立會話。
首先,建立 Session 物件。
from azure.quantum.job.session import Session, SessionDetails, SessionJobFailurePolicy import uuid session = Session( workspace=workspace, # required id=f"{uuid.uuid1()}", # optional, if not passed will use uuid.uuid1() name="", # optional, will be blank if not passed provider_id="ionq", # optional, if not passed will try to parse from the target target="ionq.simulator", # required job_failure_policy=SessionJobFailurePolicy.ABORT # optional, defaults to abort ) print(f"Session status: {session.details.status}")
注意
此時,會話只存在於用戶端上,而且您可以看到狀態為 [無]。 若要檢視會話的狀態,您也需要在服務中建立會話。
若要 在服務中建立 工作階段,您可以使用
workspace.open_session(session)
或session.open()
。您可以使用 來重新整理 狀態 和會話詳細數據
session.refresh()
,或從會話標識碼取得新的工作階段物件。same_session = workspace.get_session(session.id) print(f"Session: {session.details} \n") print(f"Session: {same_session.details} \n")
您可以使用或
workspace.close_session(session)
關閉工作階段session.close()
。若要 將會話 附加至 target,您可以使用
target.latest_session
。您可以 等候 工作階段完成:
session_jobs = session.list_jobs() [session_job.id for session_job in session_jobs] import time while (session.details.status != "Succeeded" and session.details.status != "Failed" and session.details.status != "TimedOut"): session.refresh() time.sleep(5)
傳入自變數 Q#
Q#如果您的作業接受輸入自變數,這些自變數會在作業提交期間傳遞,也就是 Python 程式代碼。 這表示您必須小心,才能將自變數格式化為 Q# 物件。
將自變數當做參數傳遞至作業時,這些自變數會在呼叫 qsharp.compile
時格式化為Q#程式代碼,因此從 Python 的值必須格式化為有效的Q#語法。
請考慮下列 Q# 程式,其採用整數和 n
角度陣列作為 angle
輸入。
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;
}
您想要使用 n=2
和不同的角度執行GenerateRandomBits
作業三次。 您可以使用下列 Python 程式代碼來提交三個具有不同角度的作業。
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]
在此範例中,由於 Python 中的陣列印為 [item0, item1, ...],因此輸入自變數會符合 Q# 格式設定。 對於其他 Python 資料結構,您可能需要更多處理,才能以相容的方式將字串值插入 。Q# 例如, Q# Tuple 必須以逗號分隔值括在括弧中。
會話逾時
如果會話內未提交任何新作業,會話就會逾時 10 分鐘。 會話會報告 TimedOut 的狀態。 若要避免這種情況,請使用 backend.open_session(name="Name")
新增 with
區塊,讓會話close()
由程式代碼區塊結尾的服務叫用。
注意
如果您的程式中發生錯誤或錯誤,在會話中先前的工作完成之後,可能需要超過10分鐘才能提交新作業。
下列代碼段顯示會話在 10 分鐘後逾時的範例,因為未提交任何新作業。 為了避免這種情況,下一個 with
代碼段會示範如何使用 區塊來建立會話。
#Example of a session that times out
session = backend.open_session(name="Qiskit circuit session") # Session times out because only contains one job
backend.run(circuit=circuit, shots=100, job_name="Job 1")
#Example of a session that includes a with block to avoid timeout
with backend.open_session(name="Qiskit circuit session") as session: # Use a with block to submit multiple jobs within a session
job1 = backend.run(circuit=circuit, shots=100, job_name="Job 1") # First job submission
job1.wait_for_final_state()
job2 = backend.run(circuit=circuit, shots=100, job_name="Job 2") # Second job submission
job2.wait_for_final_state()
job3 = backend.run(circuit=circuit, shots=100, job_name="Job 3") # Third job submission
job3.wait_for_final_state()
會話內的作業失敗原則
當作業失敗時,會話的默認原則是結束該會話。 如果您在相同的會話內提交其他作業,服務會拒絕它,而會話會回報失敗狀態。 任何進行中的作業都已取消。
不過,建立會話時,可以藉由指定的作業失敗原則 job_failure_policy=SessionJobFailurePolicy.CONTINUE
,而不是預設 SessionJobFailurePolicy.ABORT
的 ,來變更此行為。 當作業失敗原則為 CONTINUE
時,服務會繼續接受作業。 會話會在此案例中報告失敗狀態,一旦會話關閉,就會變更為 [失敗]。
如果會話從未關閉並逾時,即使作業失敗,狀態也會是 TimedOut 。
例如,下列程式會建立具有三個作業的會話。 第一個作業失敗,因為它指定 "garbage"
為輸入數據。 為了避免此時會話結束,程式會顯示如何在建立會話時新增 job_failure_policy=SessionJobFailurePolicy.CONTINUE
。
#Example of a session that does not close but reports Failure(s) when a jobs fails
with target.open_session(name="JobFailurePolicy Continue", job_failure_policy=SessionJobFailurePolicy.CONTINUE) as session:
target.submit(input_data="garbage", name="Job 1") #Input data is missing, this job fails
target.submit(input_data=quil_program, name="Job 2") #Subsequent jobs are accepted because of CONTINUE policy
target.submit(input_data=quil_program, name="Job 3")