
AttectGrid приносит вам Agora, мы совершенно новая многомодальная исследовательская организация с открытым исходным кодом с открытым исходным кодом, посвященную развитию человечества.
Присоединяйтесь к нам здесь, чтобы внести свой вклад в этот проект или получить поддержку!

AttectGrid-это передовая структура, предназначенная для демократизации включения механизмов передового внимания в модели искусственного интеллекта. Основанный на последних разработках в моделях трансформаторов, основанных на внимании, AthityGrid открывает мир механизмов внимания, как практикующим, исследователям и энтузиастам машинного обучения.
Чтобы взорвать внимание, установите пакет с помощью 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 )Мы призываем вас поделиться вниманием с вашим сообществом! Вот быстрые общие ссылки для нескольких платформ социальных сетей:
Поделиться в Твиттере
Поделиться на LinkedIn
Поделиться на Facebook
Поделиться на Reddit
Поделиться на WhatsApp
Спасибо за поддержку внимания и внесли свой вклад в демократизацию ИИ! Вместе мы можем раздвинуть границы того, что возможно.
В обширном ландшафте ИИ механизмы внимания революционизировали нашу способность создавать мощные модели, которые могут различать тонкости данных, сосредоточив внимание на важных аспектах и улучшая общую производительность. Наше видение с вниманием состоит в том, чтобы преодолеть разрыв между этими современными механизмами и их практическими приложениями, предоставляя инструмент, который делает эти методы доступными и простыми в реализации в различных приложениях ИИ.
Внимание, разработанное с интуитивно понятной и гибкой архитектурой, разделена на четыре основных компонента:
Ядро : Это основа нашей структуры, классы абстрактного жилья, которые определяют основную структуру для механизмов внимания и трансформаторных моделей.
Аттенции ?: Каталог, посвященный различным механизмам внимания. Каждый механизм внимания реализован на основе плана, предоставленного в ядре.
Трансформеры ?: Это где модели трансформаторов оживают, каждая из которых вылетала следуя конструкции, определенной в ядре.
UTILS : набор инструментов, заполненный вспомогательными классами для важных задач, таких как загрузка модели, предварительная обработка данных и многое другое.
Примеры : демистификация реализации практическими примерами и сценариями использования.
Модульная структура : смешивайте и сопоставьте различные механизмы внимания с различными моделями трансформаторов.
Пользовательский удобный для пользователя : четкая документация и примеры, которые помогут вам начать быстро.
Открытый исходный код : открытый для вкладов, внимание внимания процветает в коллективных знаниях и общем прогрессе.
Для более подробных примеров, пожалуйста, обратитесь к папке «Примеры» в нашем репозитории.
Мы открыто приглашаем вклад в AttectGrid! Если у вас есть новое предложение функции, отчет об ошибках или вы хотите добавить в наш код, пожалуйста, не стесняйтесь открыть проблему или отправить запрос на привлечение.
AttectGrid с гордостью-программное обеспечение с открытым исходным кодом, лицензированное по лицензии Apache.
Механизмы внимания трансформировали ИИ, что позволило машинам «сосредоточиться» на значительных частях входных данных. С помощью внимания мы стремимся демократизировать доступ к этим мощным инструментам. Мы считаем, что будущее ИИ лежит в силе внимания, и через внимание мы надеемся ускорить это путешествие. Исследуйте наш репозиторий, присоединяйтесь к нашему делу, и давайте вместе ориентируемся на этот захватывающий ландшафт!
«Детали не являются деталями. Они делают дизайн». - Чарльз Имс
Интегрировать флэш -внимание и варианты
Интегрировать внимание на достопримечательности
Интегрировать параллельное внимание блока
Интегрировать динамическое редкое вспышка внимания
Интегрировать перекрестное внимание от ImageBind
Интегрировать внимание COLT-5
Интегрировать многопрофильное внимание
Интегрировать обертки из Lucid Rains 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 |
| Функция индекса PAD | 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 является «хэш», или будет ли оставить данную голову, если sparsity_mode является «QK». Тензорные формы - это (пакетная, n_ctx_q, h) и (parath, n_ctx_kv, h) соответственно.sm_scale : постоянная нормализации, 1/sqrt (d_head), если не указано.sparsity_mode : «Хэш», чтобы выбрать реализацию хеш-SPARSE и «QK» для реализации QK-SPARSE. sm_scale рассчитывается по умолчанию, если не предоставлен, и если дается неизвестный sparsity_mode , он бросает Keeerror.
Затем функция проверяет sparsity_mode и на основе ее значения вызывает либо hash_sparse_attention , либо qk_sparse_attention .
compact функция создает компактное представление входного тензора x , используя информацию от keep_tensor .
Параметры функции:
x : входной тензор в компактный, с формой (партия, n_ctx, h, d_head).keep_tensor : Тензор плавания формы (партия, N_CTX, H), содержащий 1, когда голова сохраняется, и 0 в противном случае. Функция сначала вычисляет indices_per_head , в котором вычисляется количество некированных элементов на голову. Он сортирует keep_tensor в порядке убывания при сохранении порядка равных элементов (stable = true). Затем он собирает элементы x на основе тензора индекса. Результатом является компактное представление x вместе с тензором индекса и тензором, представляющим количество не Killed Elements на голову.
Функция pad_index прокладывает тензор индекса в соответствии с ядром. Требуется следующие параметры:
index : оригинальный индекс -тензор, заданный compact , с формой (packation, 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 : запрос, ключ, тензоры значений формы (PACATR, 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 . Он рассчитывает взвешенную сумму значений на основе Softmax запроса и ключевого продукта.
Параметры функции:
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 , применяет Softmax, чтобы получить веса, а затем вычисляет взвешенную сумму значений.
Обратите внимание, что это общая интерпретация документации, а понимание и изменение этих функций на практике могут потребовать глубоких знаний о редких механизмах внимания и принципах глубокого обучения.
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 Class:
Класс Blockwise_LM_Head - это модуль, который применяет линейное преобразование, сопровождаемое функцией Softmax для получения распределения по словарному запасу для каждой позиции на входе.
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 Class:
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 : Integer. Размер промежуточного уровня в сети подачи.layer_norm_epsilon : float. Небольшая постоянная для предотвращения деления на ноль в нормализации слоя. По умолчанию 1e-5 .activation_function : строка. Функция активации для использования в сети подачи. По умолчанию 'gelu' .attn_pdrop : float. Вероятность отсева для механизма внимания. По умолчанию 0.0 .resid_pdrop : FLOAT. Вероятность отсева для остаточных соединений. По умолчанию 0.0 .max_position_embeddings : Integer. Максимальное количество положений положения для использования. По умолчанию 1024 .dtype : jnp.dtype. Тип данных для использования для вычисления. По умолчанию jnp.float32 .causal : логический. Использовать ли причинно-следственный (авторегрессивный) режим или нет. По умолчанию True .policy : строка. Политика для контрольно -пропускного пункта градиентов. По умолчанию 'nothing_saveable' .prevent_cse : логическое. Чтобы предотвратить общую устранение субэкспрессии (CSE). По умолчанию False .float32_logits : логический. Использовать ли Float32 для вычислений logits. По умолчанию 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. Идентификаторы позиции для позиционного кодирования. Он должен иметь форму (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 Это класс Function Pytorch, который инкапсулирует форвардные и обратные функции плавленого механизма внимания.
forward(ctx, q, k, v, n_prefix_q, sm_scale, block_size)Эта функция выполняет прямой пропуск плавного знакового внимания.
ctx : объект, которому мы можем сохранить переменные для использования в обратном проходе. Предоставлено системой автограда Pytorch.q : Тензор запросов. Предполагается, что он является смежным, и его форма должна быть (партия, nheads, seqlen_q, d).k : Тензор ключей. Предполагается, что он является смежным, и его форма должна соответствовать форме Q, т. Е. (Parath, nheads, seqlen_k, d).v : Значения Тензор. Предполагается, что он является смежным, и его форма должна соответствовать формам Q и K, то есть (Parath, 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 (float, необязательно): вероятность отсева, чтобы применить к выводу внимания. По умолчанию: 0,0 (без выпадения).x (тензор): входной тензор формы (batch_size, seq_len, d_model) .output (тензор): выходной тензор формы (batch_size, seq_len, d_model) . Обратите внимание, что входной тензор должен быть на правильном устройстве (например, графический процессор) и иметь соответствующий тип данных ( dtype ).