주 콘텐츠로 건너뛰기

하드웨어

참고

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'