Отправка программ 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.
- Рабочая область Azure Quantum по подписке Azure. Сведения о создании рабочей области см. в статье Создание рабочей области Azure Quantum.
- Последняя версия Visual Studio Code или откройте VS Code в Интернете.
- Последняя версия расширения Пакета средств разработки Azure Quantum.
Загрузка примера программы Q#
В VS Code выберите > файл создать текстовый файл и сохраните файл как RandomNum.qs.
Откройте RandomNum.qs и введите
sample
, а затем выберите в списке параметров выборку случайного бита и сохраните файл.
Примечание.
Вы также можете открыть собственный файл Q# . Если вы запускаете старую программу Q# и выполняете ошибки, см. статью "Тестирование и отладка".
Запуск программы Q#
Чтобы протестировать программу локально на встроенном симуляторе, щелкните "Выполнить " из списка команд рядом с операцией точки входа или нажмите клавиши CTRL+F5. Выходные данные будут отображаться в консоли отладки.
Чтобы выполнить отладку программы перед отправкой в Azure Quantum, щелкните "Отладка " в списке команд рядом с операцией точки входа или нажмите клавишу F5. Используйте элементы управления отладки в верхней части, чтобы перейти к коду и выйти из него. Дополнительные сведения об отладке программ Q# см. в разделе "Тестирование и отладка".
Визуализация гистограммы частоты
Гистограмма частоты представляет распределение результатов, полученных при выполнении квантовой программы несколько раз или "выстрелов". Каждая полоса в гистограмме соответствует возможному результату, и его высота представляет количество наблюдаемых результатов. Гистограмма частоты помогает визуализировать распределение вероятностей этих результатов.
Выберите представление —> палитра команд и введите гистограмму, которая должна открыть файл Q#: Запустить файл и отобразить параметр гистограммы . Вы также можете щелкнуть гистограмму из списка команд рядом с операцией точки входа. Выберите этот параметр, чтобы открыть окно гистограммы Q#.
Введите несколько снимков для выполнения программы, например 100 выстрелов , и нажмите клавишу ВВОД. Гистограмма будет отображаться в окне гистограммы Q#.
Щелкните значок параметров вверху слева, чтобы отобразить параметры.
Щелкните панель, чтобы отобразить процент этого результата. В этом случае существует два возможных результата, 0 и 1, а процент каждого результата составляет около 50 %.
Совет
Вы можете увеличить гистограмму с помощью колесика прокрутки мыши или жеста трекпада. При увеличении масштаба диаграмму можно сдвигать, нажав клавиши ALT при прокрутке.
Визуализация квантового канала
Схемы квантовых каналов — это визуальное представление квантовых операций. Они показывают поток кубитов через квантовую программу, включая ворота и измерения, примененные к ним. Дополнительные сведения см. в схемах каналов Quantum в Visual Studio Code.
Выберите представление —> палитра команд и введите "канал", который должен открыть Q#: Показать параметр канала . Вы также можете щелкнуть канал из списка команд рядом с операцией точки входа.
Канал отображается в окне канала Q#. На схеме канала показан один регистр кубита, который он инициализирован в состояние |0⟩. Затем, ворота Hadamard, H, применяются к кубитам, за которым следует операция измерения, которая представлена символом измерения. Дополнительные сведения см . в соглашениях о каналах Quantum.
Подключение к Azure Quantum и отправка задания
Вы можете подключать и отправлять задания непосредственно из VS Code. В этом примере вы отправите задание в симулятор Rigetti.
Выберите представление —> палитра команд и тип Q#: подключение к рабочей области Azure Quantum. Нажмите ВВОД.
Выберите учетную запись Azure и следуйте инструкциям по подключению к предпочтительному каталогу, подписке и рабочей области.
Примечание.
Если у вас есть строка подключения, можно выбрать строку подключения и вставить строка подключения, соответствующую рабочей области Azure Quantum. Дополнительные сведения см. в разделе "Подключение к рабочей области Quantum" с помощью строка подключения.
После подключения в области обозревателя разверните узел "Квантовые рабочие области".
Разверните рабочую область и разверните поставщик Rigetti .
Примечание.
Если возникла проблема, связанная с подключением к Azure Quantum, появится значок предупреждения рядом с именем рабочей области. Наведите указатель мыши на имя рабочей области, чтобы отобразить сведения об ошибке.
Выберите rigetti.sim.qvm в качестве вашего target.
Щелкните значок воспроизведения справа target от имени, чтобы начать отправку текущей программы Q#. Если появится всплывающее окно, нажмите кнопку Изменить профиль QIR target и продолжить.
Добавьте имя для идентификации задания.
Добавьте количество снимков или количество операций запуска программы.
Нажмите клавишу ВВОД , чтобы отправить задание. Состояние задания будет отображаться в нижней части экрана.
Разверните задания и наведите указатель мыши на задание, которое отображает время и состояние задания.
Чтобы просмотреть результаты, щелкните значок облака рядом с именем задания, чтобы скачать результаты из хранилища рабочей области и отобразить его в VS Code.
Отправка заданий Jupyter Notebook в Azure Quantum
Узнайте, как использовать VS Code для запуска, отладки и отправки записной книжки Q# Jupyter Notebook в Azure Quantum. Действия, описанные в этой статье, также применяются к Jupyter Notebook на локальном сервере Jupyter или записных книжках на портале Azure Quantum.
Необходимые компоненты
Дополнительные сведения об установке см. в разделе "Установка QDK" в VS Code.
Рабочая область Azure Quantum по подписке Azure. Сведения о создании рабочей области см. в статье Создание рабочей области Azure Quantum.
Среда Python с установленным Python и Pip .
VS Code с установленными расширениями Jupyter для Azure Quantum Development Kit, Python и Jupyter .
Azure Quantum
qsharp
,qsharp-widgets
а такжеazure-quantum
пакеты иipykernel
пакет.python -m pip install --upgrade qsharp qsharp-widgets azure-quantum ipykernel
Запуск и тестирование программы в локальном симуляторе
В VS Code выберите палитру команд view > и нажмите кнопку Create: New Jupyter Notebook.
В правом верхнем углу VS Code обнаружит и отобразит версию Python и виртуальную среду Python, выбранную для записной книжки. Если у вас несколько сред Python, может потребоваться выбрать ядро с помощью средства выбора ядра в правом верхнем углу. Если среда не обнаружена, сведения о настройке см . в записных книжках Jupyter Notebook в VS Code .
В первой ячейке записной книжки выполните следующий код Python, чтобы импортировать необходимые модули:
import qsharp import azure.quantum
- Модуль
qsharp
активирует волшебную%%qsharp
команду, которая позволяет вводить код Q# непосредственно в ячейку. - Модуль
azure-quantum
предоставляет подключение к рабочей области Azure Quantum.
Примечание.
Если ядро
ipykernel
Python Jupyter не обнаружено, VS Code предложит установить его.- Модуль
Добавьте другую ячейку и введите этот код 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 }
Чтобы протестировать операцию, можно использовать
eval
метод, который может вызывать любую операцию Q#, ранее определенную в записной книжке:qsharp.eval("RandomNBits(4)")
[Zero, One, One, Zero]
Чтобы запустить программу на локальный симулятор, используйте
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)"))
Дополнительные сведения см . в соглашениях о каналах Quantum.
Компиляция задания с помощью базового профиля
При запуске программ на локальном квантовом симуляторе можно отправить любой тип программы Q#. Однако оборудование targets Azure Quantum пока не поддерживает все возможности, необходимые для выполнения всех программ Q#. Чтобы скомпилировать и отправить программы Q# в Azure Quantum, необходимо задать target профиль, чтобы сообщить Q# о возможностях, target поддерживаемых оборудованием. В настоящее время это базовый профиль. Дополнительные сведения см. в разделе "Типы профилей" в Azure Quantum.
Чтобы повторно инициализировать интерпретатор Q# и скомпилировать программу с базовым профилем:
init
Используйте метод для задания профиля:qsharp.init(target_profile=qsharp.TargetProfile.Base)
Так как вы повторно инициализировали интерпретатор, необходимо снова запустить код с новым профилем:
%%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 }
Затем используйте
compile
метод, чтобы указать операцию или функцию, которая является точкой входа в программу. Это компилирует код в формат QIR, который затем можно отправить на любое квантовое оборудование:MyProgram = qsharp.compile("RandomNBits(4)")
Подключение к Azure Quantum и отправка задания
Теперь, когда программа компилируется в правильном формате, создайте azure.quantum.Workspace
объект для подключения к Azure Quantum. Для подключения вы будете использовать идентификатор ресурса рабочей области Azure Quantum. Идентификатор ресурса и расположение можно скопировать на странице обзора рабочей области в портал Azure.
В новой ячейке укажите идентификатор ресурса и расположение из рабочей области Azure Quantum:
MyWorkspace = azure.quantum.Workspace( resource_id = "MyResourceID", location = "MyLocation" )
Используйте метод, чтобы просмотреть доступное
get_targets
оборудование targets в рабочей области:MyTargets = MyWorkspace.get_targets() print("This workspace's targets:") MyTargets
Выберите :
rigetti.sim.qvm
targetMyTarget = MyWorkspace.get_targets("rigetti.sim.qvm")
Наконец, используйте
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}
Все свойства задания доступны
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.
- Рабочая область Azure Quantum по подписке Azure. Сведения о создании рабочей области см. в статье Создание рабочей области Azure Quantum.
- Среда Python с установленным Python и Pip .
- VS Code с установленным пакетом средств разработки Azure Quantum и расширением Python.
- Azure Quantum
qsharp
иazure-quantum
пакеты. - Azure CLI с установленным последним расширением Azure Quantum.
Создание и импорт операций Q#
qsharp
С помощью пакета можно хранить функции и операции в файлах Q# и создавать проекты Q#, которые позволяют вызывать их из кода Python. Это особенно полезно, если необходимо запустить программу, которая принимает входные параметры.
Выполните действия, чтобы создать проект Q#.
Откройте новый текстовый файл, добавьте следующий код 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 }
В корневой папке проекта (с файлом qsharp.json ), откройте другой файл и сохраните его как
randomNum.py
.Добавьте следующий код для импорта
qsharp
иazure.quantum
модулей.import qsharp import azure.quantum
Затем добавьте код, чтобы определить корневую папку проекта Q# и протестировать target операцию на локальном симуляторе. Операция вызывается пространством <>имен.<operation_name( )>, и в этом случае вы передаете количество случайных битов для возврата.
Примечание.
Так как пространство имен не указано в
Source.qs
, компилятор использует имя файла в качестве пространства имен по умолчанию .Source.RandomNBits()
Дополнительные сведения см. в разделе "Проекты" и неявные пространства имен.qsharp.init(project_root = '../MyProjectRootFolder') print(qsharp.eval("Source.RandomNBits(4)"))
[Zero, One, One, Zero]
Вы также можете протестировать операцию с
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
профиль.
init
Используйте метод для задания профиля:qsharp.init(project_root = '../MyProjectRootFolder', target_profile=qsharp.TargetProfile.Base)
Примечание.
Так как вы повторно инициализируете состояние qsharp, необходимо снова задать
project_root
параметр, чтобы компилятор знал, где найтиRandomNBits
операцию. Это также можно было сделать на шаге 5 предыдущей процедуры.Затем используйте
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.
Добавьте следующий код
randomNum.py
, введите идентификатор ресурса и расположение из рабочей области Azure Quantum:workspace = azure.quantum.Workspace( resource_id = "MyResourceID", location = "MyLocation" )
get_targets
Используйте метод для отображения доступного оборудования targets в рабочей области:MyTargets = workspace.get_targets() print("This workspace's targets:") for x in MyTargets: print(x)
Выберите :
rigetti.sim.qvm
targetMyTarget = workspace.get_targets("rigetti.sim.qvm")
Наконец, используйте
submit
метод для отправки программы с его параметрами. Результаты задания возвращаются в виде словаря Python.job = MyTarget.submit(MyProgram, "MyPythonJob", shots=100) results = job.get_results() print("\nResults: ", results)
Чтобы извлечь только значения и отобразить их:
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
Все свойства задания доступны
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], ...]