주 콘텐츠로 건너뛰기

SQD와 SKQD

이 챕터에서는 양자 컴퓨터와 고전 컴퓨터가 협력하여 과학에서 가장 중요한 과제 중 하나인 분자 및 물질의 에너지를 정확하게 추정하는 방법을 살펴봅니다.

Iskandar Sitdikov가 다음 영상에서 알고리즘적 접근 방식을 설명합니다.

해밀토니안

이 문제의 핵심은 수학적 연산자인 해밀토니안(Hamiltonian)으로, 이는 시스템의 전체 에너지를 나타냅니다. 계산 목적상 이 해밀토니안을 큰 행렬로 생각할 수 있습니다. 우리가 찾는 해—특히 시스템의 바닥 상태(ground state)—는 이 행렬의 가장 낮은 고유값입니다. 그러나 실제 문제에서 이 해밀토니안 행렬은 매우 큽니다. 시스템의 크기에 따라 지수적으로 증가하여 (nn이 Qubit 수일 때 2n2^n) 가장 강력한 슈퍼컴퓨터조차 직접 저장하거나 풀기 어렵게 됩니다.

H=(H0,0H0,1H0,N1H1,0H1,1H1,N1HN1,0HN1,1HN1,N1)(N=2n)H = \begin{pmatrix} H_{0,0} & H_{0,1} & \cdots & H_{0,N-1} \\ H_{1,0} & H_{1,1} & \cdots & H_{1,N-1} \\ \vdots & \vdots & \ddots & \vdots \\ H_{N-1,0} & H_{N-1,1} & \cdots & H_{N-1,N-1} \end{pmatrix} \quad (N=2^n)

이를 해결하기 위해 부분 공간(subspace) 방법이라는 강력한 전략을 사용합니다. 전체 행렬을 직접 다루는 대신, 우리가 찾는 저에너지 해에 관한 가장 중요한 정보를 담고 있다고 판단되는 작고 관련성 높은 조각—"부분 공간"—을 지능적으로 선택합니다.

(Hi,j)Full HamiltonianProjectH~Projected Hamiltonian=(b1Hb1b1HbLbLHb1bLHbL)Diagonalize(E000EL1)Eigenvalues\underset{\text{Full Hamiltonian}}{\begin{pmatrix} \ddots & \vdots \\ \cdots & H_{i,j} & \cdots \\ & \vdots & \ddots \end{pmatrix}} \quad \xrightarrow{\text{Project}} \quad \underset{\text{Projected Hamiltonian}}{\tilde{H}} = \begin{pmatrix} \langle b_1 | H | b_1 \rangle & \cdots & \langle b_1 | H | b_L \rangle \\ \vdots & \ddots & \vdots \\ \langle b_L | H | b_1 \rangle & \cdots & \langle b_L | H | b_L \rangle \end{pmatrix} \quad \xrightarrow{\text{Diagonalize}} \quad \underset{\text{Eigenvalues}}{\begin{pmatrix} E_0 & & 0 \\ & \ddots & \\ 0 & & E_{L-1} \end{pmatrix}}

기저 상태들의 집합 {bi}\{|b_i\rangle\}으로 이 작은 부분 공간이 정의되면, 전체 해밀토니안을 그 위에 투영하여 새롭고 더 작은 행렬 H~\tilde{H}를 만듭니다. 이 행렬의 각 원소는 부분 공간 기저 상태와 원래 해밀토니안으로부터 biHbj\langle b_i | H | b_j \rangle와 같이 계산됩니다. 이 작은 행렬은 고전 컴퓨터에서 쉽게 대각화할 수 있으며, 결과 고유값이 추정 에너지가 됩니다.

짐작하시듯, 이 전체 접근법의 성공은 "좋은" 부분 공간을 선택하는 데 크게 달려 있습니다. 부분 공간이 진짜 바닥 상태를 정확하게 나타내지 못하면 최종 답도 틀리게 됩니다. 여기서 양자 컴퓨터가 등장합니다. 양자 컴퓨터를 이용하면 이 중요한 부분 공간을 찾아내도록 설계된 복잡한 양자 상태를 준비하고 샘플링할 수 있습니다. 복잡한 화학 구조나 결합 부위 같은 정말 거대한 문제에서는 투영된 행렬조차 대각화하기 어려울 수 있습니다. 따라서 이러한 문제는 양자 컴퓨팅과 고전 컴퓨팅 자원의 강점을 모두 활용하기에 이상적입니다.

다음 섹션에서는 양자 역학을 활용하여 이러한 부분 공간을 찾고 구성하는 두 가지 고급 알고리즘인 SQD와 SKQD를 살펴봅니다. 더 깊이 알고 싶다면 IBM Quantum 학습 플랫폼에 이 주제를 상세히 다루는 전체 강좌가 마련되어 있습니다. 이 강좌에서는 높은 수준의 설명에 집중합니다.

샘플 기반 양자 대각화 (Sample-based Quantum Diagonalization)

샘플 기반 양자 대각화(SQD)는 부분 공간 방법을 양자적 방식으로 구현하는 강력한 변분 알고리즘입니다. SQD는 Hadamard 테스트 같은 비용이 많이 드는 복잡한 절차를 피하고, 양자 컴퓨터를 사용하여 시행 상태(trial state)를 준비하고 *비트 문자열(bitstring)*을 샘플링하여 고전 대각화를 위한 부분 공간을 정의합니다.

샘플 기반 양자 대각화에 특화된 워크플로 개요. 단계는 변분 양자 Circuit, 측정을 사용하여 해밀토니안을 부분 공간으로 투영, 그런 다음 고전 옵티마이저로 Circuit의 변분 파라미터를 업데이트하고 반복하는 것을 포함합니다.

SQD 알고리즘은 다음 단계로 분해할 수 있습니다:

1단계: 앤사츠(Ansatz) 상태 준비

nn 큐비트에 대한 해밀토니안을 H=j=1QαjPjH = \sum_{j=1}^Q \alpha_j P_j라 할 때, 진짜 바닥 상태는 모든 2n2^n개의 기저 상태에 걸쳐 지지될 수 있습니다. SQD는 바닥 상태가 희소한 부분 공간(다항식 크기의 비트 문자열 집합)으로 잘 근사될 수 있는 경우에 가장 효과적입니다.

이 부분 공간을 구성하기 위해, 화학에서 Hartree-Fock(HF) 상태와 같은 입력 상태 ϕ0|\phi_0\rangle에서 시작합니다. 그런 다음 앤사츠라고 불리는 파라미터화된 양자 Circuit인 U(θ)U(\theta)를 적용합니다.

앤사츠를 구성하는 계산 기저 상태와 진짜 바닥 상태를 구성하는 계산 기저 상태의 겹침을 보여주는 다이어그램. 두 영역이 어느 정도 겹치지만 완전히 일치하지 않을 수 있음을 나타냅니다.

이 다이어그램은 좋은 앤사츠의 목표를 설명합니다. 앤사츠는 지지(support, 즉 구성하는 기저 상태의 집합)가 진짜 바닥 상태의 지지와 이상적으로 큰 겹침을 갖는 양자 상태를 준비합니다. 이 Circuit을 통해 앤사츠를 계산 기저 상태로 신속하게 투영할 수 있으며, 이는 이후 고전 대각화에 활용됩니다. 다시 말해, 앤사츠가 바닥 상태 자체일 필요는 없습니다. 동일한 기저 상태를 포함하기만 하면 됩니다. 그러면 투영된 해밀토니안의 고전 대각화가 바닥 상태를 가장 잘 근사하는 기저 상태들의 중첩을 제공합니다.

2단계: 부분 공간 샘플링

앤사츠로 준비된 Circuit에서 샘플링하면 비트 문자열 모음 {bj}j=1L\{b_j\}_{j=1}^L을 얻습니다. 이 비트 문자열들이 선택한 부분 공간의 기저를 정의합니다. 이 단계의 양자 실행 시간은 Circuit의 깊이와 샘플 수에 의해 결정됩니다.

3단계: 고전적으로 투영 및 대각화

샘플링된 비트 문자열을 사용하여 해밀토니안을 그들이 생성하는 부분 공간으로 투영합니다. 각 비트 문자열 쌍 (j,k)(j, k)에 대해 행렬 원소 H~jk=bjHbk\tilde{H}_{jk} = \langle b_j | H | b_k \rangle를 고전적으로 계산합니다. 파울리 연산자는 희소하기 때문에, 이 단계는 물리적 해밀토니안에 대해 고전적으로 효율적입니다. 결과로 얻은 작은 행렬 H~\tilde{H}는 고전 프로세서에서 대각화되어 바닥 상태와 그 에너지를 추정합니다.

4단계: 앤사츠 최적화 (선택 사항)

이 과정은 반복적으로 만들 수 있습니다. 추정된 바닥 상태 에너지를 비용 함수로 취급하여, 경사 하강법 같은 방법으로 Circuit 파라미터(θ\theta)를 최적화해 앤사츠를 개선하고, 이를 통해 다음 반복에서 에너지 근사를 향상시킬 수 있습니다.

SQD의 주요 장점

SQD는 양자 우위를 입증하는 선도적인 후보로 꼽히게 하는 몇 가지 강력한 특징을 제공합니다:

  • 강한 노이즈 강건성: 진짜 바닥 상태가 단 두 개의 비트 문자열에만 지지된다고 가정해 봅시다. 이 비트 문자열들이 샘플링되기만 한다면, 우리 앤사츠와의 겹침이 작더라도 대각화가 적절한 가중치를 부여하고 함께 샘플링된 다른 불필요한 노이즈 비트 문자열들을 효과적으로 무시합니다. 이 고유한 필터링 덕분에 SQD는 특히 노이즈에 강합니다.
  • 고전적 검증 가능성: QPE나 VQA와 달리, SQD는 바닥 상태에 대한 고전적 근사를 산출합니다. 즉, 비트 문자열 목록과 그 가중치에 접근할 수 있는 사람이라면 누구나 고전 컴퓨터에서 직접 에너지 추정을 재계산하고 검증할 수 있습니다.

SQD는 이미 77개 Qubit, 10,570개 Gate 크기의 Circuit으로 N2_2의 바닥 상태 해리 에너지와 [2Fe-2S] 및 [4Fe-4S] 클러스터의 전자 특성을 추정하는 데 사용된 바 있습니다 [2].

이해도 확인

참/거짓: SQD는 화학 시스템에 적용할 수 있다.

정답:

이해도 확인

앤사츠를 구성하는 모든 계산 기저 상태의 집합을 AA라 하고, 시스템의 진짜 바닥 상태를 구성하는 모든 계산 기저 상태의 집합을 GG라 합니다. 다음 중 "좋은" 앤사츠에 해당하는 것은 무엇인가요? 해당하는 것을 모두 고르세요.

(a) AGA \subset G \\ (b) AGA \subseteq G\\ (c) GAG \subset A\\ (d) GAG \subseteq A\\

정답:

(c)와 (d)

SKQD (Sample-based Krylov Quantum Diagonalization)

Sample-based Krylov Quantum Diagonalization (SKQD)은 SQD의 원리를 기반으로 발전한 또 하나의 강력한 양자 샘플 기반 알고리즘입니다. 목표는 동일합니다—대각화에 적합한 부분 공간을 찾는 것—하지만 SKQD는 특히 격자 해밀토니안 같은 문제에서 비트스트링을 생성하는 데 더 체계적인 방법을 사용합니다.

SKQD의 핵심 아이디어는, 좋은 앤사츠를 찾기 위해 매개변수화된 회로를 최적화하는 대신, 시스템 자체의 자연적인 시간 발전—Krylov 부분 공간—에서 생성된 상태들로부터 샘플링함으로써 바닥 상태로 수렴하는 것을 이론적으로 보장할 수 있다는 점입니다. SKQD 알고리즘은 다음 단계로 구성됩니다.

Step 1: 시간 발전을 통한 Krylov 부분 공간 구성

초기 상태 ϕ0|\phi_0\rangle에서 시작합니다. 중요한 점은, 이 초기 상태가 바닥 상태와 "좋은" 겹침을 가질 필요가 없다는 것입니다. 단지 "다항식적으로 크기"가 크거나, 시스템 크기에 대한 다항식으로 표현될 수 있으면 충분합니다. 알고리즘 자체가 상태를 시스템의 바닥 상태에 점점 더 가깝게 이끌어 갑니다. SKQD는 시간 발전 연산자 eiHte^{-iHt}를 서로 다른 시간 길이에 걸쳐 적용합니다. 이를 통해 dd개의 서로 다른 양자 상태 집합이 다음과 같이 정의됩니다.

ϕj=eiδtjHϕ0,for j=0,1,,d1|\phi_j\rangle = e^{-i \,\delta t j H}|\phi_0\rangle, \quad \text{for } j = 0, 1, \dots, d-1 \quad \text{}

이 시간 발전 상태들의 집합이 Krylov 기저를 형성합니다. 이 단계는 해밀토니안의 항 수가 많지 않은 격자 해밀토니안에 특히 효과적입니다. 화학 문제의 경우, 이 시간 발전이 매우 깊은 회로를 초래할 수 있기 때문에 그러한 경우에는 SQD가 권장됩니다.

Step 2: Krylov 기저 상태에서 샘플링

다음으로, 이전 단계에서 준비된 dd개의 서로 다른 상태 (ϕ0,ϕ1,,ϕd1|\phi_0\rangle, |\phi_1\rangle, \dots, |\phi_{d-1}\rangle) 각각에서 비트스트링 샘플을 수집합니다. 이 모든 비트스트링을 모아 부분 공간의 기저를 형성합니다.

Step 3: 고전적 투영 및 대각화

이 단계는 SQD의 단계와 동일합니다. 수집된 비트스트링을 사용하여 전체 해밀토니안을 해당 비트스트링이 생성하는 부분 공간에 투영합니다. 결과로 얻어지는 작은 행렬 H~\tilde{H}를 고전 컴퓨터에서 대각화하여 바닥 상태 에너지를 구합니다.

SKQD의 주요 장점 및 보장

SKQD의 체계적인 접근 방식은 다음과 같은 고유한 이점을 제공합니다.

  • 수렴 가능성 보장: SKQD의 핵심 장점은 특정하고 명확하게 정의된 조건 하에서의 이론적 수렴 보장입니다. 진정한 바닥 상태가 희소하고(다항식 수의 비트스트링으로 잘 근사될 수 있고) 첫 번째 들뜬 상태와의 에너지 간격이 너무 작지 않다면, 이 방법은 효율적으로 동작함이 증명되어 있습니다. 이 조건 하에서 SKQD는 바닥 상태를 구성하는 핵심 비트스트링을 찾고 바닥 상태 에너지를 높은 정밀도로 근사할 수 있음을 보장합니다. 이를 위해서는 다항식 수의 양자 실험과 샷만으로 충분합니다. 이 보장은 양자 위상 추정과 같이 확립된 방법에 준하는 엄밀한 이론적 토대 위에 샘플 기반 접근법을 위치시킵니다.

  • SQD와의 공유 장점: SQD와 마찬가지로, SKQD도 노이즈 강인성을 지닙니다. 다시 말해, 샘플링된 비트스트링 집합 안에 좋은 비트스트링이 모두 포함되어 있기만 하면, 대각화 과정에서 잘못된 비트스트링에는 거의 0에 가까운 가중치가 부여되므로 절차가 노이즈에 강건해집니다. 또한, 해가 고전 HPC에서 생성되기 때문에 그 에너지를 고전적으로 검증할 수 있습니다.

실험에서 SKQD는 최대 70개의 Qubit과 수천 개의 Gate를 사용하여 복잡한 4-불순물 앤더슨 모델의 바닥 상태를 연구하는 데 활용되었으며, DMRG와 같은 최첨단 고전적 방법과 탁월한 일치를 보였습니다.[1]

이해도 점검

SKQD 알고리즘의 어떤 부분이 화학 문제보다 스핀 격자 같은 물리 문제에 더 적합하게 만드나요? 그 이유는 무엇인가요?

정답:

시간 발전은 Trotter 회로를 필요로 하는데, 복잡하고 희소하지 않은 해밀토니안의 경우 회로가 매우 깊어집니다. 스핀 격자 상호작용은 Pauli 행렬에 해당하는 스핀 행렬로 기술됩니다. 따라서 스핀 격자의 해밀토니안은, 특히 최근접 이웃 상호작용의 경우, Pauli 행렬로 더 간결하게 표현되는 경향이 있습니다.

SQD와 SKQD의 이종 컴퓨팅으로서의 역할

모든 것을 종합하면, 샘플 기반 알고리즘은 이종 자원들의 집합 위에서 서로 다른 프로그래밍 모델의 조합으로 표현할 수 있습니다. 예를 들어, 알고리즘을 작업 워크플로로 나타낼 수 있습니다.

A schematic of the workflow specific to sample-based quantum diagonalization. The steps include a variational quantum circuit, using measurements to project the Hamiltonian into a subspace, then using a classical optimizer to update variational parameters in the circuit and repeating.

이 그림은 네 단계로 이루어진 기본 워크플로를 보여줍니다. 먼저 목표 상태와 겹치는 양자 회로를 준비하는 작업이 있고, 이어서 고전 자원만으로 실행되는 Transpiler 작업이 수행됩니다. 다음으로 양자 자원을 필요로 하는 Primitive를 사용해 양자 회로를 실행하는 작업이 있습니다. 마지막으로 후처리 작업이 이루어지며, 이 단계 자체가 여러 노드에서 실행되는 병렬 대각화 알고리즘일 수 있습니다.

또한, 앤사츠를 바꿔가며 이러한 알고리즘을 여러 번 실행하거나, 서로 다른 개체군(population)으로 완전히 병렬로 실행하고 싶을 수도 있습니다.

A schematic of an SQD workload being split among several resources. It shows several processes running sequentially, using the results of one iteration to inform the next, but also performing many such processes in parallel.

위 그림에서 보듯이, 다음과 같은 작업을 수행하면서 여러 워크플로를 동시에 실행할 수 있습니다.

  • 앤사츠의 매개변수나 구조를 변화시켜 가장 효과적인 것을 찾습니다.
  • 지역 최솟값을 피하고 더 강건한 결과를 보장하기 위해 서로 다른 초기 상태나 구성("개체군")에서 시작합니다.

작업 기반 이종성과 워크플로 수준의 병렬성을 결합한 이 다층적 접근 방식이 이러한 알고리즘의 잠재력을 최대한 발휘하는 열쇠입니다.

프로그래밍 실습

이전에 설명한 이종 워크플로를 시연하며 SKQD 알고리즘을 실습해 보겠습니다. 이 과정은 네 가지 별개의 단계로 구분되며, 각 단계마다 해당 Python 스크립트와 작업 제출용 셸 스크립트가 있습니다.

매핑 (mapping.pymapping.sh)

워크플로의 첫 번째 단계는 물리적 문제를 정의하고 이를 양자 Circuit 집합으로 매핑하는 것입니다.

mapping.py는 특정 물리 문제의 매개변수를 정의합니다. 여기서는 7개의 배스 사이트(n_bath = 7)를 가진 Anderson 불순물 모델을 다룹니다. 이 스크립트는 시스템의 해밀토니안을 나타내는 일체(h1e) 및 이체(h2e) 적분을 구성합니다.


...

n_bath = 7 # number of bath sites

...

# One body matrix elements in the "position" basis
h1e = -t * np.diag(np.ones(n_bath), k=1) - t * np.diag(np.ones(n_bath), k=-1)
h1e[impurity_index, impurity_index + 1] = -V
h1e[impurity_index + 1, impurity_index] = -V
h1e[impurity_index, impurity_index] = eps

# Two body matrix elements in the "position" basis
h2e = np.zeros((n_bath + 1, n_bath + 1, n_bath + 1, n_bath + 1))
h2e[impurity_index, impurity_index, impurity_index, impurity_index] = U

...

# The one-body time evolution
free_fermion_evolution = ffsim.qiskit.OrbitalRotationJW(n_modes, Utar)

# The two-body time evolution
def append_diagonal_evolution(dt, U, impurity_qubit, num_orb, q_circuit):
"""Append two-body time evolution to a quantum circuit."""
if U != 0:
q_circuit.append(
CPhaseGate(-dt / 2 * U),
[impurity_qubit, impurity_qubit + num_orb],
)

그런 다음 이 스크립트는 SKQD 알고리즘에 필요한 양자 Circuit을 생성합니다. 초기 상태(initial_state)를 만드는 것으로 시작하여, 서로 다른 단계 수(d = 8)에 대해 시간 발전 연산자를 적용해 다양한 크릴로프 기저 상태 ϕj=(eiHt)jϕ0|\phi_j\rangle = (e^{-iHt})^j |\phi_0\rangle를 생성합니다.


# The reference state
def initial_state(q_circuit, norb, nocc):
"""Prepare an initial state."""
for i in range(nocc):
q_circuit.append(XGate(), [i])
q_circuit.append(XGate(), [norb + i])
rot = XXPlusYYGate(np.pi / 2, -np.pi / 2)

for i in range(3):
for j in range(nocc - i - 1, nocc + i, 2):
q_circuit.append(rot, [j, j + 1])
q_circuit.append(rot, [norb + j, norb + j + 1])
q_circuit.append(rot, [j + 1, j + 2])
q_circuit.append(rot, [norb + j + 1, norb + j + 2])

...

# Generate the initial state
qubits = QuantumRegister(2 * n_modes, name="q")
init_state = QuantumCircuit(qubits)
initial_state(init_state, n_modes, n_modes // 2)

...

d = 8 # Number of Krylov basis states
circuits = []
for i in range(d):
circ = init_state.copy()
circuits.append(circ)
for _ in range(i):
append_diagonal_evolution(dt, U, impurity_index, n_modes, circ)
circ.append(free_fermion_evolution, qubits)
append_diagonal_evolution(dt, U, impurity_index, n_modes, circ)
circ.measure_all()

print(circuits[0].draw(scale=0.4, fold=-1))

이 스크립트는 측정이 추가된 8개의 생성된 Circuit 목록을 circuits.qpy 파일에 저장합니다.

mapping.shmapping.py 작업을 제출하는 데 사용되는 Slurm 배치 스크립트입니다. 이 단계는 고전적 계산이므로 표준 CPU 파티션(--partition=normal)에서 리소스를 요청합니다.

#!/bin/bash
#
#SBATCH --job-name=sqd-mapping
#SBATCH --output=sqd-mapping.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal

srun python /data/ch4/sqd/mapping.py

최적화 (optimization.pyoptimization.sh)

Circuit이 준비되면, 대상 양자 하드웨어에서 효율적으로 실행될 수 있도록 최적화하고 컴파일해야 합니다.

optimization.py는 먼저 매핑 단계에서 생성된 circuits.qpy 파일을 불러오고, 양자 리소스 매니저인 QRMI()를 통해 양자 리소스 정보를 가져옵니다. 그런 다음 Qiskit의 generate_preset_pass_manager를 높은 최적화 수준(optimization_level=3)으로 사용하여 추상적인 논리 Circuit을 ISA(Instruction Set Architecture) Circuit으로 변환합니다. 이 과정에서 하드웨어의 네이티브 Gate를 사용하도록 Circuit을 재작성하고, 깊이를 줄이며 오류를 최소화하는 방향으로 최적화합니다.


...
qrmi = QRMI()
resources = qrmi.resources()
quantum_resource = resources[0]
target = quantum_resource.target

pass_manager = generate_preset_pass_manager(
optimization_level=3,
target=target
)
isa_circuits = pass_manager.run(circuits)

트랜스파일된 하드웨어용 Circuit은 새 파일 isa_circuits.qpy에 저장됩니다.

매핑 스크립트와 마찬가지로 이 Slurm 작업도 고전적 CPU 파티션(--partition=normal)에서 실행됩니다. Transpiler 작업은 고전적 작업이기 때문입니다.

#!/bin/bash
#
#SBATCH --job-name=sqd-mapping
#SBATCH --output=sqd-mapping.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal

srun python /data/ch4/sqd/mapping.py

실행 (execution.pyexecution.sh)

이 단계는 양자 컴퓨터가 사용되는 유일한 단계입니다. 여기서는 최적화된 Circuit을 실행하고 측정 샘플을 수집합니다.

execution.py는 최적화된 isa_circuits.qpy 파일을 불러온 다음, 양자 리소스에 연결된 SamplerV2 Primitive를 초기화합니다. 그런 다음 sampler.run()을 호출하여 지정된 샷 수(shots=500)로 QPU에서 Circuit을 실행합니다.


...

qrmi = QRMI()
resources = qrmi.resources()
quantum_resource = resources[0]

# Sample from the circuits
noisy_sampler = Sampler(quantum_resource)
job = noisy_sampler.run(isa_circuits, shots=500)

실행이 끝나면 모든 Circuit에서 측정된 결과(비트스트링)가 수집 및 합산되어, 그 카운트가 counts.json 파일에 저장됩니다.

Slurm 스크립트 execution.sh는 이 단계에서 다른 스크립트들과 다릅니다. 양자 파티션(--partition=quantum)에서 실행하도록 요청하며, QPU 1개(--gres=qpu:1)를 명시적으로 요청합니다.

#!/bin/bash
#
#SBATCH --job-name=sqd-execution
#SBATCH --output=sqd-execution.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=quantum
#SBATCH --gres=qpu:1

srun python /data/ch4/sqd/execution.py

후처리 (postprocessing.pypostprocessing.sh)

마지막 단계에서는 다시 고전적 컴퓨터로 돌아와 양자 실험의 데이터를 분석하고 최종 결과인 대상 시스템의 기저 상태 에너지를 계산합니다.

postprocessing.py 프로그램은 먼저 측정 결과가 담긴 counts.json 파일을 읽습니다. 그런 다음 Anderson 모델의 해밀토니안을 재구성합니다(mapping.py와 동일한 매개변수 사용). 이후 측정된 비트스트링과 해밀토니안 정의를 diagonalize_fermionic_hamiltonian 함수에 전달합니다. 이 함수는 SKQD의 핵심 로직을 수행합니다. 즉, 비트스트링을 사용해 투영된 해밀토니안 H~\tilde{H}를 구성하고 이를 대각화하여 기저 상태 에너지를 구합니다.


...

def callback(results: list[SCIResult]):
result_history.append(results)
iteration = len(result_history)
print(f"Iteration {iteration}")
for i, result in enumerate(results):
print(f"\tSubsample {i}")
print(f"\t\tEnergy: {result.energy}")
print(f"\t\tSubspace dimension: {np.prod(result.sci_state.amplitudes.shape)}")

rng = np.random.default_rng(24)
result = diagonalize_fermionic_hamiltonian(
h1e,
h2e,
bit_array,
samples_per_batch=300,
norb=n_modes,
nelec=nelec,
num_batches=3,
max_iterations=10,
symmetrize_spin=True,
callback=callback,
seed=rng,
)

마지막으로 계산된 SKQD 에너지를 출력하고, 이 문제의 알려진 정확한 에너지와 비교하여 최종 절대 오차를 보여줍니다.

최종 작업 스크립트는 모든 분석이 고전적으로 수행되므로 고전적 파티션(--partition=normal)에서 실행됩니다. 부분 공간이 큰 경우 이 단계에서 더 많은 고전적 HPC 리소스가 필요할 수 있습니다.

#!/bin/bash
#
#SBATCH --job-name=sqd-postprocessing
#SBATCH --output=sqd-postprocessing.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal

srun python /data/ch4/sqd/postprocessing.py

요약

이것으로 마무리입니다! 복잡한 하이브리드 프로그램을 관리하는 데 도움이 되는 여러 개념과 예시를 살펴보았습니다. 물론 이것은 양자와 고전적 HPC 리소스의 조합으로 할 수 있는 것들의 시작에 불과합니다.

더 많은 사용 사례와 알고리즘을 탐구하려면 IBM Quantum Platform의 문서튜토리얼을 참고하세요. 또한 다음 레슨에서 공유되는 리소스도 꼭 방문해 보세요. 계산 과학자와 데이터 센터 관리자 모두를 위한 알고리즘 및 소프트웨어에 관한 더 많은 정보를 얻을 수 있습니다.

참고 문헌

[1] Quantum-Centric Algorithm for Sample-Based Krylov Diagonalization. https://arxiv.org/abs/2501.09702

[2] Chemistry beyond the scale of exact diagonalization on a quantum-centric supercomputer. https://www.science.org/doi/10.1126/sciadv.adu9991