Sdílet prostřednictvím


Začínáme s relacemi

Sezení jsou klíčovou součástí hybridních kvantových výpočtů, která umožňuje seskupit několik úkolů kvantových výpočtů. Relace je logické seskupení jedné či více úloh, které odešlete do jednoho target. Každá relace má jedinečné ID připojené ke každé úloze v této relaci. Relace jsou užitečné, když chcete spouštět několik úloh kvantových výpočtů v sekvenci a mezi kvantovými úlohami spouštět klasický kód.

Tento článek vysvětluje architekturu relací v hybridních kvantových výpočtech a způsob vytvoření nové relace v Azure Quantum.

Požadavky

K vytvoření relace potřebujete následující požadavky:

Co je relace?

V relacích můžete přesunout výpočetní zdroje klienta do cloudu pro nižší latenci a možnost spustit váš kvantový program opakovaně s různými parametry. Úlohy můžete logicky seskupit do jedné relace a upřednostnit úlohy v této relaci před úlohami, které nejsou relacemi. Stavy qubitů se mezi úlohami neuchovávají, ale úlohy v rámci relace mají kratší čekací dobu. Kratší doby fronty umožňují spouštět složité algoritmy, abyste mohli lépe organizovat a sledovat jednotlivé úlohy kvantového computingu.

Sezení jsou užitečná pro parametrizované kvantové algoritmy, kde se výstup jedné úlohy kvantových výpočtů používá k definování vstupních parametrů pro další úlohu kvantových výpočtů. Nejběžnějšími příklady tohoto typu algoritmu jsou Variational Quantum Eigensolvers (VQE) a Quantum Approximate Optimization Algorithms (QAOA).

Podporovaný hardware

Sezení jsou podporována u všech poskytovatelů kvantového výpočetního hardwaru. V některých případech se úlohy odeslané v rámci seance upřednostňují ve frontě tohoto prvku target. Další informace naleznete v tématu Cílové chování.

Jak vytvořit relaci

Pokud chcete vytvořit relaci, postupujte takto:

Tento příklad ukazuje, jak vytvořit relaci s Q# vloženým kódem v poznámkovém Jupyter bloku v VS Code.

Poznámka:

Relace se spravují pomocí Python, i když běží Q# vložený kód.

  1. V VS Code otevřete nabídku Zobrazit a zvolte Paleta příkazů.

  2. Zadejte a vyberte Vytvořit: Nový Jupyter Notebook.

  3. 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í.

  4. V první buňce poznámkového bloku spusťte následující kód:

    from qdk.azure import Workspace
    
    workspace = Workspace(resource_id="") # add your resource ID
    
  5. Přidejte do poznámkového bloku novou buňku qsharpPython a naimportujte balíček:

    from qdk import qsharp
    
  6. Zvolte své kvantovétarget. V tomto příkladu target je simulátor IonQ.

    target = workspace.get_targets("ionq.simulator")
    
  7. Vyberte konfigurace target profilu, buď Base, Adaptive_RInebo Unrestricted.

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    

    Poznámka:

    Adaptive_RI target profilové úlohy jsou v současné době podporovány v Quantinuum targets. Další informace najdete v tématu Integrované hybridní kvantové výpočty.

  8. Napište svůj Q# program. Například následující Q# program vygeneruje náhodný bit. Chcete-li ilustrovat použití vstupních argumentů, tento program přebírá celé číslo na pole úhlů , anglejako vstup.

    %%qsharp
    import Std.Measurement.*;
    import Std.Arrays.*;
    
    operation GenerateRandomBits(n: Int, angle: Double[]) : Result[] {
       use qubits = Qubit[n]; // n parameter as the size of the qubit array
       for q in qubits {
           H(q);
       }
       R(PauliZ, angle[0], qubits[0]); // arrays as entry-points parameters
       R(PauliZ, angle[1], qubits[1]);
       let results = MeasureEachZ(qubits);
       ResetAll(qubits);
       return results;
    }
    
  9. Dále vytvoříte relaci. Řekněme, že chcete operaci spustit GenerateRandomBit třikrát, takže použijete target.submit k odeslání Q# operace s target daty a třikrát zopakujete kód – ve skutečném scénáři můžete chtít místo stejného kódu odeslat různé programy.

    angle = [0.0, 0.0]
    with target.open_session(name="Q# session of three jobs") as session:
        target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 1", shots=100) # First job submission
        angle[0] += 1
        target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 2", shots=100) # Second job submission
        angle[1] += 1
        target.submit(input_data=qsharp.compile(f"GenerateRandomBits(2, {angle})"), name="Job 3", shots=100) # Third job submission
    
    session_jobs = session.list_jobs()
    [session_job.details.name for session_job in session_jobs]
    

    Důležité

    Když do úlohy předáte argumenty jako parametry, argumenty se při zavolání naformátují do výrazu Q#qsharp.compile . To znamená, že potřebujete naformátovat argumenty jako Q# objekty. V tomto příkladu, protože pole v Python jsou již vytištěna jako [item0, item1, ...], vstupní argumenty odpovídají formátování Q#. U jiných Python datových struktur budete možná potřebovat více zpracování, abyste získali řetězcové hodnoty vložené do Q# kompatibilním způsobem.

  10. Po vytvoření relace můžete pomocí workspace.list_session_jobs načíst seznam všech úloh v relaci. Další informace naleznete v tématu Správa relací.

Zamýšlené chování

Každý poskytovatel kvantového hardwaru definuje vlastní heuristiku, která nejlépe spravuje stanovení priorit úloh v rámci relace.

Quantinuum

Zvolíte-li odesílání úloh v rámci relace do Quantinuum target, vaše relace získá výhradní přístup k hardwaru, za předpokladu, že úlohy zadáte do fronty do jedné minuty od sebe. Potom se vaše úlohy přijímají a zpracovávají pomocí standardní logiky fronty a stanovení priority.