Отправка программ Q# с помощью Visual Studio Code

Узнайте, как использовать Visual Studio Code для создания и отправки программ Q# в реальное квантовое оборудование. Вы можете отправлять задания квантовых вычислений в Azure Quantum как автономную программу Q#, объединить Q# с Python в проекте Q# и запустить Jupyter Notebook.

Отправка заданий Q# в Azure Quantum

Узнайте, как использовать VS Code для запуска, отладки и отправки программы Q# в Azure Quantum.

Необходимые компоненты

Дополнительные сведения об установке см. в разделе "Установка QDK" в VS Code.

Загрузка примера программы Q#

  1. В VS Code выберите > файл создать текстовый файл и сохраните файл как RandomNum.qs.

  2. Откройте RandomNum.qs и введите sample, а затем выберите в списке параметров выборку случайного бита и сохраните файл.

    Снимок экрана: файл Q# в Visual Studio Code с списком примеров кода при написании примера слова в файле.

Примечание.

Вы также можете открыть собственный файл Q# . Если вы запускаете старую программу Q# и выполняете ошибки, см. статью "Тестирование и отладка".

Запуск программы Q#

  1. Чтобы протестировать программу локально на встроенном симуляторе, щелкните "Выполнить " из списка команд рядом с операцией точки входа или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.

  2. Чтобы выполнить отладку программы перед отправкой в Azure Quantum, щелкните "Отладка " в списке команд рядом с операцией точки входа или нажмите клавишу F5. Используйте элементы управления отладки в верхней части, чтобы перейти к коду и выйти из него. Дополнительные сведения об отладке программ Q# см. в разделе "Тестирование и отладка".

    Снимок экрана: файл Q# в Visual Studio Code, показывающий, где найти объектив кода с командами выполнения и отладки.

Визуализация гистограммы частоты

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

  1. Выберите представление —> палитра команд и введите гистограмму, которая должна открыть файл Q#: Запустить файл и отобразить параметр гистограммы . Вы также можете щелкнуть гистограмму из списка команд рядом с операцией точки входа. Выберите этот параметр, чтобы открыть окно гистограммы Q#.

    Снимок экрана: файл Q# в Visual Studio Code, показывающий, где найти объектив кода с помощью команды гистограммы.

  2. Введите несколько снимков для выполнения программы, например 100 выстрелов , и нажмите клавишу ВВОД. Гистограмма будет отображаться в окне гистограммы Q#.

  3. Щелкните значок параметров вверху слева, чтобы отобразить параметры.

    Снимок экрана: окно гистограммы Q# в Visual Studio Code с отображением параметров.

  4. Щелкните панель, чтобы отобразить процент этого результата. В этом случае существует два возможных результата, 0 и 1, а процент каждого результата составляет около 50 %.

    Снимок экрана: окно гистограммы Q# в Visual Studio Code.

Совет

Вы можете увеличить гистограмму с помощью колесика прокрутки мыши или жеста трекпада. При увеличении масштаба диаграмму можно сдвигать, нажав клавиши ALT при прокрутке.

Визуализация квантового канала

Схемы квантовых каналов — это визуальное представление квантовых операций. Они показывают поток кубитов через квантовую программу, включая ворота и измерения, примененные к ним. Дополнительные сведения см. в схемах каналов Quantum в Visual Studio Code.

  1. Выберите представление —> палитра команд и введите "канал", который должен открыть Q#: Показать параметр канала . Вы также можете щелкнуть канал из списка команд рядом с операцией точки входа.

    Снимок экрана: файл Q# в Visual Studio Code, показывающий, где найти команду канала объектива кода.

  2. Канал отображается в окне канала Q#. На схеме канала показан один регистр кубита, который он инициализирован в состояние |0⟩. Затем, ворота Hadamard, H, применяются к кубитам, за которым следует операция измерения, которая представлена символом измерения. Дополнительные сведения см . в соглашениях о каналах Quantum.

    Снимок экрана: окно канала Q# с результирующей схемой канала для случайной битовой операции.

Подключение к Azure Quantum и отправка задания

Вы можете подключать и отправлять задания непосредственно из VS Code. В этом примере вы отправите задание в симулятор Rigetti.

  1. Выберите представление —> палитра команд и тип Q#: подключение к рабочей области Azure Quantum. Нажмите ВВОД.

  2. Выберите учетную запись Azure и следуйте инструкциям по подключению к предпочтительному каталогу, подписке и рабочей области.

    Примечание.

    Если у вас есть строка подключения, можно выбрать строку подключения и вставить строка подключения, соответствующую рабочей области Azure Quantum. Дополнительные сведения см. в разделе "Подключение к рабочей области Quantum" с помощью строка подключения.

  3. После подключения в области обозревателя разверните узел "Квантовые рабочие области".

  4. Разверните рабочую область и разверните поставщик Rigetti .

    Примечание.

    Если возникла проблема, связанная с подключением к Azure Quantum, появится значок предупреждения рядом с именем рабочей области. Наведите указатель мыши на имя рабочей области, чтобы отобразить сведения об ошибке.

  5. Выберите rigetti.sim.qvm в качестве вашего target.

    Снимок экрана: Visual Studio Code, показывающий, как выбрать симулятор Rigetti как target.

  6. Щелкните значок воспроизведения справа target от имени, чтобы начать отправку текущей программы Q#. Если появится всплывающее окно, нажмите кнопку Изменить профиль QIR target и продолжить.

    Снимок экрана: Visual Studio Code, показывающий, как запустить симулятор Rigetti как target.

  7. Добавьте имя для идентификации задания.

  8. Добавьте количество снимков или количество операций запуска программы.

  9. Нажмите клавишу ВВОД , чтобы отправить задание. Состояние задания будет отображаться в нижней части экрана.

  10. Разверните задания и наведите указатель мыши на задание, которое отображает время и состояние задания.

  11. Чтобы просмотреть результаты, щелкните значок облака рядом с именем задания, чтобы скачать результаты из хранилища рабочей области и отобразить его в VS Code.

    Снимок экрана: Visual Studio Code, показывающий, как скачать и просмотреть результаты квантового задания.

Отправка заданий Jupyter Notebook в Azure Quantum

Узнайте, как использовать VS Code для запуска, отладки и отправки записной книжки Q# Jupyter Notebook в Azure Quantum. Действия, описанные в этой статье, также применяются к Jupyter Notebook на локальном сервере Jupyter или записных книжках на портале Azure Quantum.

Необходимые компоненты

Дополнительные сведения об установке см. в разделе "Установка QDK" в VS Code.

Запуск и тестирование программы в локальном симуляторе

  1. В VS Code выберите палитру команд view > и нажмите кнопку Create: New Jupyter Notebook.

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

  3. В первой ячейке записной книжки выполните следующий код Python, чтобы импортировать необходимые модули:

    import qsharp
    import azure.quantum
    
    • Модуль qsharp активирует волшебную %%qsharp команду, которая позволяет вводить код Q# непосредственно в ячейку.
    • Модуль azure-quantum предоставляет подключение к рабочей области Azure Quantum.

    Примечание.

    Если ядро ipykernel Python Jupyter не обнаружено, VS Code предложит установить его.

  4. Добавьте другую ячейку и введите этот код Q#, который возвращает указанное пользователем количество случайных битов:

    Примечание.

    Обратите внимание, что сразу после ввода в магическую команду %%qsharpячейка записной книжки изменяет тип с Python на Q#.

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  5. Чтобы протестировать операцию, можно использовать eval метод, который может вызывать любую операцию Q#, ранее определенную в записной книжке:

    qsharp.eval("RandomNBits(4)")
    
    [Zero, One, One, Zero]
    
  6. Чтобы запустить программу на локальный симулятор, используйте run этот метод. shotsУкажите или количество раз запуска программы, а симулятор возвращает результаты в виде списка Python.

    qsharp.run("RandomNBits(4)", shots=10)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

Визуализация квантового канала

Вы можете визуализировать квантовые каналы с помощью qsharp-widgets пакета. Этот пакет предоставляет мини-приложение, которое отображает диаграмму квантовых каналов в виде образа SVG. Дополнительные сведения см. в схемах каналов Quantum с jupyter Notebook.

Добавьте следующий код в новую ячейку для визуализации канала:

from qsharp_widgets import Circuit

Circuit(qsharp.circuit("RandomNBits(4)"))

Снимок экрана: Jupyter Notebook, показывающий, как визуализировать канал для операции Q#.

Дополнительные сведения см . в соглашениях о каналах Quantum.

Компиляция задания с помощью базового профиля

При запуске программ на локальном квантовом симуляторе можно отправить любой тип программы Q#. Однако оборудование targets Azure Quantum пока не поддерживает все возможности, необходимые для выполнения всех программ Q#. Чтобы скомпилировать и отправить программы Q# в Azure Quantum, необходимо задать target профиль, чтобы сообщить Q# о возможностях, target поддерживаемых оборудованием. В настоящее время это базовый профиль. Дополнительные сведения см. в разделе "Типы профилей" в Azure Quantum.

Чтобы повторно инициализировать интерпретатор Q# и скомпилировать программу с базовым профилем:

  1. init Используйте метод для задания профиля:

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. Так как вы повторно инициализировали интерпретатор, необходимо снова запустить код с новым профилем:

    %%qsharp
    
    operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  3. Затем используйте compile метод, чтобы указать операцию или функцию, которая является точкой входа в программу. Это компилирует код в формат QIR, который затем можно отправить на любое квантовое оборудование:

    MyProgram = qsharp.compile("RandomNBits(4)")
    

Подключение к Azure Quantum и отправка задания

Теперь, когда программа компилируется в правильном формате, создайте azure.quantum.Workspace объект для подключения к Azure Quantum. Для подключения вы будете использовать идентификатор ресурса рабочей области Azure Quantum. Идентификатор ресурса и расположение можно скопировать на странице обзора рабочей области в портал Azure.

  1. В новой ячейке укажите идентификатор ресурса и расположение из рабочей области Azure Quantum:

    MyWorkspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. Используйте метод, чтобы просмотреть доступное get_targets оборудование targets в рабочей области:

    MyTargets = MyWorkspace.get_targets()
    print("This workspace's targets:")
    MyTargets
    
  3. Выберите :rigetti.sim.qvmtarget

    MyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")
    
  4. Наконец, используйте submit метод для отправки программы с его параметрами и отображения результатов:

    job = MyTarget.submit(MyProgram, "MyQuantumJob", shots=100)
    job.get_results()
    
    {'[0, 1, 1, 1]': 0.08,
     '[1, 1, 0, 0]': 0.1,
     '[0, 0, 1, 0]': 0.04,
     '[0, 1, 0, 0]': 0.05,
     '[1, 0, 1, 0]': 0.05,
     '[1, 0, 0, 0]': 0.07,
     '[0, 1, 0, 1]': 0.07,
     '[1, 0, 1, 1]': 0.07,
     '[0, 0, 0, 0]': 0.08,
     '[1, 1, 1, 0]': 0.05,
     '[0, 0, 0, 1]': 0.1,
     '[0, 0, 1, 1]': 0.04,
     '[0, 1, 1, 0]': 0.09,
     '[1, 0, 0, 1]': 0.04,
     '[1, 1, 1, 1]': 0.05,
     '[1, 1, 0, 1]': 0.02}
    
  5. Все свойства задания доступны job.details, например:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0150202e-9638-11ee-be2f-b16153380354', 'name': 'MyQuantumJob', 'provider_id': 'rigetti'...}
    Job name: MyQuantumJob
    Job status: Succeeded
    Job ID: 0150202e-9638-11ee-be2f-b16153380354
    

Дополнительные сведения о задании

Пакет azure.quantum Python включает дополнительные методы для отображения более подробных данных задания.

  • job.get_results_histogram(): этот метод возвращает словарь результатов и количество снимков для каждого уникального измерения. Например, результаты предыдущего задания будут

    print(job.get_results_histogram()) 
    
    {   
        '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 8},  
        '[1, 1, 0, 0]' : {'Outcome' : [1, 1, 0, 0], 'Count' : 10},
        '[0, 0, 1, 0]' : {'Outcome' : [0, 0, 1, 0], 'Count' : 4},
        '[0, 1, 0, 0]' : {'Outcome' : [0, 1, 0, 0], 'Count' : 5},
        '[1, 0, 1, 0]' : {'Outcome' : [1, 0, 1, 0], 'Count' : 5},  
        '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 7},
        '[0, 1, 0, 1]' : {'Outcome' : [0, 1, 0, 1], 'Count' : 7},
        '[1, 0, 1, 1]' : {'Outcome' : [1, 0, 1, 1], 'Count' : 7},
        '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 8},  
        '[1, 1, 1, 0]' : {'Outcome' : [1, 1, 1, 0], 'Count' : 5},
        '[0, 0, 0, 1]' : {'Outcome' : [0, 0, 0, 1], 'Count' : 10},
        '[0, 0, 1, 1]' : {'Outcome' : [0, 0, 1, 1], 'Count' : 4},
        '[0, 1, 1, 0]' : {'Outcome' : [0, 1, 1, 0], 'Count' : 9},  
        '[1, 0, 0, 1]' : {'Outcome' : [1, 0, 0, 1], 'Count' : 4},
        '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 5},
        '[1, 1, 0, 1]' : {'Outcome' : [1, 1, 0, 1], 'Count' : 2}
    }
    
  • job.get_results_shots() : этот метод возвращает список каждого результата снимка. Например, результаты предыдущего задания будут

    print(job.get_results_shots()) 
    
    [ [0, 1, 1, 1], [1, 0, 1, 1], [0, 0, 1, 1], [1, 1, 0, 1], [1, 0, 0, 0], [1, 0, 1, 1], [1, 1, 0, 1], ...]
    

Отправка заданий Python с помощью заданий Q# в Azure Quantum

Узнайте, как использовать VS Code для написания программы Python, которая вызывает операции Q#, подключитесь к Azure с помощью команд Python или Azure CLI и отправьте задание.

Необходимые компоненты

Дополнительные сведения об установке см. в разделе "Установка QDK" в VS Code.

Создание и импорт операций Q#

qsharp С помощью пакета можно хранить функции и операции в файлах Q# и создавать проекты Q#, которые позволяют вызывать их из кода Python. Это особенно полезно, если необходимо запустить программу, которая принимает входные параметры.

  1. Выполните действия, чтобы создать проект Q#.

  2. Откройте новый текстовый файл, добавьте следующий код Q#, который возвращает указанное пользователем число случайных битов и сохраните файл в каталог /src в проекте как Source.qs.

    
        operation Random() : Result {
        use q = Qubit();
        H(q);
        let result = M(q);
        Reset(q);
        return result
    }
    
    operation RandomNBits(N: Int): Result[] {
        mutable results = [];
        for i in 0 .. N - 1 {
            let r = Random();
            set results += [r];
        }
        return results
    }
    
  3. В корневой папке проекта (с файлом qsharp.json ), откройте другой файл и сохраните его как randomNum.py.

  4. Добавьте следующий код для импорта qsharp и azure.quantum модулей.

    import qsharp
    import azure.quantum
    
  5. Затем добавьте код, чтобы определить корневую папку проекта Q# и протестировать target операцию на локальном симуляторе. Операция вызывается пространством <>имен.<operation_name( )>, и в этом случае вы передаете количество случайных битов для возврата.

    Примечание.

    Так как пространство имен не указано вSource.qs, компилятор использует имя файла в качестве пространства имен по умолчанию . Source.RandomNBits() Дополнительные сведения см. в разделе "Проекты" и неявные пространства имен.

    qsharp.init(project_root = '../MyProjectRootFolder')
    print(qsharp.eval("Source.RandomNBits(4)"))
    
    [Zero, One, One, Zero]
    
  6. Вы также можете протестировать операцию с run помощью метода, который передает дополнительный shots параметр и возвращает результаты в списке Python. Замените randomNum.pyпредыдущую инструкцию печати следующим образом:

    result = qsharp.run("Source.RandomNBits(4)", shots=10)
    for x in result:
        print(x)
    
    [[One, One, One, One],
    [Zero, Zero, One, Zero],
    [One, Zero, Zero, One],
    [Zero, One, Zero, Zero],
    [One, Zero, One, One],
    [One, Zero, One, Zero],
    [One, One, One, Zero],
    [One, One, One, One],
    [Zero, Zero, Zero, One],
    [One, Zero, Zero, One]]
    

Компиляция задания с помощью базового профиля

При запуске программ на локальном квантовом симуляторе можно отправить любой тип программы Q#. Однако оборудование targets Azure Quantum пока не поддерживает все возможности, необходимые для выполнения всех программ Q#. Чтобы скомпилировать и отправить программы Q# в Azure Quantum, необходимо задать target профиль, чтобы сообщить Q# о возможностях, поддерживаемых оборудованием target . В настоящее время это либо Base Adpative_RI профиль. Дополнительные сведения см. в разделе "Типы профилей" в Azure Quantum.

Примечание.

Для программ Q# только в VS Code VS Code VS Code автоматически задает Base профиль.

  1. init Используйте метод для задания профиля:

    qsharp.init(project_root = '../MyProjectRootFolder', target_profile=qsharp.TargetProfile.Base)
    

    Примечание.

    Так как вы повторно инициализируете состояние qsharp, необходимо снова задать project_root параметр, чтобы компилятор знал, где найти RandomNBits операцию. Это также можно было сделать на шаге 5 предыдущей процедуры.

  2. Затем используйте compile метод, чтобы указать операцию или функцию, которая является точкой входа в программу. Затем скомпилированную программу можно отправить на любое квантовое оборудование:

    MyProgram = qsharp.compile("Source.RandomNBits(4)")
    

Подключение к Azure Quantum и отправка задания

Вы можете подключиться к Azure Quantum и отправить задание с помощью созданного Workspace на Python объекта или подключить и отправить задание с помощью Azure CLI. Для использования Azure CLI необходимо сохранить скомпилированную программу в виде текстового файла и отправить этот файл с помощью команды CLI.

Теперь, когда программа компилируется в правильном формате, создайте azure.quantum.Workspace объект для подключения к Azure Quantum. Для подключения вы будете использовать идентификатор ресурса рабочей области Azure Quantum. Идентификатор ресурса и расположение можно скопировать на странице обзора рабочей области в портал Azure.

  1. Добавьте следующий код randomNum.py, введите идентификатор ресурса и расположение из рабочей области Azure Quantum:

    workspace = azure.quantum.Workspace(
        resource_id = "MyResourceID",
        location = "MyLocation"
    )
    
  2. get_targets Используйте метод для отображения доступного оборудования targets в рабочей области:

    MyTargets = workspace.get_targets()
    print("This workspace's targets:")
    for x in MyTargets:
        print(x)
    
  3. Выберите :rigetti.sim.qvmtarget

    MyTarget = workspace.get_targets("rigetti.sim.qvm")
    
  4. Наконец, используйте submit метод для отправки программы с его параметрами. Результаты задания возвращаются в виде словаря Python.

    job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100)
    results = job.get_results()
    print("\nResults: ", results)
    
  5. Чтобы извлечь только значения и отобразить их:

    for x in results:
        print(x)
    
    [0, 0, 0, 0]
    0.3
    [1, 0, 0, 0]
    0.1
    [1, 1, 1, 1]
    0.3
    [0, 1, 1, 1]
    0.3
    
  6. Все свойства задания доступны job.details, например:

    print(job.details)
    print("\nJob name:", job.details.name)
    print("Job status:", job.details.status)
    print("Job ID:", job.details.id)
    
    {'additional_properties': {'isCancelling': False}, 'id': '0fc396d2-97dd-11ee-9958-6ca1004ff31f', 'name': 'MyPythonJob', 'provider_id': 'rigetti'...}
    Job name: MyPythonJob
    Job status: Succeeded
    Job ID: fc396d2-97dd-11ee-9958-6ca1004ff31f
    

Дополнительные сведения о задании

Пакет azure.quantum Python включает дополнительные методы для отображения более подробных данных задания.

  • job.get_results_histogram(): этот метод возвращает словарь результатов и количество снимков для каждого уникального измерения. Например, результаты предыдущего задания будут

    results = job.get_results_histogram()
    for x in results.items():
        print(x)
    
    {   
        '[0, 0, 0, 0]' : {'Outcome' : [0, 0, 0, 0], 'Count' : 30},  
        '[1, 0, 0, 0]' : {'Outcome' : [1, 0, 0, 0], 'Count' : 10},
        '[1, 1, 1, 1]' : {'Outcome' : [1, 1, 1, 1], 'Count' : 30},
        '[0, 1, 1, 1]' : {'Outcome' : [0, 1, 1, 1], 'Count' : 30}
    }
    
  • job.get_results_shots() : этот метод возвращает список каждого результата снимка. Например, результаты предыдущего задания будут

    print(job.get_results_shots()) 
    
    [ [0, 0, 0, 0], [1, 1, 1, 1], [0, 1, 1, 1], [1, 1, 1, 1], [1, 0, 0, 0], [0, 1, 1, 1], [0, 0, 0, 0], ...]