개발 전략

로드맵

우리는 앞으로 일하기를 원하는 목표들을 수립하기 위해서 적어도 12개월을 미리 내다보고 정할 것이다. 계획을 세울 때 대부분의 경우 각 구성 요소의 관점에서 잠재적인 목표들을 살펴볼 것이다.

키스킷 테라

2018년에 우리는 키스킷 테라에서 사용되는 후위 처리 장치와 사용자 흐름을 공식화하는 일을 하였다. 기본이 되는 생각은 다음과 같다: 사용자가 양자 회로를 디자인하고 이 후 트랜스파일러들의 집합을 통해 회로들이 다른 최적화를 통해 다른 후위 처리장치에서 실행된다. 우리는 또한 새로운 개념으로 *제공자(provider)*를 도입하였는데, 이는 사용자가 양자 회로를 실행해 볼 수 있는 후위 처리 장치를 제공하는 역할이다. 우리가 첫번째 버전에서 정의했던 제공자 응용 프로그램 인터페이스는 제공자들을 확인하고 해당하는 후위 처리장치가 테라 패키지에 호환성이 있는지 확인하는 방식들을 정의하는 도식을 제시해 준다.

2019년에서는 여러 확장을 계획했었다. 이러한 계획은 다음을 포함한다:

  • 트랜스파일어에 통로 추가하기. 여기서 목표는 적절한 회로와 자원 소모 예측을 찾아주는 통로를 추가해 주고 또한 회로 깊이를 더욱 효율적으로 만드는 것이다.

  • 회로 주조 공장 및 회로 응용 프로그램 인터페이스 소개하기. 여기에서 목표는 사용자들이 손쉽게 여러 연산을 통해서 복잡한 회로를 만들수 있게 하는 것이다. 이를 위해서 연산에 통제와 파워를 추가하고 단일 행령을 직접 입력할 수 있는 기능들이 포함된다.

  • 오픈 펄스에 대한 응용 프로그램 인터페이스 제공하기. 이제 오픈 펄스가 정의되고 IBM 양자 시스템 제공자가 그것을 수락할 수 있게 되었으므로 우리는 펄스 기능을 구성하기 위한 계획을 시작하였다. 여기에는 펄스를 이용한 실험을 만들기 위한 스케줄러와 도구들이 포함되고 또한 펄스를 이용한 실험과 게이트(QASM)을 이용한 실험간에 사상하기 위한 도구들도 포함된다.

키스킷 아르

2018년 말에 처음으로 키스킷 아르가 만들어져 공개되었다. 여기에는 C++로 만들어진 QASM, 상태벡터 그리고 단일 시뮬레이터가 포함되어 있다. 이것이 키스킷 아르의 핵심 요소이고 기존 테라에 있었던 시뮬레이터들을 대체한다. QASM 시뮬레이터는 사용자가 바꿀수 있는 범용의 (Kraus) 노이즈 모델을 포함하고 있으면 모든 시뮬레이터는 오픈엠피(OpenMP) 라이브러리를 통해 중앙처리장치(CPU) 병렬화가 가능하다.

2019년에 아르는 여러 방향으로 확장될 것이다:

  • 시뮬레이터 최적화하기. 우리는 시뮬레이터를 프로파일링할 계획이고 더욱 빠르게 만들 것이다. 이를 위해 후위 처리 장치 설정, 입력 양자 객체(Qobj) 와 사용 가능한 하드웨어에 따른 오픈 엠피 병렬화 설정 등을 자동화하는 일을 할 것이다.

  • 추가적인 시뮬레이터 후위 처리 장치 개발하기 우리는 앞으로 몇몇 특정한 회로에 더욱 효과적인 시뮬레이터 후위 처리 장치를 만들 계획이다. 예를 들어 클리포드와 (낮은 T-깊이를 가진) T-게이트에서 작동하는 T-게이트 시뮬레이터나 단지 클리포드 게이트에서만 작동하는 안정화 시뮬레이터같은 경우가 있다.

  • 노이즈 근사값 추측 도구 추가하기. 우리는 노이즈 근사값 추측 도구를 만들어서 일반적인 노이즈 모델 (Kraus) 에서 근사값 후위 처리 장치 (예를 들어 노이즈 모델에서 클리포드 모델과 초기화 에러만 가진) 에서 사용될 근사값 추측 노이즈 모델을 구성해 낼 것이다.

키스킷 이그니스

올 해 우리는 키스킷 이그니스의 최초 버전을 발표할 것이다. 이그니스의 목표는 노이즈가 있는 경우에 계산 능력을 증대시키고 게이트의 성능을 올리고 에러의 원인을 알아내는 도구들을 만드는 것이다. 이러한 도구의 예는 최적화 컨트롤(optimal control), 동적 분리(dynamical decoupling), 에러 경감(error mitigation) 등이 있다.

2019년에 이그니스는 다음의 도구들을 포함한다:

  • 양자 상태/과정 단층 촬영

  • 여러 그룹들 간에 무작위 벤치마킹

  • 최적화 제어 (예를 들어, 펄스 성형)

  • 동적 분리

  • 회로 임의 추출

  • 에러 경감 (양자 화학 실험의 결과를 개선하기 위해서)

키스킷 아쿠아

아쿠아는 2018년 6월에 도입된 양자 알고리즘과 응용 프로그램로 구성된 오픈 소스 라이브러리이다. 양자 알고리즘 라이브러리로서 아쿠아는 많은 양자 알고리즘의 집합을 가지고 있는데, 여기에는 VQE, QAOA, 그로버(Grover) 탐색, 진폭 추정 (Amplitude Estimation), 위상 추정 (Phase Estimation) 과 같은 범용으로 쓰이는 것들과 도메인에 특화된 서포트 벡터 머신 (support vector machine) 양자 커널 그리고 지도 학습에 쓰이는 변분 알고리즘(variational algorithm) 등이 포함된다. 또한 아쿠아는 알고리즘을 돕는 구성요소를 포함하는데, 예를 들어 최적화 도구(optimizer), 변분 폼(variational form), 오라클 (oracles), 양자 푸리에 변환(quantum Fourier Transforms), 특징 맵 (feature maps), 다계층 분류 확장 알고리즘(multiclass classification extension algorithm), 불확정 문제(uncertainty problems) 그리고 임의 분포 (random distribution) 등이 있다. 양자 응용 프로그램을 위한 프레임워크로서 아쿠아는 화학 문제(키스킷 양자 화학 구성 요소로 따로 출시되었다) 과 인공 지능(AI) 그리고 최적화, 금융 문제 등를 위한 지원을 제공한다. 아쿠아는 여러 도메인에 확장 가능하며, 연구자들이 자신이 직접 개발한 알고리즘과 그 구성요소를 기부할 수 있는 프레임워크로서 디자인되고 구성되었다.

2019년 동안 우리는 아쿠아를 다음과 같이 확장하려고 계획중이다:

  • 우리는 도이치-조사(Deutsch-Jozsa), 시몬(Simon’s), 번스타인-바지라니(Bernstein-Vazirani), 해로우(Harrow) 하시딤(Hassidim), 로이드(Lloyd) (HHL) 같은 새로운 양자 알고리즘을 추가할 것이다.

  • 우리는 시뮬레이터와 실제 하드웨어에서 돌아가는 양자 알고리즘의 성능을 향상시킬 것이다.

  • 우리는 실제 양자 하드웨어서 실행되는 알고리즘에 대해 더 나은 지원을 할 것이다.

  • 우리는 아쿠아에서 지원되는 인공지능, 최적화, 금융 응용 프로그램이 풀 수 있는 문제들의 종류를 늘릴 것이다.

요약

다음은 앞으로 다가올 12 개월 동안 집중하여 작업할 목록들의 일부이다. 우리는 지속적으로 사람들의 피드백에 대응해서 계획을 수정할 것이다. 여기서 제공되는 내용들을 지속적으로 관심을 가지고 지켜보고 또한 어떤 것을 향상시킬 수 있는지 알려주기 바랍니다!

버전

키스킷 프로젝트는 각각 다른 기능을 수행하는 몇몇 요소들로 구성되어 있다. 각각은 독립적으로 유용하며 따로 사용될 수 있다. 그러나 우리는 편의를 위해 모든 요소들을 한번에 설치할 수 있도록 하나의 진입점으로서 이 코드 저장소와 메타 패키지들 제공한다. 이는 설치 과정을 간단화하고 최종 사용자들에게 통일된 인터페이스를 제공하기 위함이다. 하지만, 각각의 키스킷 요소들은 자신만의 배포 버전을 가지고 있기 때문에 다른 코드 저장소간의 버전을 다룰 때에는 주의가 필요하다. 이 문서는 키스킷 구성 요소들과 메타 패키지의 버전과 배포본을 다룰때 필요한 가이드라인을 설명한다.

이 안내서의 나머지 부분에서 표준 의미상의 버전 명명법은 ``주 버전.부 버전.패치버전``으로 표기된다. 예를 들어 버전 번호가 ``0.7.1``이라면 주 버전은 ``0``이고 부 버전 ``7``이고 패치 버전은 ``1``이다.

메타-패키지 버전

키스킷 메타-패키지 버전은 각각의 구성 요소들의 배포본에 따라 결정되는 독립적인 값이다. 매번 우리가 어떤 요소를 추가하거나 추적되는 요소를 발표하면 메타-패키지의 필요 항목이나 버전은 새로 업데이트 되야 하고 새 버전이 발표되게 된다. 메타-패키지 공개 버전이 각각의 구성 요소와 일치하도록 일정을 조정하여서 발표를 한다.

새 구성요소 추가하기

새로운 키스킷 구성 요소가 메타-패키지 필요항목에 추가되면, 우리는 **부 버전**의 숫자를 올려야 한다.

예를 들어, 메타-패키지가 키스킷-아르``키스킷-테라``를 가지고 있으며 버전이 ``0.7.4``라고 해보자. 그리고 만약 우리가 메타-패키지에 추가할 계획으로 새 구성요소 ``키스킷-이그니스``를 출시했다고 하자. 그러면 이 새 요소를 메타-패키지에 추가할 때 마지막 버전은 ``0.8.0``로 증가하게 된다.

패치 버전 증가

만약 어떤 키스킷 구성요소가 메타-패키지에 등록되어 있고 버그를 고치기 위해 패치 버전을 공개했다면, setup.py 파일에 있는 필요 항목을 고치고 메타-패키지의 패지 버전을 증가시켜야 한다.

예를 들어, 현재 0.9.6 버전을 가지고 있는 메타-패키지에 키스킷-테라 0.8.1 버전, 키스킷-아르 0.2.1 버전, ``키스킷-이그니스 0.1.4 버전``이 등록되어 있다고 하자. 이 때 키스킷-테라 패키지에 버그를 고치기 위한 패치 버전 ``0.8.2``가 공개되었다면, 메타-패키지도 이에 따라 패치 버전을 증가시켜 버전 ``0.9.7``이 되어야 한다.

추가적으로 때때로 메타-패키지 자체에 버그가 있어서 이를 고치고 새 버전을 내놓아야 할 때가 있다. 이러한 경우가 발생하면, 이전의 불완전한 버전과 구별하기 위해 패치 버전을 증가시켜야 한다. 어떤 상황에서도 pypi에서 예전 버전 혹은 불완전한 버전을 지우지 말라. 대신 단순히 패치 버전을 증가시키고 새로운 버전을 업로드하라.

부 버전 증가

새로운 요소를 메타-패키지에 추가하는 것 이외에, 등록된 구성 요소의 부 버전이 올라갈 때 메타-패키지의 부 버전도 함께 증가해야 한다.

예를 들어, 메타-패키지가 0.7.5 버전이고 2개의 구성 요소 ``키스킷-테라 0.7.0 버전``과 ``키스킷-아르 0.1.1 버전``이 등록되어 있다고 하자. 이 때 ``키스킷-아르``의 버전이 ``0.2.0``으로 업데이트되면, 이에 맞추어 메타-패키지의 버전도 ``0.8.0``으로 올려주어야 한다.

주 버전 증가

주 버전은 다른 버전 구성요소들과는 다르다. 각각의 등록된 요소들과 연동해서 업데이트되는 다른 버전 숫자들과는 달리 주 버전은 모든 등록 요소가 한계에 다다랐을 때 (적어도 1.0.0 전에) 에만 증가하게 된다. 현재는 모든 구성 요소의 주 버전이 ``0``이며, 메타-패키지에 등록된 각각의 요소들이 주 버전이 ``>=1``로 되어 안정적이라고 판단되는 한, 메타-패키지의 주 버전은 올라가지 않는다.

모든 구성 요소들의 버전이 1.0.0 이상이 될 경우 주 버전 번호가 어떻게 바뀌어야 할 지에 대해서는 아직 정해지지 않았다.

키스킷 구성 요소 필요조건 추적

메타-패키지와 키스킷의 버전이 엄격하게 연동되어 있지 않은 것과 별도로 메타-패키지의 필요 조건 항목들에 나타나는 구성 요소의 버전을 정확하게 추적하는 것은 중요하다. setup.py 파일에 나열된 각각의 구성 요소들은 단일 버전에 고정되어 있어야 한다. 이는 각각의 키스킷 버전은 등록된 구성 요소의 여러가지 버전 중 딱 한가지 버전만 설치해야 한다는 뜻이다. 예를 들어, 특정 버전의 경우 필요 조건 항목들은 다음과 같이 나타날 수 있다.

requirements = [
    "qiskit_terra==0.7.0",
    "qiskit-aer==0.1.1",
]

이것은 디버깅을 돕기도 하고, 또한 여러 구성 요소간에 버전을 추척하는 일을 좀 더 명확하게 해 준다.

또한 우리가 구성 요소들을 설치하는 순서가 매우 중요하다. ``pip``는 설치하는 순서가 중요한 의미를 지니는 진정한 의미의 의존도 해결 모듈을 가지고 있지 않다. 그렇기 때문에 구성 요소나 각각의 요소간에 의존도에 관한 필요 조건 버전이 중복되게 되면, 우리는 설치 순서가 의도했던 대로 맞추어 지는지 확인해 주어야 한다. 만약 설치시 호환성 문제로 설치 순서가 바뀌어야 한다면, 이를 명확하게 적어두어야 한다.

모듈 상태

키스킷은 매우 빠르게 개발되고 있기 때문에 여러가지 버전에서 지원되는 응용 프로그램 인터페이스의 각 부분의 변화를 모두 기록하기 힘들다. 우리는 최선을 다하고 있으며, 적어도 하나의 부 버전이 업데이트되면, 예를 들어 0.6에서 0.7로 증가할 때, 응용 프로그램 인터페이스에 지원 중단 경고(deprecated warning) 를 넣는 일을 하고 있다. 부디 이러한 경고 메세지를 무시하지 말아 달라. 때때로 이러한 작업이 불가능한 때가 있고 이러한 경우에는 공개 버전 기록에 자세한 설명과 함께 변화들을 적어놓을 것이다.

현재 키스킷 버전은 1.0에 가까워저 가고 있고 몇몇 모듈은 매우 안정적으로 돌아간다. 아래의 표는 그러한 모듈들을 정리해 놓은 것이다.

모듈 목록

이름

상태

노트

어셈블러

안정

버전 0.9에서 완료된 항목들

회로

불안정

컴파일러

안정

버전 0.9에서 완료된 항목들

변환기

불안정

dag회로

삭제

회로의 일부가 될 것이다

확장 기능

삭제

회로의 일부가 될 것이다

이그니스.특성화(ignis.characterization)

이그니스.완화(ignis.mitigation)

이그니스.특성화(ignis.characterization)

공급자 (providers)

안정

버전 0.7에서 완료됨

펄스

불안정

qasm

삭제

전달 위치는 결정될 것임

양자 객체(qobj)

삭제

공급자(provider) 로 옮겨졌음

양자_정보(quantum_info)

불안정

결과

삭제

공급자(provider) 로 옮겨졌음

스키마

안정

버전 0.7에서 완료됨

테스트

불안정

도구

불안정

제거될 여러 구성 요소들

트랜스파일러(transpiler)

안정

버전 0.9에서 완료된 항목들

검증

안정

버전 0.7에서 완료됨

시각화

안정

버전 0.9에서 완료된 항목들

공급자

키스킷을 설치하면 기본으로 제공되는 세 가지 공급자가 있다.

기본 아르 공급자

이 공급자는 이상적인 양자 회로를 시뮬레이션하고 세 개의 후위 처리 장치를 가진다. 아르가 점점 안정화 되고 어떤 운영 체계에서도 사용될 수 있게 되면 이 공급자는 제거될 것이다.

아르 공급자

이것은 C++로 쓰여진 고급 시뮬레이터이다. 기본적인 아르보다 빠르게 작동하고 회로에 노이즈를 추가할 수 있게 해준다. 이것은 오늘날 사용되는 양자 컴퓨터에 있는 노이즈에 좀 더 잘 대응할 수 있는 실험을 디자인하고 실제 실험에 가까운 모델에 어떠한 일이 일어나는지를 연구할 수 있게 해 준다.

아이비엠 양자 시스템 공급자

이 공급자는 실제 실험을 해 볼 수 있도록 해 준다. 이를 사용하기 위해서는 아이비엠 양자 경험 계정이 필요하다. 또한 이 계정을 통해 온라인 고성능 수퍼 컴퓨터 시뮬레이터를 사용할 수 있다. 이것은 아르 공급자의 호스팅된 버전이다.

커뮤니티 확장 기능

키스킷은 모듈성을 염두해 두고 만들어 졌다. 많은 다른 방식으로 확장될 수 있는데, 다음 페이지에서 키스킷 커뮤니티가 키스킷과 어떻게 연관을 맺고 있으며 확장 기능과 패키지들을 개발하는지에 대해 강조하였다.

공급자

키스킷의 기본 제공자는 다른 후위 처리 장치(예를 들어 아이비엠 양자 시스템을 통해서 제공되는 후위 처리 장치들) 의 그룹에 접근할 수 있는 객체이다. 이는 여러 후위 처리 장치와 상호 작용하여 여러가지 일을 하는데, 어느 후위 처리 장치가 사용 가능한지, 특정 후위 처리 장치의 인스턴스를 회수해 오는 일, 후위 처리 장치의 특성과 설정을 가져오는 일, 여러 작업들을 실행하고 다루는 일들이 포함된다.

추가적인 후위 처리 장치

  • 의사결정 다이어그램에 기반한 양자 시뮬레이터

    - Organization: Johannes Kepler University, Linz, Austria (Alwin Zulehner and Robert Wille)
    - Description: A local provider which allows Qiskit to use decision diagram-based quantum simulation
    - Qiskit Version: 0.7
  • 양자 영감 (Quantum Inspire)

    - Organization: QuTech-Delft
    - Description: A provider for the Quantum Inspire backend
    - Qiskit Version: 0.7
    - More info: Medium Blog and GitHub.

트랜스파일러(transpiler)

회로 최적화는 양자 계산이 실제 하드웨어에서 가능하게 만들어주는 핵심 요소이다. 키스킷의 가장 중요한 요소는 (트랜스 파일러 패스들로 알려진) 특정 변환들에 따라 양자 회로를 조작하는 프레임 워크인 트랜스 파일러이다. 이는 사용자 들로 하여금 패스 매니저의 감독아래 각각의 패스에 의해 정해진 규칙을 따라 회로들을 변환하는 패스 명령어 세트를 만들수 있게 해준다. 또한 트랜스파일러 아키텍처는 확장성과 모듈성을 염두해 두고 만들어 졌기에 키스킷 사용자들이 자신의 고유 패스들을 만들고 패스 매니저를 통해 그것을 사용하고 또한 기존의 패스와 합쳐서 사용할 수 있게 해준다. 이러한 방식의 트랜스파일러 아키텍처는 연구자들이 양자 회로의 최적화에 공격적으로 참여할 수 있도록 해준다.

추가 통로들

  • t|ket〉 최적화 & 경로 통로

    - Organization: Cambridge Quantum Computing
    - Description: Transpiler pass for circuit optimization and mapping to backend using CQC’s t|ket〉compiler.
    - Qiskit Version: 0.7
    - More info: Tutorial Notebook and GitHub.

도구

키스킷을 새로운 도구와 기능으로 확장할 수 있는 것은 커뮤니티를 형성하기위한 매우 중요한 요소이다. 이러한 도구들로는 새로운 시각화 도구, 슬랙 (Slack) 연동, 주피터 (Jupyter) 확장툴 등등이 있다.

추가적인 도구들

  • 열린 통제 (OpenControls) 라이브러리

    - Organization: Q-CTRL
    - Description: Library of quantum control pulses derived from the open literature.
    - Qiskit Version: 0.7
    - More info: GitHub and Q-CTRL website