다음을 통해 공유


세션을 관리하는 방법

이 문서에서는 세션을 관리하는 방법을 알아봅니다. 세션을 사용하면 하나 이상의 작업을 단일 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}")
    

    참고 항목

    이 시점에서 세션은 클라이언트에만 존재하며 상태가 None임을 확인할 수 있습니다. 세션 상태를 보려면 서비스에서 세션도 만들어야 합니다.

  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. 또는 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# 구문으로 문자열로 형식이 지정되어야 합니다.

정수 및 각도 배열을 n입력으로 사용하는 다음 Q# 프로그램을 고려합니다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# 튜플은 쉼표로 구분된 값이 있는 괄호 안에 있어야 합니다.

세션 시간 제한

세션 내에서 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()

세션 내의 작업 실패 정책

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

그러나 세션을 만들 때 기본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")