Interaktywne obliczenia kwantowe: sesje

W tym artykule wyjaśniono architekturę interaktywnych obliczeń kwantowych, znanych również jako sesje i sposób tworzenia nowej sesji.

W tym modelu hybrydowych obliczeń kwantowych zasób obliczeniowy klienta może zostać przeniesiony do chmury, co skutkuje mniejszym opóźnieniem i możliwością powtórzenia wykonywania obwodu kwantowego z różnymi parametrami. Zadania można grupować logicznie w jednej sesji, a zadania w tej sesji mogą być priorytetowe dla zadań innych niż sesja. Chociaż stany kubitu nie są utrwalane między zadaniami, sesja umożliwia skrócenie czasu kolejki dla zadań i dłuższych problemów z uruchamianiem.

Interaktywne obliczenia kwantowe

Wymagania wstępne

Aby utworzyć sesję, potrzebne są następujące wymagania wstępne:

Co to jest sesja?

Sesja to logiczne grupowanie co najmniej jednego zadania przesłanego do pojedynczego targetelementu . Każda sesja ma unikatowy identyfikator dołączony do każdego zadania w tej sesji.

Sesje umożliwiają organizowanie wielu zadań obliczeń kwantowych z możliwością uruchamiania klasycznego kodu między zadaniami kwantowymi. Będziesz mieć możliwość uruchamiania złożonych algorytmów w celu lepszego organizowania i śledzenia poszczególnych zadań obliczeń kwantowych.

Kluczowy scenariusz użytkownika, w którym można połączyć zadania w sesji, to sparametryzowane algorytmy kwantowe, w których dane wyjściowe jednego zadania obliczeń kwantowych informują o parametrach 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, obecnie IonQ, Quantinuum i Rigetti. W niektórych przypadkach zadania przesłane w ramach sesji mają priorytet w kolejce tego elementu target. Aby uzyskać więcej informacji, zobacz Zachowanie obiektu docelowego.

Rozpoczynanie pracy z sesjami

Sesje są zarządzane za pomocą języka Python i można je tworzyć dla dowolnego programu kwantowego QIR, w tym Q#programów , Qiskit i Cirq.

W tym przykładzie pokazano, jak utworzyć sesję z Q# wbudowanym kodem przy użyciu Jupyter Notebook w Visual Studio Code. Sesje można również tworzyć przy użyciu programu języka Python , który wywołuje sąsiedni Q# program.

Uwaga

Sesje są zarządzane przy użyciu języka Python, nawet w przypadku uruchamiania Q# kodu wbudowanego.

  1. W programie VS Code wybierz pozycję Wyświetl > paletę poleceń i wybierz pozycję Utwórz: Nowy Jupyter Notebook.

  2. W prawym górnym rogu program VS Code wykryje i wyświetli wersję języka Python oraz wirtualne środowisko języka Python wybrane dla notesu. Jeśli masz wiele środowisk języka Python, może być konieczne wybranie jądra przy użyciu selektora jądra w prawym górnym rogu. Jeśli nie wykryto żadnego środowiska, zobacz Notesy Jupyter Notebook w programie VS Code , aby uzyskać informacje o instalacji.

  3. W pierwszej komórce notesu uruchom polecenie

    import azure.quantum
    
    workspace = azure.quantum.Workspace(
        resource_id = "", # add your resource ID
        location = "", # add your location, for example "westus"
    )
    
  4. Kliknij pozycję + Kod , aby dodać nową komórkę w notesie i zaimportować qsharp zestaw SDK języka Python.

    import qsharp
    
  5. Wybierz wybrany kwant target . W tym przykładzie używasz symulatora IonQ jako target.

    target = workspace.get_targets("ionq.simulator")
    
  6. Wybierz konfiguracje target profilu lub BaseUnrestricted.

    qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Unrestricted
    
  7. Q# Napisz swój 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, , anglejako dane wejściowe.

    %%qsharp
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.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;
    }
    
  8. Następnie utworzysz sesję. Załóżmy, że chcesz uruchomić GenerateRandomBit operację trzy razy, dlatego używasz target.submit metody do przesyłania Q# operacji z target danymi i powtarzasz kod trzy razy — w rzeczywistym scenariuszu możesz przesłać różne programy zamiast tego samego kodu.

    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

    Podczas przekazywania argumentów jako parametrów do zadania są one sformatowane w wyrażeniu Q# podczas wywoływania metody qsharp.compile. Oznacza to, że należy zachować ostrożność, aby sformatować argumenty jako Q# obiekty. W tym przykładzie, ponieważ tablice w języku Python są już drukowane jako [item0, item1, ...], argumenty wejściowe są zgodne z formatowaniem Q# . W przypadku innych struktur danych języka Python może być potrzebna większa obsługa, aby uzyskać wartości ciągów wstawione w Q# zgodny sposób.

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

Sesje monitorowania

Możesz użyć bloku Zarządzanie zadaniami w obszarze roboczym Quantum, aby wyświetlić wszystkie przesłane elementy najwyższego poziomu, w tym sesje i poszczególne zadania, które nie są skojarzone z żadną sesją.

  1. Wybierz blok Zarządzanie zadaniami w obszarze roboczym Quantum.
  2. Zidentyfikuj zadania typu Sesja. W tym widoku można zobaczyć unikatowy identyfikator sesji w identyfikatorze kolumny i monitorować jego stan. Stany sesji to:
    • Oczekiwanie: zadania w ramach sesji są wykonywane.
    • Powodzenie: sesja zakończyła się pomyślnie.
    • Limit czasu: jeśli żadne nowe zadanie nie zostanie przesłane w ramach sesji przez 10 minut, limit czasu tej sesji jest przekroczony. Aby uzyskać więcej informacji, zobacz Limity czasu sesji.
    • Niepowodzenie: jeśli zadanie w sesji zakończy się niepowodzeniem, ta sesja zakończy się i zgłosi stan Niepowodzenie. Aby uzyskać więcej informacji, zobacz Zasady niepowodzenia zadań w ramach sesji.
  3. Kliknij nazwę sesji, aby uzyskać więcej szczegółów.
  4. Listę wszystkich zadań można wyświetlić w ramach sesji i monitorować ich stan.

Zachowanie obiektu docelowego

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

Quantinuum

Jeśli zdecydujesz się przesłać zadania w ramach sesji do kwantynyum target, sesja będzie miała wyłączny dostęp do sprzętu, o ile zadania kolejkujesz w ciągu jednej minuty od siebie. Następnie zadania zostaną zaakceptowane i obsłużone za pomocą standardowej logiki kolejkowania i priorytetyzacji.