
Agoraは、Agoraによってもたらされます。私たちは、人類の前進に専念するまったく新しいオープンソースのマルチモーダルAI研究機関です。
このプロジェクトに貢献したり、サポートを受け取ったりするために、こちらにご参加ください!

AttentionGridは、AIモデルに高度な注意メカニズムの組み込みを民主化するために設計された最先端のフレームワークです。注意ベースのトランスモデルの最新の開発を搭載したAttentionGridは、機械学習の実践者、研究者、愛好家への注意メカニズムの世界を開きます。
AttentionGridで爆発するには、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で共有します
AtingGridをサポートし、AIの民主化に貢献してくれてありがとう!一緒に、可能なことの境界を押し広げることができます。
AIの広大な景観では、注意メカニズムは、データの微妙さを識別し、重要な側面に焦点を当て、全体的なパフォーマンスを向上させることができる強力なモデルを作成する能力に革命をもたらしました。 AttentionGridを使用した私たちのビジョンは、これらの最先端のメカニズムとそれらの実用的なアプリケーションとの間のギャップを埋めることであり、これらの手法をさまざまなAIアプリケーションでアクセスしやすく実装しやすくするツールを提供することです。
AttentionGridは、直感的で柔軟なアーキテクチャで設計されており、4つの主要なコンポーネントに分割されています。
コア:これは私たちのフレームワークの基盤であり、注意メカニズムと変圧器モデルの基本構造をレイアウトする抽象クラスを収容しています。
注意?:さまざまな注意メカニズムに特化したディレクトリ。各注意メカニズムは、コアで提供される青写真に基づいて実装されます。
トランス:これは、トランスモデルが生き返る場所であり、それぞれがコアで定義された設計に続いて彫刻されました。
UTILS :モデルの読み込み、データの前処理など、重要なタスクのためのヘルパークラスで満たされたツールボックス。
例:実装と使用のシナリオを使用して実装を分類します。
モジュラー構造:さまざまな注意メカニズムをさまざまなトランスモデルと組み合わせて一致させます。
ユーザーフレンドリー:すぐに開始するのに役立つドキュメントと例を明確にします。
オープンソース:貢献を開くと、注意グリッドは集合的な知識と共有の進歩について繁栄します。
より詳細な例については、リポジトリの「例」フォルダーを参照してください。
AttentionGridへの貢献を公然と招待します!新しい機能の提案、バグレポート、またはコードに追加する場合でも、お気軽に問題を開いてください。
AttentionGridは、Apacheライセンスの下でライセンスされている誇らしげにオープンソースソフトウェアです。
注意メカニズムがAIを変換し、マシンが入力データの重要な部分に「焦点を合わせる」ことを可能にします。 AttentionGridを使用すると、これらの強力なツールへのアクセスを民主化することを目指しています。私たちは、AIの未来は注意の力にあると信じています。また、注意をgridして、この旅を加速したいと考えています。リポジトリを探索し、大義に参加して、このエキサイティングな風景を一緒にナビゲートしましょう!
「詳細は詳細ではありません。彼らはデザインを作ります。」 - チャールズイームズ
フラッシュの注意とバリアントを統合します
ランドマークの注意を統合します
ブロックごとの平行な注意を統合します
動的スパースフラッシュの注意を統合します
ImageBindからCross Crossの注意を統合します
Colt-5の注意を統合します
マルチクエリの注意を統合します
Lucid Rains X_TRANSFORMERS、DECODER、ATTERTION、エンコーダー、トランスラッパーからラッパーを統合します
| 機構 | 呼び出し方法 | インポートの例 |
|---|---|---|
| 自己atention | 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関数により、ハッシュスパールの実装と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が「ハッシュ」の場合はバケットインデックスを表します。または、Sparsity_modeが「QK」の場合は、特定のヘッドを保持するかどうかを表します。テンソル形状は(Batch、N_CTX_Q、H)と(Batch、N_CTX_KV、H)です。sm_scale :正規化定数、1/SQRT(D_HEAD)指定がない限り。sparsity_mode : 'hash' qk-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 :ヘッドが保持されているときは0、それ以外の場合は0を含む形状(バッチ、N_CTX、H)のフロートテンソル(バッチ、N_CTX、H)。この関数は、最初に、ヘッドあたりの非キルド要素の数を計算するindices_per_headを計算します。等しい要素の順序を維持しながら、 keep_tensor降順で並べ替えます(stable = true)。次に、インデックステンソルに基づいてxの要素を収集します。その結果、 xのコンパクトな表現とインデックステンソルと、ヘッドあたりの非殺された要素の数を表すテンソル。
pad_indexは、カーネルに準拠するためにインデックステンソルをパッドします。次のパラメーターが必要です。
index : compactによって与えられた元のインデックステンソル、形状(Batch、Buffer_size、H)。各バッチとタイムステップについて、それはそれが発生しているヘッドインデックスを表します。indices_per_head :各ヘッドには、ドロップされていないインデックスの数が含まれています。インデックステンソルのコピーを作成し、 indices_per_headのサイズに基づいてマスクを作成します。次に、マスク内のtrueに対応するコピー内のインデックスをpad_idxに等しく変更します。
qk_sparse_attention関数は、動的なまばらな注意メカニズムの一部です。 sparsity_modeが「QK」に設定されている場合に使用されます。この関数は、QK-SPARSE注意メカニズムを実装し、 q_keepおよびk_keepパラメーターが型フロートであることを必要とします。
最初に、 compact関数を使用して、クエリ、キー、およびバリューテンソルのコンパクトな表現を構築します。次に、 pad_index関数を使用してインデックステンソルをパッドします。次に、テンソルはカーネルとの互換性のために転置されます。最後に、この関数はqk_sparse_attention_kernel関数を呼び出し、結果のテンソルを元の寸法空間に戻します。
hash_sparse_attention関数は、動的スパース注意メカニズムの一部です。 sparsity_modeが「ハッシュ」に設定されている場合に使用されます。この関数は、ハッシュスパーの注意メカニズムを実装します。
この関数は、 qk_sparse_attentionと同じ入力パラメーターを取得します。ただし、 q_keepおよびk_keepパラメーターの代わりに、 hash_sparse_attention関数には、それぞれクエリとキーのバケットインデックスを表す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 :クエリ、キー、および形状の値のバケットインデックス(batch、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と同様に機能しますが、ハッシュスパールの注意を払うためにバケツを処理します。
関数パラメーターは、 qk_sparse_attention_kernelのパラメーターと同じです。ただし、 q 、 k 、およびvバケットインデックスに基づいてソートされ、圧縮されています。
カーネルはクエリとキーの積を計算し、 sm_scaleでスケーリングし、ソフトマックスを適用して重みを取得し、値の加重合計を計算します。
これはドキュメントの一般的な解釈であり、実際にこれらの機能を理解して変更する必要がある場合があります。まばらな注意メカニズムと深い学習原則の詳細な知識が必要になる場合があります。
blockwise_compute_attn関数:
blockwise_compute_attn関数は、 BlockwiseParallelJaxクラスの重要な部分であり、ブロックごとの方法でモデルの注意メカニズムを計算するために使用されます。
パラメーター:
query 、 key 、 value :これらのパラメーターは、それぞれクエリ、キー、および値を表す注意計算の主な入力です。bias :SoftMaxの前に注意スコアにバイアスを追加するために使用されるオプションのパラメーター。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 :一般的なサブエクスペッションの排除を防ぐために使用されるブールフラグ。BlockWisePar Alleljaxクラス:
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 :整数。自己atentionのキーのチャンクサイズ。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 :integer。使用する位置埋め込みの最大数。デフォルトは1024です。dtype :jnp.dtype。計算に使用するデータ型。デフォルトはjnp.float32です。causal :ブール。因果関係(自動回帰)モードを使用するかどうか。デフォルトはTrueです。policy :文字列。チェックポイントグラデーションのポリシー。デフォルトは'nothing_saveable'です。prevent_cse :boolean。一般的なサブエクスペッション除去を防ぐかどうか(CSE)。デフォルトはFalseです。float32_logits :boolean。 Logits計算にFloat32を使用するかどうか。デフォルトはFalseです。方法
BlockwiseParallelJaxクラスの主な方法は、変圧器ブロックのフォワードパスを実行するforwardメソッドです。
forward ( hidden_states , attention_mask , position_ids , deterministic = True , init_cache = False )hidden_states :jnp.ndarray。トランスブロックへの入力テンソル。 shape (batch_size, sequence_length, hidden_size)が必要です。attention_mask :jnp.ndarray。自己関節メカニズムの注意マスク。 shape (batch_size, 1, 1, sequence_length)が必要です。position_ids :jnp.ndarray。位置エンコーディングの位置ID。 shape (1, sequence_length)が必要です。deterministic :ブール。決定論的モード(ドロップアウトなし)を使用するかどうか。デフォルトはTrueです。init_cache :boolean。高速デコードのためにキャッシュを初期化するかどうか。デフォルトは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 :クエリテンソル。それは隣接していると想定されており、その形状は(バッチ、nheads、seqlen_q、d)でなければなりません。k :キーテンソル。それは隣接していると想定されており、その形状はQの形状、すなわち(batch、nheads、seqlen_k、d)と一致するはずです。v :値テンソル。それは隣接していると想定されており、その形状はQとKの形、つまり(batch、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 (テンソル):形状の出力テンソル(batch_size, seq_len, d_model) 。入力テンソルは、正しいデバイス(GPUなど)上にあり、適切なデータ型( dtype )を持っている必要があることに注意してください。