Qiskit을 이용해 양자 컴퓨터 경험하기
양자의 'ㅇ'자도 모르는 개발자가 취미삼아 쓰는 글이며 미래에 존재할 취약점이 없는 양자 암호화에 흥미가 끌려 적어보는 글이다. 양자역학 전문가들은 안봐도 된다.
양자역학은 기술적으로 난해하고 비전문가가 다루기에는 너무 기술적인 내용이기 때문에 최대한 뺐다.
양자, 입자, 원자, 불안정성 원리 등등에 대한 개념은 알아서 얻어오시길
양자 컴퓨터
양자 컴퓨터는 양자 얽힘 원리를 이용할 수 있는 컴퓨터를 말한다.
양자 얽힘은 입자들이 서로 강하게 연결되어 있는 현상으로 하나의 입자의 상태가 다른 입자의 상태에 의해 결정되는 것을 말한다. 이 상태는 입자들이 멀리 떨어져 있어도 적용된다.
현재 우리가 쓰고 있는 컴퓨터의 보안이나 암호화 문제는 취약점이 어느정도 조금씩은 존재한다.
근데 양자 얽힘을 이용하면 이론상 취약점이 없는 암호화 방식이 구현이 가능하다.
사실 직접 암호화를 만들어서 서버에 띄워보는게 목적이었지만 아직 양자 컴퓨터의 발전이 그만큼 되지 않았기 때문에 양자 얽힘 현상을 코드로 경험해보는 정도만 해봤다.
큐비트
큐비트는 양자 얽힘 원리를 적용할 수 있는 비트를 말한다.
컴퓨터의 일반 비트와는 다르게 0과 1을 동시에 가질 수 있다.
얽힌 큐비트 하나를 파악하면 다른 큐비트도 파악되는 성질을 가진다.
IBM 양자 컴퓨터 이용하기
우선 양자 컴퓨터를 이용하려면 Qiskit을 이용해야한다.
Qiskit은 IBM의 실제 양자 컴퓨터를 이용할 수 있는 도구로 제공된다.
실제 양자 컴퓨터를 이용하지 않더라도 로컬 환경에서 양자 회로를 시뮬레이션하고 테스트 할 수 있다.(주로 이쪽으로 많이 쓰이는 듯 하다)
Qiskit을 이용하려면 Anaconda부터 설치해야한다.
Anaconda를 설치하기 전 Qiskit과 Jupyter Notebook도 설치해야 하기 때문에 한번 알아보자.
Qiskit (키스킷)
- Qiskit의 중심 목표는 기술 수준이나 관심 분야에 상관 없이 누구나 쉽게 양자 컴퓨터를 사용할 수 있게 하는 것이다.
- Qiskit은 아나콘다의 Jupyter Notebook라는 파이썬 웹 브라우저 실행 소프트웨어에 최적화 되어있다.
Jupyter Notebook (주피터 노트북)
Jupyter Notebook은 데이터 분석 및 과학적 프로그래밍과 코드, 그래프 등을 포함한 문서를 작성하고 실행할 수 있는 웹 기반의 환경이다. 여기에서 Qiskit을 통해 양자 컴퓨터 시뮬레이션을 할 수 있다.
아래는 웹 브라우저에서 띄워본 초기 화면이다.
Anaconda (아나콘다)
아나콘다는 파이썬 배포판으로 데이터 과학과 인공지능 분야에서 사용되는 다양한 도구와 라이브러리를 포함한 패키지다.
아래 사이트에서 아나콘다를 설치해주자.
아나콘다를 설치하면 파이썬과 주피터 노트북도 같이 설치 된다.
실행 방법
커맨드를 열어 아래의 명령어를 입력해서 qiskit을 설치하고 Jupyter Notebook을 열어준다.
pip install qiskit
pip install qiskit[visualization]
jupyter notebook
그럼 아래와 같이 커맨드 창에 로컬 주소가 나타나게 되며 해당 주소를 들어가보면 Jupyter Notebook을 웹 브라우저에서 확인할 수 있다.
우측에 New를 눌러서 Python 3 (ipykernel)을 눌러준다.
그럼 아래와 같이 코드를 입력할 수 있는 부분이 보인다.
코드를 실행하고 나면 In []:에 숫자가 들어가거나 *이 들어가게 된다.
In [1]: 의미는 1번째 실행된 코드를 의미한다.
In [*]: 의미는 현재 실행중인 코드를 의미한다.
샘플 코드
아래는 로컬 환경에서 양자 회로를 시뮬레이션 하는 코드이다.
from qiskit import QuantumCircuit, execute, Aer
# 양자 회로 생성 및 초기 큐비트의 상태값은 항상 0으로 초기화 된다.
qc = QuantumCircuit(1, 1)
# 큐비트 0을 X 게이트로 변환 (|0⟩ -> |1⟩)하는 회로 작성
qc.x(0)
# 결과 측정
qc.measure(0, 0)
# 'qasm_simulator'라는 이름의 Qiskit 시뮬레이션 백엔드를 사용하기 위해 백엔드 객체를 생성합니다.
simulator = Aer.get_backend('qasm_simulator')
job = execute(qc, simulator, shots=1)
# 만들어진 시뮬레이터 객체에 만들어진 양자 회로 qc를 넣고 실행시킨다.
# 결과 출력
result = job.result()
counts = result.get_counts()
print(counts)
# 결과값은 {'1': 1}이 출력이 된다.
# '1'부분이 '0'에서 '1'로 바뀐 부분이다.
# 뒤의 숫자 1은 shots의 숫자다. shots 시뮬레이션 반복 테스트 횟수를 말한다.
로컬 환경에서 큐비트를 만들어 X 게이트를 이용해보는 코드다.
해당 코드를 적어주고 상단에 Run을 누르면 결과를 확인할 수 있다.
IBM 양자 컴퓨터 이용하기
아래 링크를 통해 들어가서 가입을 해주자
가입을 하면 아래와 같이 API token 값이 존재한다.
하단에 실제 양자 컴퓨터를 이용하고 있는 현황을 확인할 수 있다.
아래의 코드를 통해 Jupyter NoteBook에 적어주고 Run을 하면 IBM에 첫 연결에 성공한 셈이다.
from qiskit import IBMQ
IBMQ.save_account('My Api Token 값')
IBMQ.load_account()
IBM 화면의 우측위에 Account Setting를 들어가주면 Hub, Group, Project 값을 확인할 수 있다.
현재 이용할 수 있는 양자 시스템 알아보기
코드를 통해 확인하거나 직접 사이트를 들어가서 확인해볼 수 있다.
from qiskit import IBMQ
# IBM Quantum 계정 로드
provider = IBMQ.load_account()
# 사용 가능한 백엔드 목록 출력
backends = provider.backends()
for backend in backends:
print(backend.name())
실제 양자 컴퓨터 접속 코드
from qiskit import QuantumCircuit, execute, IBMQ
# IBM Quantum Experience 계정에 접속
IBMQ.load_account()
provider = IBMQ.get_provider(hub='ibm-q', group='open', project='main')
# 양자 회로 생성
qc = QuantumCircuit(1, 1)
# 회로 작성
qc.x(0) # 큐비트 0을 X 게이트로 변환 (|0⟩ -> |1⟩)
qc.measure(0, 0) # 결과 측정
# 실제 양자 컴퓨터에서 실행
backend = provider.get_backend('ibmq_manila')
job = execute(qc, backend, shots=1)
# 결과 출력
result = job.result()
counts = result.get_counts()
print(counts)
위에서 확인한 hub, group, project 값을 넣고 backend 부분엔 이용 가능한 서버를 적어주고 Run을 하면된다.
(이용 대기가 많이 걸려 있을수록 오래걸린다.)
아래는 실제 실행해본 화면이다.
결과는 불확정성 원리에 의해 올바른 값이 아닌 '0'이 나왔다.
양자 얽힘 만들기
qc = QuantumCircuit(2, 2)
qc.x(0) # x 게이트를 0번 양자 비트에 적용
qc.cx(0, 1) # CNOT 게이트를 0번 양자 비트에서 1번 양자 비트로 제어 연산
# 측정 연산 추가
qc.measure([0, 1], [0, 1])
X 게이트를 통해 0을 1로 만들고 CNOT으로 A와 B를 얽히게 만들어서 양자 얽힘을 만든다.
결과는 {'11': 1} 혹은 {'00': 1}이 나온다.
실제 양자컴퓨터는 아직 오류가 많다 이 오류를 해결하기 위해 세계 각국에서 노력 중이다.
아래는 가장 최신 기사라서 가져와봤다.
2023년 2월 Google의 연구원들은 실험에서 큐비트 수를 늘려 양자 오류를 줄였다고 주장했으며, 거리 3 큐비트 배열과 거리 5 큐비트에 대해 3.028% 및 2.914%의 오류율을 측정하는 내결함성 표면 코드를 사용했습니다.
결론
응? 갑자기 웬 뜬금없이 결론인가 싶겠지만 사실 경험해보니 개인적으로 더 이상 할만한 수준이 아니었다.
그 이상을 가면 재미삼아 한다는 측면을 넘어버리기 때문에 관뒀다.
경험해보니 암호화를 실제 경험해볼만큼 양자컴퓨터는 발전하지도 않았다.
개인적으로 느끼기에 언젠가 양자컴퓨터가 발전하고 그때까지도 Python이 최고라면 전세계의 개발 프레임워크는 Python으로 몰리지 않을까 생각한다.
취약점이 없는 암호화가 나왔다고 하면 가장 큰 기업부터 차례차례 뛰어들테니 말이다.