torchtyping

GitHub
1.5k 39 简单 1 次阅读 1周前Apache-2.0开发框架
AI 解读 由 AI 自动生成,仅供参考

torchtyping 是一个专为 PyTorch 设计的辅助库,旨在为张量(Tensor)的形状、数据类型、布局及维度名称提供清晰的类型注解与动态检查能力。在深度学习开发中,开发者常需依靠注释或断言来追踪张量维度,这不仅繁琐且容易引发难以排查的形状不匹配错误。torchtyping 通过引入直观的语法,让函数签名直接表达“输入张量应具备何种维度”,从而将隐式的文档说明转化为显式的代码约束。

该工具特别适合 PyTorch 开发者与算法研究人员使用,尤其是那些受困于复杂模型中张量形状调试的人群。其核心亮点在于支持与 typeguard 集成,能够在代码运行时自动验证张量是否符合预设的形状与类型规范,一旦检测到维度不一致即刻报错,有效将潜在 Bug 扼杀在萌芽状态。此外,它还支持灵活定义任意数量的批次维度、特定尺寸限制以及命名张量等高级特性。

值得注意的是,虽然 torchtyping 功能强大,但其作者目前更推荐新项目使用升级版工具 jaxtyping,后者兼容静态类型检查器且同样支持 PyTorch。不过,对于已有项目或希望快速提升代码可读性与健壮性的团队,torchtyping 依然是一个轻量且实用的选择,既能作为严谨的文档工具,也能在测试阶段充当可靠的“守门员”。

使用场景

某深度学习团队在开发多模态融合模型时,需要频繁处理来自视觉编码器和文本编码器的张量,确保它们在批次维度(batch)上严格对齐才能进行后续计算。

没有 torchtyping 时

  • 开发者必须在函数内部编写大量 assert x.shape[0] == y.shape[0] 语句来手动验证维度一致性,代码冗余且易遗漏。
  • 关键张量的形状含义(如“时间步”或“特征通道”)仅靠注释 # shape: (batch, time) 说明,新成员阅读代码时极易误解。
  • 当输入数据因预处理失误导致维度不匹配时,错误往往在深层网络运算中才爆发,报错信息晦涩难懂,排查耗时。
  • 重构代码时缺乏自动约束,修改某个层的输出维度后,无法立即发现下游所有依赖该形状的函数已失效。

使用 torchtyping 后

  • 通过 TensorType["batch", "time"] 语法直接在类型注解中声明形状,torchtyping 配合 typeguard 在运行时自动拦截维度不匹配的调用并抛出清晰异常。
  • 函数签名即文档,"batch""channels" 等语义化标签让张量用途一目了然,彻底消除了维护过时注释的负担。
  • 错误在数据进入函数的第一时间被捕获,报错信息明确指出是哪个命名维度(如 'batch')出现了大小冲突(如 32 vs 64),定位问题秒级完成。
  • 静态分析与动态检查双重保障,一旦调整上游张量结构,所有未适配的下游函数会立即报错,大幅降低重构风险。

torchtyping 将隐式的张量形状约定转化为显式的、可自动执行的代码契约,从根源上杜绝了深度学习中最常见的维度错位 Bug。

运行环境要求

GPU

未说明

内存

未说明

依赖
notes作者强烈建议新项目改用 jaxtyping,因为它支持静态类型检查器且不再依赖 JAX。若使用 typeguard 进行运行时检查,版本必须低于 3.0.0。若不安装 typeguard,该库仅作为文档注释使用。提供 pytest 插件以在测试时自动启用类型检查。
python>=3.7
torch>=1.7.0
typeguard<3.0.0 (可选)
torchtyping hero image

快速开始

请改用 jaxtyping

欢迎!对于新项目,我现在强烈建议使用我更新的 jaxtyping 项目。它支持 PyTorch,实际上并不依赖 JAX,而且与 TorchTyping 不同的是,它兼容静态类型检查器。名称中的“jax”现在只是历史遗留了!




原始的 torchtyping README 如下。


torchtyping

为张量的形状、数据类型、命名维度等添加类型注解

将这段代码:

def batch_outer_product(x: torch.Tensor, y: torch.Tensor) -> torch.Tensor:
    # x 的形状是 (batch, x_channels)
    # y 的形状是 (batch, y_channels)
    # 返回值的形状是 (batch, x_channels, y_channels)

    return x.unsqueeze(-1) * y.unsqueeze(-2)

改为:

def batch_outer_product(x:   TensorType["batch", "x_channels"],
                        y:   TensorType["batch", "y_channels"]
                        ) -> TensorType["batch", "x_channels", "y_channels"]:

    return x.unsqueeze(-1) * y.unsqueeze(-2)

同时对形状(数据类型等)规范进行程序化检查。

告别 bug!迎接强制执行且清晰明了的代码文档。

如果你(像我一样)经常在代码中写类似 # x 的形状是 (batch, hidden_state) 的注释,或者插入诸如 assert x.shape == y.shape 的语句,仅仅是为了跟踪各个张量的形状,那么这个库就非常适合你。


安装

pip install torchtyping

需要 Python >=3.7 和 PyTorch >=1.7.0。

如果使用 typeguard,则其版本必须低于 3.0.0。

使用方法

torchtyping 允许对以下内容进行类型注解:

  • 形状:大小、维度数;
  • 数据类型(浮点数、整数等);
  • 布局(稠密、稀疏);
  • 命名维度,基于 命名张量
  • 任意数量的批次维度,通过 ... 表示;
  • 以及任何其他你想要的内容,因为 torchtyping 具有高度可扩展性。

如果(可选地)安装了 typeguard则可以在运行时检查类型,以确保张量确实符合声明的形状、数据类型等。

# 示例

from torch import rand
from torchtyping import TensorType, patch_typeguard
from typeguard import typechecked

patch_typeguard()  # 在 @typechecked 之前调用

@typechecked
def func(x: TensorType["batch"],
         y: TensorType["batch"]) -> TensorType["batch"]:
    return x + y

func(rand(3), rand(3))  # 正常运行
func(rand(3), rand(1))
# TypeError: 维度 'batch' 的大小不一致。分别得到 1 和 3。

typeguard 还提供了一个导入钩子,可以用来自动测试整个模块,而无需手动添加 @typeguard.typechecked 装饰器。

如果你不使用 typeguard,则可以完全省略 torchtyping.patch_typeguard(),仅将 torchtyping 用于文档目的。如果你目前还没有在常规 Python 编程中使用 typeguard,强烈建议考虑使用它。这是一种很好的方式来消除 bug。此外,typeguardtorchtyping 都可以与 pytest 集成,因此如果你担心性能开销,也可以只在测试时启用它们。

API

torchtyping.TensorType[shape, dtype, layout, details]

该库的核心。

shapedtypelayoutdetails 各参数均可选。

  • shape 参数可以是以下任意一种:
    • 一个 int:维度必须精确为该大小。若为 -1,则允许任意大小。
    • 一个 str:运行时传入的维度大小将绑定到该名称,并且所有张量都会被检查以确保尺寸一致。
    • 一个 ...:表示任意数量、任意大小的维度。
    • 一个 str: int 对(实际上是切片),结合了 strint 的行为。(单独的 str 等价于 str: -1。)
    • 一个 str: str 对,此时运行时传入的维度大小将同时绑定到这两个名称,且任何带有其中任一名称的维度都必须具有相同的大小。(有些人喜欢用这种方式为一个维度关联多个名称,以增强文档性。)
    • 一个 str: ... 对,此时与 ... 对应的多个维度将被绑定到 str 指定的名称,并再次检查各参数之间的一致性。
    • None,当与下面的 is_named 一起使用时,表示该维度在 命名张量 的意义上不应具有名称。
    • 一个 None: int 对,结合了 Noneint 的行为。(单独的 None 等价于 None: -1。)
    • 一个 None: str 对,结合了 Nonestr 的行为。(即该维度不应具有命名,但其大小必须与其他使用该字符串的地方保持一致。)
    • typing.Any:该维度允许任意大小(等同于 -1)。
    • 上述类型的任意元组。例如:TensorType["batch": ..., "length": 10, "channels", -1]。如果只想指定维度的数量,可以使用例如 TensorType[-1, -1, -1] 表示三维张量。
  • dtype 参数可以是以下任意一种:
    • torch.float32torch.float64 等。
    • intboolfloat,这些会被转换为对应的 PyTorch 类型。float 特别地会被解释为 torch.get_default_dtype(),通常为 float32
  • layout 参数可以是 torch.stridedtorch.sparse_coo,分别用于稠密和稀疏张量。
  • details 参数提供了一种传递任意数量附加标志的方式,用于自定义和扩展 torchtyping。默认内置两个标志。torchtyping.is_named 会检查 张量维度的名称,而 torchtyping.is_float 可用于检查是否传入了任意浮点类型。(而不是像 TensorType[torch.float32] 那样只检查特定类型。)有关如何使用自定义 details 来扩展 torchtyping 的讨论,请参阅进一步的文档
  • 可以通过将多个条件组合在一个方括号内来同时检查多项内容。例如:TensorType["batch": ..., "length", "channels", float, is_named]
torchtyping.patch_typeguard()

torchtypingtypeguard 集成,以执行运行时类型检查。应在全局范围内调用 torchtyping.patch_typeguard(),它会修补 typeguard 以检查 TensorType

此函数可以多次安全调用。(首次调用后便不再执行任何操作。)

  • 如果使用 @typeguard.typechecked,则应在使用 @typeguard.typechecked 之前随时调用 torchtyping.patch_typeguard()。例如,可以在每个使用 torchtyping 的文件开头调用。
  • 如果使用 typeguard.importhook.install_import_hook,则应在定义要进行检查的函数之前随时调用 torchtyping.patch_typeguard()。例如,可以在安装 typeguard 导入钩子的同时仅调用一次 torchtyping.patch_typeguard()。(钩子和补丁的顺序并不重要。)
  • 如果不使用 typeguard,则可以完全省略 torchtyping.patch_typeguard(),仅将 torchtyping 用于文档目的。
pytest --torchtyping-patch-typeguard

torchtyping 提供了一个 pytest 插件,可在测试前自动运行 torchtyping.patch_typeguard()pytest 会自动发现该插件,您只需传递 --torchtyping-patch-typeguard 标志即可启用它。随后可以像往常一样将包传递给 typeguard,无论是通过 @typeguard.typecheckedtypeguard 的导入钩子,还是通过 pytest 标志 --typeguard-packages="your_package_here"

进一步的文档

请参阅进一步的文档,了解:

  • 常见问题解答;
    • 包括与 flake8mypy 的兼容性;
  • 如何编写 torchtyping 的自定义扩展;
  • 与此主题相关的其他库和资料的资源与链接;
  • 更多示例。

常见问题

相似工具推荐

stable-diffusion-webui

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

162.1k|★★★☆☆|今天
开发框架图像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 真正成长为懂上

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

ComfyUI

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

107.7k|★★☆☆☆|2天前
开发框架图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

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

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|2天前
Agent图像开发框架