From 77883cef5f14a56daa1f5e72edd4ba24e5e6c410 Mon Sep 17 00:00:00 2001 From: Benjamin Lefaudeux Date: Wed, 7 Jul 2021 22:54:57 -0700 Subject: [PATCH] [feat] Orthoformer attention (#164) * Orthoformer attention Author: Mandela Patrick et al. * only select landmarks amid the queries --- README.md | 24 +- docs/plots/memory_vs_attention.png | Bin 30127 -> 31285 bytes docs/plots/runtime_vs_attention.png | Bin 28180 -> 29406 bytes xformers/components/attention/__init__.py | 2 + xformers/components/attention/ortho.py | 295 ++++++++++++++++++++++ 5 files changed, 310 insertions(+), 11 deletions(-) create mode 100644 xformers/components/attention/ortho.py diff --git a/README.md b/README.md index 3d88369baf..cd15a5c689 100644 --- a/README.md +++ b/README.md @@ -188,17 +188,19 @@ Some examples, generated with `python3 benchmarks/benchmark_encoder.py --activat ### LRA The code for this benchmark has been adapted from [this repository](https://github.com/mlpen/Nystromformer/tree/main/LRA). [A dedicated README is available here](benchmarks/LRA/README.md) -Some results: - -| Attention | ListOps | Text | Retrieval | Image | Pathfinder | *Avg* | *Est. Gflops* | *Peak mem (mb)* | -| --------------------------- | -------- | --------- | --------- | --------- | ---------- | ------ | ------------- | --------------- | -| _Chance_ | _10_ | _50_ | _50_ | _10_ | _50_ | _34_ | _0_ | _0_ | -| Standard | **37.5** | 62.66 | 79.24 | 38.69 | **70.37** | 57.69 | 1.21 | 2291 | -| Nystromformer-128 | 36.29 | **63.24** | 78.18 | **42.86** | 67.49 | 57.61 | 0.62 | 383 | -| Favor-256 (redraw) | 19.56 | 62.76 | **81.1** | 36.09 | 67.23 | 53.35 | 0.49 | 445 | -| FourierMix | 36.29 | 60.72 | 76.41 | 36.53 | 54.07 | 52.8 | **0.17** | **87** | -| Linformer-seq/4 (no redraw) | 36.69 | 57.39 | 76.41 | 35.57 | 65.12 | 54.2 | 0.67 | 719 | -| Lambda | 19.76 | 62.47 | 79.11 | 35.04 | 49.74 | 49.224 | x | 1023 | + +__Some results:__ + +| Attention | ListOps | Text | Retrieval | Image | Pathfinder | *Avg* | *Est. Gflops* | *Peak mem (mb)* | +| --------------------------- | -------- | --------- | --------- | --------- | ---------- | --------- | ------------- | --------------- | +| _Chance_ | _10_ | _50_ | _50_ | _10_ | _50_ | _34_ | _0_ | _0_ | +| Standard | **37.5** | 62.66 | 79.24 | 38.69 | **70.37** | **57.69** | 1.21 | 2291 | +| Nystromformer-128 | 36.29 | 63.24 | 78.18 | **42.86** | 67.49 | 57.61 | 0.62 | 383 | +| Favor-256 (redraw) | 19.56 | 62.76 | **81.1** | 36.09 | 67.23 | 53.35 | 0.49 | 445 | +| FourierMix | 36.29 | 60.72 | 76.41 | 36.53 | 54.07 | 52.8 | **0.17** | **87** | +| Linformer-seq/4 (no redraw) | 36.69 | 57.39 | 76.41 | 35.57 | 65.12 | 54.2 | 0.67 | 719 | +| Lambda | 19.76 | 62.47 | 79.11 | 35.04 | 49.74 | 49.224 | x | 1023 | +| Orthoformer-32 | 27.42 | **63.96** | 77.96 | 34.5 | 67.11 | 54.19 | 0.187 | 155 | - Contrary to the initial LRA proposal, __we use the same model architecture for all tasks (2 layers).__ - The training schedule for ListOps has been lengthened, while keeping it the fastest of all tasks, which reduces the seed dependence in the final accuracy figure. diff --git a/docs/plots/memory_vs_attention.png b/docs/plots/memory_vs_attention.png index b77afc23e5f3f84dc1658e9443f9d5d2ce068fe9..6ee800e7eec668194cadd7e8e4e35077ca35fca5 100644 GIT binary patch literal 31285 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 diff --git a/docs/plots/runtime_vs_attention.png b/docs/plots/runtime_vs_attention.png index 54bba059d1071602d5ad8a63214d344a1d094e5b..16bd0eae66d43a8f8c869e49adc12e5b5ec0b700 100644 GIT binary patch literal 29406 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%0AoXpz^z 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

)3t2FjkEJ1 zqP@`^k?n*OR#5Iu7#9%GSi0zkqU?{O`I{1c3l}{DDM`)})9l8@^+vrTmIbqfr7F@R z0)AvzsxX;j70+VJvqojnmgxHZUR6F24q#js>k(zRh8{pv(n5%`d7(_KK+Q4qNmlx) zFpH7q?h5p*h@S!+9U~KXDs62mS^a9Ck6pyVMDHnKHR3eVX?r++g{`m-VJUlTdGkDk#l~2;Y z(HSi0jeijRb```R#9uBxd|4M91QqJ*p^UvC3yF`zbpwZ({BP<+;AyCef1h;L^;B`e Xr{1+i;bh>1HpTp)#qXUC)O`Lo#{Nr$ diff --git a/xformers/components/attention/__init__.py b/xformers/components/attention/__init__.py index bcee2e8eb7..db3f39191b 100644 --- a/xformers/components/attention/__init__.py +++ b/xformers/components/attention/__init__.py @@ -84,6 +84,7 @@ def sparsify(matrix): from .linformer import LinformerAttention # noqa from .local import LocalAttention # noqa from .nystrom import NystromAttention # noqa +from .ortho import OrthoFormerAttention # noqa from .random import RandomAttention # noqa from .scaled_dot_product import ScaledDotProduct # noqa @@ -93,6 +94,7 @@ def sparsify(matrix): "LinformerAttention", "NystromAttention", "RandomAttention", + "OrthoFormerAttention", "GlobalAttention", "FavorAttention", "Attention", diff --git a/xformers/components/attention/ortho.py b/xformers/components/attention/ortho.py new file mode 100644 index 0000000000..2ea0ee2711 --- /dev/null +++ b/xformers/components/attention/ortho.py @@ -0,0 +1,295 @@ +import logging +from dataclasses import dataclass +from enum import Enum +from typing import Optional + +import torch +import torch.autograd.profiler as profiler +import torch.nn as nn +import torch.nn.functional as Fn + +from xformers.components.attention import Attention, AttentionConfig, register_attention +from xformers.components.attention.core import ( + scaled_dot_product_attention, + scaled_query_key_softmax, +) + + +class LandmarkSelection(str, Enum): + Orthogonal = "orthogonal" + KMeans = "kmeans" + KMeans_Spherical = "kmeans_spherical" + Random = "random" + + +@dataclass +class OrthoformerAttentionConfig(AttentionConfig): + """ + num_landmarks Number of landmarks to use for softmax approximation. + subsample_fraction Percentage of q_samples matrix to sample per iteration + landmark_selection Landmark selection strategy + """ + + num_landmarks: Optional[int] + subsample_fraction: Optional[float] + landmark_selection: Optional[LandmarkSelection] + + +@register_attention("orthoformer", OrthoformerAttentionConfig) +class OrthoFormerAttention(Attention): + def __init__( + self, + dropout: float, + num_landmarks: int = 32, + subsample_fraction: float = 1.0, + landmark_selection: LandmarkSelection = LandmarkSelection.Orthogonal, + *args, + **kwargs, + ): + """ + Orthoformer attention mechanism, from + " + Keeping Your Eye on the Ball: Trajectory Attention in Video Transformers + Patrick, M., Campbell, D., Asano, Y., Misra, I., Metze, F., Feichtenhofer, C., Vedaldi, A., Henriques, J. (2021) + " + ArXiv: https://arxiv.org/abs/2106.05392 + Reference repository: https://github.com/facebookresearch/Motionformer + """ + super().__init__() + + self.num_landmarks = num_landmarks + self.attn_drop = nn.Dropout(dropout) + self.subsample_fraction = subsample_fraction + self.landmark_selection = landmark_selection + + def forward( + self, + q: torch.Tensor, + k: torch.Tensor, + v: torch.Tensor, + att_mask: Optional[torch.Tensor] = None, + *args, + **kwargs, + ): + N = k.shape[1] + + if self.num_landmarks == N: + # Default attention + x = scaled_dot_product_attention(q, k, v, att_mask) + else: + with torch.no_grad(), profiler.record_function("select landmarks"): + if self.landmark_selection == LandmarkSelection.Orthogonal: + landmarks = self._compute_orthogonal_landmarks(q) + elif self.landmark_selection == LandmarkSelection.Random: + half_L = self.num_landmarks // 2 + landmarks_q = q[:, torch.randint(q.size(1), (half_L,)), :] + landmarks_k = k[:, torch.randint(k.size(1), (half_L,)), :] + landmarks = torch.cat((landmarks_q, landmarks_k), dim=-2) + elif self.landmark_selection == LandmarkSelection.KMeans: + landmarks = self._cluster_landmarks(q) + elif self.landmark_selection == LandmarkSelection.KMeans_Spherical: + landmarks = self._cluster_landmarks(q, spherical=True) + + if att_mask is not None: + logging.warning( + "Orthoformer: attention mask passed alongside with using landmarks to reduce dimensions. \ + The two are typically not compatible" + ) + # FIXME: Should we still accept a mask in that case ? + att_mask = None + kernel_1 = scaled_query_key_softmax(q, landmarks, att_mask) + kernel_2 = scaled_query_key_softmax(landmarks, k, att_mask) + x = torch.matmul(kernel_1, torch.matmul(kernel_2, v)) + x = self.attn_drop(x) + return x + + def _cluster_landmarks( + self, + q: torch.Tensor, + spherical: bool = False, + num_iters: int = 6, + ) -> torch.Tensor: + """ + Construct set of landmarks by recursively selecting new landmarks + that are maximally orthogonal to the existing set. + Returns near orthogonal landmarks with shape (B, M, D). + """ + + if self.subsample_fraction < 1.0: + num_samples = max( + int(self.subsample_fraction * q.size(-2)), self.num_landmarks + ) # Need at least M/2 samples of queries and keys + q_samples = q[:, torch.randint(q.size(-2), (num_samples,)), :] # (B, N, D) + else: + q_samples = q # (B, N, D) + + if spherical: + q_samples_normalized = Fn.normalize( + q_samples, p=2, dim=-1 + ) # may need to change default eps to eps=1e-8 for mixed precision compatibility + landmarks = self._kmeans_spherical( + q_samples_normalized, self.num_landmarks, num_iters + ) + else: + landmarks = self._kmeans(q_samples, self.num_landmarks, num_iters) + return landmarks # (B, M, D) + + def _kmeans(self, x: torch.Tensor, K: int, num_iters: int = 10): + """ + Arguments: + x: (B, N, D) + K: number of clusters + num_iters: the number of kmeans updates + """ + + B, N, D = x.size() + assert K <= N + c = x[ + :, torch.randperm(N, device=x.device)[:K], : + ].clone() # initialisation for the centroids + + with profiler.record_function("kmeans"): + x_i = x.view(B, N, 1, D) + c_j = c.view(B, 1, K, D) + counts = c.new_zeros(B, K) + ones = x.new_ones((B, N)) + + for _ in range(num_iters): + # E step: assign points to the nearest cluster + D_ij = ((x_i - c_j) ** 2).sum(-1) # (B, N, K) squared distances + cl = D_ij.argmin( + dim=-1, keepdim=True + ).long() # (B, N, 1) index of point to nearest cluster + + # M step: update the centroids + c.zero_() + c.scatter_add_(-2, cl.repeat(1, 1, D), x) # sum of points per cluster + counts.fill_(1e-6) # avoid div0 + counts.scatter_add_( + -1, cl.squeeze(-1), ones + ) # number of points per cluster + c.divide_(counts.unsqueeze(-1)) # compute the average + + return c + + def _kmeans_spherical(self, x: torch.Tensor, K: int, num_iters=10): + """ + Arguments: + x: (B, N, D) + """ + B, N, D = x.size() + assert K <= N + + # initialisation for the centroids + c = x[:, torch.randperm(N, device=x.device)[:K], :].clone() + + with profiler.record_function("kmeans_spherical"): + counts = c.new_zeros(B, K) + ones = x.new_ones((B, N)) + + for _ in range(num_iters): + # E step: assign points to the nearest cluster + D_ij = torch.matmul( + x, c.transpose(-2, -1) + ) # (B, N, K) cosine similarity + cl = D_ij.argmax( + dim=-1, keepdim=True + ).long() # (B, N, 1) index of point to nearest cluster + + # M step: update the centroids + c.zero_() + c.scatter_add_(-2, cl.repeat(1, 1, D), x) # sum of points per cluster + counts.fill_(1e-6) # avoid div0 + counts.scatter_add_( + -1, cl.squeeze(-1), ones + ) # number of points per cluster + c.divide_(counts.unsqueeze(-1)) # compute the average + c = Fn.normalize(c, p=2, dim=-1) # renormalise + return c + + def _compute_orthogonal_landmarks(self, q: torch.Tensor) -> torch.Tensor: + """ + Construct set of landmarks by recursively selecting new landmarks + that are maximally orthogonal to the existing set. + Returns near orthogonal landmarks with shape (B, M, D). + """ + + if self.subsample_fraction < 1.0: + # Need at least M samples of queries + num_samples = max( + int(self.subsample_fraction * q.size(-2)), self.num_landmarks + ) + q_samples = q[ + :, torch.randint(q.size(-2), (num_samples,), device=q.device), : + ] + else: + # (B, N, D) + q_samples = q + + # may need to change default eps to eps=1e-8 for mixed precision compatibility + q_samples_normalized = Fn.normalize(q_samples, p=2, dim=-1) + B, N, D = q_samples_normalized.shape + + selected_mask = torch.zeros((B, N, 1), device=q_samples_normalized.device) + landmark_mask = torch.ones( + (B, 1, 1), dtype=selected_mask.dtype, device=q_samples_normalized.device + ) + + #  Get initial random landmark + random_idx = torch.randint( + q_samples_normalized.size(-2), (B, 1, 1), device=q_samples_normalized.device + ) + selected_mask.scatter_(-2, random_idx, landmark_mask) + + #  Selected landmarks + selected_landmarks = torch.empty( + (B, self.num_landmarks, D), + device=q_samples_normalized.device, + dtype=q_samples_normalized.dtype, + ) + selected_landmarks[:, 0, :] = q_samples_normalized[ + torch.arange(q_samples_normalized.size(0)), random_idx.view(-1), : + ].view(B, D) + + # Store computed cosine similarities + cos_sims = torch.empty( + (B, N, self.num_landmarks), + device=q_samples_normalized.device, + dtype=q_samples_normalized.dtype, + ) + + for M in range(1, self.num_landmarks): + with profiler.record_function("find new landmark"): + #  Calculate absolute cosine similarity between selected and unselected landmarks + # (B, N, D) * (B, D) -> (B, N) + cos_sims[:, :, M - 1] = torch.einsum( + "b n d, b d -> b n", + q_samples_normalized, + selected_landmarks[:, M - 1, :], + ).abs() + + # (B, N, M) cosine similarities of current set of landmarks wrt all queries and keys + cos_sim_set = cos_sims[:, :, :M] + + #  Get orthogonal landmark: landmark with smallest absolute cosine similarity: + # set cosine similarity for already selected landmarks to > 1 + cos_sim_set.view(-1, M)[selected_mask.flatten().bool(), :] = 10 + + # (B,) - want max for non + selected_landmark_idx = cos_sim_set.amax(-1).argmin(-1) + + #  Add most orthogonal landmark to selected landmarks: + selected_landmarks[:, M, :] = q_samples_normalized[ + torch.arange(q_samples_normalized.size(0)), selected_landmark_idx, : + ].view(B, D) + + #  Removed selected indices from non-selected mask: + selected_mask.scatter_( + -2, selected_landmark_idx.unsqueeze(-1).unsqueeze(-1), landmark_mask + ) + + # (B, M, D) + landmarks = torch.masked_select(q_samples, selected_mask.bool()).reshape( + B, -1, D + ) + return landmarks #  (B, M, D)