Udostępnij za pośrednictwem


Wprowadzenie do sesji

Sesje to kluczowa funkcja hybrydowych obliczeń kwantowych, które umożliwiają grupowanie wielu zadań obliczeniowych kwantowych.

W tym artykule wyjaśniono architekturę sesji w hybrydowych obliczeniach kwantowych oraz sposób tworzenia nowej sesji.

Wymagania wstępne

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

  • Konto platformy Azure z aktywną subskrypcją. Jeśli nie masz konta platformy Azure, zarejestruj się bezpłatnie i zarejestruj się w celu korzystania z subskrypcji z płatnością zgodnie z rzeczywistym użyciem.

  • Obszar roboczy usługi Azure Quantum. Aby uzyskać więcej informacji, zobacz Tworzenie obszaru roboczego usługi Azure Quantum.

  • Środowisko języka Python z zainstalowanym językiem Python i programem .

  • Pakiet Azure Quantum azure-quantum . Jeśli chcesz użyć zestawu Qiskit lub Cirq, musisz zainstalować azure-quantum pakiet przy użyciu tagów [qiskit] lub [cirq].

    pip install --upgrade azure-quantum[qiskit] 
    

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.

W sesjach zasób obliczeniowy klienta może zostać przeniesiony do chmury, co spowoduje mniejsze opóźnienie i możliwość powtarzania wykonywania obwodu kwantowego z różnymi parametrami. Zadania można grupować logicznie w jedną sesję, a zadania w tej sesji mogą być priorytetowe dla zadań innych niż sesja. Chociaż stany kubitu nie utrzymują się między zadaniami, sesja umożliwia skrócenie czasu kolejki dla zadań i dłuższych problemów z uruchamianiem.

Sesje umożliwiają organizowanie wielu zadań przetwarzania kwantowego 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. W niektórych przypadkach zadania przesłane w ramach sesji mają priorytet w kolejce tego targetelementu . Aby uzyskać więcej informacji, zobacz Target zachowanie.

Jak utworzyć sesję

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

W tym przykładzie pokazano, jak utworzyć sesję z Q# kodem wbudowanym przy użyciu notesu Jupyter Notebook w programie Visual Studio Code. Sesje można również tworzyć przy użyciu programu w języku Python, który wywołuje sąsiadujący 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 notes Jupyter.>

  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 środowisko nie zostało wykryte, zobacz Jupyter Notebooks in VS Code (Notesy Jupyter Notebooks w programie VS Code ), aby uzyskać informacje o konfiguracji.

  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 kwanttarget. W tym przykładzie używasz symulatora IonQ jako target.

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

    qsharp.init(target_profile=qsharp.TargetProfile.Base) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted
    

    Uwaga

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

  7. 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;
    }
    
  8. Następnie utworzysz sesję. Załóżmy, że chcesz uruchomić GenerateRandomBit operację trzy razy, dlatego użyjesz target.submit polecenia , 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 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 formatowane w wyrażeniu Q# podczas wywoływania elementu 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.

Target zachowanie

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 ramach sesji do kwantynauum 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.