Jak odesílat Q# programy pomocí Visual Studio Code

Naučte se používat Visual Studio Code (VS Code) k vytváření a odesílání Q# programů do skutečného kvantového hardwaru. Úlohy kvantového computingu můžete odeslat do Azure Quantum jako samostatný Q# program, kombinovat Q# s Python v projektu Q# a spustit Jupyter Notebook.

Q# Odesílání úloh doAzure Quantum

Naučte se používat VS Code ke spouštění, ladění a odesílání Q# programu do Azure Quantum.

Požadavky

Podrobnosti o instalaci najdete v QDK tématu Nastavení rozšíření.

Načtení ukázkového Q# programu

  1. V VS Code vyberte Soubor > Nový textový soubor a uložte soubor jako RandomNum.qs.

  2. Otevřete RandomNum.qs a zadejte sample, pak vyberte náhodný bit vzorek ze seznamu možností a uložte soubor.

    Snímek obrazovky se souborem Q#Visual Studio Code zobrazujícím seznam ukázek kódu při psaní ukázky slova v souboru

Poznámka:

Můžete také otevřít vlastní Q# soubor. Pokud spustíte starší Q# program a narazíte na chyby, přečtěte si téma Testování a ladění.

Spusťte program Q#

  1. Pokud chcete program otestovat místně na integrovaném simulátoru, klikněte na Spustit ze seznamu příkazů vedle operace vstupního bodu nebo stiskněte Kombinaci kláves Ctrl + F5. Výstup se zobrazí v konzole ladění.

  2. Pro ladění programu před jeho odesláním do Azure Quantum klikněte na Ladit ze seznamu příkazů vedle vstupního bodu nebo stiskněte klávesu F5. Pomocí ovládacích prvků ladění v horní části můžete krokovat přes, vstoupit do a vystoupit z kódu. Další informace o ladění Q# programů naleznete v tématu Testování a ladění.

    Q# Snímek obrazovky z Visual Studio Code ukazující, kde najít code lens s příkazy

Vizualizace histogramu četnosti

Histogram frekvence představuje distribuci výsledků získaných z vícenásobného spuštění kvantového programu nebo "záběrů". Každý pruh v histogramu odpovídá možnému výsledku a jeho výška představuje počet pozorovaných výsledků. Histogram četnosti pomáhá vizualizovat rozdělení pravděpodobnosti těchto výsledků.

  1. Vyberte Zobrazit –> Paleta příkazů a zadejte histogram, který vyvolá příkaz QDKSpustit soubor a zobrazit histogram. Také můžete zvolit Histogram ze seznamu příkazů, které předchází operaci vstupního bodu. Tuto možnost vyberte, pokud chcete otevřít okno histogramu Q# .

    Pořiďte snímek obrazovky souboru Q# v Visual Studio Code znázorňujícího, kde najít code lens pomocí příkazu histogramu.

  2. Zadejte počet snímků pro spuštění programu, například 100 snímků, a stiskněte Enter. Histogram se zobrazí v okně histogramu Q# .

  3. Kliknutím na ikonu nastavení vlevo nahoře zobrazíte možnosti.

    Snímek obrazovky s oknem histogramu Q#Visual Studio Code znázorňující, jak zobrazit nastavení

  4. Kliknutím na pruh zobrazíte procento tohoto výsledku. V tomto případě existují dva možné výsledky, 0 a 1 a procento každého výsledku se blíží 50 %.

    Snímek obrazovky s oknem histogramu Q# v souboru Visual Studio Code.

Návod

Histogram můžete přiblížit pomocí kolečka myši nebo gesta trackpadu. Při přiblížení můžete graf posunout stisknutím klávesy Alt při posouvání.

Vizualizace kvantového okruhu

Diagramy kvantových obvodů představují vizuální znázornění kvantových operací. Zobrazují tok qubitů v kvantovém programu, včetně použitých bran a měření. Další informace naleznete v Diagramy kvantových obvodů v Visual Studio Code.

  1. Vyberte Zobrazit –> Paleta příkazů a napište circuit, který zobrazí příkaz QDK: Zobrazit okruh. Můžete také vybrat Circuit z CodeLens nad operací vstupního bodu.

  2. Okruh je zobrazen v okně Q#. Diagram okruhu znázorňuje jeden qubitový registr, který je inicializován do stavu |0⟩. Pak se na qubit použije brána Hadamard, H, následovaná měřicí operací, která je znázorněna symbolem měřiče. Další informace najdete v tématu Konvence kvantových obvodů.

    Snímek obrazovky okna okruhu Q# znázorňující výsledný diagram okruhu pro náhodnou bitovou operaci

Připojte se k Azure Quantum a odešlete svou úlohu.

Úlohy můžete připojit a odeslat přímo z VS Codeaplikace . V tomto příkladu odešlete úlohu do simulátoru Rigetti.

  1. Vyberte Zobrazit –> Paleta příkazů a zadejte QDK: Připojit se k Azure Quantum pracovnímu prostoru. Stiskněte klávesu Enter.

  2. Vyberte Azure účet a podle pokynů se připojte k preferovanému adresáři, předplatnému a pracovnímu prostoru.

    Poznámka:

    Pokud máte připojovací řetězec, můžete vybrat Připojovací řetězec a vložit připojovací řetězec odpovídající vašemu Azure Quantum pracovnímu prostoru. Další informace najdete v tématu Připojení k pracovnímu prostoru Quantum pomocí připojovacího řetězce.

  3. Po připojení rozbalte v podokně PrůzkumníkaQuantum Workspaces.

  4. Rozšiřte svůj pracovní prostor a rozbalte poskytovatele Rigetti.

    Poznámka:

    Pokud dojde k Azure Quantumproblému s připojením, zobrazí se vedle názvu pracovního prostoru ikona upozornění. Najeďte myší na název pracovního prostoru, aby se zobrazily informace o chybě.

  5. Vyberte rigetti.sim.qvm jako svůj target.

    Snímek obrazovky znázorňující Visual Studio Code , jak vybrat simulátor Rigetti jako target.

  6. Výběrem ikony přehrávání napravo od target názvu zahájíte odesílání aktuálního Q# programu.

    Snímek obrazovky znázorňující Visual Studio Code , jak spustit simulátor Rigetti jako target.

  7. Přidejte název pro identifikaci úlohy.

  8. Přidejte počet snímků nebo počet spuštění programu.

  9. Stisknutím klávesy Enter odešlete úlohu. Stav úlohy se zobrazí v dolní části obrazovky.

  10. Rozbalte úlohy a najeďte myší na úlohu, která zobrazuje časy a stav vaší úlohy.

  11. Pokud chcete zobrazit výsledky, vyberte ikonu cloudu vedle názvu úlohy, abyste si stáhli výsledky z úložiště pracovního prostoru a zobrazili ho v VS Code.

    Snímek obrazovky znázorňující Visual Studio Code , jak stáhnout a zobrazit výsledky kvantové úlohy

Odeslat úlohy na Azure Quantum z Jupyter Notebook

Naučte se používat VS Code ke spuštění, ladění a odeslání souboruQ#Jupyter NotebookAzure Quantum.

Požadavky

Podrobnosti o instalaci najdete v QDK tématu Nastavení rozšíření.

Spuštění a otestování programu v místním simulátoru

  1. V VS Code, vyberte Zobrazit > příkazový panel a vyberte Vytvořit: Nový Jupyter Notebook.

  2. V pravém horním rohu VS Code rozpozná a zobrazí verzi Python a virtuální Python prostředí, které byly vybrány pro poznámkový blok. Pokud máte více Python prostředí, možná budete muset vybrat jádro pomocí nástroje pro výběr jádra v pravém horním rohu. Pokud nebylo zjištěno žádné prostředí, přečtěte siJupyter NotebookVS Code informace o nastavení.

  3. V první buňce poznámkového bloku spusťte následující Python kód a naimportujte potřebné moduly:

    from qdk import qsharp
    import qdk.azure
    
    • Modul qdk.qsharp aktivuje %%qsharp magický příkaz, který umožňuje zadat Q# kód přímo do buňky.
    • Tento qdk.azure modul poskytuje připojení k vašemu Azure Quantum pracovnímu prostoru.

    Poznámka:

    Jupyter Python Pokud se jádro ipykernel nerozpoznalo, VS Code zobrazí se výzva k jeho instalaci.

  4. Přidejte další buňku a zadejte tento Q# kód, který vrátí počet náhodných bitů zadaný uživatelem:

    Poznámka:

    Všimněte si, že jakmile zadáte příkaz %%qsharpmagic, typ buňky poznámkového bloku se změní z Python na Q#.

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            results += [r];
        }
        return results
    }
    
  5. K otestování operace můžete použít metodu eval , která může volat jakoukoli Q# operaci, která byla dříve definovaná v poznámkovém bloku:

    qsharp.eval("RandomNBits(4)")
    
    [Zero, One, One, Zero]
    
  6. Ke spuštění programu do místního simulátoru použijte metodu run . Zadejte shots, nebo počet spuštění programu, a simulátor vrátí výsledky jako seznam Python.

    qsharp.run("RandomNBits(4)", shots=10)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

Vizualizace kvantového okruhu

Kvantové okruhy můžete vizualizovat pomocí modulu qdk.widgets. Tento modul poskytuje widget, který vykresluje diagram kvantového obvodu jako obrázek SVG. Další informace naleznete v tématu Kvantové diagramy obvodů s Jupyter Notebook.

Přidejte do nové buňky následující kód pro vizualizaci okruhu:

from qdk.qsharp import circuit
from qdk.widgets import Circuit

Circuit(circuit("RandomNBits(4)"))

Snímek obrazovky Jupyter Notebook, který ukazuje, jak vizualizovat obvod pro operaci Q#.

Další informace najdete v tématu Konvence kvantových obvodů.

Kompilujte vaši úlohu pomocí základního profilu

Při spouštění programů v místním kvantovém simulátoru můžete odeslat libovolný typ Q# programu. Azure Quantum Hardware targets ale zatím nepodporuje všechny možnosti potřebné ke spuštění všech Q# programů. Abyste mohli kompilovat a odesílat Q# programy, Azure Quantummusíte nastavit svůj target profil tak, aby bylo možné zjistit Q# , jaké možnosti target hardware podporuje. Aktuálně je to základní profil. Další informace naleznete v tématu Typy profilů v Azure Quantum.

Opětovné inicializace interpreta Q# a kompilace programu pomocí základního profilu:

  1. init K nastavení profilu použijte metodu:

    from qdk import init, TargetProfile
    
    init(target_profile=TargetProfile.Base)
    
  2. Vzhledem k tomu, že jste interpret znovu inicializovali, musíte znovu spustit kód s novým profilem:

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            results += [r];
        }
        return results
    }
    
  3. Dále použijte metodu compile k určení operace nebo funkce, která je vstupním bodem programu. Tento kód se zkompiluje do formátu QIR, který se pak dá odeslat do libovolného kvantového hardwaru:

    from qdk.qsharp import compile
    
    MyProgram = compile("RandomNBits(4)")
    

Připojte se k Azure Quantum a odešlete svou úlohu.

Teď, když máte program zkompilovaný do správného formátu, vytvořte Workspace objekt pro připojení k Azure Quantum. Použijte ID prostředku svého Azure Quantum pracovního prostoru k připojení. Zkopírujte ID prostředku z podokna Přehled ve svém pracovním prostoru na portálu Azure.

  1. V nové buňce vyplňte ID prostředku ze svého pracovního Azure Quantum prostoru:

    from qdk.azure import Workspace
    
    MyWorkspace = Workspace(resource_id="") # Fill in your resource ID
    
  2. get_targets Pomocí této metody můžete zobrazit dostupný hardware targets v pracovním prostoru:

    MyTargets = MyWorkspace.get_targets()
    print("This workspace's targets:")
    MyTargets
    
  3. Vyberte :rigetti.sim.qvmtarget

    MyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")
    
  4. Nakonec pomocí submit metody odešlete program s jeho parametry a zobrazte výsledky:

    job = MyTarget.submit(MyProgram, "MyQuantumJob", shots=100)
    job.get_results()
    
    {'[0, 1, 1, 1]': 0.08,
     '[1, 1, 0, 0]': 0.1,
     '[0, 0, 1, 0]': 0.04,
     '[0, 1, 0, 0]': 0.05,
     '[1, 0, 1, 0]': 0.05,
     '[1, 0, 0, 0]': 0.07,
     '[0, 1, 0, 1]': 0.07,
     '[1, 0, 1, 1]': 0.07,
     '[0, 0, 0, 0]': 0.08,
     '[1, 1, 1, 0]': 0.05,
     '[0, 0, 0, 1]': 0.1,
     '[0, 0, 1, 1]': 0.04,
     '[0, 1, 1, 0]': 0.09,
     '[1, 0, 0, 1]': 0.04,
     '[1, 1, 1, 1]': 0.05,
     '[1, 1, 0, 1]': 0.02}
    
  5. Všechny vlastnosti úlohy jsou přístupné v job.details, například:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0150202e-9638-11ee-be2f-b16153380354', 'name': 'MyQuantumJob', 'provider_id': 'rigetti'...}
    Job name: MyQuantumJob
    Job status: Succeeded
    Job ID: 0150202e-9638-11ee-be2f-b16153380354
    

Další podrobnosti o úloze

Tento qdk.azure modul obsahuje další metody zobrazení podrobnějších dat úlohy.

  • job.get_results_histogram: Tato metoda vrátí slovník výsledků a počet snímků pro každé jedinečné měření. Například výsledky pro předchozí úlohu byly

    print(job.get_results_histogram()) 
    
    {   
        '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 8},  
        '[1, 1, 0, 0]' : {'Outcome' : [1, 1, 0, 0], 'Count' : 10},
        '[0, 0, 1, 0]' : {'Outcome' : [0, 0, 1, 0], 'Count' : 4},
        '[0, 1, 0, 0]' : {'Outcome' : [0, 1, 0, 0], 'Count' : 5},
        '[1, 0, 1, 0]' : {'Outcome' : [1, 0, 1, 0], 'Count' : 5},  
        '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 7},
        '[0, 1, 0, 1]' : {'Outcome' : [0, 1, 0, 1], 'Count' : 7},
        '[1, 0, 1, 1]' : {'Outcome' : [1, 0, 1, 1], 'Count' : 7},
        '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 8},  
        '[1, 1, 1, 0]' : {'Outcome' : [1, 1, 1, 0], 'Count' : 5},
        '[0, 0, 0, 1]' : {'Outcome' : [0, 0, 0, 1], 'Count' : 10},
        '[0, 0, 1, 1]' : {'Outcome' : [0, 0, 1, 1], 'Count' : 4},
        '[0, 1, 1, 0]' : {'Outcome' : [0, 1, 1, 0], 'Count' : 9},  
        '[1, 0, 0, 1]' : {'Outcome' : [1, 0, 0, 1], 'Count' : 4},
        '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 5},
        '[1, 1, 0, 1]' : {'Outcome' : [1, 1, 0, 1], 'Count' : 2}
    }
    
  • job.get_results_shots : Tato metoda vrátí seznam výsledků každého snímku. Například výsledky pro předchozí úlohu byly

    print(job.get_results_shots()) 
    
    [ [0, 1, 1, 1], [1, 0, 1, 1], [0, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 0], [1, 0, 1, 1], [1, 1, 0, 1], ...]
    

Odeslání Python pomocí Q# úloh do Azure Quantum

Naučte se psát VS CodePython program, který volá Q# operace, připojit se pomocí AzurePython příkazů nebo Azure rozhraní příkazového řádku a odeslat úlohu.

Požadavky

Podrobnosti o instalaci najdete v QDK tématu Nastavení rozšíření.

Vytvořte a importujte své operace Q#

V modulu qdk.qsharp můžete ukládat funkce a operace do Q# souborů a vytvářet Q# projekty , které umožňují volání libovolného z nich z Python kódu. To je užitečné hlavně v případě, že potřebujete spustit program, který přebírá vstupní parametry.

  1. Podle pokynů vytvořte Q# projekt.

  2. Otevřete nový textový soubor, přidejte následující Q# kód, který vrátí uživatelem zadaný počet náhodných bitů, a uložte soubor do /src adresáře v projektu jako Source.qs.

        operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            results += [r];
        }
        return results
    }
    
  3. V kořenové složce projektu (se souborem qsharp.json ) otevřete jiný soubor a uložte ho jako randomNum.py.

  4. Přidejte následující kód pro načtení požadovaných importů:

    from qdk import qsharp
    from qdk.azure import Workspace
    
  5. Dále přidejte kód, který definuje Q# kořenovou složku projektu a otestuje target operaci v místním simulátoru. Operace je volána oborem <názvů>.<operation_name( )> a v tomto případě předáváte počet náhodných bitů, které se mají vrátit.

    Poznámka:

    Protože nebyl Source.qszadán žádný obor názvů , kompilátor používá název souboru jako výchozí obor názvů - Source.RandomNBits(). Další informace naleznete v tématu Projekty a implicitní obory názvů.

    qsharp.init(project_root = '../MyProjectRootFolder')
    print(qsharp.eval("Source.RandomNBits(4)"))
    
    [Zero, One, One, Zero]
    
  6. Můžete také otestovat operaci pomocí run metody, která předá další shots parametr, a vrátí výsledky v Python seznamu. Nahraďte v randomNum.py předchozí příkaz print následujícím:

    result = qsharp.run("Source.RandomNBits(4)", shots=10)
    for x in result:
        print(x)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

Kompilujte vaši úlohu pomocí základního profilu

Při spouštění programů v místním kvantovém simulátoru můžete odeslat libovolný typ Q# programu. Azure Quantum Hardware targets ale zatím nepodporuje všechny možnosti potřebné ke spuštění všech Q# programů. Abyste mohli kompilovat a odesílat Q# programy do Azure Quantum, musíte nastavit svůj target profil tak, aby Q# věděl, jaké možnosti váš target hardware podporuje. V současné době se jedná o profil Base nebo profil Adpative_RI. Další informace naleznete v tématu Typy profilů v Azure Quantum.

Poznámka:

Pro Q# pouze programy v VS Code, VS Code nastaví Base profil automaticky.

  1. init K nastavení profilu použijte metodu:

    qsharp.init(project_root = '../MyProjectRootFolder', target_profile=qsharp.TargetProfile.Base)
    

    Poznámka:

    Vzhledem k tomu, že znovu inicializujete qsharp svůj stav, musíte znovu nastavit parametr project_root, aby kompilátor věděl, kde najít operaci RandomNBits. To bylo možné provést také v kroku 5 předchozího postupu.

  2. Pak použijte metodu compile k určení operace nebo funkce, která je vstupním bodem programu. Kompilovaný program je pak možné odeslat do libovolného kvantového hardwaru:

    MyProgram = qsharp.compile("Source.RandomNBits(4)")
    

Připojte se k Azure Quantum a odešlete svou úlohu.

K Azure Quantum se můžete připojit a odeslat úlohu pomocí objektu WorkspacePython nebo se připojit a odeslat úlohu pomocí rozhraní příkazového řádku Azure. Použití Azure rozhraní příkazového řádku vyžaduje, abyste kompilovaný program uložili jako textový soubor a tento soubor odeslali pomocí příkazu rozhraní příkazového řádku.

Teď, když máte program zkompilovaný do správného formátu, vytvořte Workspace objekt pro připojení k Azure Quantum. Použijte ID prostředku svého Azure Quantum pracovního prostoru k připojení. Zkopírujte ID prostředku z podokna Přehled ve svém pracovním prostoru na portálu Azure.

  1. Přidejte následující kód do randomNum.py a vyplňte své ID prostředku z prostoru Azure Quantum workspace:

    workspace = Workspace(resource_id="") # Fill in your resource ID
    
  2. Použijte metodu get_targets k zobrazení dostupného hardwaru targets v pracovním prostoru:

    MyTargets = workspace.get_targets()
    print("This workspace's targets:")
    for x in MyTargets:
        print(x)
    
  3. Vyberte :rigetti.sim.qvmtarget

    MyTarget = workspace.get_targets("rigetti.sim.qvm")
    
  4. Nakonec použijte metodu submit k odeslání programu s jeho parametry. Výsledky úlohy jsou vráceny jako Python slovník.

    job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100)
    results = job.get_results()
    print("\nResults: ", results)
    
  5. Pokud chcete extrahovat jenom hodnoty a zobrazit je:

    for x in results:
        print(x)
    
    [0, 0, 0, 0]
    0.3
    [1, 0, 0, 0]
    0.1
    [1, 1, 1, 1]
    0.3
    [0, 1, 1, 1]
    0.3
    
  6. Všechny vlastnosti úlohy jsou přístupné v job.details, například:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0fc396d2-97dd-11ee-9958-6ca1004ff31f', 'name': 'MyPythonJob', 'provider_id': 'rigetti'...}
    Job name: MyPythonJob
    Job status: Succeeded
    Job ID: fc396d2-97dd-11ee-9958-6ca1004ff31f
    

Další podrobnosti o úloze

Tento qdk.azurePython modul obsahuje další metody zobrazení podrobnějších dat úlohy.

  • job.get_results_histogram(): Tato metoda vrátí slovník výsledků a počet snímků pro každé jedinečné měření. Například výsledky pro předchozí úlohu byly

    results = job.get_results_histogram()
    for x in results.items():
        print(x)
    
    {   
        '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 30},  
        '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 10},
        '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 30},
        '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 30}
    }
    
  • job.get_results_shots() : Tato metoda vrátí seznam výsledků každého snímku. Například výsledky pro předchozí úlohu byly

    print(job.get_results_shots()) 
    
    [ [0, 0, 0, 0], [1, 1, 1, 1], [0, 1, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0], [0, 1, 1, 1], [0, 0, 0, 0], ...]