我们介绍了 Yao (查看我们最新的论文),这是一个用于解决量子计算研究中实际问题的开源 Julia 包。Yao 的名字来源于幺正(幺)的第一个汉字。
Yao 的 Logo
我们为什么要创建 Yao?简而言之,我们像 Julia 本身 一样贪婪。我们想要一些:
正如许多其他 Julia 博客文章(以及 Zygote 论文)提到的:有时梯度可以比人类成为更好的程序员。在量子计算中,它们可用于变分算法、量子控制、门学习等。因此,我们也希望在量子电路中进行可微编程!
然而,量子电路的自动微分 (AD) 与常规程序有很大不同:由于在一般情况下缓存中间状态,电路模拟中的内存分配成本可能非常高。在正向模式 AD 中,我们需要额外的语义来保留量子电路——以便它可以在真实设备上实现。
在 Yao 中,为了实现此目标,我们实现了一个内置的特定领域自动微分 (AD) 引擎,以利用量子电路的可逆性。以下是一个变分量子本征求解器算法的示例。借助我们高效的 AD 引擎,您应该能够在笔记本电脑上尝试它
using Yao, YaoExtensions
# number of qubits and circuit depth
n, d = 16, 100
circuit = dispatch!(variational_circuit(n, d),:random)
h = heisenberg(n)
for i in 1:100
_, grad = expect'(h, zero_state(n) => circuit)
dispatch!(-, circuit, 1e-1 * grad)
println("Step $i, energy = $(real.(expect(h, zero_state(n)=>circuit)))")
end
此示例训练了一个 100 层参数化电路(4816 个参数)以找到 16 个位点海森堡模型的基态。该引擎还可以与通用 AD 框架(如 Zygote)无缝集成,例如,在我们的 门学习示例 中。我们使用可微编程来找到给定幺正变换的分解。您可以在我们的 教程 和 量子算法动物园 中了解更多信息。
每天每小时都会涌现新的研究思路。量子软件领域本身也在快速发展。我们希望有一个框架,能够灵活地让研究人员和开发人员在任何层面上扩展它,以用于任何可能的研究类型。
首先,我们设计并开发了一个无硬件的中间表示(量子块中间表示,QBIR)来表示和操作量子电路以及一组量子寄存器接口。此设计使人们能够通过重载相关接口将 Yao 扩展到自定义算法、硬件等。例如,在实现下一节所示的最新性能的同时,我们仅用几百行用原生 Julia 和 CUDAnative 编写的代码在 CuYao 中扩展了我们的 CUDA 后端。通过一些补丁和语法糖,Yao 就可以与符号引擎 SymEngine 一起工作,后者允许您使用符号计算进行微分和计算量子电路。
其次,与 Julia 中的其他项目一样,我们使 Yao 在架构级别上可扩展。Yao 包(或其 CUDA 后端 CuYao)只是一个元包,它重新导出其他组件包。开发人员可以使用轻量级依赖项自定义自己的软件,并快速开发新功能。
效率也很重要,尤其是在涉及数值实验的研究中,例如变分量子算法。除了所有其他令人兴奋的功能外,我们仍然希望此框架在模拟中实现最新性能。
通过利用 Julia 中的原生 GPU 编程 和基于多重调度的专门化,Yao 在中等规模的量子电路中实现了最先进的性能。
您可以查看 更详细的基准测试。
到目前为止,我们很高兴地宣布它的诞生,但旅程才刚刚开始。
我们仍然希望实现实际硬件编译(例如,到 OpenQASM)、电路简化和编译 (YaoIR)、可视化、张量网络(查看 在线游乐场) 等等!
尽管一些 Beta 用户在 实际研究工作 中帮助我们塑造了此软件,但我们仍然需要更多用例来进一步开发它,也需要更多人加入我们。如果您对这个想法感兴趣,加入我们,让我们一起构建一个强大的工具,用于量子计算研究!