Aracılığıyla paylaş


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

Paketini kullanarak Cirq quantum devresi 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.

Önkoşullar

Yükleme ayrıntıları için bkz. QDK uzantısını ayarlama.

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

  • Python ve Pip'inPython.

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

  • [cirq] etiketine ve ve paketlerine azure-quantumqsharp sahip Azure Quantum ipykernel paketi.

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

    Not

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

Yeni bir Jupyter Notebook oluşturma

  1. VS Code'da > Görüntüle'yi ve ardından Oluştur: Yeni Jupyter Not Defteri'ni 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ğ üstteki çekirdek seçiciyi kullanarak bir çekirdek seçmeniz gerekebilir. Ortam algılanmadıysa kurulum bilgileri için VS Code'da Jupyter Not Defterleri 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.

  1. Azure hesabınızda oturum açın, https://portal.azure.com,

  2. Azure Quantum çalışma alanınızı seçin ve Genel Bakış'a gidin.

  3. Alanlardaki parametreleri kopyalayın.

    Quantum Çalışma Alanınızın genel bakış bölmesini genişletmeyi gösteren Visual Studio Code'un ekran görüntüsü.

Yeni bir hücre ekleyin ve hesap bilgilerinizi Workspace kullanarak oluşturma ve AzureQuantumService Nesneleri kullanarak Azure Quantum çalışma alanınıza bağlanın.

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

Çalışma alanınızdakilerin targets tümü listelenmeyebilir; yalnızca targets Cirq veya OpenQASM bağlantı hattını kabul edebilenler burada 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.simulator", avg. queue time=3 s, Available>,
<Target name="ionq.qpu.aria-1", avg. queue time=1136774 s, Available>]

Basit bir 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 sistemine özgü 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, iş tamamlanana kadar bekleyen ve sonuçları döndüren bir iş (varsayılan IonQ simülatörüne) 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

İş maliyetini tahmin

QPU'da bir işi çalıştırmadan önce çalıştırmanın maliyetini tahmin etmelisiniz.

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 ç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 şunu "ionq.qpu.aria-1" sağlayıntarget:

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

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

print(result)
b=0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111, 0101011011011111100001011101101011011110100010000000011110111000100100110110101100110001001111101111

İşler 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

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

  • Etkin aboneliği olan bir Azure hesabı. Azure hesabınız yoksa ücretsiz kaydolun ve kullandıkça öde aboneliğine kaydolun.
  • Azure Quantum çalışma alanı. Daha fazla bilgi için bkz . Azure Quantum çalışma alanı oluşturma.

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

  1. Azure portalında oturum açın ve önceki adımda ç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 AzureQuantumService bir workspace nesne oluşturun. Aşağıdaki koda sahip yeni bir hücre ekleyin:

provider = AzureQuantumService(workspace)

Basit bir bağlantı hattı tanımlama

Ardından, çalıştırmak için basit bir Cirq devresi oluşturun. Bu bağlantı hattı, IonQ donanım sistemine özgü 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 alanları listelemek için yöntemini kullanın.

Not

Çalışma alanınızdakilerin targets tümü listelenmeyebilir; yalnızca targets Cirq veya OpenQASM bağlantı hattını kabul edebilenler burada 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.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 100 çekimle bağlantı hattını çalıştıran bir iş gönderir, iş tamamlanana kadar bekler ve sonuçları döndürür.

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 etmelisiniz.

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ırmış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 ionq.qpu.aria-1 sağlayıntarget:

result = service.run(
    program=circuit,
    repetitions=100,
    target="ionq.qpu.aria-1",
    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ılartargetiçin ortalama kuyruk süresini görüntüleyebilirsiniz.

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

print(result)
    b=1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010, 1001100101100001000011011101000011010100010111100011001000100100010000001110010010101110110000011010

İşler 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ının gönderilmesi ş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. Örneğin:

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

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