양자컴퓨터에서 코딩이란 무엇인가? (IBM사례)
양자 컴퓨터에 대해서 여러가지 이야기를 해왔지만 실제 코딩은 어떤 모습일까? 나와있기는 한 것일까?
물론 아직 성숙되지는 않았으나 전편 글들에서 밝혔듯이 일반 컴퓨터의 코딩이 결국에는 논리 게이트(공대 학부생때 공부하던 그 AND, OR 회로)로 환원되듯이 양자 컴퓨터도 맨 처음의 시작은 이 게이트(Gate)들의 코딩이다. 아마 나중에는 library들이 나올테지만, 지금 여기서의 확인은 Gate들의 조합 수준이다. 어떻게 보면 가장 직관적이기도 하다.
(이것으로 쇼어 알고리즘이나 그로버 알고리즘을 직접 구현해야 한다.)
그러면 IBM이 양자 컴퓨터 API/SDK를 제공하고 있는 것(2017년에 공개)을 살펴보자. 아래가 그 개괄하는 URL이다. 전체적인 모습만 간단히 소개해보자.
https://developer.ibm.com/dwblog/2017/quantum-computing-api-sdk-david-lubensky/
아래 커뮤니티에 들어가서 가입하면 실제로 문서를 보고(Gates Glossary), 그래픽 환경의 회로 구성도 하면서(Circuit Composer), 최근 많이 활용되는 웹기반 python실행 환경인 Jupyter Notebook기반으로 예제 코딩(Qiskit Notebook)을 실행해볼 수 있다.
https://quantumexperience.ng.bluemix.net/qstage/#/community
차례차례 스크린샷으로 설명해보자.
이곳에 가입 후 로긴해서보면 첫 화면에서는 오른쪽에 실제 on-line된 양자컴퓨터의 목록이 뜬다. 이것저것 실제 작업이 할당되어 테스트되고 있음을 볼 수 있다. 15 qubit짜리도 보인다.
왼쪽의 세부메뉴나 링크(Circuit Composer의 링크를 통해서도 들어갈 수 있다)를 통해 Gate Glossary 문서를 살펴보자. 양자 컴퓨팅의 연산 게이트는 AND, OR, NOT 같은 것들이 아니라 H, CX, Id, U1, U2, U3, 같은 것들이 존재한다(양자 상태 변환이 단순 bit연산보다는 더 다양하다). 이것들은 양자 상태를 반전하거나 이동하는 등 다양한 것들이겠다. 스크린샷을 한번 보자.
오른쪽에는 Gate의 리스크가 나오고 왼쪽에는 각 게이트별 설명이 나온다. H Gate 는 상태를 절반정도 반전시켜주는(90도?) 역할을 한다. CX Gate는 아예 반전을 시킨다.
이런 게이트 들을 사용해 Circuit Composer에서는 GUI로 회로를 구성해서 실행해볼 수 있다. 간단하게 상태만 바꿔주는 엉터리 게이트로 회로를 구성해서(Gate를 끌어당겨 하단의 qubit들의 경로에 놓아두며 된다. 그리고 측정값을 얻기 위해 qubit 3개의 값을 c5로 내려놓는다.) Save한 후 상단 오른쪽의 Run을 눌러보자.
그러면 화면 맨 하단에 작업이 할당되었다는 메시지를 볼 수 있고 수초 이후에 Results 칸 아래에 결과가 나온다. 각기 결과를 눌러보면 아래의 화면과 같이 나온다. 이 실행 결과는 15 qubit짜리 양자컴퓨터가 할당되어 1024번을 수행하고 난 후 각 qubit상태별 조합의 빈도수(1024번중 각 케이스가 얼마인지의 비율 형태로)를 보여준다. 해당 State 케이스 숫자(00000~00111)의 맨 오른쪽이 0번 qubit이므로(역순으로 배치된다) 00000, 00001 즉 000과 001이 거의 절반씩 나왔다. 처음의 q[0]의 상태가 50%쯤 반전되었고, 나머지 q[1], q[2]는 사실 큰 변동이 없으니 맞는 결과다. (00000형태로 qubit이 5개인 것으로 나왔는데 뒤 3가지 qubit만 본 것이다. qubit 3개만 할당했는데 왜 5개로 배열되었는지는 잘 모르겠다. 여하튼 무시하면 결과는 맞다.)
그 다음으로는 실제 코딩 부분을 들어가보자. 제공되는 Getting Started샘플을 통해 위 GUI를 통한 회로 구성을 실제 Python Code로 비슷하게 진행할 수 있다.
큐빗을 3개 할당하고 각 큐빗에 역시 게이트를 코딩으로 선언해주고 지속 진행한다(아래 사진, jupyter notebook이라는 웹기반의 python code를 실행하면서 살펴볼 수 있는 환경이다.)
이후 중간과정은 생략해보고(진행 과정에서 실제 양자 컴퓨터를 할당하지 않고, 시뮬레이션 값 등을 얻을 수 있게 되어 있다), 이렇게 구성한 회로를 실제 Quantum Computer Device(Device)를 할당하여 결과를 얻자 (여기서는 시뮬레이터(Simulator) 값과 같이 나오도록 코드가 구성되어 있는 점에는 유의하자)
결과값은 상기 회로를 여러번 수행하여 각 qubit별 관측된 조합의 확률이다. 대략 디폴트가 1024번을 수행하도록 되어 있는데, qubit 3개가 000인 경우가 40.6%였고 111인 경우가 39.4%였다는 이야기가 된다. 나머지는 각기 낮은 빈도수로 나타났다.
결국 IBM이 제공하는 것은 Quantum Gate들을 배열하고 실제 초기상태에서 확률붕괴하여 관측된 값의 실제를 얻을 수 있게 해주는 셈이다.
생각보다 직관적이나. 이를 실제 응용하려면 앞서 밝힌 쇼어나 그로버의 알고리즘을 이해하고 조금더 복잡한 구성을 해야겠다.