Azure Quantum'a Cirq ile bağlantı hattı gönderme

Paketini kullanarak Cirq quantum bağlantı hattı göndermeyi azure-quantumPython öğrenin. Yerleşik paketi olan Azure Quantum not defterini kullanarak veya yerel makinenizden Azure Quantum'a azure-quantumPython Cirq devreleri gönderebilirsiniz.

Daha fazla bilgi için bkz . Kuantum devreleri.

Not

Microsoft Quantum Geliştirme Seti (Klasik QDK) artık 30 Haziran 2024'e kadar desteklenmeyecektir. Mevcut bir QDK geliştiricisiyseniz kuantum çözümleri geliştirmeye devam etmek için yeni Azure Quantum Development Kit'e (Modern QDK) geçmenizi öneririz. Daha fazla bilgi için bkz . Q# kodunuzu Modern QDK'ye geçirme.

Önkoşullar

Yükleme ayrıntıları için bkz . VS Code'da Modern QDK'yi yükleme.

  • Azure aboneliğinizde bir Azure Quantum çalışma alanı. Çalışma alanı oluşturmak için bkz. Azure Quantum çalışma alanı oluşturma.

  • Python ve Pip'in yüklü olduğu bir ortamPython.

  • Azure Quantum Geliştirme Seti, Pythonve Jupyter uzantılarının yüklü olduğu VS Code.

  • [cirq] etiketine sahip Azure Quantum azure-quantum paketi ve qsharp ve ipykernel paketleri.

    python -m pip install --upgrade azure-quantum[cirq] qsharp ipykernel 
    

    Not

    Jupyter Python çekirdeği ipykernel algılanmazsa VS Code sizden bunu yüklemenizi ister.

Yeni Jupyter Notebook oluşturma

  1. VS Code'da Komut paleti Görüntüle'yi > ve ardından Oluştur: Yeni Jupyter Notebook'yi seçin.
  2. Sağ üst kısımda VS Code, not defteri için seçilen ve sanal Python ortamın Python sürümünü algılar ve görüntüler. Birden çok Python ortamınız varsa, sağ üst kısımdaki çekirdek seçiciyi kullanarak bir çekirdek seçmeniz gerekebilir. Ortam algılanmadıysa kurulum bilgileri için VS Code'da Jupyter Notebooks bölümüne bakın.

Gerekli içeri aktarmaları yükleme

Not defterinizin ilk hücresinde, gerekli içeri aktarmaları yüklemek için aşağıdaki kodu çalıştırın:

import azure.quantum
from azure.quantum.cirq import AzureQuantumService

Azure Quantum hizmetine bağlanma

Azure Quantum hizmetine bağlanmak için programınızın kaynak kimliğine ve Azure Quantum çalışma alanınızın konumuna ihtiyacı vardır. Azure hesabınızda oturum açın, https://portal.azure.comAzure Quantum çalışma alanınıza gidin ve üst bilgiden değerleri kopyalayın.

Azure Quantum çalışma alanından kaynak kimliğini ve konumunu alma

Yeni bir hücre ekleyin ve hesap bilgilerinizi kullanarak Azure Quantum çalışma alanınıza bağlanmak üzere nesneler AzureQuantumService oluşturunWorkspace.

workspace = Workspace(  
    resource_id = "", # Add the resourceID of your workspace
    location = "" # Add the location of your workspace (for example "westus")
    )

service = AzureQuantumService(workspace)

Tümünü listele targets

targets()Geçerli kuyruk süresi ve kullanılabilirlik dahil olmak üzere çalışma alanınızda bağlantı hattınızı çalıştırabilen tüm targets alanları listelemek için yöntemini kullanın.

Not

targets Çalışma alanınızdakilerin tümü listelenmeyebilir; burada yalnızca targets Cirq veya OpenQASM bağlantı hattını kabul edebilenler listelenir.

print(service.targets())
[<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>,
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>,
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>,
<Target name="ionq.qpu", avg. queue time=229 s, Available>,
<Target name="ionq.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

Basit bağlantı hattı oluşturma

Ardından, çalıştırmak için basit bir Cirq devresi oluşturun. Bu bağlantı hattı, IonQ donanım sisteminde yerel olan X geçidinin karekökünü kullanır.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

Programınızı çalıştırmak için bir target seçin

IonQ simülatöründe çalıştırma

Artık programı Azure Quantum hizmeti aracılığıyla çalıştırabilir ve sonucu alabilirsiniz. Aşağıdaki hücre, bağlantı hattını 100 çekimle çalıştıran bir işi (varsayılan IonQ simülatörüne) gönderir, işin tamamlanmasını bekler ve sonuçları döndürür.

result = service.run(program=circuit, repetitions=100, target="ionq.simulator")

Bu, bir cirq.Result nesnesi döndürür.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

İş maliyetini tahmin

QPU'da bir işi çalıştırmadan önce çalıştırmanın maliyetini tahmin edebilirsiniz. QPU'da bir işi çalıştırmanın maliyetini tahmin etmek için yöntemini kullanabilirsiniz estimate_cost :

cost = service.estimate_cost(
    program=circuit,
    repetitions=100,
    target="ionq.qpu"
)

print(f"Estimated cost: {cost.estimated_total}")

Bu, tahmini maliyeti ABD doları cinsinden yazdırır.

En güncel fiyatlandırma ayrıntıları için IonQ Fiyatlandırması'na bakın veya çalışma alanınızı bulun ve fiyatlandırma seçeneklerini şu adres aracılığıyla çalışma alanınızın "Sağlayıcı" sekmesinde görüntüleyin: aka.ms/aq/myworkspaces.

IonQ QPU üzerinde çalıştırma

Önceki iş varsayılan simülatörde çalıştırmıştı: "ionq.simulator". Ancak, bunu IonQ'nun donanım işlemcisinde ( Kuantum İşlemci Birimi (QPU) da çalıştırabilirsiniz. IonQ QPU üzerinde çalıştırmak için bağımsız değişken olarak sağlayın "ionq.qpu"target :

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

Bu da bir cirq.Result nesnesi döndürür.

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

İşleri kullanan zaman uyumsuz model

Uzun süre çalışan devreler için bunları zaman uyumsuz olarak çalıştırmak yararlı olabilir. service.create_job yöntemi, iş başarıyla çalıştırıldıktan sonra sonuçları almak için kullanabileceğiniz bir Job nesnesi döndürür.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

İş durumunu denetlemek için kullanın job.status():

print(job.status())
'completed'

İşin tamamlanmasını bekleyip sonuçları almak için engelleme çağrısını job.results()kullanın:

result = job.results()
print(result)
00: 0.5
11: 0.5

Bunun bir cirq.Result nesne döndürmediğini unutmayın. Bunun yerine, IonQ simülatörüne özgü bir sonuç nesnesi döndürür ve çekim verileri yerine durum olasılıklarını kullanır.

type(result)
cirq_ionq.results.SimulatorResult

Bunu bir cirq.Result nesneye dönüştürmek için kullanın result.to_cirq_result():

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

Önkoşullar

Çalışma alanınızda yeni not defteri oluşturma

  1. Azure portal oturum açın ve önceki adımdan çalışma alanını seçin.
  2. Sol dikey pencerede Not Defterleri'ni seçin.
  3. Not Defterlerim'e ve yeni ekle'ye tıklayın.
  4. Dosya için Cirq.ipynb gibi bir ad yazın ve Dosya oluştur'a tıklayın.

Yeni not defteriniz açıldığında, aboneliğinize ve çalışma alanı bilgilerinize göre ilk hücrenin kodunu otomatik olarak oluşturur.

from azure.quantum import Workspace
workspace = Workspace ( 
  resource_id = "", # Add your resource_id 
  location = ""  # Add your workspace location (for example, "westus") 
)

Not

Aksi belirtilmediği sürece, derleme sorunlarını önlemek için her hücreyi oluştururken sırayla çalıştırmanız gerekir.

Kodu çalıştırmak için hücrenin solundaki üçgen "oynat" simgesine tıklayın.

Gerekli içeri aktarmaları yükleme

İlk olarak ek bir modülü içeri aktarmanız gerekir.

+ Kod'a tıklayarak yeni bir hücre ekleyin ve aşağıdaki kodu ekleyin ve çalıştırın:

from azure.quantum.cirq import AzureQuantumService

Azure Quantum hizmetine bağlanma

Ardından, Azure Quantum çalışma alanınıza bağlanmak için önceki hücredeki nesneyi kullanarak workspace bir AzureQuantumService nesne oluşturun. Aşağıdaki kodla yeni bir hücre ekleyin:

provider = AzureQuantumService(workspace)

Basit bir devre tanımlama

Ardından, çalıştırmak için basit bir Cirq bağlantı hattı oluşturun. Bu bağlantı hattı, IonQ donanım sisteminde yerel olan X geçidinin karekökünü kullanır.

import cirq

q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.X(q0)**0.5,             # Square root of X
    cirq.CX(q0, q1),              # CNOT
    cirq.measure(q0, q1, key='b') # Measure both qubits
)
print(circuit)
0: ───X^0.5───@───M────────
              │   │
1: ───────────X───M────────

Tümünü listele targets

targets()Geçerli kuyruk süresi ve kullanılabilirlik dahil olmak üzere çalışma alanınızda bağlantı hattınızı çalıştırabilen tüm targets öğeleri listelemek için yöntemini kullanın.

Not

targets Çalışma alanınızdakilerin tümü listelenmeyebilir; burada yalnızca targets Cirq veya OpenQASM bağlantı hattını kabul edebilenler listelenir.

print("This workspace's targets:")
for target in service.targets():
     print(target)
This workspace's targets:
<Target name="quantinuum.qpu.h1-1", avg. queue time=0 s, Degraded>
<Target name="quantinuum.sim.h1-1sc", avg. queue time=1 s, Available>
<Target name="quantinuum.sim.h1-1e", avg. queue time=40 s, Available>
<Target name="ionq.qpu", avg. queue time=229 s, Available>
<Target name="ionq.simulator", avg. queue time=3 s, Available>
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>

Not

tam listesi target çalışma alanınız için farklı olabilir.

Programınızı çalıştırmak için bir target seçin

IonQ simülatöründe çalıştırma

Devrenizi gerçek kuantum donanımında çalıştırmadan önce denetlemek için IonQ simülatörünü ionq.simulatorkullanabilirsiniz.

Aşağıdaki hücre, devreyi 100 çekimle çalıştıran, iş tamamlanana kadar bekleyen ve sonuçları döndüren bir iş gönderir.

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

Bu bir cirq.Result nesne döndürür.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

Sonuçları histogramda çizebilirsiniz:

import pylab as pl

pl.hist(result.data)
pl.ylabel("Counts")
pl.xlabel("Result")

İş maliyetini tahmin

Bir işi gerçek kuantum donanımında veya kuantum işleme biriminde (QPU) çalıştırmadan önce çalıştırmanın maliyetini tahmin edebilirsiniz. QPU'da bir işi çalıştırmanın maliyetini tahmin etmek için yöntemini kullanabilirsiniz estimate_cost :

cost = service.estimate_cost(
    program=circuit,
    repetitions=100,
    target="ionq.qpu"
)

print(f"Estimated cost: {cost.estimated_total}")
Estimated cost: 1

Bu, tahmini maliyeti ABD doları cinsinden yazdırır.

En güncel fiyatlandırma ayrıntıları için IonQ Fiyatlandırması'na bakın veya çalışma alanınızın Sağlayıcılar dikey penceresinde fiyatlandırma seçeneklerini görüntüleyin. Geçerli kredi durumunuzu ve kullanımınızı görmek için Krediler ve kotalar'ı seçin.

IonQ QPU üzerinde çalıştırma

Önceki iş varsayılan simülatörde çalıştı. ionq.simulator Ancak, IonQ'nun donanım işlemcisinde veya Kuantum İşlemci Birimi'nde (QPU) da çalıştırabilirsiniz. IonQ QPU üzerinde çalıştırmak için bağımsız değişken olarak şunu target sağlayınionq.qpu:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu",
    timeout_seconds=500 # Set timeout to accommodate queue time on QPU
)

Not

QPU'da bir bağlantı hattını çalıştırmak için gereken süre, geçerli kuyruk sürelerine bağlıdır. Çalışma alanınızın Sağlayıcılar dikey penceresini seçerek ortalama target kuyruk süresini görüntüleyebilirsiniz.

Bu da bir cirq.Result nesne döndürür.

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

İşleri kullanan zaman uyumsuz model

Uzun süre çalışan devreler için bunları zaman uyumsuz olarak çalıştırmak yararlı olabilir. service.create_job yöntemi, iş başarıyla çalıştırıldıktan sonra sonuçları almak için kullanabileceğiniz bir Job nesnesi döndürür.

job = service.create_job(
    program=circuit,
    repetitions=100,
    target="ionq.simulator"
)

İş durumunu denetlemek için kullanın job.status():

print(job.status())
'completed'

İşin tamamlanmasını beklemek ve sonuçları almak için engelleme çağrısını job.results()kullanın:

result = job.results()
print(result)
00: 0.5
11: 0.5

Not

job.results() İşlev bir cirq.Result nesne döndürmez. Bunun yerine IonQ simülatörüne özgü bir sonuç nesnesi döndürür ve çekim verileri yerine durum olasılıklarını kullanır.

type(result)
cirq_ionq.results.SimulatorResult

Bunu bir cirq.Result nesneye dönüştürmek için kullanın result.to_cirq_result():

print(result.to_cirq_result())
b=1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100, 1110101111111110111000011101011111001100010000001011011101001111001111001101100111010000001100011100

Önemli

Tek bir işte birden çok bağlantı hattı gönderme işlemi şu anda desteklenmemektedir. Geçici bir çözüm olarak, her bağlantı hattını zaman uyumsuz olarak göndermek için yöntemini çağırabilir backend.run ve ardından her işin sonuçlarını getirebilirsiniz. Örnek:

jobs = []
for circuit in circuits:
    jobs.append(backend.run(circuit, shots=N))

results = []
for job in jobs:
    results.append(job.result())

Sonraki adımlar