다음을 통해 공유


세션을 관리하는 방법

Azure Quantum에서 여러 작업을 단일 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] 
    

비고

세션은 Q# 인라인 코드를 실행하는 경우에도 Python으로 관리됩니다.

모니터링 세션

Quantum 작업 영역의 작업 관리 블레이드를 사용하여 세션 및 세션과 연결되지 않은 개별 작업을 포함하여 제출된 모든 최상위 항목을 볼 수 있습니다.

  1. Quantum 작업 영역에서 작업 관리 블레이드를 선택합니다.
  2. 세션 형식의 작업을 식별합니다. 이 보기에서는 열 ID 세션의 고유 ID를 확인하고 상태모니터링할 수 있습니다. 세션의 상태는 다음과 같습니다.
    • 대기: 세션 내의 작업이 실행되고 있습니다.
    • 성공: 세션이 성공적으로 종료되었습니다.
    • TimeOut: 세션 내에서 10분 동안 새 작업이 제출되지 않으면 해당 세션의 시간이 초과됩니다. 자세한 내용은 세션 시간 제한참조하세요.
    • 실패: 세션 내의 작업이 실패하면 해당 세션이 종료되고 실패한상태를 보고합니다. 자세한 내용은 세션 내의작업 실패 정책을 참조하세요.
  3. 자세한 내용을 보려면 세션의 이름을 클릭합니다.
  4. 세션 내에서 모든 작업 목록을 보고 해당 상태를 모니터링할 수 있습니다.

세션 검색 및 나열

다음 표에서는 지정된 세션에 대한 모든 세션 및 모든 작업의 목록을 가져오는 Python 명령을 보여 줍니다.

명령어 설명
workspace.list_sessions() 또는 session.list_sessions() Quantum 작업 영역의 모든 세션 목록을 검색합니다.
workspace.get_session(sessionId) 또는 session.get_session(sessionId) ID sessionId사용하여 세션을 검색합니다. 각 세션에는 고유한 ID가 있습니다.
workspace.list_session_jobs(sessionId) 또는 session.list_session_jobs(sessionId) 세션 ID sessionId의 모든 작업 목록을 검색합니다. 각 세션에는 고유한 ID가 있습니다.

예를 들어 다음 코드는 최소 작업 수를 가진 세션을 가져오는 함수를 정의합니다. 그런 다음, 해당 세션의 경우 모든 작업, 총 작업 수 및 처음 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()를 사용하여 상태 및 세션 세부 정보를 새로 고치거나, 세션 ID에서 새 세션 객체를 가져올 수 있습니다.

    same_session = workspace.get_session(session.id) 
    print(f"Session: {session.details} \n")
    print(f"Session: {same_session.details} \n")
    
  4. session.close() 또는 workspace.close_session(session)를 사용하여 세션을 닫을 수 있습니다.

  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# 구문으로 문자열로 형식을 지정해야 합니다.

정수, n및 각도 배열(angle)을 입력으로 사용하는 다음 Q# 프로그램을 고려합니다.

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;
}

GenerateRandomBits 작업을 n=2과 여러 각도로 세 번 실행하려고 합니다. 다음 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# 튜플은 쉼표로 구분된 값이 있는 괄호 안에 있어야 합니다.

세션 시간 제한

세션 내에서 10분 동안 새 작업이 제출되지 않으면 세션 시간이 초과됩니다. 세션은 시간 초과 상태을 보고합니다. 이 상황을 방지하려면 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()

세션 내의 작업 실패 정책

작업이 실패할 때 세션에 대한 기본 정책은 해당 세션을 종료하는 것입니다. 동일한 세션 내에 추가 작업을 제출하면 서비스에서 작업을 거부하고 세션이 실패한상태를 보고합니다. 진행 중인 모든 작업이 취소됩니다.

그러나 이 동작은 세션을 만들 때 기본 SessionJobFailurePolicy.ABORT대신 job_failure_policy=SessionJobFailurePolicy.CONTINUE작업 실패 정책을 지정하여 변경할 수 있습니다. 작업 실패 정책이 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")