Začínáme s relacemi

Relace jsou klíčovou funkcí hybridních 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.

Poznámka:

Relace seskupují úlohy pro odeslání od Azure Quantum poskytovatele, ale úlohy v relaci se neskupují na straně poskytovatele.

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.