Udostępnij przez


Wprowadzenie do sesji

Sesje to kluczowa funkcja hybrydowych obliczeń kwantowych, które umożliwiają grupowanie wielu zadań obliczeniowych kwantowych. 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 są przydatne, gdy chcesz uruchamiać wiele zadań obliczeń kwantowych w sekwencji, z możliwością uruchamiania klasycznego kodu między zadaniami kwantowymi.

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 Azure Quantum roboczy. Aby uzyskać więcej informacji, zobacz Tworzenie obszaru roboczegoAzure Quantum.

  • Środowisko Python z zainstalowanym Python i Pip.

  • Biblioteka qdkPython . Jeśli chcesz użyć Qiskit lub Cirq, musisz zainstalować dodatki azure i qiskit.

    pip install --upgrade qdk
    

    lub

    pip install --upgrade "qdk[azure,qiskit]" 
    

Co to jest sesja?

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 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# kodem wbudowanym przy użyciu Jupyter Notebook w Visual Studio Code (VS Code). Sesje można również tworzyć przy użyciu Python programu , który wywołuje sąsiadujący Q# program.

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
        location = "", # add your location, for example "westus"
    )
    
  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) # or qsharp.TargetProfile.Adaptive_RI, qsharp.TargetProfile.Unrestricted
    

    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 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

    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żna pobrać workspace.list_session_jobs listę wszystkich zadań w 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.