Hızlandırılmış kuantum süper hesaplama, yapay zeka süper hesaplamanın avantajlarını kuantum işlemci birimleri (QPUs) ile birleştirerek dünyanın en zorlu problemlerine çözüm geliştirmeyi amaçlar. Böyle bir cihazın gerçekleştirilmesi, bir veya birden fazla QPU’nun geleneksel CPU ve GPU süper hesaplama mimarisiyle sorunsuz bir şekilde entegrasyonunu gerektirir.
Herhangi bir hızlandırılmış kuantum süper bilgisayarı için en önemli bileşenlerden biri, onunla etkileşim kuracak bir programlama modeli olmaktır. Bu model, gerçekten hibrit kuantum-klasik uygulamaları çalıştırmanın yanı sıra QPU donanımını yönetmek için de optimize edilmiş olmalıdır. Bu, gerçek zamanlı kuantum hata düzeltimi (QEC) gibi görevlerin düzenlenmesini içerir ki bu da performanslı ve ölçeklenebilir hibrit uygulamaların geliştirilmesini son derece zorlaştırır.
Açık kaynaklı NVIDIA CUDA-Q platformu tam da bu programlama modelini sunar; araştırmacuların ve geliştiricilerin hızlandırılmış kuantum süper bilgisayarı uygulamalarını hayata geçirmesine yardımcı olur.
SC24’te NVIDIA, CUDA-QX’i duyurdu: CUDA-Q’nun güçlü programlama modelini araştırmacıların karşılaştığı zorluklara doğrudan ileten optimize edilmiş kütüphanelerden oluşan bir uzantı.
CUDA-QX, temel kuantum bilgisayar ilke ve yöntemleri için optimize edilmiş çekirdekler ve API’ler sunar (Şekil 1). Bu, araştırmacıların ve geliştiricilerin CUDA-Q’nun GPU hızlandırmasına erişimini kolaylaştırarak, kod optimizasyonuna daha az zaman harcayıp yeni bilim ve uygulama geliştirmeye daha çok zaman ayırmalarını sağlar. AI süper hesaplama araçlarını kuantum araştırma iş akışlarına entegre ederek CUDA-QX, gelecekteki kuantum bilgisayar devrimlerine zemin hazırlar.
Şekil 1. CUDA-QX mimarisi
Bu yazı, ilk iki CUDA-QX kütüphanesini tanıtmaktadır:
- CUDA-Q QEC: Kuantum hata düzeltimi (QEC) araştırmalarını hızlandırır.
- CUDA-Q Çözücüler: Kuantum kimyası gibi spesifik problemleri çözmek için optimize edilmiş kuantum çözücülerin bir setidir.
Her iki kütüphane için örnekler bu yazıda sunulmuş olup, bu kütüphanelerin araştırma ve uygulama geliştirme süreçlerini nasıl hızlandırabileceğini göstermektedir.
CUDA-Q QEC
Günümüzdeki QPU’lar ile faydalı kuantum bilgisayarları geliştirmek arasındaki en büyük zorluklardan biri, gürültülü qubitlerdir. Faydalı hata toleranslı kuantum hesaplama, hataları belirlemek, takip etmek ve düzeltmek için QEC kullanır. Bu, QEC kodlarının karmaşıklığı ve bunları çözmek için gereken sıkı gerçek zamanlı işlem gereksinimleri nedeniyle son derece zor bir görevdir.
CUDA-Q QEC kütüphanesi, hızlandırılmış QEC ilke ve yöntemlerini CUDA-Q iş akışlarına entegre etmeyi sağlar. Şimdi, CUDA-QX ile sunulan standart QEC kodları ve kod çözücülerden yararlanabilir veya kendi QEC kodunuzu değiştirebilirsiniz; bu da araştırmalarınızda esneklik sağlar.
CUDA-Q QEC Uygulaması: Kod Kapasitesi Gürültü Modelleri
CUDA-Q QEC kütüphanesi için iyi bir kullanım durumu, bir QEC kodu ve kod çözücü çiftinin mantıksal hata oranlarını tahmin etmektir.
Mantıksal hatalar, QEC kodları için felaketlerdir ve kuantum verilerini koruyamazlar. CUDA-Q QEC ile yapılan simülasyonlar, mantıksal hataların sıklığının QEC kodu ve çözücü seçimindeki etkisini anlamaya yardımcı olabilir.
CUDA-Q QEC’yi kullanmaya başlamadan önce, öncelikle CUDA-QX’i kurmanız ve gerekli kütüphaneleri içe aktarmanız gerekmektedir.
import numpy as np
import cudaq_qec as qec
Sonra, incelemek için bir QEC kodunu seçin. CUDA-Q QEC, Surface ve Steane kodları gibi birçok yerleşik seçenek sunar. Ancak kendi QEC kodunuzu tanımlayıp aynı iş akışına yerleştirebilirsiniz.
steane = qec.get_code("steane")
Parite kontrol matrisini, hata sendromunu belirleyecek stabilizatör operatörleri setleri ile tanımlayabilirsiniz. CUDA-Q QEC’yi kullanarak Steane kodu için bu parite kontrol matrisini çıkarabilirsiniz.
CSS kodları gibi Steane kodları için tam kod seçebilir veya yalnızca bit döngüsü (X
) veya faz döngüsü (Z
) hatalarına karşı yalnızca parite kontrol matrislerini seçebilirsiniz. Ayrıca, Steane kodundaki mantıksal qubit durumlarının nasıl tekrar temsil edildiğini belirleyen eşleme bilgilerini de çıkarabilirsiniz.
Hz = steane.get_parity_z()
Hx = steane.get_parity_x()
H = steane.get_parity()
observable = steane.get_observables_z()
Herhangi bir analiz çalıştırmadan önce, hata sendromu verilerini kullanarak hata yerlerini tahmin eden bir kod çözücü (decoder) tanımlamanız gerekir. Bu adımda, seçtiğiniz kod çözücü ve parite kontrol matrisine dayanan bir kod çözümü oluşturabilirsiniz. Örneğin, burada Steane kodu için CUDA-Q QEC’te tanımlı bir arama tablosu (LUT) kod çözücüsü kullanılmaktadır.
decoder = qec.get_decoder("steane_lut_decoder", Hz)
Hatasız sonuç, başlangıç mantıksal durumunda bir değişiklik olmadığını gösteren 0
bit dizisidir. Bu QEC kodlayıcı/çözücü çiftinin performansını simüle etmek için basit bir hata modeli kullandık. Verilen bir veri qubitine bit döngüsü hatası ekleme olasılığını p=0.1
olarak belirledik.
Şekil 2. Steane koduyla yapılan bir kod kapasitesi analizinin şematik temsili
Kod kapasitesi prosedürü, QEC kodlayıcı/çözücü çiftinin performansını değerlendirmek için kullanılır. Aşağıdaki kod örneğinde özetlenmiştir ve Şekil 2’de gösterilmiştir. Prosedür, her biri rastgele gürültülü bir veri bit dizisini temsil eden birkaç kez tekrarlanır. Veri bit dizisi, hata sendromlarını hesaplamak, bunları kod çözmek ve mantıksal bir durum değişikliğinin meydana gelip gelmediğini belirlemek için kullanılır.
Gerçek bir kuantum hesaplamada, yalnızca hata sendromları erişilebilir olup başka bir veri qubitinin gözlemlenmesi, kodlu mantıksal durumların tehlikeye girmesine sebep olur. Ancak, bu simüle edilmiş prosedürde daha fazla veri mevcut olup, bu veriler kod çözücünün mantıksal durum değişikliğini doğru bir şekilde tahmin edip etmediğini değerlendirmek için kullanılabilir.
Eğer kod çözücü yanlış bir tahminde bulunursa, mantıksal bir hata meydana gelir ve bu kaydedilebilir. Kod çözücünün gerçek verilerle karşılaştırmalara göre ne sıklıkla hatalı tahmin yaptığı, mantıksal hata oranını belirler.
# Veri qubitinin bit çevirme hatası olasılığı
p = 0.1
nShots = 10
nLogicalErrors = 0
for i in range(nShots):
# Gürültülü veri oluştur
data = qec.generate_random_bit_flips(Hz.shape[1], p)
# Hangi sendromların verildiğini hesapla
syndrome = Hz @ data % 2
# Sendromları çözüp tahmin edilen gözlemleri belirle
result = decoder.decode(syndrome)
data_prediction = np.array(result.result, dtype=np.uint8)
predicted_observable = observable @ data_prediction % 2
# Veriden doğrudan gerçek gözlemleri belirle
actual_observable = observable @ data % 2
# Eğer mantıksal hata gerçekleştiyse, sayacı arttır
if (predicted_observable != actual_observable):
nLogicalErrors += 1
# Mantıksal hata oranını yazdır
print(nLogicalErrors/nShots)
Kod kapasitesi prosedürünü özeti bir fonksiyon çağrısıyla da gerçekleştirebilirsiniz.
syndromes, data = qec.sample_code_capacity(Hz, nShots, p).
Kod kapasitesi uygulamasından elde edilen sonuçlar son derece faydalı olabilir ve fiziksel hata oranlarının mantıksal hata oranlarına etkisini aydınlatabilir.
Şekil 3, fiziksel hata oranının değiştiği kod kapasitesi sonuçlarını göstermektedir. Bu tür bir analiz, devre seviyesindeki gürültü modellerine genişletilebilir, alt eşik ölçekleme çalışmaları yapabilir ve belirli uygulamalar için uygun mantıksal hata oranları sağlamak üzere fiziksel hata oranları üzerine detaylı gereksinimleri belirleyebilir.
Şekil 3. Steane kodu için kod kapasitesi sonuçları
Kod katmanı hatası analizi için en uygun yol, sample_memory_circuit
fonksiyonunu çağırmak ve QEC kodunu sağlamaktır. Analizde ayrıca, her turda üretilen hata sendromlarının sayısını belirtmek için birkaç QEC turu eklemeniz gerekmektedir.
syndromes, data = qec.sample_memory_circuit(steane, numShots, numRounds, noise=noise)
sample_memory_circuit
fonksiyonu, yeterli eşlemeleri sağladığınız müddetçe kullanıcı tanımlı QEC kodları ile de uyumludur; bu süreç, Steane kodu gibi yerleşik kodlar için arka planda halledilir.
Daha fazla bilgi için CUDA-Q QEC kullanımının yanı sıra C++ uygulamaları, yüzey kod örnekleri ve tam devre seviyesindeki gürültü modelleme iş akışını da görmek için CUDA-Q QEC dokümantasyonuna göz atın.
CUDA-Q Çözücüler
CUDA-Q Çözücüler kütüphanesi, hızlı bir şekilde birçok standart kuantum uygulamasını, örneğin variational quantum eigensolver (VQE), ADAPT-VQE ve QAOA’yı hızlandırmak için kullanılan yöntemler içerir.
Küresel bir uygulama olarak çözücüler, en çok kimya uygulamalarında kullanılmakta ve umut verici kullanımlar arasında yer almaktadır. CUDA-Q Çözücüler, GE Vernova İleri Araştırmalar ile iş birliği yaparak enerji materyallerinin simülasyonu için kullanılmaktadir.
Kimya uygulamalarının önemi göz önüne alındığında, aşağıda CUDA-Q Çözücüler kütüphanesinin, bir azot molekülünü aktif bir alan ile hazırlamak için nasıl kullanılacağını gösteren bir örnek verir.
CUDA-Q Çözücüler Uygulaması: Aktif Alanla Bir Molekül Hazırlama
Birçok kuantum algoritması, QPU üzerinde gerçekleştirilen uygulamadan önce klasik ön işleme adımlarını gerektirir. Bu, genellikle kimya uygulamaları için, bir başlangıç durumunu hazırlamak üzere gereklidir.
Büyük simülasyonlar, genellikle aktif alan tahminini kullanmalıdır; bu, bir molekülün elektronik yapısının kuantum bilgisayarında modellenmesi için gereken kaynakları azaltmak amacıyla yapılır. Aşağıdaki örnek, aktif bir alan oluşturarak CUDA-Q Çözücüler kütüphanesinin nasıl kullanılacağını göstermektedir.
İlk adım, CUDA-QX’i kurmak ve gerekli kütüphaneleri içe aktarmaktır:
import cudaq, cudaq_solvers as solvers
import numpy as np
from scipy.optimize import minimize
Sonraki adımda, create_molecule
fonksiyonunu kullanarak bir molekül hazırlayın. Bu, çoğu kuantum kimyası paketlerinde tanıdık olabilecek standart girdileri alır, örneğin geometri, temel set, yük ve çoğulluk gibi.
geometry=[('N', (0.0, 0.0, 0.5600)), ('N', (0.0,0.0, -0.5600))]
molecule = solvers.create_molecule(geometry,
'sto-3g', # Temel set
0, # Yük
0, # Çoğulluk
nele_cas=2,
norb_cas=3,
ccsd=True,
casci=True,
verbose=True)
Aktif alanı belirtmek için, nele_cas
ve norb_cas
ile sırasıyla elektron ve orbital sayılarını ayarlayın. ccsd
veya casci
değerini True
olarak ayarlamak, molekül başlatıldığında bu enerjilerin klasik olarak hesaplanmasını sağlar. Hesaplanan her enerji değerini print(molecule.energies)
ile yazdırabilirsiniz.
CUDA-Q Çözücüler, aktif alan hesaplamalarını geliştirmek için farklı orbitaller için ekstra esneklik sunar. MP2 doğal orbitalleri ve CASSCF orbitalleri ile ilgili örnekler için CUDA-QX dokümantasyonuna bakın.
CUDA-Q Çözücüler Uygulaması: ADAPT-VQE’yi Hızlandırma
Uyarlanabilir Türev Toplanan Pseudo Trotter VQE (ADAPT-VQE), bir operator havuzundan iteratif olarak bir ansatz oluşturan bir çözüm tekniğidir; bu yöntem, zemin durum enerjisini daha verimli bir şekilde tahmin etmenize olanak tanır (Şekil 4).
Şekil 4. ADAPT-VQE prosedürü
Bir molekül tanımladıktan sonra, yalnızca bir kaç adımda bir ADAPT-VQE çözümü üretebilirsiniz. Öncelikle, molekülden elektron ve qubit sayısını çıkarın.
numQubits = molecule.n_orbitals * 2
numElectrons = molecule.n_electrons
Ardından, cudaqx.solvers.get_operator_pool
fonksiyonu, yaygın bir ansatzdan tüm operatörleri çıkarır ve her birini bir dizi başlangıç parametresiyle çarparak tamamlanmış operatör havuzunu (op_pool_uccsd
) oluşturur. Burada UCCSD ansatzı kullanılmaktadır, ancak CUDA-Q Çözücüler genelize edilmiş tek ikili ansatz (GSD) desteği de sunmaktadır.
# Operatörleri çıkar
operators = solvers.get_operator_pool("uccsd",
num_qubits=numQubits,
num_electrons=numElectrons)
# Operatör sayısını al
count = len(operators)
# Başlangıç parametreleri listesi oluştur
init_params = [0.05]*count
print(init_params)
# Nihai operatör havuzunu oluştur
op_pool_uccsd = [1j * coef * op for coef, op in zip(init_params, operators)]
Çözümlemeden önce, aktif alandaki doldurulmuş orbitalleri belirtmek için bir bit çevrim işlemi kullanan bir başlangıç Hartree-Fock durumu hazırlamanız gerekir. Bu, aşağıdaki CUDA-Q çekirdek kodu ile yapılır.
@cudaq.kernel
def initState(q: cudaq.qview):
for i in range(numElectrons):
x(q[i])
ADAPT-VQE çözücü, başlangıç durumu çekirdeğini, molecule.hamiltonian
ile oluşturulmuş Jordan-Wigner Hamiltonian’ını ve bir klasik optimizasyon yöntemini alır; bu durumda SciPy’den seçilen bir yöntem kullanılır. Varsayılan olarak, prosedür tek bir NVIDIA GPU üzerinde simüle edilir, ancak fiziksel QPU arka uçları ile kolayca değiştirilebilir.
energy, thetas, ops = solvers.adapt_vqe(initState,
molecule.hamiltonian,
op_pool_uccsd,
optimizer=minimize,
method='L-BFGS-B',
jac='3-point',
tol=1e-7)
print('Adapt-VQE enerjisi: ', energy)
print('Optimal havuz operatörleri: ', [op.to_string(False) for op in ops])
CUDA-Q Çözücüler, ADAPT-VQE gibi uygulamaları hızlandırmayı kolaylaştırmanın yanı sıra, aynı zamanda çoklu QPU’lar arasında paralel hesaplamalar yapmanıza da imkan tanır.
Birden fazla QPU’da çalışabilecek simülasyonları emüle etmek için cudaq.set_target(‘nvidia’, mqpu=’True’)
kullanarak MQPU hedefini belirtir ve hemen ardından cudaq.mpi.initialize
komutunu çalıştırabilirsiniz. Yukarıda açıklanan aynı ADAPT-VQE kodunu çağırdıktan sonra cudaq.mpi.finalize
işlemini gerçekleştirebilirsiniz.
Bu emüle edilmiş çoklu QPU yaklaşımıyla, 16 qubitlik bir azot molekülü simülasyonu için gradient hesaplaması %4.5 daha hızlı hızlandırılır; tüm bunlar önemli kod değişiklikleri gerektirmeden gerçekleşir (Şekil 5).
Şekil 5. CUDA-Q Çözücüler ile ADAPT-VQE gradient hesaplaması hızlandırıldı.
Daha fazla bilgi için, bu ve diğer örneklerdeki tam kaynak kodunu görmek için CUDA-Q Çözücüler dokümantasyonuna göz atın.
CUDA-QX Kütüphaneleriyle Başlayın
CUDA-QX, yapay zeka süper hesaplama simülasyon araçlarını kuantum araştırmacılarının kullanımına sunar ve kutudan çıkar çıkmaz kullanılabilen yüksek optimizasyonlu kütüphanelerle gelir. Gelişen bir kütüphane koleksiyonunun ilk iki parçası olan CUDA-Q Çözücüler ile CUDA-Q QEC, hibrit kuantum-klasik uygulamalarının birçok yönünü hızlandırmak için sağlam bir araç seti oluşturur.
CUDA-QX kütüphanelerini kullanmaya başlamak için kurulum talimatları ve CUDA-Q Çözücüler ve CUDA-Q QEC dokümantasyonuna göz atabilirsiniz.
Bu kütüphaneler, CUDA-Q’yu ön koşul olarak gerektirir. Daha fazla bilgi için NVIDIA CUDA-Q dokümantasyonundaki Yerel Kurulum konusuna bakabilirsiniz.