Go 语言中类似 PyTorch 的开源深度学习框架研究总结
Go 语言中类似 PyTorch 的开源深度学习框架研究总结
Go 的机器学习/深度学习生态远不如 Python 成熟,目前尚无官方的 PyTorch Go 版本。但近年来出现了几个高质量的原生框架或绑定,它们主要聚焦于自动微分(autodiff)、动态/静态计算图、张量操作和模型训练/推理,目标是实现 PyTorch 风格的易用性,同时发挥 Go 语言在高性能和单二进制部署方面的优势。以下按活跃度和成熟度排序,介绍最接近 PyTorch 的几个开源项目。
GoMLX:最活跃的全功能 Go 深度学习框架
GoMLX 是当前最接近“Go 版 PyTorch”的项目,也是社区中最活跃、功能最全面的深度学习框架。它自称是“Go 语言版的 PyTorch/JAX/TensorFlow”,旨在提供完整的机器学习平台,可用于训练、微调、组合和部署模型。GoMLX 的核心特点包括:
- 丰富的 PyTorch 式 API:提供类似 PyTorch 的高级抽象,包括各种常见的神经网络层(如全连接层、卷积层、循环层、多头注意力等)、优化器(如 Adam/AdamW)和损失函数,支持自动微分计算梯度。开发者可以用熟悉的 PyTorch 风格构建和训练模型。
- 多后端支持:GoMLX 采用后端抽象设计,支持多种执行引擎。其中 XLA 后端利用了与 PyTorch/XLA、JAX、TensorFlow 相同的高性能编译器,可在 CPU、GPU(NVIDIA 等)和 TPU 上运行,许多情况下性能与 PyTorch/XLA 相当。另有 纯 Go 后端(SimpleGo),无 C/C++ 依赖,虽然速度较慢但可移植性极强,可编译为 WebAssembly 在浏览器中运行,甚至支持嵌入式设备。近期还增加了 go-darwinml 后端,通过 Go 绑定 Apple 的 CoreML 支持 Metal 加速和 MLX,以及在 DarwinOS 上的其他后端。
- ONNX 模型导入与 Hugging Face 集成:通过
onnx-gomlx子项目,可以将 PyTorch 或 TensorFlow 导出的 ONNX 模型转换为 GoMLX 格式,在 Go 中直接加载运行,甚至进一步微调。配合go-huggingface,可以方便地下载 Hugging Face 上的模型权重,实现训练在 Python,部署在 Go 的流程。GoMLX 示例中已成功加载并运行了 Hugging Face 上的 BERT 等模型。 - LLM 支持与分布式训练:GoMLX 提供了构建和训练大语言模型(LLM)的基础组件,如支持 transformer 结构、提供 KV 缓存等,并且正在积极改进分布式执行功能,以支持多 GPU/TPU 的模型并行和数据并行训练。这意味着在 Go 中训练超大模型或处理大规模数据集成为可能。
- 完善的工具链:GoMLX 附带了丰富的开发和调试工具,例如用于训练过程可视化的 UI 工具、检查点管理命令行工具、与 Jupyter Notebook 集成的 GoNB 内核等。它还支持将训练好的模型连同检查点一起打包,以 Go 程序的形式部署推理服务,实现训练与生产环境一体化。
适用场景:GoMLX 适用于从零开始训练新模型、进行机器学习研究,以及需要高性能或跨平台部署的场景。其完善的文档和活跃的社区使其成为目前 Go 深度学习的首选方案。需要注意的是,由于 Go 语言的静态类型和显式风格,用 GoMLX 编写模型代码可能比 Python 略显冗长,但这也带来了更清晰、安全的代码结构。
Born:纯 Go 的生产就绪型深度学习框架
Born 是一个新兴的纯 Go 深度学习框架,受 Rust 语言的 Burn 框架启发,强调“模型一经训练,即生产就绪”。它聚焦于零依赖、单二进制部署和GPU 加速,目标是让训练和部署神经网络像构建普通 Go 应用一样简单。Born 的主要特性包括:
- 纯 Go 实现,零 CGO 依赖:Born 使用纯 Go 编写,不依赖 CGo 或任何 C/C++ 库,这意味着编译出的二进制可独立运行,无需额外的 Python 运行时或复杂的依赖管理。它天然支持跨平台和交叉编译,部署非常方便。
- WebGPU 加速:Born 创新性地引入了 WebGPU 后端,通过 Go 的
go-webgpu绑定直接调用 GPU 计算,无需 CGo。实测显示,在矩阵乘法等运算上,WebGPU 后端相比纯 CPU 实现可获得 123 倍的加速。Born 已经实现了 30+ 种 GPU 加速操作(包括 MatMul、Conv2D、MaxPool、Softmax 等),并采用惰性求值策略优化 GPU 命令批处理,显著减少同步开销,将训练步骤从约 90 秒缩短到 5 秒以内。 - PyTorch 式 API 与类型安全张量:Born 提供类似 PyTorch 的高级 API,包括自动微分、常用层和优化器等。同时利用 Go 1.18+ 的泛型实现了类型安全的张量类型,在编译期即可检查出类型错误,提高代码可靠性。开发者可以使用熟悉的 PyTorch 风格构建模型,例如定义线性层、卷积层、激活函数,并进行前向传播和反向传播计算梯度。
- ONNX 模型导入:Born 支持导入 ONNX 格式的模型,可以将 PyTorch 或 TensorFlow 训练的模型通过 ONNX 间接加载到 Born 中运行。目前支持约 49 个 ONNX 算子,覆盖了常见的神经网络操作,使得训练在 Python,部署在 Go 成为可能。此外,Born 也支持将模型保存为原生的
.born格式,方便在 Go 中直接加载使用。 - LLM 推理优化:Born 对大语言模型推理进行了特别优化,包括实现了Flash Attention 2(将注意力计算的内存复杂度降至 O(N))和推测式解码(通过小模型生成候选、大模型并行验证,实现 2-4 倍推理加速)等前沿技术。它还支持现代 LLM 所需的功能,如 KV 缓存(用于自回归生成)和各种位置编码(RoPE、ALiBi 等),以及 Hugging Face 格式的 tokenizer。
适用场景:Born 非常适合追求极致轻量、部署简单和纯 Go 技术栈的开发者,尤其是需要将深度学习模型嵌入到 Go 服务或设备中的场景。例如,在边缘设备上部署 LLM 推理、构建无需 Python 的微服务等。Born 已在 MNIST 数据集上取得了 97% 以上的准确率,证明其核心功能是可用的。不过作为一个较新的项目,Born 目前功能仍在快速迭代中,部分高级特性和稳定性还有待进一步验证。
Gorgonia:经典但已不活跃的图计算库
Gorgonia 是 Go 语言中历史最悠久的深度学习库之一,其设计理念类似于早期的 Theano 和 TensorFlow。它提供自动微分和符号微分功能,可以构建计算图来表示数学表达式,并支持梯度下降优化和 CUDA/GPU 加速计算。Gorgonia 在其活跃期曾被用于构建神经网络和其他机器学习模型,但由于项目维护者精力有限,近三年几乎没有新的开发活动,已处于不活跃状态。
Gorgonia 的主要特点包括:
- 计算图与自动微分:Gorgonia 使用计算图来表示数学运算,支持自动求导和符号求导,方便实现反向传播。用户需要显式地构建图、编译图,再在虚拟机(VM)上运行,这种编程范式与 Theano 类似。
- CUDA 支持:Gorgonia 内置了对 CUDA 的支持,可以通过 CGo 调用 NVIDIA 的 CUDA 库,在 GPU 上执行张量运算。不过由于涉及 CGo,部署和跨平台相对复杂。
- 较低层级的 API:Gorgonia 属于较低级的库,用户需要手动管理张量、节点和计算图。它提供了构建神经网络的基础工具,但不如 PyTorch 那样高层易用。开发者需要自己实现训练循环等逻辑,这在灵活性和控制力方面有优势,但也意味着更陡峭的学习曲线。
现状与评价:Gorgonia 在功能上仍然可用,但它缺乏对现代深度学习需求的支持(例如对 Transformer 等复杂模型的支持、动态图训练的便利性等),社区和文档也相对停滞。对于新项目而言,不推荐选择 Gorgonia。它更适合作为历史参考或在某些特殊场景下(如需要与现有 Gorgonia 代码兼容时)使用。
GoTorch:基于 PyTorch C++ 核心的 Go 惯用绑定
GoTorch 是对 PyTorch C++ 核心(LibTorch)的 Go 语言惯用绑定,它试图在 Go 中重现 PyTorch 的高层 API 风格。与直接绑定 C++ API 的 gotch 不同,GoTorch 更注重提供Go 惯用的接口和模块化设计,使开发者能够以更地道的 Go 方式编写深度学习程序。GoTorch 仍处于早期阶段,但其设计目标是实现训练和推理同语言,即用 Go 完成从模型训练到部署的整个流程,从而避免 Python 和 C++ 之间的切换。
GoTorch 的主要特性包括:
- Go 惯用 API:GoTorch 提供了类似 PyTorch 的模块(Module)和函数式(Functional)API,但用 Go 的惯用方式实现。这意味着开发者可以使用 Go 的结构体和方法来定义模型层,使用 Go 的函数来调用神经网络操作,从而获得接近 PyTorch 的易用性,同时保持 Go 代码的风格和类型安全。
- 绑定 LibTorch:GoTorch 通过 CGo 绑定 PyTorch 的 C++ 核心(LibTorch),利用了 PyTorch 已有的高效张量运算和动态图计算能力。这使得 GoTorch 能够支持完整的动态计算图和 CUDA 加速,实现与 PyTorch 相近的性能和灵活性。
- 训练与推理一体化:使用 GoTorch,开发者可以用 Go 完成模型训练,然后直接用同一套代码进行推理部署,无需将模型转换为其他格式或依赖 Python 运行时。这简化了从实验到生产的流程,也避免了训练和推理使用不同语言带来的数据管道不一致问题。
- 早期阶段:目前 GoTorch 的功能还不完整,API 可能存在较大变动。它适合追求 Go 纯净风格、希望参与早期项目贡献的开发者尝试,但生产环境需谨慎评估其成熟度。
适用场景:GoTorch 适用于希望用 Go 语言风格开发深度学习模型的开发者,特别是在边缘设备或需要与 Go 生态深度集成的场景。如果项目团队更擅长 Go 而非 Python,GoTorch 可以降低开发门槛。不过由于项目尚不成熟,建议关注其进展,待功能更完善后再用于生产。
其他相关项目
除了上述框架,Go 社区还有一些与深度学习相关的开源项目,但它们要么功能侧重不同,要么成熟度较低,这里简要提及:
- GoLearn:一个经典的 Go 机器学习库,类似于 Python 的 scikit-learn,主要提供传统机器学习算法(分类、回归、聚类等),而非深度学习。GoLearn 适合处理结构化数据的机器学习任务,但不支持神经网络和自动微分。
- TensorFlow Go 绑定:Google 官方提供的 TensorFlow Go API,可用于加载和运行已训练的 TensorFlow 模型,但不支持动态图训练。这意味着使用 TensorFlow Go 绑定时,模型训练仍需在 Python 中完成,Go 仅用于推理,部署时需要依赖 TensorFlow C 库。
- gotch:与 GoTorch 类似,
gotch是对 PyTorch C++ API 的 Go 绑定,但更侧重于直接封装而非惯用设计。它提供了对 2500+ 个 PyTorch 张量操作的访问,支持动态图和 CUDA,可通过 JIT 加载 TorchScript 模型。gotch 适合需要将 PyTorch 模型无缝迁移到 Go 生产环境的场景,但由于是薄封装,API 风格与 PyTorch C++ 近似,Go 惧用性稍逊。 - Fuego、goml 等:一些较小型或实验性的 Go 深度学习库,功能相对有限,主要用于特定用途或学习研究,目前影响力不大。
总结与推荐
Go 语言在深度学习领域的生态仍在成长中,但已经出现了一些值得关注的项目。从功能完整度和活跃度来看,GoMLX 是当前最接近 PyTorch 的选择,它提供了全面的机器学习工具链和与 XLA 相当的性能,适合希望用 Go 进行模型训练和研究的开发者。如果追求极致轻量和纯 Go,Born 提供了零依赖的单二进制部署方案,并针对 LLM 推理做了优化,适合嵌入式或边缘场景。对于已有 PyTorch 模型并希望快速迁移到 Go 的场景,使用 gotch 直接加载模型是简单高效的选择;而 GoTorch 则为希望以 Go 风格开发深度学习应用的开发者提供了一个未来可期的方案。Gorgonia 虽然是早期开拓者,但由于缺乏维护,不推荐在新项目中采用。
总体而言,Go 在深度学习方面相较 Python 仍有差距,但其部署简单、性能高、并发强的优势正在通过这些框架逐步体现。目前很多团队的实际做法是Python 训练 → ONNX/ TorchScript → Go 推理/服务,但随着 Go 深度学习框架的成熟,未来在 Go 中完成端到端开发将变得更加可行。开发者可以根据项目需求选择合适的框架,为 Go 生态的 ML/DL 发展贡献力量。
🌟 智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。
🎁 领取 2000万 Tokens