你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Q# 程序和Visual Studio Code入门

本文介绍使用 VC Code 创建 Q#、Jupyter Notebook 或 Python 量子计算作业并使用 VS Code 将 Python 量子计算作业提交到 Azure Quantum 的步骤。

将 Q# 作业提交到 Azure Quantum

了解如何使用 VS Code 运行、调试 Q# 程序并将其提交到 Azure Quantum。

先决条件

有关安装详细信息,请参阅 在 VS Code 上安装新式 QDK

加载 Q# 示例程序

  1. 在 VS Code 中,选择“ 文件 > 新建文本文件” ,并将文件另存为 RandomNum.qs

  2. 打开 RandomNum.qs 并键入 sample,然后从选项列表中选择“ 随机位示例” 并保存文件。

    Visual Studio Code中的 Q# 文件的屏幕截图,其中显示了在文件中编写示例一词时代码示例的列表。

注意

还可以打开自己的 Q# 文件。 如果运行较旧的 Q# 程序并遇到错误,请参阅 测试和调试将程序迁移到新式 QDK

运行 Q# 程序

  1. 若要测试在内置模拟器上本地运行程序,请单击下面的@EntryPoint()命令列表中的“运行”,或按 Ctrl+F5。 输出将显示在调试控制台中。

  2. 若要在将程序提交到 Azure Quantum 之前对其进行调试,请单击下面的@EntryPoint()命令列表中的“调试”,或按 F5。 使用顶部的调试控件单步执行、进入和退出代码。 有关调试 Q# 程序的详细信息,请参阅 测试和调试

    Visual Studio Code中的 Q# 文件的屏幕截图,其中显示了使用 run 和 debug 命令在何处查找代码镜头。

绘制频率直方图

频率直方图表示多次运行量子程序或“拍摄”获得的结果分布。 直方图中的每个条都对应于一个可能的结果,其高度表示观察到结果的次数。 频率直方图有助于直观显示这些结果的概率分布。

  1. 选择“ 视图 -> 命令面板 ”并键入“直方图”,此时会显示 “Q#:运行文件并显示直方图 ”选项。 还可以从下面的@EntryPoint()命令列表中单击“直方图”。 选择此选项可打开 Q# 直方图窗口。

    Visual Studio Code中的 Q# 文件的屏幕截图,其中显示了使用直方图命令查找代码镜头的位置。

  2. 输入执行程序(例如 100 个 镜头 )的镜头数,然后按 Enter。 直方图将显示在 Q# 直方图窗口中。

  3. 单击左上角 的设置图标 以显示选项。

    Visual Studio Code中 Q# 直方图窗口的屏幕截图,其中显示了如何显示设置。

  4. 单击条形图可显示该结果的 百分比 。 在这种情况下,有两个可能的结果,0 和 1,每个结果的百分比接近 50%。

    Visual Studio Code中的 Q# 直方图窗口的屏幕截图。

提示

可以使用鼠标滚轮或触控板手势缩放直方图。 放大后,可以通过在滚动时按“Alt”来平移图表。

连接到 Azure Quantum 并提交作业

可以直接从 VS Code 连接和提交作业。 在本示例中,你将将作业提交到 Rigetti 模拟器。

  1. 选择“ 视图 -> 命令面板” 并键入 “Q#:连接到 Azure Quantum 工作区”。 按 Enter

  2. 选择 “Azure 帐户”,并按照提示连接到首选目录、订阅和工作区。

    注意

    如果有连接字符串,可以选择“连接字符串”并粘贴与 Azure Quantum 工作区对应的连接字符串。 有关详细信息,请参阅使用连接字符串连接到 Quantum 工作区

  3. 连接后,在 “资源管理器 ”窗格中,展开“ Quantum 工作区”。

  4. 展开工作区并展开 Rigetti 提供程序。

    注意

    如果连接到 Azure Quantum 时出现问题,工作区名称旁边会显示一个警告图标。 将鼠标悬停在工作区名称上以显示错误信息。

  5. 选择 rigetti.sim.qvm 作为 。target

    显示如何选择 Rigetti 模拟器作为 target的Visual Studio Code的屏幕截图。

  6. 选择名称右侧的 target 播放图标,开始提交当前 Q# 程序。 如果收到弹出窗口,请选择“ 更改 QIR target 配置文件”并继续

    显示如何将 Rigetti 模拟器作为 target运行 Visual Studio Code的屏幕截图。

  7. 添加用于标识作业的名称。

  8. 添加拍摄次数或程序运行的次数。

  9. Enter 提交作业。 作业状态将显示在屏幕底部。

  10. 展开 “作业” 并将鼠标悬停在作业上,这会显示作业的时间和状态。

  11. 若要查看结果,请选择作业名称旁边的云图标,从工作区存储下载结果并将其显示在 VS Code 中。

    显示如何下载和查看量子作业结果的Visual Studio Code的屏幕截图。

将 Jupyter Notebook 作业提交到 Azure Quantum

了解如何使用 VS Code 运行、调试 Q# Jupyter Notebook并将其提交到 Azure Quantum。 本文中的步骤也适用于本地 Jupyter 服务器上的 Jupyter Notebook 或 Azure Quantum 门户中的笔记本。

先决条件

有关安装详细信息,请参阅 在 VS Code 上安装新式 QDK

在本地模拟器中运行并测试程序

  1. 在 VS Code 中,选择“查看>命令”面板,然后选择“创建:新建Jupyter Notebook”。

  2. 在右上角,VS Code 将检测并显示为笔记本选择的 Python 版本和虚拟 Python 环境。 如果有多个 Python 环境,则可能需要使用右上角的内核选取器选择内核。 如果未检测到任何环境,请参阅 VS Code 中的 Jupyter Notebook 了解 设置信息。

  3. 在笔记本的第一个单元格中,运行

    import qsharp
    import azure.quantum
    
    • qsharp 模块激活 magic 命令, %%qsharp 使你可以直接在单元格中输入 Q# 代码。
    • azure-quantum 模块提供与 Azure Quantum 工作区的连接。

    注意

    如果未检测到 Jupyter Python 内核 ipykernel ,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# 程序。 但是,Azure Quantum 硬件 targets 尚不支持运行所有 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 工作区的资源 ID 进行连接。 可以从Azure 门户中的工作区概述页复制资源 ID 和位置。

  1. 在新单元格中,从 Azure Quantum 工作区填写资源 ID 和位置:

    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
    

使用 Q# 作业将 Python 提交到 Azure Quantum

了解如何使用 VS Code 编写调用 Q# 操作的 Python 程序、使用 Python 命令或 Azure CLI 连接到 Azure 以及提交作业。

先决条件

有关安装详细信息,请参阅 在 VS Code 上安装新式 QDK

创建和导入 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. 添加以下代码以导入 qsharpazure.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# 程序。 但是,Azure Quantum 硬件 targets 尚不支持运行所有 Q# 程序所需的全部功能。 若要编译 Q# 程序并将其提交到 Azure Quantum,需要设置配置文件 target 以告知 Q# 硬件支持的功能 target 。 目前,这是基本配置文件。 有关详细信息,请参阅 Azure Quantum 中的配置文件类型

注意

对于 VS Code 中仅限 Q# 的程序,VS Code 会自动设置基本配置文件。

  1. init使用 方法设置配置文件:

    qsharp.init(target_profile=qsharp.TargetProfile.Base)
    
  2. compile然后使用 方法指定操作或函数,该操作或函数是程序的入口点。 然后,可以将编译的程序提交到任何量子硬件:

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

连接到 Azure Quantum 并提交作业

可以使用 Python 创建 Workspace 的对象连接到 Azure Quantum 并提交作业,或使用 Azure CLI 连接并提交作业。 使用 Azure CLI 需要将编译的程序保存为文本文件,并使用 CLI 命令提交该文件。

将程序编译为正确的格式后,请创建一个 azure.quantum.Workspace 对象以连接到 Azure Quantum。 你将使用 Azure Quantum 工作区的资源 ID 进行连接。 可以从Azure 门户中的工作区概述页复制资源 ID 和位置。

  1. 将以下代码添加到 randomNum.py,从 Azure Quantum 工作区填写资源 ID 和位置:

    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
    

后续步骤