에서 Azure Quantum여러 작업을 단일 대상에 그룹화하여 작업을 효과적으로 관리할 수 있습니다. 이를 세션이라고합니다. 자세한 내용은 세션 시작하기을 참조하세요.
이 문서에서는 세션을 사용하여 작업을 수동으로 관리하는 방법을 알아봅니다. 또한 작업 실패 정책과 세션 시간 제한을 방지하는 방법에 대해서도 알아봅니다.
필수 조건
활성 구독이 있는 Azure 계정. Azure 계정이 없는 경우 무료로 등록하고 종량제 구독을 신청하십시오.
Azure Quantum 작업 영역입니다. 자세한 내용은 작업 영역 만들기를 Azure Quantum 참조하세요.
qdkPython 라이브러리입니다. Qiskit 또는 Cirq을 사용하려면,azure및qiskit추가 항목을 설치해야 합니다.pip install --upgrade "qdk[azure,qiskit]"
비고
세션은 Python로 관리되며, 인라인 코드Q#를 실행할 때도 마찬가지입니다.
세션 모니터링
Quantum 작업 영역의 작업 관리 블레이드를 사용하여 세션 및 세션과 연결되지 않은 개별 작업을 포함하여 제출된 모든 최상위 항목을 볼 수 있습니다.
- Quantum 작업 영역에서 작업 관리 블레이드를 선택합니다.
- 세션 형식의 작업을 식별합니다. 이 보기에서는 ID 열에서 세션의 고유 ID를 찾고 세션의 상태를 모니터링할 수 있습니다. 세션은 다음과 같은 상태를 가질 수 있습니다.
- 대기 중: 세션 내의 작업이 현재 실행 중입니다.
- 성공: 세션이 성공적으로 종료되었습니다.
- TimeOut: 세션 내에서 10분 동안 새 작업이 제출되지 않으면 해당 세션의 시간이 초과됩니다. 자세한 내용은 세션 시간 제한을 참조하세요.
- 실패: 세션 내의 작업이 실패하면 해당 세션이 종료되고 실패 상태를 보고합니다. 자세한 내용은 세션 내의작업 실패 정책을 참조하세요.
- 자세한 내용을 보려면 세션의 이름을 클릭합니다.
- 세션 내의 모든 작업 목록을 보고 해당 상태를 모니터링할 수 있습니다.
세션 검색 및 나열
다음 표에서는 지정된 세션에서 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}")
수동으로 세션 열기 또는 닫기
새 세션을 만들려면 세션 시작의 단계를 수행하는 것이 가장 좋습니다. 대신 세션을 수동으로 만들려면 개발 환경의 탭을 선택합니다.
Session 개체를 만듭니다.
from qdk.azure.job 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()및 세션 세부 정보를 새로 고치거나, 세션 ID에서 새 세션 객체를 가져올 수 있습니다.same_session = workspace.get_session(session.id) print(f"Session: {session.details} \n") print(f"Session: {same_session.details} \n")또는
session.close()를 사용하여workspace.close_session(session)닫을 수 있습니다.세션을 대상에 연결하려면
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# 객체 형식으로 지정해야 합니다.
인수를 작업에 매개 변수로 전달하면 인수가 호출될 때 Q# 코드 형식이 qsharp.compile 지정되므로 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;
}
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분 동안 새 작업이 제출되지 않으면 세션 시간이 초과됩니다. 세션은 시간 초과 상태을 보고합니다. 이 상황을 방지하려면 with사용하여 backend.open_session(name="Name") 블록을 추가하면 코드 블록의 끝에 있는 서비스에서 세션 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")