ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Quself - 양자 컴퓨팅 시뮬레이션 프로그램 제작 프로젝트
    양자컴퓨팅/Quself 프로젝트 2023. 1. 24. 05:51

    들어가며

    몇년전부터 양자 컴퓨터의 계산에 사용되는 큐빗의 수학적인 처리과정에 대해 공부하고 이를 파이썬으로 시뮬레이션하는 프로그램을 만들어오고 있습니다. 관련 이론에 대해 공부하면서 새로 알게 된 내용이 생기면 이를 해당 프로그램에 적용시키며 듬성 듬성 업데이트를 진행해 왔습니다. 그러다 작년에 Pycon korea 2022에 해당 프로젝트를 소개하는 발표를 진행했었으며 학교에서 진행한 전시회에 전시할 기회가 생겨 대규모 업데이트를 진행했었고 방학을 맞아 한번더 대규모 업데이트를 하고자 합니다. 나름 애착이 가는 프로젝트이기도 하고 여러 피드백도 받아보고 싶어 해당 프로젝트의 지난 개발 과정과 앞으로의 업데이트 과정을 공유하고자 합니다.

     

    해당 프로그램은 제가 지난번에 올렸던 단일 큐비트의 선형대수적 시스템에 대한 이론과 이 글을 작성하는 날을 기준으로 빠른 시일내에 업로드 하고자 하는 다중 큐비트의 선형대수적 시스템에 대한 이론을 바탕으로 제작하고 있는 프로그램입니다.

     

     

    GitHub - remontree/Quself: Quantum Computing Simulation Using Numpy

    Quantum Computing Simulation Using Numpy. Contribute to remontree/Quself development by creating an account on GitHub.

    github.com

    깃허브 주소

     

    파이콘 한국 2022

    PYCON KOREA 2022: 10.01 - 10.02

    2022.pycon.kr:443

    파이콘 주소

     

    Basic of Quantum Computing(1) - 양자컴퓨팅의 단일 큐비트 시스템에 필요한 선형대수학 기초

    모바일에서 접속할 경우 티스토리 앱이나 모바일 버전 웹 주소로 들어올 경우 수식이 깨지는거 같습니다. 폰에서 수식이 깨질 경우 모바일 버전이 아닌 일반 버전 주소로 접속해 주세요 들어가

    babyseal4711.tistory.com

    양자컴퓨팅 단일 큐비트 시스템의 수학적 기초에 관해 정리한 글

     


    프로젝트 소개

    • 프로젝트 명: Quself
    • 프로젝트 요약: 양자 회로를 정의 하고 해당 회로에 다양한 양자 게이트를 적용 시켜 양자 컴퓨팅을 시뮬레이션 할 수 있는 프로그램
    • 사용 언어: python (2023.1.24 기준)
    • 시용 라이브러리: Numpy & Pytorch (2023.1.24 기준)
    • 시뮬레이션 가능한 큐비트: 일반 16G램의 일반 PC 기준 GPU가속화 시 15큐비트 (2023.1.24 기준)
    • 지원하는 단일, 다중 양자 게이트: 18개
      I
      H
      X
      Y
      Z
      S
      T
      SQRT_X
      U
      RX
      RY
      RZ
      CNOT
      CY
      CZ
      CS
      SWAP
      TOFFOLI
    • 지원하는 기능
      • 양자 회로를 정의하고 사용자가 지정한 n개의 큐비트 시스템을 시뮬레이션 할 수 있습니다.
      • 다양한 양자 게이트를 원하는 큐비트에 적용하고 그 결과를 확인 할 수 있습니다.
      • 현재의 양자 상태에 대해 m번의 "측정" 행위를 할 수 있습니다. (현재 다중 큐비트 시스템에서 특정 큐비트만 측정하는 기원은 지원하지 않습니다.)
      • 양자 상태를 그래프로 시각화 할 수 있습니다.
      • 그로버, 도이치 등의 간단한 양자 알고리즘을 쉽게 적용해 볼 수 있는 함수를 제공합니다.
    • GUI 테스트 환경 지원

    GUI 화면 결과

     

    사용 예시

     

    2023.1.24 기준 최신 업데이트 내용

    • Numpy 기반 코드에서 계산이 유독 오래 걸리는 일부 계산 (Kronecker Product)을 Pytorch 기반 코드로 교체
      • 기존 프로그램은 numpy에 의존하고 있었다. 구현한 알고리즘의 특성상 큐비트가 늘어날 수록 계산시간이 너무 오래걸리는데 당시 최대 시뮬레이션 가능한 큐비트 수가 일반  16g 램을 지닌 pc기준 12~13큐비트 정도였습니다. 계산 속도를 좀더 늘리고 싶어 방안을 모색하던 중 numpy 계산 알고리즘이 python기반으로 작성 된 것을 파악했고 c++ 기반의 pytorch를 사용하여 계산 속도를 늘렸습니다.
    • GPU 가속화 기능 지원
      • pytorch기반의 코드로 수정하면서 pytorch의 gpu 가속화 기능을 같이 사용할 수 있게 되었습니다. 
      • 이를 통해 최종적으로 15큐비트까지 시뮬레이션 가능할 수 있도록 계산 시간 문제를 개선했습니다.
    • GUI 환경 지원
      • pyqt를 기반으로 quself 엔진을 gui에서 사용 할 수 있도록 업데이트 했습니다.

     

    업데이트 계획

    현재 알고리즘의 가장 큰 문제는 양자 상태를 나타내는 State Vector에 선형 변환을 위한 행렬을 생성(1)하고 이를 벡터에 곱하는(2) 두가지 과정에서 큐비트가 커질 수록 (1)의 과정에서 엄청난 메모리를 요구하고 결국 오버플로우가 나버리는 현상이 나타나는 것입니다. 현재 이 문제를 해결하기 위해 Divide-and-conquer(분할 정복) 기법과 행렬의 Kronecker Product(크로네커곱)의 성질을 이용해 메모리를 획기적으로 줄이는 알고리즘을 구상했으며 테스트를 해보고 있습니다. 또 현재 프로그램은 전체적으로 파이썬 기반이나 c++기반으로 코드를 완전히 수정하여 메모리와 속도 문제를 해결, 15큐비트보다 많은 큐비트를 일반  pc에서 시뮬레이션 할 수있도록 하고자 합니다. 또 현재 다중 큐비트 시스템에서는 사용자가 원하는 큐비트 하나만 측정하는 것이 지원되지 않습니다. 하지만 얼마전 "cirQuit"이라고 하는 양자컴퓨팅 어플리케이션의 개발자를 우연히 알게 되었고 메일을 통해 다중 큐비트 시스템에서 독립적으로 큐비트를 측정하는 방법에 대해 문의 했고 다음과 같은 답변을 받을 수 있었습니다.

    Taking a quick look, my understanding is that you have only set up measurements of the full state vector, but not measurements of a subset of qubits, such as measuring just one qubit.
    There are two ways to do this. First, given the full state of the system, we can construct the reduced density matrix of a subsystem by tracing out the other qubits. The probabilities for the bitstrings are then in the diagonal of this reduced density matrix.
    The alternative way is, given the probabilities of all bit strings, we can sum over all of the qubits we are not measuring. For the simple case of two qubits, if we want to just measure the first qubit, this is
    p(|0>_1) = p(|00>) + p(|01>)
    p(|1>_1) = p(|10>) + p(|11>)
    I hope this helps.

     

    reduced density matrix(아직 뭔지 모름. 양자 컴퓨팅에서 쓰이는 특별한 행렬이라고 추측하는 중. 더 공부해 볼 예정)을 이용해 보거나 아니면 모든 단일 큐비트가 포함 된 상태의 확률을 다 더 해서 구할 수도 있다는 단서를 얻었고 이를 적용 시켜 업데이트 시켜 볼 생각입니다. (두번째 방법이 더 간단해 보이긴하는데 첫번째 방법을 한번 찾아보려구 해요!)

     


    마무리하며

    이번 글에서는 제가 진행하고 있는 프로젝트에 대해 소개해보았는데요, 앞으로 해당 프로젝트의 업데이트가 진행될때마다 여러 사람에게 피드백도 받고 저도 개발 일지를 정리할 겸 블로그에 올리려고 해요. 그런데 지금 블로그에 적기로 마음 먹은 글이나 주제가 너무 많은데 하나씩 안하고 너무 이거 적다 저거 적는 느낌이라 이게 맞나 싶네요..ㅋㅋ 사실 제가 공부한거 정리하려고 블로그를 처음 시작한거라 그날 그날 기분에 따라 이글 적다 저글 적어 올려도 양해 부탁드려요ㅎㅎ 그래도 꾸준히 해보겠습니다.

    댓글

Designed by Tistory.