Начало работы с сеансами

Сеансы являются ключевым компонентом гибридных квантовых вычислений. Сеанс — это логическая группировка одного или нескольких заданий, которые вы отправляете в один target. Каждый сеанс имеет уникальный идентификатор, подключенный к каждому заданию в этом сеансе. Сеансы полезны при выполнении нескольких заданий квантовых вычислений в последовательности и выполнении классического кода между квантовыми заданиями.

Примечание.

Задания группы сеансов для отправки от Azure Quantum поставщика, но задания в сеансе не пакетируются на стороне поставщика.

Предварительные условия

Чтобы создать сеанс, необходимо выполнить следующие предварительные требования:

Что такое сеанс?

В сеансах вы можете переместить вычислительный ресурс клиента в облако для снижения задержки и возможность многократного выполнения квантовой программы с разными параметрами. Вы можете логически сгруппировать задания в один сеанс, и вы можете определить приоритеты заданий в этом сеансе по сравнению с заданиями, отличными от сеанса. Состояния Кубита не сохраняются между заданиями, но задания в сеансе имеют более короткое время очереди. Более короткое время очереди позволяет выполнять сложные алгоритмы для более эффективной организации и отслеживания отдельных заданий квантовых вычислений.

Сеансы полезны для параметризованных квантовых алгоритмов, где выходные данные одного задания квантовых вычислений используются для определения входных параметров для следующего задания квантовых вычислений. Наиболее распространенными примерами этого типа алгоритма являются Variational Quantum Eigensolvers (VQE) и Quantum Approximate Optimization Algorithms (QAOA).

Поддерживаемое оборудование

Сеансы поддерживаются для всех поставщиков оборудования квантовых вычислений. В некоторых случаях задания, отправленные в сеансе, приоритизируются в очереди этого target. Дополнительные сведения см. в разделе "Поведение целевого объекта".

Создание сеанса

Чтобы создать сеанс, выполните следующие действия.

В этом примере показано, как создать сеанс с использованием встроенного кода Q# в записной книжке Jupyter на платформе VS Code.

Примечание.

Сеансы управляются с помощью Python, даже если выполняется встроенный код Q#.

  1. Откройте VS Codeменю "Вид " и выберите палитру команд.

  2. Введите и нажмите кнопку "Создать:".Jupyter Notebook

  3. В правом верхнем углу VS Code определит и отобразит версию Python и виртуальной среды Python, выбранной для записной книжки. Если у вас несколько Python сред, может потребоваться выбрать ядро с помощью средства выбора ядра в правом верхнем углу. Если среда не была обнаружена, смотрите сведения о настройке в Jupyter Notebook.

  4. В первой ячейке записной книжки выполните следующий код:

    from qdk.azure import Workspace
    
    workspace = Workspace(resource_id="") # add your resource ID
    
  5. Добавьте новую ячейку в записную книжку qsharpPython и импортируйте пакет:

    from qdk import qsharp
    
  6. Выберите квантовый target. В этом примере target используется симулятор IonQ.

    target = workspace.get_targets("ionq.simulator")
    
  7. Выберите конфигурации target профиля либо Base, Adaptive_RIлибо Unrestricted.

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

    Примечание.

    Adaptive_RI target Задания профилей в настоящее время поддерживаются в Quantinuum targets. Дополнительные сведения см. в разделе "Интегрированные гибридные квантовые вычисления".

  8. Напишите вашу программу Q#. Например, следующая Q# программа создает случайный бит. Чтобы проиллюстрировать использование входных аргументов, эта программа принимает целое число nи массив углов, angleв качестве входных данных.

    %%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. Затем вы создадите сеанс. Предположим, вы хотите выполнить GenerateRandomBit операцию три раза, поэтому вы используете target.submit для отправки Q# операции с target данными, и вы повторяете код три раза - в реальном сценарии, вы можете отправить разные программы вместо одного и того же кода.

    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]
    

    Внимание

    При передаче аргументов в качестве параметров заданию аргументы форматируются в Q# выражение, когда вызывается qsharp.compile. Это означает, что необходимо отформатировать аргументы в виде Q# объектов. В этом примере, так как массивы в Python уже печатаются как [item0, item1, ...], входные аргументы соответствуют форматированию Q#. Для других Python структур данных может потребоваться дополнительная обработка, чтобы строковые значения обрабатывались и вставлялись в Q# совместимым способом.

  10. После создания сеанса можно использовать workspace.list_session_jobs для получения списка всех заданий в сеансе. Дополнительные сведения см. в разделе "Управление сеансами".

Поведение целевого объекта

Каждый поставщик квантового оборудования определяет собственные эвристики для лучшего управления приоритетом заданий в сеансе.

Quantinuum

Если вы решили отправить задания в течение сеанса на Quantinuum target, ваш сеанс имеет монопольный доступ к оборудованию до тех пор, пока вы ставите задания в очередь с интервалом не более одной минуты друг от друга. После этого задания принимаются и обрабатываются с помощью стандартной логики очередей и приоритетов.