sonnet

GitHub
9.9k 1.3k 简单 1 次阅读 今天Apache-2.0开发框架
AI 解读 由 AI 自动生成,仅供参考

Sonnet 是由 DeepMind 研究人员基于 TensorFlow 2 打造的神经网络库,旨在为机器学习研究提供简洁且可组合的抽象构建块。它主要解决了传统框架中模型结构复杂、耦合度高以及训练逻辑固化的问题,让开发者能够更专注于算法创新而非底层实现细节。

这款工具特别适合人工智能研究人员、算法工程师及深度学习开发者使用。Sonnet 的核心设计理念围绕唯一的概念"snt.Module"展开,模块内部可独立管理参数、子模块及计算方法,彼此之间完全解耦。与许多“ opinionated"(强观点)的框架不同,Sonnet 不强制绑定特定的训练流程,用户可自由构建或复用现有的训练策略,灵活性极高。

其技术亮点在于“延迟初始化”机制:模块的参数形状通常在首次接收输入数据时自动推导并创建,无需预先手动定义繁琐的维度信息。此外,Sonnet 内置了丰富的预定义模块(如线性层、卷积层、批归一化等)及经典网络结构,同时也鼓励用户根据需求自定义模块。配合清晰的代码风格和详尽的文档,Sonnet 让构建从监督学习到强化学习等各类神经网络变得简单直观,是探索前沿 AI 模型的得力助手。

使用场景

某深度学习团队正在基于 TensorFlow 2 研发一套复杂的强化学习代理模型,需要频繁组合自定义网络层并管理大量状态参数。

没有 sonnet 时

  • 开发者需手动编写繁琐的类继承代码来管理变量作用域,稍有不慎就会导致参数命名冲突或泄露。
  • 构建复杂网络时,层层嵌套的函数调用让数据流向难以追踪,调试时无法直观定位某一层的输出异常。
  • 缺乏统一的模块封装标准,团队成员各自为战,导致代码风格割裂,复用他人编写的网络组件极其困难。
  • 每次修改网络结构(如增加批归一化层)都需要重构大量底层逻辑,严重拖慢了算法迭代和实验验证的速度。

使用 sonnet 后

  • 利用 snt.Module 统一封装逻辑,自动处理参数创建与作用域隔离,彻底消除了手动管理变量的出错风险。
  • 通过 snt.Sequential 等组合工具像搭积木一样构建网络,数据流转清晰可见,快速定位并修复了中间层计算错误。
  • 团队基于统一的模块接口开发,轻松将同事写好的奖励预测模块直接嵌入主模型,显著提升了协作效率。
  • 修改网络架构只需调整模块序列或替换单个组件,无需触动底层训练循环,让新想法的验证周期从数天缩短至数小时。

sonnet 通过极简且高内聚的模块化设计,让研究人员从繁琐的工程细节中解放出来,专注于核心算法的创新与探索。

运行环境要求

操作系统
  • 未说明
GPU

非必需,但示例推荐使用 Google Colab (提供 GPU 或 TPU)

内存

未说明

依赖
notesSonnet 是构建在 TensorFlow 2 之上的库,由 DeepMind 开发。它不提供内置的训练框架,用户需自行构建或使用第三方训练脚本。支持通过 pickle、TensorFlow Checkpoint 和 Saved Model 进行序列化。支持分布式训练,但梯度平均和批归一化统计同步等逻辑需用户在训练脚本中自行实现或使用特定的分布式感知模块。
python未说明
tensorflow>=2.0
tensorflow-probability
dm-sonnet
sonnet hero image

快速开始

Sonnet

Sonnet

文档 | 示例

Sonnet 是一个构建在 TensorFlow 2 之上的库,旨在为机器学习研究提供简单、可组合的抽象。

简介

Sonnet 由 DeepMind 的研究人员设计和开发。它可以用于构建各种用途的神经网络(无监督/有监督学习、强化学习等)。我们发现它对我们的团队非常有效,你也许也会喜欢!

具体来说,Sonnet 提供了一个简单而强大的编程模型,核心概念是 snt.Module。模块可以包含参数、其他模块以及对用户输入应用某些函数的方法。Sonnet 自带许多预定义模块(如 snt.Linearsnt.Conv2Dsnt.BatchNorm)和一些预定义的模块网络(如 snt.nets.MLP),同时也鼓励用户自定义模块。

与许多框架不同,Sonnet 对 如何 使用模块持开放态度。模块被设计成自包含且彼此完全解耦。Sonnet 不自带训练框架,而是鼓励用户自行构建或采用他人开发的框架。

Sonnet 还致力于简洁易懂,我们的代码(希望)清晰且专注。当我们选择默认值时(例如初始参数值的默认值),我们会说明原因。

快速入门

示例

尝试 Sonnet 的最简单方式是使用 Google Colab,它提供免费的 Python 笔记本,并配备 GPU 或 TPU。

安装

要开始使用,请安装 TensorFlow 2.0 和 Sonnet 2:

$ pip install tensorflow tensorflow-probability
$ pip install dm-sonnet

你可以运行以下代码来验证是否安装正确:

import tensorflow as tf
import sonnet as snt

print("TensorFlow 版本 {}".format(tf.__version__))
print("Sonnet 版本 {}".format(snt.__version__))

使用现有模块

Sonnet 自带许多内置模块,你可以直接使用。例如,要定义一个 MLP,我们可以使用 snt.Sequential 模块来按顺序调用多个模块,将前一个模块的输出作为下一个模块的输入。我们可以使用 snt.Lineartf.nn.relu 来实际定义计算过程:

mlp = snt.Sequential([
    snt.Linear(1024),
    tf.nn.relu,
    snt.Linear(10),
])

要使用这个模块,我们需要“调用”它。Sequential 模块(以及大多数模块)都定义了 __call__ 方法,这意味着你可以直接通过名称调用它们:

logits = mlp(tf.random.normal([batch_size, input_size]))

通常,我们还会获取模块的所有参数。Sonnet 中的大多数模块会在第一次被调用并传入输入时创建其参数(因为参数的形状通常是输入的函数)。Sonnet 模块提供了两个属性来访问这些参数。

variables 属性会返回给定模块引用的所有 tf.Variable

all_variables = mlp.variables

需要注意的是,tf.Variable 并不只用于模型的参数。例如,它们还用于存储 snt.BatchNorm 中指标的状态。大多数情况下,用户会提取模块的变量以传递给优化器进行更新。然而,不可训练的变量通常不应包含在该列表中,因为它们是通过另一种机制更新的。TensorFlow 内置了标记变量为“可训练”(模型参数)或“不可训练”(其他变量)的机制。Sonnet 提供了一种从模块中收集所有可训练变量的方法,这通常是你要传递给优化器的内容:

model_parameters = mlp.trainable_variables

构建自己的模块

Sonnet 强烈鼓励用户继承 snt.Module 来定义自己的模块。让我们从创建一个简单的线性层 MyLinear 开始:

class MyLinear(snt.Module):

  def __init__(self, output_size, name=None):
    super(MyLinear, self).__init__(name=name)
    self.output_size = output_size

  @snt.once
  def _initialize(self, x):
    initial_w = tf.random.normal([x.shape[1], self.output_size])
    self.w = tf.Variable(initial_w, name="w")
    self.b = tf.Variable(tf.zeros([self.output_size]), name="b")

  def __call__(self, x):
    self._initialize(x)
    return tf.matmul(x, self.w) + self.b

使用这个模块非常简单:

mod = MyLinear(32)
mod(tf.ones([batch_size, input_size]))

通过继承 snt.Module,你可以免费获得许多便利的功能。例如,默认实现的 __repr__ 方法,会显示构造函数的参数(非常有助于调试和内省):

>>> print(repr(mod))
MyLinear(output_size=10)

你还可以使用 variablestrainable_variables 属性:

>>> mod.variables
(<tf.Variable 'my_linear/b:0' shape=(10,) ...>,
 <tf.Variable 'my_linear/w:0' shape=(1, 10) ...>)

你可能会注意到上述变量名前都有 my_linear 前缀。这是因为当方法被调用时,Sonnet 模块会进入模块的命名空间。通过进入模块的命名空间,我们可以为 TensorBoard 等工具提供更有用的图结构(例如,所有发生在 my_linear 内的操作都会被归类到名为 my_linear 的组中)。

此外,你的模块现在也支持 TensorFlow 的检查点保存和模型保存功能,这些高级特性将在后面介绍。

序列化

Sonnet 支持多种序列化格式。我们支持的最简单格式是 Python 的 pickle,所有内置模块都经过测试,确保可以在同一 Python 进程中通过 pickle 保存和加载。不过,我们通常不建议使用 pickle,因为它在 TensorFlow 的许多部分中支持不佳,而且在实践中往往比较脆弱。

TensorFlow 检查点

参考: https://www.tensorflow.org/alpha/guide/checkpoints

TensorFlow 检查点可用于在训练过程中定期保存参数值。这在程序崩溃或中断时保存训练进度非常有用。Sonnet 与 TensorFlow 检查点能够很好地协同工作:

checkpoint_root = "/tmp/checkpoints"
checkpoint_name = "example"
save_prefix = os.path.join(checkpoint_root, checkpoint_name)

my_module = create_my_sonnet_module()  # 可以是任何继承自 snt.Module 的对象。

# `Checkpoint` 对象管理与其构造函数中传入的对象相关联的 TensorFlow 状态的检查点保存。请注意,Checkpoint 支持在创建时恢复,这意味着 `my_module` 的变量**无需**在从检查点恢复之前被创建(它们的值将在被创建时被恢复)。
checkpoint = tf.train.Checkpoint(module=my_module)

# 大多数训练脚本都会希望在存在检查点的情况下从中恢复。例如,如果你中断了训练(比如为了将 GPU 用于其他任务,或者在云环境中实例被抢占),就需要进行恢复。
latest = tf.train.latest_checkpoint(checkpoint_root)
if latest is not None:
  checkpoint.restore(latest)

for step_num in range(num_steps):
  train(my_module)

  # 在训练过程中,我们会偶尔保存权重的值。需要注意的是,这是一个阻塞调用,可能会比较慢(通常是在机器上速度最慢的存储设备上写入数据)。如果你的环境更加可靠,可能可以适当减少保存频率。
  if step_num > 0 and step_num % 1000 == 0:
    checkpoint.save(save_prefix)

# 务必保存最终的模型参数!!
checkpoint.save(save_prefix)

TensorFlow Saved Model

参考: https://www.tensorflow.org/alpha/guide/saved_model

TensorFlow 的 Saved Model 可以用来保存一份与 Python 源代码解耦的网络副本。这是通过保存描述计算过程的 TensorFlow 图以及包含权重值的检查点来实现的。

要创建一个 Saved Model,首先需要创建一个你想要保存的 snt.Module

my_module = snt.nets.MLP([1024, 1024, 10])
my_module(tf.ones([1, input_size]))

接下来,我们需要创建另一个模块,用于描述我们想要导出的模型的具体部分。我们建议这样做(而不是直接修改原始模型),以便对实际导出的内容有更精细的控制。这通常很重要,可以避免生成非常大的 Saved Model,并且只共享你希望公开的部分(例如,你只想共享 GAN 的生成器,而保持判别器私密)。

@tf.function(input_signature=[tf.TensorSpec([None, input_size])])
def inference(x):
  return my_module(x)

to_save = snt.Module()
to_save.inference = inference
to_save.all_variables = list(my_module.variables)
tf.saved_model.save(to_save, "/tmp/example_saved_model")

现在,我们在 /tmp/example_saved_model 文件夹中有了一个 Saved Model:

$ ls -lh /tmp/example_saved_model
total 24K
drwxrwsr-t 2 tomhennigan 154432098 4.0K Apr 28 00:14 assets
-rw-rw-r-- 1 tomhennigan 154432098  14K Apr 28 00:15 saved_model.pb
drwxrwsr-t 2 tomhennigan 154432098 4.0K Apr 28 00:15 variables

加载这个模型非常简单,甚至可以在没有构建该 Saved Model 的任何 Python 代码的另一台机器上完成:

loaded = tf.saved_model.load("/tmp/example_saved_model")

# 使用 inference 方法。请注意,这并不会运行 `to_save` 中的 Python 代码,而是使用 Saved Model 中包含的 TensorFlow 图。
loaded.inference(tf.ones([1, input_size]))

# 可以使用 all_variables 属性来获取已恢复的变量。
assert len(loaded.all_variables) > 0

需要注意的是,加载后的对象并不是 Sonnet 模块,而是一个容器对象,它包含了我们在前面步骤中添加的特定方法(如 inference)和属性(如 all_variables)。

分布式训练

示例: https://github.com/deepmind/sonnet/blob/v2/examples/distributed_cifar10.ipynb

Sonnet 支持使用 自定义的 TensorFlow 分布式策略 进行分布式训练。

Sonnet 与使用 tf.keras 进行分布式训练的一个关键区别在于,Sonnet 模块和优化器在分布式策略下运行时的行为不会发生变化(例如,我们不会对梯度进行平均或同步批归一化统计信息)。我们认为用户应该完全掌控这些训练细节,而不应将其硬编码到库中。相应的权衡是,你需要在自己的训练脚本中实现这些功能(通常只需两行代码,在应用优化器之前对梯度进行全归约操作),或者替换为明确支持分布式训练的模块(例如 snt.distribute.CrossReplicaBatchNorm)。

我们的 分布式 Cifar-10 示例 详细介绍了如何使用 Sonnet 进行多 GPU 训练。

版本历史

v2.0.22024/01/02
v2.0.12024/01/02
v2.0.02020/03/27
v2.0-beta2019/09/06

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

156k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|4天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|5天前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架