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

如何使用 Visual Studio Code 提交 Q# 程序

了解如何使用 Visual Studio Code 创建 Q# 程序并将其提交到真正的量子硬件。 可以将量子计算作业作为独立的 Q# 程序提交到 Azure Quantum,将 Q# 与 Python 组合在 Q# 项目中,并运行 Jupyter Notebook。

将 Q# 作业提交到 Azure Quantum

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

先决条件

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

加载 Q# 示例程序

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

  2. 打开 RandomNum.qs 并键入 sample,然后 从选项列表中选择 Random Bit 示例 并保存文件。

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

注意

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

运行 Q# 程序

  1. 若要测试在本地在内置模拟器上运行程序,请单击 入口点操作旁边的命令列表中运行 ,或按 Ctrl+F5。 输出会显示在调试控制台中。

  2. 若要在将程序提交到 Azure Quantum 之前对其进行调试,请在入口点操作旁边的命令列表中单击“调试”,或按 F5。 使用顶部的调试控件对代码进行逐过程执行、单步执行和单步跳出操作。 有关调试 Q# 程序的详细信息,请参阅 测试和调试

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

可视化频率直方图

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

  1. 选择 “视图 -> 命令面板 ”并键入“直方图”,显示 Q#:运行文件并显示直方图 选项。 还可以从入口点操作旁边的命令列表中单击 直方图 。 选择此选项可打开 Q# 直方图窗口。

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

  2. 输入执行程序的大量 镜头 ,例如 100 次拍摄,然后按 Enter。 直方图将显示在 Q# 直方图窗口中。

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

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

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

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

提示

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

可视化量子线路

量子线路图是量子操作的可视表示形式。 它们通过量子程序显示量子比特的流动,包括应用于量子程序的入口和度量。 有关详细信息,请参阅 Visual Studio Code 中的 Quantum 线路图。

  1. 选择 “视图 -> 命令面板 ”并键入“线路”,应显示 Q#:显示线路 选项。 还可以从入口点操作旁边的命令列表中单击 “线路 ”。

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

  2. 线路显示在 Q# 线路窗口中。 线路图显示了一个量子比特寄存器,该寄存器已初始化为 |0⟩ 状态。 然后,Hadamard 门 H 将应用于量子比特,后跟 度量运算,该操作由计量符号表示。 有关详细信息,请参阅 Quantum 线路约定

    Q# 线路窗口的屏幕截图,其中显示了随机位操作生成的线路图。

连接到 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 模拟器的 targetVisual Studio Code 屏幕截图。

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

    显示如何运行 Rigetti 模拟器的 targetVisual Studio Code 屏幕截图。

  7. 添加名称以标识作业。

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

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

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

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

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

将 Jupyter Notebooks 作业提交到 Azure Quantum

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

先决条件

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

  • Azure 订阅中的 Azure Quantum 工作区。 若要创建工作区,请参阅创建 Azure Quantum 工作区

  • 安装了 Python 和 Pip 的 Python 环境。

  • 安装了 Azure Quantum 开发工具包、Python 和 Jupyter 扩展的 VS Code。

  • Azure Quantumqsharpqsharp-widgets、包azure-quantumipykernel包。

    python -m pip install --upgrade qsharp qsharp-widgets azure-quantum ipykernel
    

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

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

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

  3. 在笔记本的第一个单元中,运行以下 Python 代码以导入所需的模块:

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

    注意

    如果未检测到 Jupyter Python 内核 ipykernel ,VS Code 将提示你安装它。

  4. 添加另一个单元格并输入此 Q# 代码,该代码返回用户指定的随机位数:

    注意

    请注意,一旦键入 magic 命令 %%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 图像。 有关详细信息,请参阅 使用 Jupyter Notebook 的量子线路图。

将以下代码添加到新单元格以可视化线路:

from qsharp_widgets import Circuit

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

Jupyter Notebook 的屏幕截图,其中显示了如何可视化 Q# 操作的线路。

有关详细信息,请参阅 Quantum 线路约定

使用基本配置文件编译作业

在本地量子模拟器上运行程序时,可以提交任何类型的 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()
    
    {'[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 编写用于调用 Q# 操作的 Python 程序、使用 Python 命令或 Azure CLI 连接到 Azure,以及提交作业。

先决条件

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

创建和导入 Q# 操作

qsharp使用包,可以将函数和操作存储在 Q# 文件中,并创建 Q# 项目,以便从 Python 代码中调用它们中的任何一个。 当你需要启动采用输入参数的程序时,这特别有用。

  1. 按照步骤创建 Q# 项目

  2. 打开一个新的文本文件,添加以下 Q# 代码,以返回用户指定的随机位数,并将该文件另存为项目中Source.qs/src 目录。

    
        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. 添加以下代码以导入 qsharpazure.quantum 模块。

    import qsharp
    import azure.quantum
    
  5. 接下来,添加代码以定义 Q# 项目根文件夹并测试在本地 target 模拟器上运行操作。 操作由 <命名空间>调用。<operation_name()>,在本例中,你将传入要返回的随机位数。

    注意

    由于未在 中 Source.qs指定命名空间,因此编译器使用文件名作为默认命名空间 - Source.RandomNBits()。 有关详细信息,请参阅 Projects 和隐式命名空间

    qsharp.init(project_root = '../MyProjectRootFolder')
    print(qsharp.eval("Source.RandomNBits(4)"))
    
    [Zero, One, One, Zero]
    
  6. 还可以使用 run 方法测试操作,该方法传递其他 shots 参数,并在 Python 列表中返回结果。 在 中 randomNum.py,将上一个 print 语句替换为以下内容:

    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# 程序。 但是,Azure Quantum 硬件 targets 尚不支持运行所有 Q# 程序所需的所有功能。 若要将 Q# 程序编译并提交到 Azure Quantum,需要设置 target 配置文件,告知 Q# 硬件支持的功能 target 。 目前,即 Base 配置文件 Adpative_RI 。 有关详细信息,请参阅 Azure Quantum 中的配置文件类型。

注意

对于 仅 VS Code 中的 Q# 程序,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 并提交作业

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

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

  1. 将以下代码添加到 randomNum.pyAzure 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. 仅提取值并显示它们:

    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], ...]