共用方式為


如何管理您的會話

在本文中,您將瞭解如何管理您的會話。 透過工作階段,您可以將一或多個作業分組到單 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 工作區中的 [作業管理 ] 刀鋒視窗來檢視所有最上層提交的專案,包括會話和與任何會話無關的個別作業。

  1. 選取 Quantum 工作區中的 [ 作業管理] 刀鋒視窗。
  2. 識別會話類型的作業。 在此檢視中,您可以在 [標識符] 數據行中看到會話的唯一標識符,並監視其狀態。 工作階段的狀態如下:
    • 等候:正在執行會話內的作業。
    • 成功:工作階段已順利結束。
    • TimeOut:如果會話內未提交任何新作業 10 分鐘,該會話就會逾時。如需詳細資訊,請參閱 會話逾時
    • 失敗:如果會話內的作業失敗,該會話會結束並報告失敗狀態。 如需詳細資訊,請參閱 會話內的作業失敗原則。
  3. 如需詳細資訊,請按兩下會話的名稱。
  4. 您可以在會話內查看 [所有作業] 列表,並監視其狀態。

擷取和列出會話

下表顯示 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}")

開啟/關閉會話的手動方法

建議您遵循開始使用會話中的步驟來建立新的會話。 您也可以手動建立會話。

  1. 首先,建立 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}")
    

    注意

    此時,會話只存在於用戶端上,而且您可以看到狀態為 [無]。 若要檢視會話的狀態,您也需要在服務中建立會話。

  2. 若要 在服務中建立 工作階段,您可以使用 workspace.open_session(session)session.open()

  3. 您可以使用 來重新整理 狀態 和會話詳細數據 session.refresh(),或從會話標識碼取得新的工作階段物件。

    same_session = workspace.get_session(session.id) 
    print(f"Session: {session.details} \n")
    print(f"Session: {same_session.details} \n")
    
  4. 您可以使用workspace.close_session(session)關閉工作階段session.close()

  5. 若要 將會話 附加至 target,您可以使用 target.latest_session

  6. 您可以 等候 工作階段完成:

    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")