Model pengaturcaraan
Model pengaturcaraan adalah spesifikasi asas yang mentakrifkan cara perisian disusun dan dilaksanakan. Ia menyediakan kerangka untuk pembangun menyatakan algoritma dan mengatur kod, sering mengabstrakkan perincian peringkat rendah perkakasan asas atau persekitaran pelaksanaan. Model yang berbeza sesuai untuk jenis masalah dan seni bina perkakasan yang berbeza, menawarkan pelbagai tahap abstraksi dan kawalan.
Dalam pelajaran ini, kita akan mengkaji model pengaturcaraan kuantum dan klasik serta melihat bagaimana kita boleh menggabungkannya untuk mengendalikan algoritma dalam persekitaran heterogen. Iskandar Sitdikov memberi kita gambaran keseluruhan dalam video berikut.
Model pengaturcaraan untuk QPUโ
Kita akan mulakan dengan model pengaturcaraan untuk komputer kuantum. Model pengaturcaraan asas yang dikenali oleh hampir semua pembangun kuantum ialah Circuit kuantum. Kita tidak akan masuk ke dalam perincian model Circuit kuantum di sini, kerana kita sudah mempunyai kuliah yang bagus oleh John Watrous yang menjelaskan ini secara terperinci. Kita hanya akan menyebut bahawa Circuit dibina daripada satu set garis (dipanggil wayar) yang mewakili qubit, Gate yang mewakili operasi pada keadaan kuantum, dan satu set pengukuran.
Satu lagi konsep model pengaturcaraan penting untuk pengkomputeran kuantum ialah apa yang kita panggil primitif pengkomputeran. Primitif-primitif ini mewakili beberapa tugas paling biasa yang ingin dicapai pengguna dengan komputer kuantum. Terdapat beberapa primitif yang tersedia pada masa ini, termasuk Executor. Dalam kursus ini kita akan memberi tumpuan terutamanya kepada primitif Sampler dan Estimator. Sampler memberi kamu keupayaan untuk mensampling keadaan yang disediakan oleh Circuit kuantum kamu. Ia memberitahu kamu keadaan asas pengkomputeran mana yang membentuk keadaan kuantum yang disediakan pada Circuit kuantum kamu. Estimator membolehkan kamu menganggarkan nilai jangkaan bagi suatu boleh-cerapan untuk sistem dalam keadaan yang disediakan oleh Circuit kuantum kamu. Konteks yang biasa ialah menganggarkan tenaga sistem dalam keadaan tertentu.
Perkara terakhir yang akan kita bincangkan dalam bahagian ini ialah transpilasi. Transpilasi adalah proses menulis semula Circuit input yang diberikan untuk memadankan kekangan fizikal dan Instruction Set Architecture (ISA) peranti kuantum tertentu. Serupa dengan pengkompil klasik, ini bermakna menterjemahkan operasi kesatuan abstrak kepada set Gate natif yang boleh dilaksanakan oleh peranti sasaran. Ia juga mengoptimumkan arahan Circuit untuk pelaksanaan yang cekap pada komputer kuantum berderau, dengan rutin yang secara beransur-ansur mengubah struktur Circuit dengan menggunakan beberapa peringkat pengoptimuman.
Semak pemahaman kamuโ
Berapa banyak qubit dalam Circuit di bawah?

Jawapan:
Empat.
Semak pemahaman kamuโ
Anggap kamu sedang memodelkan elektron dalam molekul. Kamu ingin menganggarkan (a) tenaga keadaan asas molekul, dan (b) keadaan asas pengkomputeran yang paling dominan dalam keadaan asas molekul. Dalam setiap kes, adakah kamu akan menggunakan primitif Estimator atau Sampler?
Jawapan:
(a) Estimator (b) Sampler
Model pengaturcaraan klasikโ
Terdapat banyak model pengaturcaraan untuk komputer klasik, tetapi untuk bahagian ini kita akan memberi tumpuan kepada dua yang paling popular: pengaturcaraan selari dan aliran kerja tugas. Menggunakan kedua-dua model ini bersama model pengaturcaraan kuantum, seseorang boleh menyatakan hampir mana-mana aliran kerja kuantum-klasik hibrid yang mana-mana kerumitan.
Pengaturcaraan selariโ
Pengaturcaraan selari adalah model yang membahagikan program kepada sub-masalah yang boleh dilaksanakan secara serentak. Terdapat dua paradigma utama pengaturcaraan selari:
-
Keselarian memori dikongsi (Open Multiprocessing, atau OpenMP): Digunakan untuk mengeksploitasi berbilang teras dalam satu nod pengkomputeran. Thread pelaksanaan berkongsi satu ruang memori.
-
Keselarian memori teragih (Message Passing Interface, atau MPI): Digunakan untuk berskala merentasi berbilang nod pengkomputeran yang berasingan. Setiap proses mempunyai ruang memori terpencilnya sendiri.
Di sini, kita akan memberi tumpuan kepada model memori teragih kerana ia penting untuk superkomputer berbilang nod dan menyelaraskan kerja kuantum-klasik heterogen berskala besar.
Terdapat beberapa konsep yang perlu kita fahami untuk beroperasi dalam model pengaturcaraan selari memori teragih:
- Proses - Contoh program yang bebas dengan ruang memorinya sendiri.
- Rank - Pengecam integer unik yang diberikan kepada setiap proses, digunakan khusus untuk mengenal pasti penghantar dan penerima semasa komunikasi (bukan semestinya "rank" dalam erti kata keutamaan).
- Penyegerakan - Mekanisme untuk penyelarasan antara rank dan proses yang berbeza.
- Program tunggal, data berbilang (SPMD) - Model pengkomputeran abstrak di mana satu contoh kod sumber dijalankan secara serentak pada berbilang proses, masing-masing beroperasi pada subset berbeza daripada jumlah data.
- Penghantaran mesej - Paradigma komunikasi yang digunakan dalam seni bina memori teragih yang membolehkan proses bebas bertukar data dan hasil pertengahan. Ia bergantung pada operasi 'hantar' dan 'terima' yang eksplisit untuk menyelaraskan pelaksanaan antara nod pengkomputeran yang berbeza.
Terdapat standard yang dipanggil MPI yang melaksanakan paradigma penghantaran mesej ini untuk seni bina selari. MPI berfungsi sebagai penjelmaan fungsional bagi semua konsep yang disenaraikan di atas, menyediakan panggilan pustaka khusus yang diperlukan untuk mengurus proses, menetapkan rank, memudahkan penyegerakan, dan membolehkan penghantaran mesej di bawah model SPMD. Dengan mengumpulkan semua konsep ini bersama, kita boleh mengatakan pelaksanaan program selari berlaku dengan cara berikut:
- Satu program terkompilasi (fail binari yang sama) disalin ke dan dilaksanakan oleh pelancaran kerja untuk mencipta berbilang proses selari merentasi berbilang nod.
- Aliran kawalan utama program ditentukan oleh rank proses. Ini adalah prinsip SPMD dalam tindakan: program menggunakan logik bersyarat (contohnya, if (rank == 0)) untuk memastikan bahawa hanya bahagian tertentu dan selari kod dilaksanakan oleh proses pekerja, sementara proses induk (sering Rank 0) mengendalikan permulaan dan pengagregatan akhir.
- Komunikasi antara proses berlaku melalui penghantaran mesej (menggunakan MPI), yang dipanggil setiap kali proses perlu bertukar data atau hasil pertengahan dengan rank lain.
Secara visual, ia akan kelihatan seperti ini:
Mari kita cuba mengaplikasikan beberapa konsep yang baru kita pelajari kepada kod.
Pertama, kita akan cuba menjalankan program selari "hello world" mudah menggunakan OpenMPI, yang merupakan implementasi protokol MPI, standard untuk penghantaran mesej dalam pengaturcaraan selari. Di sini, kita akan menggunakan pakej Python mpi4py, yang merupakan pengikatan Python untuk standard Message Passing Interface (MPI).
$ vim mpi-hello-world.py
from mpi4py import MPI
import sys
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
sys.stdout.write(f"[Rank {rank}] Hello from process {rank} of {size}!\n")
if rank == 0:
data = {'answer': 42, 'pi': 3.14}
sys.stdout.write(f"[Rank {rank}] Sending: {data}\n")
comm.send(data, dest=1, tag=42)
elif rank == 1:
data = comm.recv(source=0, tag=42)
sys.stdout.write(f"[Rank {rank}] Received: {data}\n")
~
~
Kita akan menggunakan dua nod untuk menjalankan program ini, yang akan kita nyatakan dalam skrip penyerahan kita.
$ vim mpi-hello-world.sh
#!/bin/bash
#
#SBATCH --job-name=mpi-hello-world
#SBATCH --output=mpi-hello-world.out
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal
/usr/lib64/openmpi/bin/mpirun python /data/ch3/parallel/mpi-hello-world.py
Kemudian jalankan skrip shell.
$ sbatch mpi-hello-world.sh
Kita boleh menyemak log hasil kerja.
$ cat mpi-hello-world.out | grep Rank
[Rank 1] Hello from process 1 of 2!
[Rank 0] Hello from process 0 of 2!
[Rank 0] Sending: {'answer': 42, 'pi': 3.14}
[Rank 1] Received: {'answer': 42, 'pi': 3.14}
Di sini kita menggunakan dua nod dan proses pada setiap nod kini dikenal pasti oleh rank - Rank 0 dan Rank 1 - yang digunakan untuk menentukan aliran kawalan program.
Aliran kerja tugasโ
Sekarang mari kita bincangkan model pengaturcaraan aliran kerja Tugas. Aliran kerja tugas mengabstrakkan pengkomputeran ke dalam graf asiklik terarah (DAG). Dalam graf ini, setiap nod mewakili tugas atau kerja tertentu, dan tepi (anak panah yang menghubungkan nod) mewakili kebergantungan (data dan turutan) antara mereka. Pengatur jadual adalah komponen yang memetakan tugas kepada sumber dan mengorkestrakan pelaksanaan.
Contoh konkrit model aliran kerja tugas yang diterapkan pada pengkomputeran kuantum ialah kerangka corak Qiskit. Corak Qiskit adalah kerangka umum yang direka untuk memecahkan masalah khusus domain kepada jujukan peringkat, terutamanya untuk tugas kuantum. Ini membolehkan kebolehkomposisian yang lancar bagi keupayaan baru yang dibangunkan oleh penyelidik IBM Quantumยฎ (dan lain-lain) dan membolehkan masa depan di mana tugas pengkomputeran kuantum dilaksanakan oleh infrastruktur pengkomputeran heterogen (CPU/GPU/QPU) yang berkuasa. Empat langkah corak Qiskit ialah pemetaan, pengoptimuman, pelaksanaan, dan pasca-pemprosesan, di mana semua tugas dilaksanakan satu demi satu dalam saluran paip. Tetapi dengan aliran kerja tugas kita tidak terikat kepada urutan pelaksanaan linear dan boleh melaksanakan tugas secara selari. Setiap tugas aliran kerja boleh menjadi kerja selari penuh miliknya sendiri. Jadi, kamu boleh menggabungkan model-model ini untuk menggambarkan algoritma yang kompleks secara sewenang-wenangnya, dan pengurus beban kerja seperti Slurm akan mengendalikannya.
Imej di atas menggambarkan corak Qiskit dalam tindakan. Aliran kerja mempunyai struktur graf dengan empat peringkat. Struktur seperti cabang ini diorkestrasikan dan dilaksanakan oleh pengatur jadual. Masalah dipetakan ke dalam bentuk boleh-laksana kuantum (Circuit kuantum) pada peringkat awal. Pada peringkat seterusnya, Circuit kuantum ini dioptimumkan untuk perkakasan kuantum tertentu. Imej menunjukkan ini sebagai proses selari, yang menunjukkan bagaimana pelbagai strategi pengoptimuman boleh diterapkan pada masa yang sama. Circuit kuantum yang dioptimumkan kemudian dilaksanakan pada perkakasan kuantum sebenar. Ini adalah peringkat ketiga imej di mana pengatur jadual bekerja dengan satu unit pemprosesan kuantum ungu. Akhirnya, hasil diproses pasca oleh sumber klasik.
Mengapa kedua-duanya?โ
Jadi mengapa kita memerlukan kedua-dua pengaturcaraan selari dan aliran kerja tugas? Walaupun banyak perbincangan tentang keselarian kuantum, ada baiknya menjelaskan bahawa tidak semua perkara adalah selari dalam pengkomputeran kuantum.
Pelajaran sebelumnya mengenai aliran kerja SQD menyebut beberapa proses yang tidak boleh diparalelkan. Sebagai contoh, kita memerlukan hasil banyak pengukuran kuantum untuk memproyeksikan matriks kita ke dalam subruang dimensi yang boleh diuruskan. Seterusnya, kita memerlukan matriks yang didiagonalkan dan vektor keadaan yang berkaitan untuk menyemak konsistensi kendiri pengukuran kuantum (menggunakan, contohnya, pemuliharaan cas). Selepas semua itu, kita perlu memutuskan sama ada tenaga keadaan asas telah menumpu secukupnya untuk tujuan kita. Langkah-langkah ini semestinya berurutan dan memerlukan pengujian keadaan penumpuan dan konsistensi kendiri sebelum meneruskan.
Aliran kerja ini akan dikaji semula secara lebih terperinci dan dilaksanakan dalam bahagian seterusnya. Satu-satunya perkara yang perlu kamu ambil dari bahagian ini ialah aliran kerja tugas adalah perlu.
Amalan pengaturcaraanโ
Keindahan model pengaturcaraan ialah kamu boleh menggabungkan semuanya bersama. Dengan mengetahui model pengaturcaraan kuantum dan klasik, kamu boleh menggambarkan pengkomputeran heterogen yang mana-mana kerumitan dan melaksanakannya pada perkakasan. Mari kita amalkan ini dengan contoh kecil aliran kerja gabungan, yang melaksanakan corak Qiskit (petakan, optimumkan, laksanakan, dan proses pasca) dalam Slurm yang kita pelajari dalam bab terakhir. Setiap empat tugas akan menjadi kerja Slurm yang berasingan, masing-masing dengan sumbernya sendiri. Tugas pengoptimuman akan menggunakan MPI untuk mengoptimumkan Circuit secara selari (hanya untuk tujuan contoh, seperti imej di atas). Tugas pelaksanaan akan menggunakan sumber kuantum dan model pengaturcaraan kuantum (Circuit dan sampler). Tugas terakhir - pasca-pemprosesan - akan sekali lagi menggunakan MPI secara selari dengan sumber klasik.
Pemetaanโ
Program mapping.py direka untuk membina Circuit PauliTwoDesign, yang kerap digunakan dalam literatur pembelajaran mesin kuantum dan literatur penanda aras kuantum, dengan boleh-cerapan mudah yang mengukur qubit ke- dalam arah sistem -qubit dengan parameter awal rawak. Setiap satu daripada ini (Circuit kuantum yang ditukar kepada fail qasm, boleh-cerapan, dan parameter) akan disimpan ke dalam fail berasingan di bawah direktori data dan akan digunakan sebagai input dalam peringkat pengoptimuman.
Skrip shell peringkat ini (mapping.sh) ialah
#!/bin/bash
#
#SBATCH --job-name=mapping
#SBATCH --output=mapping.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=normal
srun python /data/ch3/workflows/mapping.py
yang mentakrifkan nama kerja, format output, dan bilangan nod/tugas/CPU.
Pengoptimumanโ
Program optimization.py bermula dengan membawa fail dari peringkat pemetaan. Di sini kamu akan menggunakan QRMI untuk membawa sumber kuantum ke dalam program ini.
qrmi = QRMI()
resources = qrmi.resources()
quantum_resource = resources[0]
...
Ia kemudian melakukan pengoptimuman ringan dengan menetapkan optimization_level=1 untuk mentranspilasi Circuit kuantum dan menerapkan susun atur Circuit kepada boleh-cerapan, kemudian menyimpannya ke folder data.
Skrip shell peringkat ini (optimization.sh) ialah
#!/bin/bash
#SBATCH --job-name=optimization
#SBATCH --output=output/optimization.out
#SBATCH --ntasks=4
#SBATCH --partition=classical
srun python3 /tmp/optimization.py
Di sini --ntasks=4 meminta empat tugas klasik daripada Slurm untuk proses selari.
Pelaksanaanโ
Ini adalah peringkat kuantum teras di mana Circuit kuantum yang dioptimumkan dari langkah sebelumnya dijalankan pada QPU oleh Estimator. Untuk melakukan ini, pertama kita akan membawa tiga fail - Circuit kuantum yang ditranspilasi, boleh-cerapan, dan parameter awal - kemudian menyerahkannya kepada Estimator. Ia menghasilkan nilai yang dianggarkan bagi boleh-cerapan dan mencetaknya.
Skrip execution.sh memanfaatkan plugin Slurm untuk menggunakan sumber kuantum.
#!/bin/bash
#
#SBATCH --job-name=execution
#SBATCH --output=execution.out
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=quantum
#SBATCH --gres=qpu:1
srun python /data/ch3/workflows/execution.py
Pasca-pemprosesanโ
Langkah pasca-pemprosesan sering melibatkan pendiagonalan klasik dan semakan konsistensi kendiri. Ia juga mungkin berulang. Adalah paling berguna untuk mempertimbangkan langkah pasca-pemprosesan dalam pelajaran seterusnya, di mana konteks fizikal dan tujuan langkah-langkah berulang adalah jelas.
Menggabungkan semuanya bersamaโ
Kita boleh merangkaikan semua tugas ini ke dalam aliran kerja dengan menggunakan argumen kebergantungan untuk arahan sbatch:
$ MAPPING_JOB=$(sbatch --parsable mapping.sh)
$ OPTIMIZE_JOB=$(sbatch --parsable --dependency=afterok:$MAPPING_JOB optimization.sh)
$ EXECUTE_JOB=$(sbatch --parsable --dependency=afterok:$OPTIMIZE_JOB execute.sh)
Dan kita boleh menyemak baris gilir pelaksanaan Slurm kita.
$ squeue
# JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
# 3 classical mapping admin PD 0:00 1 (None)
# 4 classical optimiza admin PD 0:00 1 (Dependency)
# 5 quantum execute admin PD 0:00 1 (Dependency)
Ini adalah contoh mainan untuk menunjukkan campuran model pengaturcaraan. Dalam bab seterusnya kita akan melihat algoritma dunia sebenar dan menunjukkan model pengaturcaraan dan pengurusan sumber pada aliran kerja yang berguna.
Ringkasanโ
Dalam pelajaran ini, kita telah menunjukkan cara menggabungkan pelbagai model pengaturcaraan klasik dan kuantum untuk membina, mengurus, dan melaksanakan aliran kerja empat peringkat yang lengkap. Kita bermula dengan konsep asas Circuit kuantum dan primitif, kemudian meneroka model klasik seperti pengaturcaraan selari dan aliran kerja tugas. Dengan menggabungkan semua konsep, kita membina corak Qiskit โ petakan, optimumkan, laksanakan, dan proses pasca โ yang diorkestrasikan oleh pengurus beban kerja Slurm dengan Circuit kuantum mudah dan boleh-cerapan.
Dalam pelajaran seterusnya, kita akan menggunakan kerangka ini untuk menjalankan algoritma kuantum berasaskan pensampelan, menunjukkan bagaimana aliran kerja ini boleh diterapkan untuk menyelesaikan masalah yang bermakna.
Semua kod dan skrip yang digunakan dalam bab ini tersedia untuk kamu dalam repositori Github ini.