← 返回主题列表
✨步子哥
@steper · 2026年04月19日 15:58 · 1浏览

Go 语言中类似 PyTorch 的开源深度学习框架研究总结

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 进行模型训练和研究的开发者。如果追求极致轻量和纯 GoBorn 提供了零依赖的单二进制部署方案,并针对 LLM 推理做了优化,适合嵌入式或边缘场景。对于已有 PyTorch 模型并希望快速迁移到 Go 的场景,使用 gotch 直接加载模型是简单高效的选择;而 GoTorch 则为希望以 Go 风格开发深度学习应用的开发者提供了一个未来可期的方案。Gorgonia 虽然是早期开拓者,但由于缺乏维护,不推荐在新项目中采用。

总体而言,Go 在深度学习方面相较 Python 仍有差距,但其部署简单、性能高、并发强的优势正在通过这些框架逐步体现。目前很多团队的实际做法是Python 训练 → ONNX/ TorchScript → Go 推理/服务,但随着 Go 深度学习框架的成熟,未来在 Go 中完成端到端开发将变得更加可行。开发者可以根据项目需求选择合适的框架,为 Go 生态的 ML/DL 发展贡献力量。

图1:主要 Go 深度学习框架关键维度对比

👍 1
💬 讨论回复 (2)
✨步子哥 #1 2026-04-19 16:38

GoMLX 深度研究:使用指南与 Demo 详解

GoMLX 深度研究:使用指南与 Demo 详解

GoMLX 简介

GoMLX 是一个用 Go 语言编写的加速机器学习框架,其定位类似于 Python 生态中的 PyTorch/JAX/TensorFlow,旨在为 Go 提供完整的机器学习平台。它由 Google 工程师 Jan Pfeifer 发起,目标是让开发者能够在 Go 中完成从模型构建、训练、微调到部署的全流程,而无需依赖 Python。GoMLX 并非简单地封装 Python 库,而是采用与主流框架相同的底层技术,利用 OpenXLA 引擎来编译和执行计算图,从而在 CPU、GPU(包括 Nvidia、AMD、Intel、Apple Metal 等)和 TPU 上实现高性能。简而言之,GoMLX 可以看作“Go 语言的 PyTorch”,它追求易用性与生产就绪性,并充分体现 Go 语言在可读性、类型安全和部署简洁性方面的优势。

GoMLX 安装与环境配置

获取 GoMLX 源码: 要开始使用 GoMLX,首先需要获取其源码。可以通过 go get 命令将 GoMLX 添加到您的 Go 工作空间:

go get github.com/gomlx/gomlx

这会下载 GoMLX 的最新代码到您的 $GOPATH/src/github.com/gomlx/gomlx 目录。GoMLX 是一个纯 Go 实现的项目,无需安装 Python 或其他依赖。不过,为了充分利用硬件加速,后续可能需要安装 XLA 的 PJRT 插件(下文详述)。

安装 XLA/PJRT 后端(可选): GoMLX 支持多种计算后端,其中 XLA 后端利用了与 TensorFlow/JAX 相同的编译器,可在 GPU/TPU 上提供接近原生的性能。如果希望使用 GPU 或 TPU 加速,需要安装相应的 PJRT 插件。GoMLX 提供了自动安装功能,默认情况下会在用户本地目录自动安装常用的 PJRT 插件(例如 CPU 和 CUDA 插件)。对于 Linux 用户,插件通常安装在 $HOME/.local/lib/go-xla;macOS 用户则在 $HOME/Library/Application Support/go-xla;Windows 用户在 $HOME\AppData\Local\go-xla。您也可以手动下载安装特定版本的 PJRT 插件。如果不想使用 XLA 后端,或者仅需纯 Go 实现,可以跳过此步骤。

使用纯 Go 后端(SimpleGo): 如果您的目标环境没有 GPU 或不想安装 XLA,可以使用 GoMLX 内置的纯 Go 后端。只需在代码中导入 SimpleGo 后端即可:

import _ "github.com/gomlx/gomlx/backends/simplego"

这样程序将使用纯 Go 实现的张量运算,无需任何 C/C++ 依赖。虽然纯 Go 后端目前速度较慢,但胜在可移植性极强,甚至可以编译为 WebAssembly 在浏览器中运行。随着 Go 语言对 SIMD 的支持逐步完善,纯 Go 后端的性能有望大幅提升。

Docker 快速启动: 为了降低环境配置门槛,GoMLX 提供了官方 Docker 镜像,其中集成了 GoMLX、JupyterLab 和 GoNB(Go 语言的 Jupyter 内核)。这是体验 GoMLX 最快的方式。您只需拉取镜像并运行,即可在浏览器中使用 Jupyter 笔记本进行交互式开发:

docker pull janpfeifer/gomlx_jupyterlab:latest
docker run -it --rm -p 8888:8888 -v "${PWD}":/home/jupyter/work janpfeifer/gomlx_jupyterlab:latest

上述命令会启动一个容器,将本机当前目录挂载到容器的笔记本工作目录,并开放 8888 端口。运行后,终端会显示一个带密钥的 URL,在浏览器中打开即可进入 JupyterLab,其中包含 GoMLX 的教程和示例笔记本。通过 Docker 方式,您无需手动配置 Go 或 XLA 环境,非常适合初学者快速上手。

GoMLX 核心概念与 API 概览

GoMLX 的设计哲学是提供易读、可预测且符合 Go 语言习惯的 API,同时保持足够的灵活性以实现前沿研究想法。其核心概念与 PyTorch 等框架类似,但用 Go 的方式加以表达。下面介绍 GoMLX 的几个关键概念:

    • 计算图(Graph)与自动微分: GoMLX 使用计算图来表示数学运算和模型结构。开发者通过调用 GoMLX 提供的运算函数来构建前向计算图,框架会自动根据运算关系构建反向传播图,实现自动微分。这与 PyTorch 的动态图机制类似,但 GoMLX 在实现上更接近静态图(当前 XLA 后端要求静态形状)。自动微分的结果可以用于计算梯度,从而支持模型训练。需要注意的是,目前 GoMLX 的自动微分主要支持梯度计算,尚未提供 Jacobian 矩阵等高级功能。
    • 上下文(Context): GoMLX 引入了“上下文”对象来管理模型变量和超参数。上下文充当模型的“命名空间”,所有变量(如权重)都挂载在上下文的层级结构中,便于组织和管理。例如,在构建模型时可以为每一层创建子上下文,以区分不同层的参数。上下文还支持参数的序列化和加载(检查点),以及超参数的获取和设置。通过上下文,GoMLX 实现了模型变量与计算图的解耦,使得模型的构建、保存和恢复更加清晰。
    • 张量(Tensor): GoMLX 使用张量作为基本数据结构,表示多维数组。与 Python 框架类似,张量可以包含不同数据类型(如 float32int64 等),并可以在 CPU 或 GPU 上分配。GoMLX 提供了丰富的张量操作 API,包括数学运算、形状操作、随机生成等。开发者可以使用这些原语构建复杂的神经网络层和损失函数。
    • 层(Layers)库: 为了方便构建神经网络,GoMLX 提供了高级的“层”库,封装了常见的神经网络组件。例如,layers.Dense 用于构建全连接层,layers.Convolution 用于卷积层,还有各种激活函数、归一化层(如层归一化、批归一化)、循环层(LSTM)等。这些层接口设计遵循 Go 的惯用风格,例如使用方法链式调用来配置参数,使代码更易读。同时,GoMLX 也支持更前沿的模型组件,如 KAN(Kolmogorov-Arnold Networks)网络层,以及用于等变/不变网络的 VNN 层等,这体现了其对最新研究的跟进。
    • 训练循环与优化器: GoMLX 提供了训练流程的辅助工具,包括数据迭代、损失计算、指标记录和优化器等。优化器方面,支持常见的 SGD、Adam、AdamW 等。训练过程中,GoMLX 可以自动记录损失和指标,并提供命令行工具 gomlx_checkpoints 来绘制训练曲线。此外,通过集成 GoNB,用户可以在 Jupyter 笔记本中交互式地观察训练过程,实时调整超参数,这为研究和调试提供了便利。
    • 后端(Backend)接口: GoMLX 本身不直接执行计算,而是通过后端接口将计算图交给底层引擎编译和运行。当前主要有三种后端实现:XLA 后端(使用 OpenXLA/PJRT,支持 CPU/GPU/TPU,需要安装插件)、纯 Go 后端(SimpleGo,无 C 依赖,可移植性强)以及 go-darwinml 后端(针对 Apple Silicon,通过 CoreML/Metal 加速)。这种设计使 GoMLX 能够在几乎任何 Go 能运行的环境中工作,包括浏览器(WASM)和嵌入式设备(如 Tamago)。用户可以通过环境变量 GOMLX_BACKEND 或代码中的后端配置来选择使用哪种后端。

GoMLX Demo 详解

GoMLX 提供了丰富的示例(Demo)来展示其功能和用法。这些示例覆盖了从基础的线性模型到前沿的大语言模型,帮助开发者快速上手并了解 GoMLX 的能力。下面将详细解析几个具有代表性的 Demo:

1. MNIST 手写数字识别

MNIST 是机器学习领域的“Hello World”数据集,包含 28x28 像素的手写数字图像。GoMLX 的 MNIST 示例展示了如何使用框架构建和训练一个图像分类模型。该示例包含两种模型:一个简单的线性模型和一个卷积神经网络(CNN)模型。

线性模型: 线性模型是最基础的分类器,它将输入图像展平为一维向量,然后通过一个全连接层映射到 10 个输出节点(对应 0-9 十个数字)。在 GoMLX 中,线性模型的定义非常直观:

func LinearModelGraph(ctx *context.Context, spec any, inputs []*Node) []*Node {
    ctx = ctx.In("model") // 在上下文中创建 "model" 子空间
    batchSize := inputs[0].Shape().Dimensions[0]
    embeddings := Reshape(inputs[0], batchSize, -1) // 将图像展平
    logits := layers.DenseWithBias(ctx, embeddings, NumClasses) // 全连接层+偏置
    return []*Node{logits}
}

上述代码中,inputs[0] 是输入图像张量,形状为 [batch_size, 28, 28, 1]。首先调用 Reshape 将其展平为 [batch_size, 784],然后使用 layers.DenseWithBias 添加一个带偏置的全连接层,输出维度为类别数 NumClasses(10)。返回的 logits 节点即为模型的原始输出,后续可结合交叉熵损失进行训练。

卷积神经网络模型: CNN 模型利用卷积层提取图像特征,效果远优于线性模型。GoMLX 示例中的 CNN 模型包含两组卷积+池化模块,最后接全连接层输出分类结果。核心代码如下:

func CnnModelGraph(ctx *context.Context, spec any, inputs []*Node) []*Node {
    ctx = ctx.In("model")
    embeddings := CnnEmbeddings(ctx, inputs[0]) // 提取卷积特征
    logits := layers.Dense(ctx, embeddings, true, NumClasses) // 全连接分类层
    return []*Node{logits}
}

func CnnEmbeddings(ctx *context.Context, images *Node) *Node { batchSize := images.Shape().Dimensions[0] g := images.Graph() dtype := images.DType() // 第一组卷积+激活+池化 images = layers.Convolution(nextCtx("conv"), images).Channels(32).KernelSize(3).PadSame().Done() images = activations.Relu(images) images = normalizeCNN(nextCtx("norm"), images) images = MaxPool(images).Window(2).Done() // 第二组卷积+激活+池化 images = layers.Convolution(nextCtx("conv"), images).Channels(64).KernelSize(3).PadSame().Done() images = activations.Relu(images) images = normalizeCNN(nextCtx("norm"), images) images = MaxPool(images).Window(2).Done() // 展平并应用 Dropout images = Reshape(images, batchSize, -1) images = layers.DropoutNormalize(nextCtx("dropout"), images, dropoutNode, true) return images }

该模型首先通过 CnnEmbeddings 提取图像特征:连续两次应用 3x3 卷积(分别输出 32 和 64 通道)、ReLU 激活、归一化(可选择层归一化或批归一化)和 2x2 最大池化,将 28x28 的图像逐步缩小为 7x7 的特征图。然后将特征展平为一维向量,并应用 Dropout 正则化。最后,通过一个全连接层输出 10 维的 logits。整个过程清晰地展示了如何用 GoMLX 的层 API 构建复杂网络。

训练与评估: 在模型定义之后,示例代码展示了如何加载数据、构建训练循环并评估模型。MNIST 数据集会自动从网络下载并缓存。训练时,GoMLX 使用上下文管理模型参数,并通过优化器更新权重。训练过程中,可以启用 plotly.ParamPlots 参数在 Jupyter 笔记本中实时绘制损失曲线。训练完成后,可以使用测试集评估模型准确率。根据示例的配置,线性模型和 CNN 模型在 MNIST 测试集上都能达到接近 99% 的准确率,其中 CNN 模型略胜一筹。该 Demo 充分说明了 GoMLX 构建经典模型的简便性,以及其训练流程的完整性。

2. CIFAR-10 图像分类

CIFAR-10 是另一个常用的图像分类数据集,包含 10 类 32x32 的彩色图像。GoMLX 提供了 CIFAR-10 的示例,展示如何构建更深的 CNN 模型来处理彩色图像。该示例与 MNIST 类似,但模型更复杂,包含多组卷积层和全连接层,以提取更丰富的特征。通过此 Demo,开发者可以学习如何在 GoMLX 中处理多通道输入、使用批量归一化等技巧,并了解如何在 GPU 上训练中等规模的模型。

3. IMDB 影评情感分析

IMDB 影评数据集是一个二分类问题,判断影评是正面还是负面。GoMLX 的 IMDB 示例展示了如何处理文本数据并构建情感分类模型。该示例通常使用预训练的词嵌入(如 GloVe)将文本转换为向量,然后通过循环神经网络(如 LSTM)或一维卷积网络提取特征,最后分类。GoMLX 提供了文本处理的工具,例如分词和嵌入层,使得构建 NLP 模型变得容易。通过此 Demo,开发者可以了解如何在 GoMLX 中使用序列模型和预训练嵌入,为更复杂的 NLP 任务打下基础。

4. Oxford Flowers 102 花卉生成(扩散模型)

Oxford Flowers 102 是一个花卉图像数据集。GoMLX 提供了一个基于扩散模型的示例,用于生成随机花卉图像。扩散模型是一类生成模型,通过逐步去噪来生成新样本。该 Demo 展示了 GoMLX 在生成模型领域的应用,包括如何定义去噪网络、训练扩散过程以及采样生成新图像。这是对 GoMLX 能力的一种高级展示,说明其不仅可用于判别模型,也能支持前沿的生成式模型。

5. ONNX 模型推理与微调

GoMLX 对 ONNX 格式模型的支持是一个重要特色。通过 onnx-gomlx 子项目,用户可以将 PyTorch 或 TensorFlow 训练的模型导出为 ONNX 格式,然后在 GoMLX 中加载并执行推理,甚至进一步微调。这为“训练在 Python,部署在 Go”提供了可行路径。GoMLX 提供了将 ONNX 模型的变量转换为 GoMLX 上下文的工具,以及将 ONNX 计算图转换为 GoMLX 计算图的方法。一个典型用例是:在 Python 中使用 Hugging Face Transformers 训练一个 BERT 模型,将其导出为 ONNX,然后在 GoMLX 中加载该模型进行推理服务。这种工作流充分利用了 Python 生态的丰富模型资源,同时利用了 Go 在部署方面的优势。

示例: 假设我们有一个 ONNX 格式的 Sentence Embedding 模型(例如 sentence-transformers/all-MiniLM-L6-v2),可以使用 GoMLX 如下加载和执行:

import (
    "github.com/gomlx/onnx-gomlx/onnx"
    "github.com/gomlx/go-huggingface/hub"
)

// 从 HuggingFace 下载并缓存 ONNX 模型 hfAuthToken := os.Getenv("HF_TOKEN") hfModelID := "sentence-transformers/all-MiniLM-L6-v2" repo := hub.New(modelID).WithAuth(hfAuthToken) modelPath := must.M1(repo.DownloadFile("onnx/model.onnx"))

// 解析 ONNX 模型 model := must.M1(onnx.ReadFile(modelPath))

// 将 ONNX 模型的变量(权重)加载到 GoMLX 上下文 ctx := context.New() must.M(model.VariablesToContext(ctx))

// 准备输入数据(例如两句话的 token ids、attention mask 等) inputIDs := [][]int64{ /* ... */ } attentionMask := [][]int64{ /* ... */ } tokenTypeIDs := [][]int64{ /* ... */ }

// 执行模型推理 embeddings := context.MustExecOnceN( backends.New(), // 使用默认后端(XLA 或 SimpleGo) ctx, func(ctx *context.Context, inputs []*Node) []*Node { // 将 ONNX 模型转换为 GoMLX 计算图 return model.CallGraph(ctx, inputs[0].Graph(), map[string]*Node{ "input_ids": inputs[0], "attention_mask": inputs[1], "token_type_ids": inputs[2], }, "output_0") // 指定输出节点 }, inputIDs, attentionMask, tokenTypeIDs)

fmt.Printf("Embeddings: %v\n", embeddings)

上述代码首先通过 go-huggingface 下载模型文件,然后使用 onnx.ReadFile 解析 ONNX 模型。接着,将模型的权重转换为 GoMLX 的上下文变量。在执行推理时,通过 model.CallGraph 将 ONNX 的计算图转换为 GoMLX 的计算图,并指定输入输出映射。最终,调用 context.MustExecOnceN 执行计算,得到句子的嵌入向量。这个例子展示了 GoMLX 与 Hugging Face 生态的无缝集成,以及其在推理服务中的潜在应用。

6. 大语言模型(LLM)示例

GoMLX 近期添加了对大型语言模型的支持,这是其迈向成熟的重要标志。示例包括对 GemmaGPT-2 等模型的实现和推理演示。Gemma 是 Google 发布的一系列小型语言模型,GoMLX 示例中展示了如何使用 ONNX 转换的 Gemma 模型进行文本生成。GPT-2 则是 OpenAI 的经典生成式预训练模型,GoMLX 通过自己的 transformer 实现(实验性)来运行 GPT-2。这些示例证明了 GoMLX 已经具备运行生产级 LLM 的能力,而无需 Python 的参与。对于开发者而言,这意味着可以在 Go 中构建聊天机器人、文本生成等应用,同时享受 Go 在并发和部署方面的优势。

7. 其他 Demo

除了上述示例外,GoMLX 还提供了许多其他有趣的 Demo,如使用 Flow Matching 技术生成图像、基于 图神经网络(GNN) 的 OGBN-MAG 模型、用于棋类游戏 Hive 的 AlphaZero AI 等。这些 Demo 覆盖了机器学习的多个领域,展示了 GoMLX 的通用性和前沿性。特别是 Hive 游戏的 AlphaZero 实现,不仅有命令行界面,还有浏览器中的 WASM Demo,用户可以直接在网页中与训练好的模型对弈,直观感受 GoMLX 在浏览器端的运行效果。

GoMLX 的 ONNX 模型支持与 Hugging Face 集成

GoMLX 对 ONNX 模型的支持是其一大亮点,这使其能够与 Python 生态的大量预训练模型对接。onnx-gomlx 提供了双向功能:一方面,可以将 ONNX 模型导入 GoMLX 进行推理或微调;另一方面,未来还计划支持将 GoMLX 模型导出为 ONNX 或 XLA 的 StableHLO 格式,以便在其他框架或引擎中运行。

通过 go-huggingface 库,GoMLX 能够方便地下载 Hugging Face Hub 上的模型和 tokenizer。这意味着开发者可以直接使用 Hugging Face 上成千上万的开源模型,而无需手动转换格式。例如,上述 Sentence Embedding 模型的示例就使用了 go-huggingface 来获取模型文件。同样,对于 BERT、GPT 等模型,也可以通过类似流程在 GoMLX 中加载使用。

值得注意的是,GoMLX 并非唯一支持 ONNX 的 Go 框架。例如 gonnxonnx-go 等项目提供纯 Go 的 ONNX 运行时,无需 XLA。然而,这些纯 Go 运行时目前速度较慢(对于某些模型可能比 ONNX Runtime 慢 8 倍以上),且仅支持 CPU。相比之下,GoMLX 利用 XLA 可以获得与原生框架相当的推理速度,同时仍保持了 Go 的部署优势。因此,对于性能要求较高的生产环境,GoMLX 是更优的选择;而对于小型模型或对性能要求不高的场景,纯 Go 的 ONNX 运行时则提供了更轻量的方案。

图1:GoMLX (XLA) 与纯 Go ONNX 运行时相对性能对比

GoMLX 在生产环境中的应用

GoMLX 的设计初衷之一就是让机器学习模型能够方便地部署到生产环境。与 Python 不同,Go 程序可以编译为单一二进制文件,启动迅速,无运行时依赖,非常适合微服务和云原生部署。GoMLX 提供了多种机制来支持生产化:

    • 检查点与模型导出: GoMLX 支持将训练好的模型上下文保存为检查点文件。这些检查点包含了模型的权重和结构信息,可以在推理时加载。通过 gomlx_checkpoints 工具,可以方便地管理检查点、查看训练指标曲线等。未来,GoMLX 计划支持将模型导出为 ONNX 或 StableHLO 格式,这样推理时就无需链接整个 GoMLX 库,从而减小可执行文件体积。
    • 推理服务构建: 使用 GoMLX,开发者可以轻松地将模型集成到 Go 应用中。例如,可以编写一个 HTTP 服务,加载训练好的模型检查点,对请求中的输入进行预测。由于 GoMLX 本身就是 Go 代码,这种集成非常自然,无需额外的桥接。同时,Go 的并发模型使得构建高吞吐的推理服务变得简单,可以利用 goroutine 轻松实现批量推理。
    • 单二进制部署: GoMLX 应用可以编译为单一二进制,包含模型和运行时。这与传统的 Python+ONNX Runtime 方案形成鲜明对比——后者通常需要庞大的 Docker 镜像来包含 Python 环境和依赖。GoMLX 的部署包往往只有几十兆,启动时间不到百毫秒,这在边缘设备或需要快速启动的场景下极具优势。
    • 跨平台与嵌入式: GoMLX 的纯 Go 后端使其可以运行在几乎所有 Go 能运行的平台,包括浏览器(通过 WASM)和嵌入式设备(如 Tamago)。这意味着开发者可以在资源受限的环境中运行 ML 模型,而不需要操作系统级别的依赖。这对于物联网、边缘计算等场景非常重要。
    • 与 Hugot 等高层库结合: 为了进一步简化部署,社区出现了如 Hugot 这样的库,它在 GoMLX 之上提供类似 Hugging Face Transformers 的高级 API。Hugot 支持多种后端(XLA、ONNX Runtime、纯 Go),并提供管道(Pipeline)抽象,使开发者只需几行代码就能完成从模型下载、预处理到推理的整个流程。这大大降低了将 ML 功能嵌入 Go 应用的门槛。

总结

GoMLX 已经成为 Go 生态中机器学习领域最活跃、功能最全面的框架。它通过提供与 PyTorch 类似的易用 API 和与 XLA 相当的高性能后端,让开发者能够在 Go 中完成从研究实验到生产部署的全流程。丰富的示例(从基础的 MNIST、CIFAR-10,到前沿的 LLM 和 ONNX 模型)证明了 GoMLX 的通用性和成熟度。随着 Go 语言对 SIMD 等特性的支持不断完善,以及 GoMLX 自身在动态形状、分布式训练等方面的持续开发,GoMLX 有望进一步缩小与 Python 框架的差距。对于希望将机器学习融入 Go 项目的开发者来说,GoMLX 是一个值得深入研究和尝试的优秀框架。它不仅提供了“Python 训练、Go 推理”的可行方案,更在探索一条让 Go 成为 ML 第一语言的道路。我们有理由相信,在不久的将来,GoMLX 将成为 Go 开发者进行机器学习的首选工具,为 Go 生态带来一场 ML 革命。

👍 1
✨步子哥 #2 2026-04-20 09:20

https://github.com/born-ml/born

👍 1
推荐

🌟 智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

🎁 领取 2000万 Tokens