Comment envoyer des programmes Qiskit à Azure Quantum avec le QDK

Vous pouvez envoyer des programmes Qiskit à exécuter sur Azure Quantum targets avec le Kit de développement Microsoft Quantum (QDK). Vous pouvez également exécuter des programmes Qiskit sur votre machine locale avec le simulateur épars intégré de QDK. Le QDK prend en charge à la fois la version 1 et la version 2 de Qiskit.

Dans cet article, vous allez apprendre à exécuter des programmes Qiskit avec la bibliothèque QDK Python à partir d’un jupyter Notebook dans Visual Studio Code (VS Code).

Remarque

Il est recommandé d’exécuter votre programme quantique sur un simulateur target avant de soumettre un travail à exécuter sur un ordinateur targetquantique. Chaque fournisseur Azure Quantum offre un ou plusieurs simulateurs targetsgratuits.

Prérequis

Pour soumettre des travaux Qiskit à Azure Quantum et exécuter des programmes Qiskit sur le simulateur partiellement alloué local, vous devez disposer des éléments suivants :

  • Un espace de travail Azure Quantum dans votre abonnement Azure. Pour créer un espace de travail, consultez Créer un espace de travail Azure Quantum.

  • Un environnement local Python (version 3.10 ou ultérieure) avec Pip et Python installé.

  • Visual Studio Code (VS Code) avec les extensions PythonJupyter déjà installées.

  • La bibliothèque qdkPython avec les extras azureqiskit et le paquet ipykernel.

    pip install --upgrade "qdk[azure,qiskit]" ipykernel
    

Soumettre un travail à un Azure Quantum dans votre espace de travail Quantum target

Pour soumettre un programme Qiskit à exécuter sur Azure Quantum target, procédez comme suit :

  1. Dans VS Code, ouvrez le menu Affichage et choisissez Palette de commandes.

  2. Entrez et sélectionnez Créer : Nouveau bloc-notes Jupyter. Un fichier Jupyter Notebook vide s’ouvre dans un nouvel onglet.

  3. Dans la première cellule de votre bloc-notes, écrivez un circuit Qiskit. Par exemple, utilisez le circuit suivant :

    from qiskit import QuantumCircuit
    
    # Create a Quantum circuit that acts on the q register
    circuit = QuantumCircuit(3, 3)
    circuit.name = "Qiskit Sample - 3-qubit GHZ circuit"
    circuit.h(0)
    circuit.cx(0, 1)
    circuit.cx(1, 2)
    circuit.measure([0, 1, 2], [0, 1, 2])
    
    # Print out the circuit
    circuit.draw()
    
  4. Connectez-vous à votre espace de travail Azure Quantum.

    from qdk.azure import Workspace 
    
    workspace = Workspace(resource_id="") # Add the resource ID of your workspace
    
  5. Obtenez les fournisseurs de votre espace de travail qui peuvent exécuter des programmes Qiskit et affichez les éléments disponibles targets pour chaque fournisseur.

    from qdk.azure.qiskit import AzureQuantumProvider
    
    provider = AzureQuantumProvider(workspace)
    
    for backend in provider.backends():
        print("- " + backend.name)
    
  6. Définissez le back-end Azure Quantum avec celui target auquel vous souhaitez soumettre votre travail. Par exemple, le code suivant configure un back-end pour exécuter votre programme sur le simulateur Rigetti :

    backend = provider.get_backend('rigetti.sim.qvm')
    
  7. Exécutez votre programme sur Azure Quantum target et obtenez les résultats. Le code suivant exécute 1 000 captures de votre programme sur le fichier spécifié target et stocke les résultats :

    job = backend.run(circuit, shots=1000)
    
    result = job.result()
    print(result)
    

Examiner les résultats de votre travail

L’objet result contient des informations sur les résultats de votre tâche, telles que le résultat de mesure pour chaque essai, ainsi que les comptes totaux et les probabilités pour chaque mesure possible.

Pour créer un histogramme des résultats de mesure, passez votre circuit à la get_counts méthode, puis transmettez les nombres à la plot_histogram fonction à partir du qiskit.visualization module. Le code suivant reformat l’objet counts pour afficher tous les résultats de mesure possibles :

from qiskit.visualization import plot_histogram

print("Job ID:", job.job_id())

counts = result.get_counts(circuit)
print('Counts:', counts)

# Reformat counts to include all possible measurement outcomes, even those with zero counts
full_counts = {format(n, "03b"): 0 for n in range(8)}
full_counts.update(counts)

plot_histogram(full_counts)

Remarque

Pour utiliser la plot_histogram fonction à partir de Qiskit, vous devez installer Matplotlib.

pip install matplotlib

Résultats des tâches Qiskit pour les programmes avec perte de qubit

Certains types de matériel quantique peuvent subir une perte de qubit pendant une exécution du programme. Si la perte de qubit se produit à un moment quelconque pendant une capture pour un programme Qiskit, cette capture est supprimée des résultats du travail Azure Quantum. Par exemple, si la perte de qubit se produit dans 10 sur 200 essais, les résultats du travail n’ont que 190 comptes de mesures totales.

Les résultats bruts de toutes les captures, y compris les plans où la perte de qubit s’est produite, sont toujours disponibles dans l’objet results . Le code suivant obtient les deux ensembles de résultats :

# Get results only for shots without qubit loss
print('Counts:', result.results[0].data.counts)
print('Probabilities:', result.results[0].data.probabilities)
print('Memory:', result.results[0].data.memory)

# Get the raw total shot results
print('Raw counts:', result.results[0].data.raw_counts)
print('Raw probabilities:', result.results[0].data.raw_probabilities)
print('Raw memory:', result.results[0].data.raw_memory)

Pour les travaux ou targets qui n’ont pas de perte de qubit, les résultats par défaut et les résultats bruts sont identiques.

Remarque

L’attribut memory pour les résultats de tâche Qiskit est une liste des résultats de mesure pour chaque tir.

Exécuter une tâche sur le simulateur épars du QDK.

Le QDK inclut un simulateur sparse intégré que vous pouvez utiliser pour exécuter des programmes Qiskit sur votre machine locale, au lieu de soumettre un travail à Azure Quantum. Pour exécuter un programme Qiskit sur le simulateur clairsemé, utilisez QSharpBackend pour créer une instance d’un objet backend.

from qsharp.interop.qiskit import QSharpBackend

backend = QSharpBackend()
job = backend.run(circuit)
counts = job.result().get_counts()
print(counts)

Étapes suivantes