-
Kvanttitöiden ajaminen
Useiden taustajärjestelmien käyttö
Tällä hetkellä Q50:tä ja Helmeä ei voi käyttää yhdessä, koska ne toimivat eri ohjelmistoversioilla.
Ajaminen Helmellä ja Q50:llä
Anna palautetta!
Kaikki palaute on erittäin tervetullutta, jaa kokemuksesi lähettämällä sähköpostia osoitteeseen fiqci-feedback@postit.csc.fi.
Töiden ajaminen
Jos haluat lähettää töitä kvanttitietokoneille (Helmi ja Q50), käytä niille varattua kvanttisolmua (q_fiqci) lisäämällä eräajokomentoosi --partition=q_fiqci.
Tällä hetkellä Helmi ja Q50 tukevat töiden lähettämistä Qiskitillä tai Cirqillä. Nämä skriptit on lähetettävä tavallisina Python-tiedostoina.
Jos haluat ajaa töitä kvanttitietokoneilla, noudata seuraavia vaiheita oikean ympäristön määrittämiseksi LUMIssa:
Huom: Suorita nämä komennot joko eräajoskriptissäsi tai interaktiivisessa istunnossa, joka on käynnistetty srun-komennolla.
-
Lisää moduulipolku, jotta järjestelmä löytää käytettävissä olevat moduulit:
module use /appl/local/quantum/modulefilestaimodule load Local-quantum -
Lataa sopiva ympäristömoduuli käyttämäsi ohjelmistokehyksen mukaan:
- Qiskitille:
module load fiqci-vtt-qiskit - Cirqille:
module load fiqci-vtt-cirq
- Qiskitille:
Moduulit fiqci-vtt-qiskit ja fiqci-vtt-cirq tarjoavat valmiiksi määritetyt Python-ympäristöt töiden ajamiseen kvanttitietokoneilla.
Jos sinun täytyy asentaa lisää Python-paketteja, voit tehdä sen komennolla:
python -m pip install --user package.
Oman Python-ympäristön luominen
Jos haluat käyttää mukautettua Python-ympäristöä, suosittelemme käyttämään säiliökääretyökalua ympäristösi luomiseen ja hallintaan.
Tällä hetkellä tuetut ohjelmistoversiot ovat:
| Ohjelmisto | LUMI_Module_name | Versiot |
|---|---|---|
| IQM client | fiqci-vtt-qiskit/fiqci-vtt-cirq | ≥ 33.0.0, < 34.0.0 |
| IQM client | fiqci-vtt-qiskit/17.8 or fiqci-vtt-cirq/16.2 | >= 22.3, <= 23.0 |
Tässä on esimerkki eräajoskriptistä kvanttityön lähettämiseen
#!/bin/bash
#SBATCH --job-name=quantumjob # Job name
#SBATCH --account=project_<id> # Project for billing (slurm_job_account)
#SBATCH --partition=q_fiqci # Partition (queue) name
#SBATCH --ntasks=1 # One task (process)
#SBATCH --mem-per-cpu=2G # memory allocation
#SBATCH --cpus-per-task=1 # Number of cores (threads)
#SBATCH --time=00:05:00 # Run time (hh:mm:ss)
module use /appl/local/quantum/modulefiles
# uncomment the correct line:
# module load fiqci-vtt-qiskit/17.8
# or
# module load fiqci-vtt-cirq/16.2
export DEVICES=("Q5")
source $RUN_SETUP
python your_python_script.py
#!/bin/bash
#SBATCH --job-name=quantumjob # Job name
#SBATCH --account=project_<id> # Project for billing (slurm_job_account)
#SBATCH --partition=q_fiqci # Partition (queue) name
#SBATCH --ntasks=1 # One task (process)
#SBATCH --mem-per-cpu=2G # memory allocation
#SBATCH --cpus-per-task=1 # Number of cores (threads)
#SBATCH --time=00:05:00 # Run time (hh:mm:ss)
module use /appl/local/quantum/modulefiles
# uncomment the correct line:
# module load fiqci-vtt-qiskit
# or
# module load fiqci-vtt-cirq
export DEVICES=("Q50")
source $RUN_SETUP
python your_python_script.py
Eräajoskripti voidaan sitten lähettää komennolla sbatch. Voit myös lähettää interaktiivisia töitä srun-komennolla.
Moduuli fiqci-vtt-* määrittää oikean Python-ympäristön Qiskitin tai Cirqin käyttämiseen yhdessä kvanttitietokoneiden kanssa.
Ajaminen fyysisillä kvanttitietokoneilla
Kun lähetät työn Helmelle tai Q50:lle, käyttäjän slurm_job_account (projekti, jolla työ ajetaan) yhdistetään project_id-tunnukseen, ja tämä tieto siirretään VTT:lle laskutusta varten.
Jos haluat ajaa Q50:llä, määritä laite komennolla export DEVICES=("Q50")
Qiskit
Lataa Qiskit-moduuli komennolla module load fiqci-vtt-qiskit.
Qiskit Python -skripteissäsi sinun tulee sisällyttää seuraava:
import os
from qiskit import QuantumCircuit, transpile
from iqm.qiskit_iqm import IQMProvider
DEVICE_CORTEX_URL = os.getenv('HELMI_CORTEX_URL')
provider = IQMProvider(DEVICE_CORTEX_URL)
backend = provider.get_backend()
shots = 1000 # Set the number of shots you wish to run with
# Create your quantum circuit.
# Here is an example
circuit = QuantumCircuit(2, 2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
print(circuit.draw(output='text'))
transpiled_circuit = transpile(circuit, backend)
job = backend.run(transpiled_circuit, shots=shots)
counts = job.result().get_counts()
print(counts)
import os
from qiskit import QuantumCircuit, transpile
from iqm.qiskit_iqm import IQMProvider
DEVICE_CORTEX_URL = os.getenv('Q50_CORTEX_URL')
provider = IQMProvider(DEVICE_CORTEX_URL, quantum_computer="q50")
backend = provider.get_backend()
shots = 1000 # Set the number of shots you wish to run with
# Create your quantum circuit.
# Here is an example
circuit = QuantumCircuit(2, 2)
circuit.h(0)
circuit.cx(0, 1)
circuit.measure_all()
print(circuit.draw(output='text'))
transpiled_circuit = transpile(circuit, backend)
job = backend.run(transpiled_circuit, shots=shots)
counts = job.result().get_counts()
print(counts)
Cirq
Lataa Cirq-moduuli komennolla module load fiqci-vtt-cirq.
import os
import cirq
from iqm.cirq_iqm.iqm_sampler import IQMSampler
DEVICE_CORTEX_URL = os.getenv('HELMI_CORTEX_URL')
sampler = IQMSampler(DEVICE_CORTEX_URL)
shots = 1000
# Create your quantum circuit
# Here is an example
q1, q2 = cirq.NamedQubit('QB1'), cirq.NamedQubit('QB2')
circuit = cirq.Circuit()
circuit.append(cirq.H(q1))
circuit.append(cirq.CNOT(q1, q2))
circuit.append(cirq.measure(q1, q2, key='m'))
print(circuit)
routed_circuit, initial_mapping, final_mapping = sampler.device.route_circuit(circuit)
decomposed_circuit = sampler.device.decompose_circuit(routed_circuit)
# Optionally print mapping
# print(routed_circuit)
# print(initial_mapping)
# print(final_mapping)
# print(decomposed_circuit)
result = sampler.run(decomposed_circuit, repetitions=shots)
print(result.measurements['m'])
import os
import cirq
from iqm.cirq_iqm.iqm_sampler import IQMSampler
DEVICE_CORTEX_URL = os.getenv('Q50_CORTEX_URL')
sampler = IQMSampler(DEVICE_CORTEX_URL, quantum_computer="q50")
shots = 1000
# Create your quantum circuit
# Here is an example
q1, q2 = cirq.NamedQubit('QB1'), cirq.NamedQubit('QB2')
circuit = cirq.Circuit()
circuit.append(cirq.H(q1))
circuit.append(cirq.CNOT(q1, q2))
circuit.append(cirq.measure(q1, q2, key='m'))
print(circuit)
routed_circuit, initial_mapping, final_mapping = sampler.device.route_circuit(circuit)
decomposed_circuit = sampler.device.decompose_circuit(routed_circuit)
# Optionally print mapping
# print(routed_circuit)
# print(initial_mapping)
# print(final_mapping)
# print(decomposed_circuit)
result = sampler.run(decomposed_circuit, repetitions=shots)
print(result.measurements['m'])
Lisäesimerkkejä
Lisää esimerkkejä löytyy täältä. Esimerkeissä korostetaan simulaattorilla ajamisen ja oikealla fyysisellä kvanttitietokoneella ajamisen eroa sekä sitä, miten piirisi kannattaa rakentaa optimaalisten tulosten saavuttamiseksi kvanttitietokoneilla. Repositorio sisältää myös hyödyllisiä skriptejä töiden lähettämiseen.
Simuloidut testiajot
Koska kvanttiresurssit voivat olla niukkoja, on suositeltavaa valmistella koodit ja algoritmit, jotka aiot ajaa kvanttitietokoneilla, etukäteen. Tämän tueksi qiskit-on-iqm tarjoaa fake noise model backendin. Voit ajaa fake noise model backendia paikallisesti omalla kannettavallasi simulointia ja testausta varten.
Saatavilla on myös joukko Qiskit- ja Cirq-esimerkkejä sekä skriptejä ohjeeksi q_fiqci-osion käyttämiseen. Löydät ne täältä.
Työn metadata
Lisämetadataa työstäsi voidaan kysyä suoraan Qiskitillä. Esimerkiksi:
DEVICE_CORTEX_URL = os.getenv('HELMI_CORTEX_URL')
provider = IQMProvider(DEVICE_CORTEX_URL)
backend = provider.get_backend()
#Retrieving backend information
print(f'Native operations: {backend.operation_names}')
print(f'Number of qubits: {backend.num_qubits}')
print(f'Coupling map: {backend.coupling_map}')
transpiled_circuit = transpile(circuit, backend)
job = backend.run(transpiled_circuit, shots=shots)
result = job.result()
exp_result = result._get_experiment(circuit)
print("Job ID: ", job.job_id()) # Retrieving the submitted job id
print(result.request.circuits) # Retrieving the circuit request sent
print("Calibration Set ID: ", exp_result.calibration_set_id) # Retrieving the current calibration set id.
print(result.request.qubit_mapping) # Retrieving the qubit mapping
print(result.request.shots) # Retrieving the number of requested shots.
#retrieve a job using the job_id from a previous session
#old_job = backend.retrieve_job(job_id)
DEVICE_CORTEX_URL = os.getenv('Q50_CORTEX_URL')
provider = IQMProvider(DEVICE_CORTEX_URL, quantum_computer="q50")
backend = provider.get_backend()
#Retrieving backend information
print(f'Native operations: {backend.operation_names}')
print(f'Number of qubits: {backend.num_qubits}')
print(f'Coupling map: {backend.coupling_map}')
transpiled_circuit = transpile(circuit, backend)
job = backend.run(transpiled_circuit, shots=shots)
result = job.result()
exp_result = result._get_experiment(circuit)
print("Job ID: ", job.job_id()) # Retrieving the submitted job id
print(result.request.circuits) # Retrieving the circuit request sent
print("Calibration Set ID: ", exp_result.calibration_set_id) # Retrieving the current calibration set id.
print(result.request.qubit_mapping) # Retrieving the qubit mapping
print(result.request.shots) # Retrieving the number of requested shots.
#retrieve a job using the job_id from a previous session
#old_job = backend.retrieve_job(job_id)
Tallenna työsi Job ID!
Huomaa, että tällä hetkellä ei ole menetelmää aiempien Job ID:iden listaamiseen, joten on suositeltavaa aina tulostaa Job ID työn lähettämisen jälkeen ja tallentaa se johonkin! Sama koskee calibration set id:tä.
Kalibrointidata
Kalibrointidata (tai laatumittaristo) voi olla tarpeen Helmellä/Q50:llä tuotetun työn julkaisemisessa. Se antaa myös käsityksen kvanttitietokoneiden tämänhetkisestä tilasta. Kalibrointidata on saatavilla FiQCI-sivulla. Lisäksi fiqci-examples sisältää apuskriptin kalibrointidatan hakemiseen manuaalisesti. Skripti löytyy täältä. Tämä tiedosto voidaan lisätä omiin Python-skripteihisi, ja se palauttaa datan json-muodossa. Huomaa, että uusimman kalibrointidatan kysely voi antaa puutteellisen tai vanhentuneen lukujoukon. Siksi calibration set ID:t tulisi tallentaa yhdessä Job ID:iden kanssa.
Tässä on lyhyt kuvaus kyselyssä annettavista arvoista:
| Kuvaaja | Avain | Kuvaus | ||
|---|---|---|---|---|
| T1-aika (s) | t1_time |
T1-aikaa kutsutaan pitkittäiseksi relaksaationopeudeksi, ja se kuvaa, kuinka nopeasti kubitin virittynyt tila palautuu perustilaansa. | ||
| T2-aika (s) | t2_time |
T2-aikaa kutsutaan poikittaiseksi relaksaationopeudeksi, ja se kuvaa superpositiotilan koherenssin häviämistä. | ||
| T2 echo -aika (s) | t2_echo_time |
T2 echo -aika kuvaa kubitin superpositiotilan koherenssin häviämistä. Se on tarkempi kuin T2-aika, koska se on vähemmän altis matalataajuiselle kohinalle. | ||
| Lukufideliteetti | measure_fidelity_ssro_fidelity |
Tämä kuvaa fideliteettiä, kun suoritetaan kubitin tilan single shot -lukemia. Single-shot-luku valmistaa 50 % kubittien tiloista virittyneeseen tilaan ja 50 % perustilaan. | ||
| Single shot readout 01 -virhe | measure_fidelity_ssro_error_0_to_1 |
Virhe virittyneen tilan ('1') määrittämisessä, kun tila on perustilassa ('0'). | ||
| Single shot readout 10 -virhe | measure_fidelity_ssro_error_1_to_0 |
Virhe perustilan ('0') määrittämisessä, kun tila on virittyneessä tilassa ('1'). | ||
| Yksikubittisen portin fideliteetti | prx_rb_fidelity |
Tämä lasketaan Randomized Benchmarking -menetelmällä, ja se kuvaa keskimääräistä porttifideliteettiä, kun satunnainen yksikubittisten Clifford-porttien sarja suoritetaan. | ||
| Fidelity 2QB Cliffords averaged | clifford_rb_fidelity |
Tämä lasketaan Randomized Benchmarking -menetelmällä, ja se näyttää keskimääräisen Clifford-portin fideliteetin. | ||
| CZ-portin fideliteetti | cz_irb_fidelity |
Controlled-z-portin fideliteetti, joka lasketaan lomitetulla satunnaistetulla benchmarkkauksella, jossa controlled-z-portti on lomitettu mukaan. | ||
| MCM-fideliteetti | measure_ssro_fidelity |
Keskipiirin mittauksen fideliteetti. | ||
| QNDness-fideliteetti | measure_qndness_fidelity |
Quantum non-demolition (QND) -fideliteetti kuvaa todennäköisyyttä sille, että kubitin kvanttitila säilyy keskipiirin mittaustoimenpiteen jälkeen. | ||
| QNDness 0 | measure_qndness_qndness_0 |
QND-fideliteetti perustilalle. Se kuvaa todennäköisyyttä sille, että alun perin perustilassa oleva kubitti pysyy perustilassa mittauksen jälkeen. | ||
| QNDness 1 | measure_qndness_qndness_1 |
QND-fideliteetti ensimmäiselle virittyneelle tilalle. Se kuvaa todennäköisyyttä sille, että alun perin ensimmäisessä virittyneessä tilassa oleva kubitti pysyy ensimmäisessä virittyneessä tilassa mittauksen jälkeen. | ||
| QNDness repeatability | measure_qndness_repeatability |
Keskipiirin mittaustulosten toistettavuus. Todennäköisyys sille, että toinen mittaustulos vastaa ensimmäistä. Tämä metriikka sisältää lukudiskriminointivirheet, mikä tarkoittaa, että jos lukufideliteetti on heikko, toistettavuus on alhainen, vaikka mittaus olisi tuhoamaton. |
Lisätietoja kalibrointidatasta saat ottamalla yhteyttä osoitteeseen fiqci-feedback@postit.csc.fi tai CSC:n asiakastukeen, jonka tavoittaa osoitteesta servicedesk@csc.fi.
Helmen/Q50:n käyttäminen Lumi-selainkäyttöliittymässä
LUMI-selainkäyttöliittymä mahdollistaa kvanttitöiden ajamisen Helmellä ja Q50:llä selainkäyttöliittymän kautta. Tarkemmat tiedot kirjautumisesta LUMI-selainkäyttöliittymään löytyvät LUMI-dokumentaation sivulta.
Helmen/Q50:n käyttäminen
Kun tunnistautuminen on onnistunut, sinulla pitäisi nyt olla pääsy kojelaudallesi. Napsauta Jupyter-sovellusta, valitse projektisi ja osioksi q_fiqci. Jos sinulla on aktiivinen varaus, voit käyttää sitä valitsemalla sen reservation-kohdasta.
On suositeltavaa käyttää Advanced settings -asetuksia. Valitse Custom init -vaihtoehdossa Text, ja kirjoita Script to start -tekstikenttään seuraava skripti ympäristön määrittämiseksi kvanttiohjelmistopinon käyttöä varten.
Qiskit
Cirq

Käynnistä Jupyter-istunto napsauttamalla launch. Tämä käynnistää Jupyterin komennolla python -m Jupyter lab. Jos käytät Helmeä/Q50:tä kvanttilaskennan kurssin aikana, kurssia varten on voitu luoda mukautettu ympäristö. Tässä tapauksessa voit käyttää kvanttitietokoneita Jupyter-for-courses-sovelluksen kautta.

QPU-käytön tarkasteleminen LUMIssa ja MyCSC:ssä
Voit nyt tarkastella QPU-käyttöä MyCSC-koontinäytöltä. Jos haluat tarkastella QPU-käyttöä LUMIn terminaalissa, käytä alla kuvattua menetelmää. Komento lumi-allocations ei näytä QPU-käyttöä oikein.
Jos haluat tarkastella QPU-käyttöä, lataa ensin terminaalissasi fiqci-vtt-qiskit-moduuli ja suorita sitten komento project-qpu-allocations. Tämä komento näyttää nykyisen QPU-allokaatiosi ja käyttösi tiedot kaikille projekteillesi.
module use /appl/local/quantum/modulefiles
module load fiqci-vtt-qiskit
project-qpu-allocations
# To view for a specific project, run
project-qpu-allocations <project_xxxx>
Vaihtoehtoisesti voit saavuttaa saman tuloksen käyttämällä project-qpu-allocations-työkalua suoraan.