Начало работы с программами Q# и Visual Studio Code

В этой статье описано, как использовать VC Code для создания и отправки заданий квантовых вычислений Q#, Jupyter Notebook или Python в Azure Quantum с помощью VS Code.

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

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

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

Сведения об установке см. в статье Установка современного QDK в VS Code.

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

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

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

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

Примечание

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

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

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

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

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

Построение гистограммы частоты

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

  1. Выберите Вид —> палитра команд и введите "гистограмма", чтобы открыть файл Q#: Выполнить и показать гистограмму . Вы также можете щелкнуть гистограмму в списке команд ниже @EntryPoint(). Выберите этот параметр, чтобы открыть окно гистограммы Q#.

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

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

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

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

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

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

Совет

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

Подключение к 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 для запуска, отладки и отправки Jupyter Notebook Q# в Azure Quantum. Действия, описанные в этой статье, также относятся к записным книжкам Jupyter Notebook на локальном сервере Jupyter или записных книжках на портале Azure Quantum.

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

Сведения об установке см. в статье Установка современного QDK в VS Code.

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

  1. В VS Code выберите Просмотреть > палитру команд и выберите Создать: создать Jupyter Notebook.

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

  3. В первой ячейке записной книжки выполните команду

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

    Примечание

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

  4. Добавьте еще одну ячейку и введите следующий код 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]]
    

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

При запуске программ в локальном квантовом симуляторе можно отправить любой тип программы 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()
    
    {'Histogram': ['[0, 0, 0, 0]',
      0.3,
      '[1, 0, 0, 0]',
      0.1,
      '[1, 1, 1, 1]',
      0.3,
      '[0, 1, 1, 1]',
      0.3]}
    
  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
    

Отправка Python с заданиями Q# в Azure Quantum

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

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

Сведения об установке см. в разделе Установка современного QDK в VS Code.

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

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

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

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

    Примечание

    Обратите внимание, что этот код Q# не имеет @EntryPoint функции, подобной программе Q# (см. раздел Отправка заданий Q# в Azure Quantum), но в отличие от Jupyter Notebook требуется пространство имен (см. раздел Отправка заданий Jupyter Notebook в Azure Quantum).

    namespace Sample {
    
      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. В той же папке откройте другой файл и сохраните его как randomNum.py.

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

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

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

    result = qsharp.run("Sample.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 . В настоящее время это базовый профиль. Дополнительные сведения см. в статье Типы профилей в Azure Quantum.

Примечание

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

  1. Используйте метод , init чтобы задать профиль:

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

    MyProgram = qsharp.compile("Sample.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. Чтобы извлечь только значения и отобразить их, выполните следующие действия:

    resultList = results.get("Histogram")
    for x in resultList:
        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
    

Дальнейшие действия