주 콘텐츠로 건너뛰기

하드웨어

참고

Masao Tokunari and Tamiya Onodera (14 June 2024)

이 강좌는 도쿄대학교에서 진행된 실시간 강좌를 기반으로 합니다.

이 레슨의 강의 pdf는 두 부분으로 분할되었습니다. 파트 1 다운로드 및 파트 2 다운로드. 이는 정적 이미지이므로 일부 코드 스니펫은 더 이상 사용되지 않을 수 있다는 점에 유의하세요.

1. 소개​

이 레슨은 현대의 양자 컴퓨팅 하드웨어를 탐구합니다.

일부 버전을 확인하고 관련 패키지를 import하는 것부터 시작하겠습니다.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
import statistics

from qiskit_ibm_runtime import QiskitRuntimeService

2. Backend 및 Target​

Qiskit은 양자 장치에 대한 정적 및 동적 정보를 모두 얻을 수 있는 API를 제공합니다. 장치와 인터페이싱하기 위해 Backend 인스턴스를 사용하며, 여기에는 명령어 집합 아키텍처(ISA)와 이와 관련된 속성이나 제약 조건 등 관련 특성을 요약한 추상 머신 모델인 Target 인스턴스가 포함됩니다. 이러한 Backend 인스턴스를 사용하여 IBM Quantum® Platform의 컴퓨팅 리소스 페이지에서 볼 수 있는 일부 정보를 가져와 보겠습니다. 먼저, 관심 있는 장치에 대한 Backend 인스턴스를 만듭니다. 다음에서는 "ibm_kyoto", "ibm_kawasaki", 또는 가장 덜 바쁜 Eagle 머신을 선택합니다. QPU에 대한 접근 권한은 다를 수 있으니, 그에 따라 backend 이름을 업데이트하세요.

service = QiskitRuntimeService()
# backend = service.backend("ibm_kawasaki") # an Eagle, if you have access to ibm_kawasaki
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=127
) # Eagle
backend.name
'ibm_strasbourg'

장치에 대한 기본(정적) 정보부터 시작하겠습니다.

print(
f"""
{backend.name}, {backend.num_qubits} qubits
processor type = {backend.processor_type}
basis gates = {backend.basis_gates}
"""
)
ibm_strasbourg, 127 qubits
processor type = {'family': 'Eagle', 'revision': 3}
basis gates = ['ecr', 'id', 'rz', 'sx', 'x']

2.1 연습​

Heron 장치인 "ibm_strasbourg"에 대한 기본 정보를 가져와 보세요. 직접 시도해 보되, 스스로 확인할 수 있도록 아래에 코드가 추가되어 있습니다.

a_heron = service.backend("ibm_strasbourg") # a Heron

# your code here
print(
f"""
{backend.name}, {a_heron.num_qubits} qubits
processor type = {a_heron.processor_type}
basis gates = {a_heron.basis_gates}
"""
)
ibm_strasbourg, 133 qubits
processor type = {'family': 'Heron', 'revision': '1'}
basis gates = ['cz', 'id', 'rz', 'sx', 'x']

2.2 결합 맵(coupling map)​

이제 장치의 결합 맵을 그립니다. 보면 알 수 있듯이, 노드는 번호가 매겨진 Qubit입니다. 간선(edge)은 2-Qubit 얽힘 Gate를 직접 적용할 수 있는 쌍을 나타냅니다. 이 토폴로지를 "heavy-hex 격자"라고 합니다.

# This function requires that Graphviz is installed. If you need to install Graphviz
# you can refer to:
# https://graphviz.org/download/#executable-packages for instructions.
try:
fig = backend.coupling_map.draw()
except RuntimeError as ex:
print(ex)
fig

Output of the previous code cell

3. Qubit 속성​

Eagle 장치에는 127개의 Qubit이 있습니다. 그 중 일부의 속성을 가져와 보겠습니다.

for qn in range(backend.num_qubits):
if qn >= 5:
break
print(f"{qn}: {backend.qubit_properties(qn)}")
0: QubitProperties(t1=0.000183686508736532, t2=0.00023613944465408068, frequency=4832100227.116953)
1: QubitProperties(t1=0.00048794378526038294, t2=9.007098375327869e-05, frequency=4736264354.075363)
2: QubitProperties(t1=0.00021247781834456527, t2=7.81037910324034e-05, frequency=4859349851.150393)
3: QubitProperties(t1=0.0002936462084765663, t2=0.00011400214529510604, frequency=4679749549.503852)
4: QubitProperties(t1=0.00044229440258559125, t2=0.0003181648356339447, frequency=4845872064.050596)

Qubit T1 시간의 중앙값을 계산해 보겠습니다. 결과를 IBM Quantum Platform의 장치에 표시된 값과 비교해 보세요.

t1s = [backend.qubit_properties(qq).t1 for qq in range(backend.num_qubits)]
f"Median T1: {(statistics.median(t1s)*10**6):.2f} \u03bcs"
'Median T1: 285.43 μs'

3.1 연습​

Qubit의 T2 시간의 중앙값을 계산해 보세요. 직접 시도해 보되, 스스로 확인할 수 있도록 아래에 코드가 추가되어 있습니다.

# Your code here

t2s = [backend.qubit_properties(qq).t2 for qq in range(backend.num_qubits)]
f"Median T2: {(statistics.median(t2s)*10**6):.2f} \u03bcs"
'Median T2: 173.10 μs'

3.2 Gate 및 판독 오류​

이제 Gate 오류로 넘어가겠습니다. 먼저, target 인스턴스의 데이터 구조를 살펴봅니다. 이는 키가 연산 이름인 딕셔너리입니다.

target = backend.target
target.keys()
dict_keys(['measure', 'id', 'sx', 'delay', 'x', 'for_loop', 'rz', 'if_else', 'ecr', 'reset', 'switch_case'])

값 역시 딕셔너리입니다. 'sx' 연산에 대한 값(딕셔너리)의 일부 항목을 살펴보겠습니다.

for i, qq in enumerate(target["sx"]):
if i >= 5:
break
print(i, qq, target["sx"][qq])
0 (0,) InstructionProperties(duration=6e-08, error=0.0007401311759115297)
1 (1,) InstructionProperties(duration=6e-08, error=0.0003163759907528654)
2 (2,) InstructionProperties(duration=6e-08, error=0.0003183859004638003)
3 (3,) InstructionProperties(duration=6e-08, error=0.00042235914178831863)
4 (4,) InstructionProperties(duration=6e-08, error=0.011163151923589715)

'ecr' 및 'measure' 연산에 대해 동일하게 해보겠습니다.

for i, edge in enumerate(target["ecr"]):
if i >= 5:
break
print(i, edge, target["ecr"][edge])
0 (0, 14) InstructionProperties(duration=6.6e-07, error=0.01486295709788732)
1 (1, 0) InstructionProperties(duration=6.6e-07, error=0.015201590794522601)
2 (2, 1) InstructionProperties(duration=6.6e-07, error=0.00697838102630724)
3 (2, 3) InstructionProperties(duration=6.6e-07, error=0.008075067943986797)
4 (3, 4) InstructionProperties(duration=6.6e-07, error=0.0630164507876913)
for i, qq in enumerate(target["measure"]):
if i >= 5:
break
print(i, qq, target["measure"][qq])
0 (0,) InstructionProperties(duration=1.6e-06, error=0.0078125)
1 (1,) InstructionProperties(duration=1.6e-06, error=0.155029296875)
2 (2,) InstructionProperties(duration=1.6e-06, error=0.057373046875)
3 (3,) InstructionProperties(duration=1.6e-06, error=0.02880859375)
4 (4,) InstructionProperties(duration=1.6e-06, error=0.01318359375)

보면 알 수 있듯이, 판독 오류는 2-Qubit 연산의 오류보다 크고, 후자는 다시 1-Qubit 연산의 오류보다 큰 경향이 있습니다.

데이터 구조를 이해했으니, 'sx' 및 'ecr' Gate 오류의 중앙값을 계산할 준비가 되었습니다. 다시 한 번, 결과를 IBM Quantum Platform의 장치에 표시된 값과 비교해 보세요.

sx_errors = [inst_prop.error for inst_prop in target["sx"].values()]
f"Median SX error: {(statistics.median(sx_errors)):.3e}"
'Median SX error: 2.277e-04'
ecr_errors = [inst_prop.error for inst_prop in target["ecr"].values()]
f"Median ECR error: {(statistics.median(ecr_errors)):.3e}"
'Median ECR error: 6.895e-03'

4. 부록​

Qiskit의 인기 있는 기능 중 하나는 시각화 능력입니다. 여기에는 회로 시각화 도구, 상태 및 분포 시각화 도구, 그리고 target 시각화 도구가 포함됩니다. 이전 jupyter 노트북에서 앞의 두 가지는 이미 사용해 보았습니다. target 시각화 도구의 일부 기능을 사용해 보겠습니다.

from qiskit.visualization import plot_gate_map

plot_gate_map(backend, font_size=14)

Output of the previous code cell

from qiskit.visualization import plot_error_map

plot_error_map(backend)

Output of the previous code cell

# Check Qiskit version
import qiskit

qiskit.__version__
'2.0.2'