blocksparse

GitHub
1.1k 198 较难 1 次阅读 1个月前MIT开发框架
AI 解读 由 AI 自动生成,仅供参考

blocksparse 是一个专为深度学习设计的高性能开源库,核心功能是提供针对“块稀疏”矩阵乘法和卷积运算的高效 GPU 内核。在训练大型神经网络时,模型参数往往存在大量冗余,传统稠密计算浪费了宝贵的算力资源。blocksparse 通过引入块稀疏结构,允许开发者定义特定的稀疏模式,仅对非零数据块进行计算,从而在显著减少内存占用和计算量的同时,充分利用 GPU 并行加速能力,大幅提升模型训练与推理效率。

该工具主要面向 AI 研究人员和深度学习工程师,特别是那些致力于优化大模型架构、探索稀疏化算法或需要在有限硬件资源下提升性能的用户。其技术亮点在于提供了高度定制的 TensorFlow 算子,支持多种 NVIDIA GPU 架构(如 Maxwell、Pascal 和 Volta),并针对不同硬件特性自动选择最优的底层实现(ASM 或 CUDA C)。此外,它还集成了边缘偏置、稀疏权重归一化等辅助操作,为构建复杂的稀疏神经网络提供了完整的基础设施。虽然目前处于活跃开发阶段,API 可能存在变动,但对于追求极致计算效率的技术团队而言,blocksparse 是一个极具价值的底层加速工具。

使用场景

某 AI 实验室团队正在基于 TensorFlow 训练一个超大规模的语言模型,旨在提升长文本生成的准确性与响应速度。

没有 blocksparse 时

  • 显存浪费严重:传统稠密矩阵乘法强制存储和计算大量零值参数,导致高端 GPU 显存迅速耗尽,无法加载更大规模的模型。
  • 训练效率低下:GPU 算力被无效的零值运算占用,每个训练步耗时过长,迭代一次完整数据集需要数天时间。
  • 硬件适配困难:团队难以针对不同代际的 Nvidia GPU(如 Maxwell 或 Pascal)手动优化底层内核,性能发挥受限。
  • 开发成本高昂:若要实现稀疏加速,工程师需从头编写复杂的 CUDA 内核代码,极易出错且维护困难。

使用 blocksparse 后

  • 显存利用率倍增:blocksparse 通过块稀疏矩阵乘法仅处理非零数据块,在相同显存下可支撑参数量翻倍的网络结构。
  • 推理与训练提速:利用专为 GPU 优化的高效内核,消除了冗余计算,模型训练速度显著提升,大幅缩短研发周期。
  • 自动硬件优化:工具内置针对 Kepler 到 Volta 等不同架构的优化策略(如 ASM 或 CUDA C 实现),自动匹配最佳执行路径。
  • 集成便捷高效:只需几行代码即可替换标准矩阵乘法操作,无缝融入现有 TensorFlow 工作流,无需深入底层驱动开发。

blocksparse 让研究团队在不增加硬件投入的前提下,突破了大模型训练的显存与算力瓶颈,实现了效率与规模的双重飞跃。

运行环境要求

操作系统
  • Linux
GPU
  • 必需 NVIDIA GPU
  • 推荐 Pascal 或 Maxwell 架构(性能最佳),支持 Kepler、Volta(需重新编译)
  • 未明确说明显存大小要求
  • 默认支持 CUDA 8
  • 若使用 CUDA 9 和 Volta 架构,需更新构建目标并从源码编译 TensorFlow
内存

未说明

依赖
notes该工具处于活跃开发中,可能会发生破坏性变更。BSMatMul-CudaC 仅支持 feature_axis=0,而 BSMatMul-ASM 仅支持 feature_axis=1。如果 CUDA 不在默认路径 (/usr/local/cuda) 或有多个版本,编译时需设置 CUDA_HOME 环境变量。对于 Volta 架构和 CUDA 9,需要从源码编译 TensorFlow 并修改构建参数。
python3.5+ 或 2.7+
tensorflow-gpu>=1.4.0
numpy
blocksparse hero image

快速开始

状态: 活跃(处于积极开发中,可能会有破坏性变更)

Blocksparse

blocksparse 包含用于块稀疏矩阵乘法的 TensorFlow 操作及相应的 GPU 内核。此外,还包含与之相关的操作,如边偏置、稀疏权重归一化和层归一化。

欲了解更多信息,请参阅 OpenAI 博客上的发布文章

前提条件

首先,您需要至少一块 Nvidia GPU。为获得最佳性能,我们建议使用 Pascal 或 Maxwell 架构的 GPU——以下是按 GPU 类型划分的功能列表:

GPU 系列 BSMatMul-ASM BSMatMul-CudaC BSConv
Kepler - X -
Maxwell X(最快) X X
Pascal X(最快) X X
Volta - X(最快) -

请注意,BSMatMul-CudaC 仅支持 feature_axis=0,而 BSMatMul-ASM 仅支持 feature_axis=1

此外,您还需要:

  • 一个可用的 Linux 系统(我们使用 Ubuntu 16.04),并安装适用于您的 GPU 的 Nvidia 驱动程序。
  • CUDA 8(位于 /usr/local/cuda)。
  • Python 3.5 或更高版本,或 2.7 或更高版本。
  • TensorFlow 1.4.0 或更高版本,并具备 GPU 支持(例如:pip install tensorflow-gpu)。
  • 如果您使用 CUDA 9 和 Volta 架构的 GPU,需更新构建目标(-gencode=arch=compute_70,code=sm_70),并从源码编译 TensorFlow。

安装

pip install blocksparse

使用方法

以下示例执行了一个块稀疏矩阵乘法:

from blocksparse.matmul import BlocksparseMatMul
import tensorflow as tf
import numpy as np

hidden_size = 4096
block_size = 32
minibatch_size = 64

# 创建一个(随机)稀疏模式
sparsity = np.random.randint(2, size=(hidden_size//block_size,hidden_size//block_size))

# 初始化稀疏矩阵乘法对象
bsmm = BlocksparseMatMul(sparsity, block_size=block_size)

# 图中的输入
x = tf.placeholder(tf.float32, shape=[None, hidden_size])

# 初始化块稀疏权重
w = tf.get_variable("w", bsmm.w_shape, dtype=tf.float32)

# 执行块稀疏矩阵乘法
y = bsmm(x, w)

# 运行
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
result = sess.run([y], feed_dict = {x: np.ones((minibatch_size,hidden_size), dtype='float32')})
print(result)

有关使用块稀疏操作训练语言模型的更复杂示例,请参阅 examples/

开发

如果您有兴趣对这些操作和内核进行修改,可以直接从源码构建:

git clone git@github.com:openai/blocksparse.git
cd blocksparse

make compile
pip install dist/*.whl

# 如果需要,可以运行测试
test/blocksparse_matmul_test.py
test/blocksparse_conv_test.py

如果您的 CUDA 不在 /usr/local/cuda 目录下,或者同时安装了多个版本,例如 /usr/local/cuda-8.0/usr/local/cuda-9.0,请将 CUDA_HOME 设置为编译时使用的基础路径,以便在执行 make compile 时正确引用。

API 文档:

blocksparse.matmul

class BlocksparseMatMul(object)

    def __init__(self, layout, block_size=32, feature_axis=1)
    """
    layout:一个由 1 和 0 组成的二维数组,用于指定块布局。
    block_size:支持 32、16 和 8。
    feature_axis:当 block_size 小于 32 时,采用 (C,N) 激活布局会使内存访问效率显著提高。
    """

    # 用于生成张量的形状辅助函数(N 表示小批量大小)
    self.w_shape
    def i_shape(self, N)
    def o_shape(self, N)

    # 根据给定的块 ID 返回布局中对应的 (c,k) 坐标
    def block_coord(self, block)

    # 实验性正交初始化
    def ortho_init(self)

    # 在实践中,只需使用 identity_init 加上层归一化即可完成初始化。
    # 当 gpu=True 时,初始化操作由设备上的内核直接执行。
    def identity_init(self, gpu=False)

    # 用于实现权重归一化。但在实际应用中,层归一化效果更好。
    def l2_normalize(self, W,gain=None,epsilon=1e-6,dtype=np.float32)

    def __call__(self, I,W,dw_dtype=tf.float32)
    """
    执行该操作。请注意,权重变量与 bsmm 对象是独立的,这允许多个权重绑定到同一个 bsmm 布局。

    dw_dtype:用于控制 dw 的精度格式。
    """


def group_param_grads(param_grad, group_size=8, cast32=True)
"""
param_grad:给定 bsmm 权重变量的 TensorFlow 参数梯度(由 tf.gradients 返回)。
group_size:期望的分组大小,最多支持 8 组。

此函数会重写 TensorFlow 图,将来自不同时间步的权重梯度矩阵乘法(以及跨时间共享的权重)合并为一个更高效的单次矩阵乘法。
"""


class SparseProj(object):
    def __init__(self, nhidden, nproj=None,proj_stride=None,block_size=32,gather_lut=None)
    """
    实验性类,用于支持稠密到稀疏以及稀疏到稠密的投影操作。其功能与 TensorFlow 操作基本相同,但速度更快,并支持其他精度格式。此类假设存在唯一的 1 对 1 映射,因此在反向传播操作中无需使用原子操作。
    """

    def gather(self, x)
    def scatter(self, x)
    def scatter_add(self, x,y)
    def scatter_mul(self, x,y)

blocksparse.conv

class BlocksparseConv(object):
    def __init__(self, BCK, TRS, DHW, MPQ=None, strides=(1,1,1), dilates=(1,1,1), padding="SAME", edge_bias=False)
    """
    BCK: (                                             # 块(B)/输入(C)/输出(K)特征维度
             ( (c0, c1, c2, ...), (k0, k1, k2, ...) ), # 块 0 的 c,k 是 C,K 维度的索引
             ( (c0, c1, c2, ...), (k0, k1, k2, ...) ), # 块 1
             ( (c0, c1, c2, ...), (k0, k1, k2, ...) ), # 块 2 ...
         )
    TRS: (T,R,S) 或 (R,S) 或 (S,)         - 卷积核的空间尺寸维度
    DHW: (D,H,W) 或 (H,W) 或 (W,)         - 输入图像的空间尺寸维度
    MPQ: (M,P,Q) 或 (P,Q) 或 (Q,) 或 None - 输出图像的空间尺寸维度(用于步幅转置卷积中存在歧义的情况)
    strides: (1,1,1) 或 (1,1) 或 (1,)
    dilates: (1,1,1) 或 (1,1) 或 (1,)
    padding: (1,1,1) 或 (1,1) 或 (1,) 或 "SAME" 或 "VALID"
    edge_bias: True/False
    """

    # 用于设置变量或测试张量的形状辅助函数
    def edge_bias_shape(self)
    def f_shape(self, block=None)
    def i_shape(self, N)
    def o_shape(self, N)

    # 执行操作,传入参数变量和输入
    def __call__(vs, F, I, edge_bias=None):

    # 用于实现权重归一化
    def l2_normalize(self, F, gain=None, epsilon=1e-6, dtype=np.float32):

class BlocksparseDeconv(BlocksparseConv)
    def __init__(self, BCK, TRS, DHW, MPQ=None, strides=(1,1,1), dilates=(1,1,1), padding="SAME", edge_bias=False)
    """
    反卷积。参数与上述相同。
    """

def cwise_linear(x, a=None, b=None)
"""
在 NCHW 张量格式下,TensorFlow 对中间 C 维度上的简单广播操作实现得非常缓慢。
这个函数可以用来执行:
    y = a*x + b
    y = a*x
    y = x + b

其中 a 和 b 的形状为 (1,C,1,1)。
这对于权重归一化等操作非常有用。

blocksparse.ew

# 与 tf 操作相同,但通常更高效,并支持自定义精度格式
def        add(x, y, name=None)
def   multiply(x, y, name=None)
def   subtract(x, y, name=None)
def     divide(x, y, name=None)
def    maximum(x, y, name=None)
def    minimum(x, y, name=None)

def   negative(x,    name=None)
def reciprocal(x,    name=None)
def     square(x,    name=None)
def       sqrt(x,    name=None)
def        exp(x,    name=None)
def        log(x,    name=None)
def    sigmoid(x,    name=None)
def       tanh(x,    name=None)
def       relu(x,    name=None)
def       elu (x, alpha=1.0, name=None)

# 这里参数可以是 4 个独立的门控张量,或者
# 一个合并后的门控张量(内部会拆分成 4 个)
def fused_lstm_gates(c, *args, name=None)

def split4(x)
def concat4(x0, x1, x2, x3)

# 一个自定义的类型转换操作,用于探索新的精度格式
def float_cast(x, dtype, dx_dtype=None)

# 一个更快(且非确定性)的 dropout 操作
# 同时也支持新的精度格式
def dropout(x, keep_prob=0.8, mask=None)

# 一个在 tf.gradients 中使用,用于将多个梯度贡献相加的操作。
# 注意,只支持最多 8 个输入,因为不希望单个操作在图中开始执行之前就消耗掉所有可能的输入,
# 从而减少内存占用。
def add_n8(xs, name=None)

blocksparse.norms

def layer_norm(x, g, b, axis=1, epsilon=1e-6, relu=False)
"""
非常快速的层归一化,支持两种 bsmm 特征轴激活布局。
同时还包括可选的集成 ReLU(在最后应用)。
"""

# NCHW 布局下的基本批归一化操作
def batch_norm(x, g, b, epsilon=1e-6)
def batch_norm_inference(x, g, b, m, v, epsilon=1e-6)

常见问题

相似工具推荐

openclaw

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

349.3k|★★★☆☆|今天
Agent开发框架图像

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 真正成长为懂上

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

ComfyUI

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

107.9k|★★☆☆☆|今天
开发框架图像Agent

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|今天
语言模型图像Agent

Deep-Live-Cam

Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具,用户仅需一张静态照片,即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点,让高质量的数字内容创作变得触手可及。 这款工具不仅适合开发者和技术研究人员探索算法边界,更因其极简的操作逻辑(仅需三步:选脸、选摄像头、启动),广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换,还是制作趣味短视频和直播互动,Deep-Live-Cam 都能提供流畅的支持。 其核心技术亮点在于强大的实时处理能力,支持口型遮罩(Mouth Mask)以保留使用者原始的嘴部动作,确保表情自然精准;同时具备“人脸映射”功能,可同时对画面中的多个主体应用不同面孔。此外,项目内置了严格的内容安全过滤机制,自动拦截涉及裸露、暴力等不当素材,并倡导用户在获得授权及明确标注的前提下合规使用,体现了技术发展与伦理责任的平衡。

88.9k|★★★☆☆|今天
开发框架图像Agent