
注意力Grid是由Agora带给您的,我们是一个全新的开源多模式AI研究组织,致力于推进人类。
加入我们这里,为该项目做出贡献或获得支持!

注意力Grid是一个尖端的框架,旨在将高级注意机制的融合到AI模型中。注意力基于基于注意力的变压器模型的最新发展,注意力Grid向机器学习从业人员,研究人员和爱好者开辟了关注机制的世界。
要用注意格爆炸,请使用PIP安装包装:
pip install AttentionGrid实施注意机制或带有注意格的变压器模型很容易:
from AttentionGrid import BlockwiseParallelJax
import jax . numpy as jnp
# Initialize the class
bpjax = BlockwiseParallelJax (
q_chunk_size = 64 ,
k_chunk_size = 64 ,
hidden_size = 768 ,
num_heads = 12 ,
rotary_dim = 32 ,
intermediate_size = 3072
)
# Suppose we have hidden_states, attention_mask, and position_ids as input data
hidden_states = jnp . random . rand ( 1 , 100 , 768 )
attention_mask = jnp . random . rand ( 1 , 1 , 100 , 100 )
position_ids = jnp . arange ( 100 ). reshape ( 1 , 100 )
# You can now apply the attention mechanism to your input data
output = bpjax . forward ( hidden_states , attention_mask , position_ids )我们鼓励您与您的社区分享注意力!以下是几个社交媒体平台的快速共享链接:
在Twitter上分享
分享LinkedIn
在Facebook上分享
分享Reddit
分享WhatsApp
感谢您支持注意力grig,并为人工智能的民主化做出贡献!一起,我们可以突破可能的界限。
在AI的广阔景观中,注意机制彻底改变了我们创建强大模型的能力,可以辨别数据中的微妙之处,重点关注重要方面并改善整体性能。我们使用注意力网格的愿景是弥合这些最新机制与其实际应用之间的差距,提供了一种工具,使这些技术在不同的AI应用中易于访问且易于实现。
注意力Grid设计具有直观且灵活的架构,分为四个主要组成部分:
核心:这是我们框架的基石,是集中抽象类,它们为注意机制和变压器模型的基本结构布局。
注意力?:专门针对各种注意机制的目录。每个注意机制都是根据核心中提供的蓝图实现的。
变压器?:这是变压器模型的生命,每个模型都按照核心中定义的设计雕刻。
UTILS :一个装有助手类的工具箱,用于基本任务,例如模型加载,数据预处理等。
示例:通过动手实例和用法方案揭开实施的神秘面纱。
模块化结构:将不同的注意机制与多种变压器模型匹配。
用户友好:清晰的文档和示例,以帮助您快速入门。
开源:对贡献开放,注意力网格在集体知识和共同的进步上蓬勃发展。
有关更详细的示例,请参阅我们存储库中的“示例”文件夹。
我们公开邀请人们对注意力的贡献!无论您有新功能建议,错误报告还是要添加到我们的代码中,请随时打开问题或提交拉动请求。
注意力Grid是由Apache许可证获得许可的开源软件。
注意机制已转化为AI,使机器可以“专注”输入数据的重要部分。通过注意力网络,我们旨在民主化对这些强大工具的访问。我们认为,人工智能的未来在于关注的力量,并且通过注意力,我们希望加速这一旅程。探索我们的存储库,加入我们的事业,让我们一起浏览这一激动人心的景观!
“细节不是细节。它们进行了设计。” - 查尔斯·埃姆斯(Charles Eames)
整合闪光的注意力和变体
整合具有里程碑意义的关注
整合块平行注意
整合动态稀疏闪光注意力
整合来自ImageBind的交叉注意
整合柯尔特5的注意力
整合多奇的关注
整合来自清醒降雨的包装纸X_TransFormers,解码器,注意力,编码器,变压器包装器
| 机制 | 调用方法 | 示例导入 |
|---|---|---|
| 自我注意力 | from AttentionGrid import SelfAttention | from AttentionGrid import SelfAttention |
| 全球关注 | from AttentionGrid import GlobalAttention | from AttentionGrid import GlobalAttention |
| 当地的关注 | from AttentionGrid import LocalAttention | from AttentionGrid import LocalAttention |
| 分层的关注 | from AttentionGrid import HierarchicalAttention | from AttentionGrid import HierarchicalAttention |
| 动态稀疏的注意力 | from AttentionGrid import dynamic_sparse_attention | from AttentionGrid import dynamic_sparse_attention |
| 紧凑功能 | from AttentionGrid import compact | from AttentionGrid import compact |
| 垫索引功能 | from AttentionGrid import pad_index | from AttentionGrid import pad_index |
| 块平行的注意 | from AttentionGrid import BlockwiseParallelJax | from AttentionGrid import BlockwiseParallelJax |
| 闪烁注意力 | from AttentionGrid import FlashAttention | from AttentionGrid import FlashAttention |
| 具有里程碑意义的关注 | from AttentionGrid import LandmarkAttention | from AttentionGrid import LandmarkAttention |
| 柯尔特-5注意 | from AttentionGrid import Colt5Attention | from AttentionGrid import Colt5Attention |
| 多传奇的关注 | from AttentionGrid import MultiQueryAttention | from AttentionGrid import MultiQueryAttention |
| 注意力扩张 | from AttentionGrid import DilatedAttention | from AttentionGrid import DilatedAttention |
Agora的dynamic_sparse_attention功能允许在Hash-Sparse实现和QK-SPARSE实现之间进行选择。该函数的目标是基于所选的sparsity_mode指导稀疏的注意机制。
功能参数如下:
q :查询形状的张量(批次,n_ctx_q,h,d_head)k :形状的关键张量(批次,n_ctx_kv,h,d_head)v :形状的值张量(批次,n_ctx_kv,h,d_head)q_idx & k_idx :如果Sparsity_mode为'Hash',则表示存储率索引,或者如果Sparsity_mode为'qk',是否要保持给定头。张量形状分别为(批处理,n_ctx_q,h)和(批处理,n_ctx_kv,h)。sm_scale :归一化常数,1/sqrt(d_head),除非指定。sparsity_mode :'HASH'用于为QK-SPARSE实现选择Hash-Sparse实现和“ QK”。默认情况下, sm_scale的计算是默认情况下的,如果给出了未知的sparsity_mode ,则会抛出键盘。
然后,该函数检查sparsity_mode并根据其值,它调用hash_sparse_attention或qk_sparse_attention 。
compact函数使用keep_tensor的信息构建了输入张量x的紧凑表示。
功能参数为:
x :带有形状的输入张量(批处理,n_ctx,h,d_head)。keep_tensor :float张量(批处理,n_ctx,h),该张量在保持头部时包含1,否则为0。该函数首先计算indices_per_head ,该Indices_per_head计算每个头部非杀菌元素的数量。它在保留均等元素的顺序(stable = true)的同时,按降序对keep_tensor进行分类。然后,它根据索引张量收集x的元素。结果是x的紧凑表示以及索引张量和代表每个头部非杀菌元件数量的张量。
pad_index函数将索引张量填充以符合内核。它采用以下参数:
index :由compact给出的原始索引张量,带有形状(批处理,buffer_size,h)。对于每个批次和时间步,它代表其源自的头部索引。indices_per_head :对于每个头部,包含尚未删除多少个索引。它创建索引张量的副本,并根据indices_per_head的大小创建掩码。然后,它修改了副本中与蒙版中对应的索引,以等于pad_idx 。
qk_sparse_attention功能是动态稀疏注意机制的一部分。当sparsity_mode设置为'qk'时,使用它。此功能实现了QK-SPARSE注意机制,并要求q_keep和k_keep参数为float类型。
它首先使用compact函数构建查询,密钥和值张量的紧凑表示。然后,它使用pad_index函数对索引张量进行填充。然后将张量转移以与核的兼容性。最后,该功能调用qk_sparse_attention_kernel功能,并将结果张量分散回原始尺寸空间。
hash_sparse_attention函数是动态稀疏注意机制的一部分。当sparsity_mode设置为“哈希”时,使用它。该功能实现了哈希·帕斯斯注意机制。
该函数采用与qk_sparse_attention相同的输入参数。但是, hash_sparse_attention函数而不是q_keep和k_keep参数,需要q_bucket_idx和k_bucket_idx ,该功能分别代表查询和键的存储桶索引。
hash_sparse_attention函数首先使用sort_bucketed_attention函数根据存储键指数对查询,键和值张量进行分类。然后,它使用compact函数构建了分类查询,键和值张量的紧凑表示。然后,它使用pad_index函数对索引张量进行填充。
然后将张量转移以与核的兼容性。然后,该功能调用hash_sparse_attention_kernel函数,并将结果张量分散回原始尺寸空间。
sort_bucketed_attention函数是hash_sparse_attention中使用的辅助功能。它根据给定的存储桶指数对输入张量进行分类。
功能参数为:
qkv :查询,键,值张量(批次,n_ctx,h,d_head)qkv_bucket_idx :查询,键和形状值的存储率索引(批次,n_ctx,h)该功能首先对qkv_bucket_idx张量进行分类,并获取排序的索引。然后,它使用排序的索引对qkv张量进行分组。它还将qkv_bucket_idx扩展到与qkv相同的形状,以兼容。
qk_sparse_attention_kernel函数是qk_sparse_attention中使用的内核函数。它根据查询和关键产品的软效果计算了价值的加权总和。
功能参数为:
q :查询形状的张量(批次,n_ctx_q,h,d_head)k :形状的关键张量(批次,n_ctx_kv,h,d_head)v :形状的值张量(批次,n_ctx_kv,h,d_head)sm_scale :归一化常数,1/sqrt(d_head),除非指定。hash_sparse_attention_kernel函数是hash_sparse_attention中使用的内核函数。它的工作原理与qk_sparse_attention_kernel类似,但可以处理Hash-Sparse注意的桶。
功能参数与qk_sparse_attention_kernel的函数参数相同。但是, q , k和v已根据存储桶指数进行了分类和压实。
内核计算查询和键的乘积,按sm_scale缩放它,应用SoftMax来获得权重,然后计算值的加权总和。
请注意,这是对文档的一般解释,在实践中理解和修改这些功能可能需要深入了解稀疏注意机制和深度学习原理。
blockwise_compute_attn函数:
blockwise_compute_attn函数是BlockwiseParallelJax类的重要组成部分,用于以模块的方式计算模型的注意机制。
参数:
query , key , value :这些参数分别代表查询,键和值的主要输入。bias :可选参数,用于在软磁性之前为注意力分数增加偏差。deterministic :用于决定是否应用辍学的布尔标志。dropout_rng :用于辍学的随机数生成器。attn_pdrop :辍学的可能性。causal_mask :是否使用因果关注面具,是布尔的标志。query_chunk_size , key_chunk_size :每个查询和密钥块的大小分别。dtype :计算的数据类型。默认值是jnp.float32 。policy :此参数定义了梯度检查点的策略。precision :此参数用于设置计算的精度级别。默认值是lax.Precision.HIGHEST 。prevent_cse :用于防止常见子表达消除的布尔标志。blockwise_compute_ffn函数:
blockwise_compute_ffn函数用于以模块的方式计算模型的馈送网络。
参数:
cell :应用函数的网络中的单元格。inputs :馈送网络的输入数据。chunk_size :每个块的大小用于块计算。deterministic :用于决定是否应用辍学的布尔标志。policy :此参数定义了梯度检查点的策略。prevent_cse :用于防止常见子表达消除的布尔标志。blockwise_lm_head类:
Blockwise_LM_Head类是应用线性变换的模块,然后使用软磁性函数来在输入中每个位置的词汇上产生分布。
vocab_size :词汇的大小,这也是线性转换的输出维度的大小。chunk_size :每个块的大小用于块计算。policy :此参数定义了梯度检查点的策略。dtype :计算的数据类型。默认值是jnp.float32 。prevent_cse :用于防止常见子表达消除的布尔标志。blockwise_cross_entropy函数:
blockwise_cross_entropy函数以模型方式计算模型预测的跨凝结损失。
参数:
logits :模型的输出预测。tokens :真正的标签。valid :指定输入中有效位置的掩码。chunk_size :每个块的大小用于块计算。policy :此参数定义了梯度检查点的策略。prevent_cse :用于防止常见子表达消除的布尔标志。BlockWiseParallelJax类:
BlockwiseParallelJax ( q_chunk_size , k_chunk_size , hidden_size , num_heads , rotary_dim , intermediate_size , layer_norm_epsilon = 1e-5 , activation_function = "gelu" , attn_pdrop = 0.0 , resid_pdrop = 0.0 , max_position_embeddings = 1024 , dtype = jnp . float32 , causal = True , policy = 'nothing_saveable' , prevent_cse = False , float32_logits = False )参数
q_chunk_size :整数。自我注意的查询的块大小。k_chunk_size :整数。自我注意的钥匙的大小。hidden_size :整数。变压器中隐藏层的维度。num_heads :整数。自我注意力机制中的注意力头数。rotary_dim :整数或无。用于旋转位置编码的尺寸数量。intermediate_size :整数。馈送网络中中间层的大小。layer_norm_epsilon :float。较小的常数以防止层归一化零分裂。默认值为1e-5 。activation_function :字符串。激活函数用于进料向前网络。默认值为'gelu' 。attn_pdrop :float。注意机制的辍学概率。默认值为0.0 。resid_pdrop :浮动。残留连接的辍学概率。默认值为0.0 。max_position_embeddings :整数。最大使用位置嵌入的数量。默认值为1024 。dtype :jnp.dtype。用于计算的数据类型。默认值为jnp.float32 。causal :布尔。是否使用因果(自动回归)模式。默认是True 。policy :字符串。检查点梯度的策略。默认值是'nothing_saveable' 。prevent_cse :布尔值。是否预防常见的亚表达消除(CSE)。默认值为False 。float32_logits :布尔值。是否将Float32用于逻辑计算。默认值为False 。方法
BlockwiseParallelJax类的主要方法是forward方法,该方法执行变压器块的正向通行。
forward ( hidden_states , attention_mask , position_ids , deterministic = True , init_cache = False )hidden_states :jnp.ndarray。变压器块的输入张量。它应该具有形状(batch_size, sequence_length, hidden_size) 。attention_mask :jnp.ndarray。自我发项机制的注意力掩盖。它应该具有形状(batch_size, 1, 1, sequence_length) 。position_ids :jnp.ndarray。位置编码的位置ID。它应该具有形状(1, sequence_length) 。deterministic :布尔值。是否使用确定性模式(无辍学模式)。默认是True 。init_cache :布尔值。是否要初始化缓存以进行快速解码。默认值为False 。此方法返回变压器块的输出张量,该块具有与hidden_states相同的形状。
示例用法
以下示例演示了如何使用BlockwiseParallelJax类。
# Initialize
from jax import random
import jax . numpy as jnp
from AttentionGrid import BlockwiseParallelJax
# Initialize transformer block
block = BlockwiseParallelJax (
q_chunk_size = 64 ,
k_chunk_size = 64 ,
hidden_size = 768 ,
num_heads = 12 ,
rotary_dim = 64 ,
intermediate_size = 3072 ,
)
# Create a batch of input tensors
key = random . PRNGKey ( 0 )
batch_size = 8
sequence_length = 128
hidden_states = random . normal ( key , ( batch_size , sequence_length , block . hidden_size ))
# Create attention mask
attention_mask = jnp . ones (( batch_size , 1 , 1 , sequence_length ))
# Create position ids
position_ids = jnp . arange ( sequence_length )[ None , :]
# Forward pass
output = block . forward ( hidden_states , attention_mask , position_ids )
print ( output . shape ) # prints: (8, 128, 768) FusedLandmarkAttention这是一个Pytorch Function类,它封装了融合具有里程碑意义的注意机制的前向和向后功能。
forward(ctx, q, k, v, n_prefix_q, sm_scale, block_size)此功能执行了融合地标的正向通行证。
ctx :我们可以保存变量以在向后通过的对象。由Pytorch的自动克拉德系统提供。q :查询张量。假定它是连续的,其形状应为(批处理,n头,seqlen_q,d)。k :钥匙张量。假定它是连续的,其形状应与Q的形状相匹配,即(批次,nheads,seqlen_k,d)。v :值张量。假定它是连续的,其形状应与Q和K的形状相匹配,即(批次,nheads,seqlen_k,d)。n_prefix_q :查询中的前缀数。sm_scale :SoftMax操作中使用的缩放系数。block_size :用于执行块操作的块大小。 o :来自融合具有里程碑意义的注意机制的前向传球的输出张量。 backward(ctx, do)此功能执行融合地标注意的向后通过,即计算梯度。
ctx :我们可以从该对象中检索保存在正向通行中的变量。由Pytorch的自动克拉德系统提供。do :相对于正向函数的输出,损失的梯度。 None 。fused_landmark_attention(q, k, v, is_mem, sm_scale=None, block_size=64)此功能是FusedLandmarkAttention类的方便包装器。
q :查询张量。k :钥匙张量。v :值张量。is_mem :一个布尔张量,指示是否应将每个键值对作为内存视为。它的长度应与键的序列长度相同。sm_scale :SoftMax操作中使用的缩放系数。如果None ,它将设置为1.0 / sqrt(d) 。block_size :用于执行块操作的块大小。 这是如何使用fused_landmark_attention函数的基本示例。
import torch
from AttentionGrid import fused_landmark_attention
# Initialize some tensors
batch = 8
nheads = 12
seqlen = 128
d = 64
q = torch . randn ( batch , nheads , seqlen , d )
k = torch . randn ( batch , nheads , seqlen , d )
v = torch . randn ( batch , nheads , seqlen , d )
is_mem = torch . zeros ( seqlen , dtype = torch . bool )
# Call the function
output = fused_landmark_attention ( q , k , v , is_mem )
print ( output . shape ) # prints: (8, 12, 128, 64)此示例首先初始化一些张量以作为查询,键
和值。然后,它称为fused_landmark_attention函数,并打印输出张量的形状。
import torch
import torch . nn as nn
from AttentionGrid import DilatedAttention
# Replace this with your correct GPU device
device = "cuda:0"
dtype = torch . float16
# Create an instance of DilatedAttention
d_model = 512
num_heads = 8
dilation_rate = 2
segment_size = 64
dropout = 0.2 # Specify the dropout rate
attention = DilatedAttention (
d_model = d_model ,
num_heads = num_heads ,
dilation_rate = dilation_rate ,
segment_size = segment_size ,
dropout = dropout ,
). to ( device , dtype = dtype )
# Create some dummy input data
batch_size = 16
seq_len = 128
input_dim = d_model
inputs = torch . randn ( batch_size , seq_len , input_dim , device = device , dtype = dtype )
# Forward pass
outputs = attention ( inputs )
# Print the output shape
print ( outputs . shape ) # Expected: [batch_size, seq_len, d_model]在上面的示例中,我们使用指定的超参数创建一个DilatedAttention类别的实例。然后,我们生成一些虚拟输入数据,并将其通过注意机制以获取输出。最后,我们打印输出张量的形状。
DilatedAttention类具有扩张的注意力,随着令牌之间的距离的增长,该阶段会呈指数增长。它从torch.nn.Module继承,可以用作变压器模型中标准注意机制的倒入替换。
d_model (INT):输入和输出嵌入的维度。num_heads (int):注意力头的数量。dilation_rate (INT):稀疏输入序列的扩张率。segment_size (int):稀疏后每个段的大小。dropout (浮点,可选):辍学概率应用于注意力输出。默认值:0.0(无辍学)。x (张量):形状的输入张量(batch_size, seq_len, d_model) 。output (张量):Shape的输出张量(batch_size, seq_len, d_model) 。请注意,输入张量应在正确的设备(例如GPU)上,并具有适当的数据类型( dtype )。