Skip to main content
IBM Quantum Platform

SQD 및 SKQD

이 장에서는 양자 컴퓨터와 고전 컴퓨터가 어떻게 협력하여 과학에서 가장 중요한 과제 중 하나인 분자와 물질의 에너지를 정확히 추정하는지 살펴보겠습니다.

이스칸다르 시트디코프는 다음 동영상에서 알고리즘적 접근법을 설명합니다.


해밀턴

이 문제의 핵심은 수학적 연산자인 해밀토니안으로, 이는 시스템의 총 에너지를 나타냅니다. 계산적 목적으로, 이 해밀토니안을 큰 행렬로 생각할 수 있다. 우리가 찾고 있는 해—특히 시스템의 기저 상태—는 이 행렬의 가장 낮은 고유값들이다. 그러나 문제는 실제 문제에 적용할 때 이 해밀토니안 행렬이 매우 크다는 점이다. 시스템 규모에 따라 기하급수적으로 증가하여, 가장 강력한 슈퍼컴퓨터조차도 저장하거나 직접 해결하기에는 너무 커지게 됩니다( 2n2^n, 여기서 nn 는 큐비트 수).

H=(H0,0H0,1⋯H0,N−1H1,0H1,1⋯H1,N−1⋮⋮⋱⋮HN−1,0HN−1,1⋯HN−1,N−1)(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)

이를 해결하기 위해 우리는 부분공간법이라는 강력한 전략을 사용합니다. 전체 행렬을 다루기보다는, 우리가 찾고 있는 저에너지 해에 관한 가장 중요한 정보가 포함되어 있다고 판단되는 작고 관련성 높은 부분집합, 즉 "부분공간"을 지능적으로 선택합니다.

(⋱⋮⋯Hi,j⋯⋮⋱)Full Hamiltonian→ProjectH~Projected Hamiltonian=(⟨b1∣H∣b1⟩⋯⟨b1∣H∣bL⟩⋮⋱⋮⟨bL∣H∣b1⟩⋯⟨bL∣H∣bL⟩)→Diagonalize(E00⋱0EL−1)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} 을 생성합니다. 이 행렬의 각 요소는 ⟨bi∣H∣bj⟩\langle b_i | H | b_j \rangle 에서와 같이 부분공간 기저 상태와 원래 해밀토니안을 이용해 계산됩니다. 이 작은 행렬은 고전 컴퓨터에서 쉽게 대각화할 수 있으며, 그 결과로 얻어진 고유값이 우리의 추정 에너지입니다.

예상하셨겠지만, 이 접근법 전체의 성공은 "좋은" 부분공간을 선택하는 데 크게 좌우됩니다. 우리의 부분공간이 진정한 기저 상태를 정확히 표현하지 못한다면, 우리의 최종 답은 틀릴 것이다. 여기서 양자 컴퓨터가 등장합니다: 양자 컴퓨터는 이러한 중요한 부분 공간을 식별하도록 설계된 복잡한 양자 상태를 준비하고 샘플링할 수 있게 해줍니다. 복잡한 화학 구조나 결합 부위 같은 정말 거대한 문제의 경우, 투영된 행렬조차 대각화하기 어려울 수 있다. 따라서 이러한 문제는 양자 컴퓨팅과 고전 컴퓨팅 자원의 장점을 모두 활용하기에 이상적으로 적합하다.

다음 섹션에서는 양자 역학을 활용하여 이러한 부분공간을 찾고 구성하는 두 가지 고급 알고리즘인 SQD와 SKQD를 살펴보겠습니다. 더 깊이 알아보려면, IBM Quantum 에서 이러한 주제를 상세히 다루는 정규 과정이 마련되어 있습니다. 본 강좌의 목적상, 설명은 높은 수준에서 진행하겠습니다.


샘플 기반 양자 대각화

샘플 기반 양자 대각화(SQD)는 부분공간 방법을 양자 방식으로 구현하는 강력한 변분 알고리즘이다. 양자 컴퓨터를 사용하여 시험 상태를 준비하고 비트열을 샘플링함으로써, 고전적 대각화 연산을 위한 부분공간을 정의하는 데 필요한 하다마르 테스트 같은 비용이 많이 들고 복잡한 절차를 피한다.

샘플 기반 양자 대각화 작업에 특화된 워크플로우의 개략도. 이 과정에는 변분 양자 회로를 포함하며, 측정을 통해 해밀토니안을 부분공간으로 투영한 다음, 고전적 최적화기를 사용하여 회로 내의 변분 매개변수를 업데이트하고, 이 과정을 반복하는 방식으로 이루어집니다.

SQD 알고리즘은 다음과 같은 단계로 나눌 수 있습니다:

1단계: 안쯔(Ansatz) 상태 준비

H=∑j=1QαjPjH = \sum_{j=1}^Q \alpha_j P_j 를 nn 큐비트에 대한 해밀토니안이라 하자. 진정한 기저 상태가 모든 다항식 크기 비트열 집합( 2n2^n ) 기저 상태에 기반할 수 있지만, SQD는 기저 상태가 스파스 부분공간(다항식 크기의 비트열 집합)으로 잘 근사될 수 있는 경우에 가장 효과적이다.

이 부분공간을 구성하기 위해, 우리는 화학에서의 하트리-포크(HF) 상태와 같은 입력 상태 ∣ϕ0⟩|\phi_0\rangle 로 시작한다. 그런 다음 우리는 매개변수화된 양자 회로인 U(θ)U(\theta) 를 적용하는데, 이는 가정(ansatz)으로 알려져 있다.

가설 상태를 구성하는 계산 기저 상태와 실제 기저 상태를 구성하는 계산 기저 상태 간의 중첩을 보여주는 도식. 구체적으로 말하면, 이 이미지에서 볼 수 있듯이 두 영역은 어느 정도 겹치겠지만, 완벽하게 일치하지는 않을 수도 있습니다.

이 도표는 좋은 안자츠의 목표를 보여줍니다. 이 가정법은 양자 상태를 준비하는데, 그 지지 영역(이 상태를 구성하는 기저 상태들의 집합)은 이상적으로 진정한 기저 상태의 지지 영역과 큰 중첩을 가져야 한다. 이 회로는 안쯔를 계산 기반 상태에 신속하게 투영할 수 있게 해주며, 이는 이후 고전적 대각화 과정에서 추가로 활용될 것입니다. 다시 말해: 우리는 기저 상태인 가정을 추측할 필요가 없다; 단지 동일한 기저 상태들을 포함하기만 하면 된다. 그러면 투영된 해밀토니안을 고전적 대각화하면 기저 상태들의 중첩을 얻게 되며, 이는 기저 상태를 가장 잘 근사화한다.

2단계: 부분공간 샘플링

가정식(ansatz)으로 준비된 회로에서 샘플링함으로써, 우리는 비트열의 집합을 얻는다: {bj}j=1L\{b_j\}_{j=1}^L. 이 비트열들은 우리가 선택한 부분 공간의 기저를 정의한다. 이 단계의 양자 런타임은 회로의 깊이와 샘플링 횟수에 의해 결정됩니다.

3단계: 고전적인 방법으로 투영하고 대각화하기

샘플링된 비트열을 사용하여, 우리는 해밀토니안을 이들이 생성하는 부분공간으로 투영한다. 각 비트열 쌍 (j,k)(j, k) 에 대해, 우리는 고전적으로 행렬 원소 H~jk=⟨bj∣H∣bk⟩\tilde{H}_{jk} = \langle b_j | H | b_k \rangle 을 계산한다. 파울리 연산자는 스파스(sparse)이므로, 이 단계는 물리적 해밀토니언에 대해 고전적으로 효율적이다. 이렇게 생성된 작은 행렬 H~\tilde{H} 은 고전 프로세서에서 대각화되어 기저 상태와 그 에너지를 추정한다.

4단계: 가정식 최적화 (선택 사항)

이 과정은 반복적으로 수행될 수 있다. 추정된 기저 상태 에너지를 비용 함수로 취급함으로써, 우리는 기울기 하강법과 같은 방법을 사용하여 회로 매개변수( θ\theta )를 최적화할 수 있으며, 이를 통해 가정을 개선하고 결과적으로 다음 반복 단계에서 에너지 근사값을 향상시킬 수 있다.

SQD의 주요 장점

SQD는 양자 우위를 입증하는 데 선도적인 후보가 될 수 있는 여러 강력한 기능을 제공합니다:

  • 강한 잡음 내성: 진정한 지상 상태가 단 두 개의 비트열에만 존재한다고 가정하자. 이들 샘플이 존재한다면, 설령 우리의 가정(ansatz)과의 중첩이 작더라도, 대각화 과정은 그들에게 적절한 가중치를 할당할 것이며, 샘플링되었을 수도 있는 다른 모든 불필요한 잡음 비트열들을 효과적으로 무시할 것이다. 이러한 내재된 필터링 기능 덕분에 SQD는 특히 노이즈에 강합니다.
  • 고전적 검증 가능성: QPE나 VQA와 달리 SQD는 기저 상태에 대한 고전적 근사값을 산출한다. 이는 비트열 목록과 그 가중치에 접근할 수 있는 사람이라면 누구나 고전 컴퓨터에서 직접 에너지 추정을 재계산하고 검증할 수 있음을 의미합니다.

SQD는 이미 N 원자 분자( 2_2 )의 기저 상태 이탈 에너지와 및 [4Fe-4S] [2Fe-2S] 클러스터의 전자적 특성을 추정하는 데 활용되었으며 [2], 최대 77 큐비트와 10,570개의 게이트로 구성된 회로가 사용되었다.

이해도 점검

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

  • 예

이해도 점검

당신의 가설(ansatz)을 구성하는 모든 계산 기저 상태의 집합을 A라고 부르자. 시스템의 진정한 기저 상태를 구성하는 모든 계산 기저 상태의 집합을 G라고 하자. 다음 중 ‘좋은’ 가설에 해당하는 것은 무엇인가? 해당되는 모든 사항을 선택하십시오.

(a) A⊂GA \subset G

(b) A⊆GA \subseteq G

(c) G⊂AG \subset A

(d) G⊆AG \subseteq A

  • (c) 및 (d)


SKQD (샘플 기반 크릴로프 양자 대각화)

샘플 기반 크릴로프 양자 대각화(SKQD)는 SQD의 원리를 기반으로 구축된 또 다른 강력한 양자 샘플 기반 알고리즘이다. 목표는 동일하지만—대각화하기 위한 적절한 부분공간을 찾는 것—SKQD는 특히 격자 해밀토니언과 같은 문제에 대해 비트열을 생성하는 데 더 구조화된 방법을 사용합니다.

SKQD의 핵심 아이디어는 매개변수화된 회로를 최적화하여 좋은 근사해(ansatz)를 찾는 대신, 시스템 자체의 자연스러운 시간 진화에 의해 생성된 상태 집합—크릴로프 부분공간(Krylov subspace)—에서 샘플링함으로써 증명 가능하게 기저 상태(ground state)로 수렴할 수 있다는 점이다. SKQD 알고리즘은 다음과 같은 단계로 나눌 수 있습니다:

단계 1: 시간 진화를 통한 크릴로프 부분공간 구성

이 과정은 초기 상태 ∣ϕ0⟩|\phi_0\rangle 에서 시작됩니다. 중요한 점은, 이 초기 상태가 기저 상태와 “양호한” 중첩을 가질 필요는 없다는 것입니다. 단, “다항식적으로 큰” 수준이면 충분하며, 시스템 규모에 대한 다항식으로 표현될 수 있으면 됩니다. 그러면 알고리즘 자체가 상태를 시스템의 기저 상태에 점점 더 가깝게 이끌어 갈 것입니다. SKQD는 시간 진화 연산자 e−iHte^{-iHt} 를 서로 다른 시간 동안 적용합니다. 이를 통해 다음과 같이 정의되는 dd 개의 서로 다른 양자 상태 집합이 생성됩니다:

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

이 시간에 따라 진화한 상태들의 집합은 크릴로프 기저를 형성한다. 이 단계는 해밀토니안의 항 수가 많지 않은 격자 해밀토니안에 특히 효과적이다. 화학 문제의 경우, 이러한 시간적 변화는 매우 복잡한 회로를 초래할 수 있으므로, 해당 사례에는 SQD가 종종 권장됩니다.

2단계: 크릴로프 기저 상태에서 샘플링

다음으로, 이전 단계에서 준비된 dd 서로 다른 상태들( ∣ϕ0⟩,∣ϕ1⟩,…,∣ϕd−1⟩|\phi_0\rangle, |\phi_1\rangle, \dots, |\phi_{d-1}\rangle ) 각각으로부터 비트열 샘플을 수집합니다. 이러한 모든 비트열은 하위 공간의 기초를 형성하기 위해 함께 풀링됩니다.

3단계: 고전적인 방법으로 투영하고 대각화하기

이 단계는 SQD의 단계와 동일합니다. 수집된 비트열은 전체 해밀토니안을 이들이 생성하는 부분공간으로 투영하는 데 사용된다. 이렇게 생성된 작은 행렬, H~\tilde{H} 는 고전 컴퓨터에서 대각화되어 기저 상태 에너지를 구한다.

SKQD의 주요 장점 및 보증 사항

SKQD의 체계적인 접근 방식은 다음과 같은 독보적인 이점을 제공합니다:

  • 증명 가능한 수렴성: SKQD의 핵심 장점은 특정하고 명확히 정의된 조건 하에서 수렴을 이론적으로 보장한다는 점입니다. 진정한 기저 상태가 스파스(비트열의 다항식 개수로 잘 근사될 수 있음)이고 첫 번째 여기 상태와의 에너지 갭이 너무 작지 않다면, 이 방법이 효율적으로 작동함이 입증되었다. 이러한 조건 하에서 SKQD는 기저 상태를 구성하는 핵심 비트스트링을 찾아내고 기저 상태 에너지를 높은 정확도로 근사할 수 있음을 보장합니다. 이는 단지 다항식 개수의 양자 실험과 샷만을 필요로 한다. 이 보증은 샘플 기반 접근법을 양자 위상 추정과 같은 확립된 방법과 유사한 엄격한 이론적 토대 위에 올려놓는다.

  • SQD와의 공통점: SQD와 마찬가지로 SKQD 역시 잡음 강건성을 지닙니다. 다시 말해, 샘플링된 비트열 집합에 속하는 모든 올바른 비트열을 보유하고 있는 한, 대각화 기법은 잘못된 비트열에 거의 무게를 부여하지 않아 이 절차가 잡음에 대해 강건하게 만든다. 또한, 해가 고전적 HPC로부터 생성되므로 해의 에너지는 고전적으로 검증 가능하다.

실험에서 SKQD는 최대 70큐비트와 수천 개의 게이트를 사용하여 복잡한 4불순물 앤더슨 모델의 기저 상태를 연구하는 데 활용되었으며, DMRG와 같은 최첨단 고전적 방법과 탁월한 일치를 달성하였다. [1]

이해도 점검

SKQD 알고리즘의 어떤 부분이 화학 문제보다 스핀 격자와 같은 물리적 문제에 더 적합하게 만드는가? 왜?

  • 시간 진화에는 트로터 회로가 필요하며, 복잡하고 스파스가 아닌 해밀토니언의 경우 이 회로가 매우 깊어진다. 스핀 격자 상호작용은 파울리 행렬과 동등한 스핀 행렬에 의해 지배된다. 따라서 스핀 격자에 대한 해밀토니안은 특히 근접 상호작용을 갖는 경우 파울리 행렬로 더 간결하게 표현되는 경향이 있다.


SQD 및 SKQD를 이종 컴퓨팅으로

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

샘플 기반 양자 대각화 작업에 특화된 워크플로우의 개략도. 이 과정에는 변분 양자 회로를 포함하며, 측정을 통해 해밀토니안을 부분공간으로 투영한 다음, 고전적 최적화기를 사용하여 회로 내의 변분 매개변수를 업데이트하고, 이 과정을 반복하는 방식으로 이루어집니다.

이 그림은 기본적인 4단계 워크플로를 보여줍니다. 처음에는 목표 상태와 중첩되는 양자 회로 준비 작업을 수행한 후, 클래식 자원으로만 실행 가능한 트랜스파일레이션 작업을 수행하게 됩니다. 다음은 양자 회로를 실행하기 위해 기본 연산자를 사용하는 작업으로, 양자 자원이 필요합니다. 마지막으로, 후처리 작업이 있습니다. 이 작업 자체는 여러 노드에서 실행되는 병렬 대각화 알고리즘일 수 있습니다.

또한, 가설을 변경하면서 이러한 알고리즘 중 하나를 여러 번 실행하거나, 서로 다른 개체군으로 완전히 병렬 처리할 수도 있습니다.

SQD 워크로드가 여러 리소스에 분산되는 방식의 개략도. 이 그림은 여러 프로세스가 순차적으로 실행되며, 한 반복의 결과를 다음 반복에 반영하는 동시에, 이러한 프로세스들을 병렬로 다수 수행하고 있는 모습을 보여줍니다.

위에서 설명한 바와 같이, 다음과 같은 작업을 수행하면서 여러 워크플로를 동시에 실행할 수 있습니다:

  • 가장 효과적인 것을 찾기 위해 가설의 매개변수나 구조를 변화시키는 것.
  • 다양한 초기 상태 또는 구성("개체군")으로 시작하여 국소적 최소값을 피하고 보다 견고한 결과를 보장합니다.

작업 기반 이질성과 워크플로 수준 병렬성을 결합한 이 다층적 접근 방식은 해당 알고리즘의 잠재력을 최대한 발휘하는 핵심 요소이다.


프로그래밍 연습

앞서 설명한 이종 워크플로를 시연하며 SKQD 알고리즘을 연습해 보겠습니다. 이 프로세스는 네 가지 별개의 단계로 나뉘며, 각 단계마다 고유한 Python 스크립트와 작업 제출을 위한 대응 셸 스크립트가 있습니다.

매핑 (mapping.py 및 mapping.sh)

우리 작업 흐름의 첫 번째 단계는 물리적 문제를 정의하고 이를 일련의 양자 회로로 매핑하는 것입니다.

는 mapping.py 특정 물리 문제의 매개변수를 정의한다—이 경우 일곱 개의 욕조 사이트를 가진 앤더슨 불순물 모델(n_bath = 7)이다. 이는 시스템의 해밀토니안을 나타내는 일체(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 알고리즘에 필요한 양자 회로를 생성합니다. 초기 상태(initial_state)를 생성한 후, 다양한 단계 수(d = 8)에 대해 시간 진화 연산자를 적용하여 서로 다른 크릴로프 기저 상태 ∣ϕj⟩=(e−iHt)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개의 회로 목록(각각 측정값이 첨부됨)을. circuits.qpy라는 이름의 파일에 저장합니다.

이 mapping.sh 스크립트는 Slurm 배치 스크립트로, 작업을 mapping.py 제출하는 데 사용됩니다. 이것은 클래식 컴퓨테이션이므로 표준 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.py 및 optimization.sh)

회로를 확보한 후에는 대상 양자 하드웨어에서 효율적으로 실행되도록 최적화하고 컴파일해야 합니다.

이 스크립트는 매핑 단계에서 생성된 파일을 circuits.qpy optimization.py먼저 로드하고, 양자 리소스 관리자(QRM)를 QRMI()통해 양자 리소스 정보를 가져옵니다. 그런 다음 Qiskit의 높은 최적화 generate_preset_pass_manager 수준(optimization_level=3)을 사용하여 추상적이고 논리적인 회로를 명령어 집합 아키텍처(ISA) 회로로 변환합니다. 이 과정은 하드웨어의 기본 게이트를 사용하여 회로를 재작성하고, 깊이를 줄이고 오류를 최소화하도록 최적화합니다.


...
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)

컴파일되어 하드웨어 실행 가능한 회로가 새 파일( isa_circuits.qpy.

매핑 스크립트와 마찬가지로, 이 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

실행 (execution.py 그리고 execution.sh)

이 단계에서만 양자 컴퓨터가 사용됩니다. 여기서 우리는 최적화된 회로를 실행하고 측정 샘플을 수집합니다.

최적화된 isa_circuits.qpy 파일을 로드한 execution.py 후, 양자 리소스에 연결된 기본 객체를 SamplerV2 초기화합니다. 그런 다음 지정된 샷 수(shots=500) 동안 QPU에서 회로를 실행하도록 sampler.run() 호출합니다.


...

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)

실행이 끝난 후, 모든 회로에서 측정된 결과(비트열)를 수집하여 결합하고, 그 개수를 파일에 counts.json 저장한다.

이 단계에서 Slurm 스크립트는 다른 execution.sh 것들과 다릅니다. 양자 파티션(--partition=quantum)에서 실행되도록 요청하며, 특히 하나의 QPU(--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.py 및 postprocessing.sh)

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

프로그램은 postprocessing.py 먼저 측정 결과가 포함된 파일을 counts.json 읽습니다. 그런 다음 앤더슨 모델의 해밀토니안을 재구성한다(와 동일한 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]. 샘플 기반 크릴로프 대각화 알고리즘을 위한 양자 중심 알고리즘. https://arxiv.org/abs/2501.09702

[2] 양자 중심 슈퍼컴퓨터 상에서 정확한 대각화 범위를 넘어선 화학. https://www.science.org/doi/10.1126/sciadv.adu9991

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.