Zaczynamy z sesjami

Sesje to kluczowa funkcja hybrydowego przetwarzania kwantowego. Sesja to logiczne grupowanie jednego lub większej liczby zadań przesyłanych do jednego target. Każda sesja ma unikatowy identyfikator dołączony do każdego zadania w tej sesji. Sesje są przydatne, gdy chcesz uruchamiać wiele zadań obliczeń kwantowych w sekwencji i uruchamiać klasyczny kod między zadaniami kwantowymi.

Uwaga

Sesje grupowania zadań do przesłania z Azure Quantum do dostawcy, ale zadania w sesji nie są wsadowe po stronie dostawcy.

Wymagania wstępne

Do utworzenia sesji potrzebne są następujące wymagania wstępne:

Co to jest sesja?

W sesjach można przenieść zasób obliczeniowy klienta do chmury w celu uzyskania mniejszego opóźnienia i możliwości wielokrotnego uruchamiania programu kwantowego z różnymi parametrami. Zadania można logicznie pogrupować w jednej sesji i nadać im wyższy priorytet w tej sesji w porównaniu z zadaniami spoza sesji. Stany qubitów nie przechowują się między zadaniami, ale zadania w ramach sesji mają krótszy czas oczekiwania w kolejce. Krótszy czas kolejki umożliwia uruchamianie złożonych algorytmów w celu lepszego organizowania i śledzenia poszczególnych zadań obliczeń kwantowych.

Sesje są przydatne w przypadku sparametryzowanych algorytmów kwantowych, w których dane wyjściowe jednego zadania obliczeń kwantowych są używane do definiowania parametrów wejściowych dla następnego zadania obliczeń kwantowych. Najczęstsze przykłady tego typu algorytmu to Variational Quantum Eigensolvers (VQE) i Quantum Approximate Optimization Algorithms (QAOA).

Obsługiwany sprzęt

Sesje są obsługiwane przez wszystkich dostawców sprzętu obliczeń kwantowych. W niektórych przypadkach zadania przesyłane podczas sesji mają priorytet w kolejce tego target. Aby uzyskać więcej informacji, zobacz Sposób działania obiektu docelowego.

Jak utworzyć sesję

Aby utworzyć sesję, wykonaj następujące kroki:

W tym przykładzie pokazano, jak utworzyć sesję z Q# wbudowanym kodem w notatniku Jupyter w VS Code programie.

Uwaga

Sesje są zarządzane za pomocą Python, nawet podczas uruchamiania kodu Q# w trybie inline.

  1. W VS Codeprogramie otwórz menu Widok i wybierz pozycję Paleta poleceń.

  2. Wprowadź i wybierz pozycję Utwórz: Nowy Jupyter Notebook.

  3. W prawym górnym rogu VS Code zostanie wykryta i wyświetlona wersja Python oraz środowisko wirtualne Python, które zostały wybrane dla notatnika. Jeśli masz wiele Python środowisk, może być konieczne wybranie jądra przy użyciu selektora jądra w prawym górnym rogu. Jeśli środowisko nie zostało wykryte, zobacz Jupyter Notebookw dokumentacji VS Code aby uzyskać informacje o konfiguracji.

  4. W pierwszej komórce notesu uruchom następujący kod:

    from qdk.azure import Workspace
    
    workspace = Workspace(resource_id="") # add your resource ID
    
  5. Dodaj nową komórkę w notebooku i zaimportuj pakiet qsharpPython.

    from qdk import qsharp
    
  6. Wybierz swój kwantowy target. W tym przykładzie target jest to symulator IonQ.

    target = workspace.get_targets("ionq.simulator")
    
  7. Wybierz konfiguracje target profilu , Baselub Adaptive_RIUnrestricted.

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

    Uwaga

    Adaptive_RI target Zadania profilu są obecnie obsługiwane w aplikacji Quantinuum targets. Aby uzyskać więcej informacji, zobacz Zintegrowane hybrydowe obliczenia kwantowe.

  8. Napisz swój Q# program. Na przykład następujący Q# program generuje losowy bit. Aby zilustrować użycie argumentów wejściowych, ten program przyjmuje liczbę całkowitą, ni tablicę kątów, angle, jako dane wejściowe.

    %%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. Następnie utworzysz sesję. Załóżmy, że chcesz uruchomić GenerateRandomBit operację trzy razy, dlatego użyjesz polecenia target.submit, aby przesłać Q# operację z target danymi i powtórzyć kod trzy razy — w rzeczywistym scenariuszu możesz przesłać różne programy zamiast powtarzać ten sam kod.

    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]
    

    Ważne

    Po przekazaniu argumentów jako parametrów do zadania, są one formatowane do wyrażenia Q# w momencie, gdy qsharp.compile jest wywoływany. Oznacza to, że należy sformatować argumenty jako Q# obiekty. W tym przykładzie, ponieważ tablice w pliku Python są już drukowane jako [item0, item1, ...], argumenty wejściowe są zgodne z formatowaniem Q# . W przypadku innych Python struktur danych może być potrzebne dodatkowe przetwarzanie, aby wstawione wartości ciągów pasowały w Q# w sposób zgodny.

  10. Po utworzeniu sesji możesz za pomocą workspace.list_session_jobs pobrać listę wszystkich zadań w tej sesji. Aby uzyskać więcej informacji, zobacz Jak zarządzać sesjami.

Zachowanie docelowe

Każdy dostawca sprzętu kwantowego definiuje własne heurystyki, aby najlepiej zarządzać priorytetyzacji zadań w ramach sesji.

Quantinuum

Jeśli zdecydujesz się przesyłać zadania w sesji do Quantinuum target, sesja ma wyłączny dostęp do sprzętu, o ile zadania kolejkujesz w ciągu jednej minuty od poprzedniego. Następnie zadania są akceptowane i obsługiwane przy użyciu standardowej logiki kolejkowania i priorytetyzacji.