理想汽車智駕方案介紹專題 3 MoE+Sparse Attention 高效結構解析

一、前言

【理想汽車智駕方案介紹專題 -1】端到端+VLM 方案介紹

【理想汽車智駕方案介紹專題 -2】MindVLA 方案詳解

在上述兩篇系列帖子中,筆者已對理想汽車 VLM 和 VLA 方案的框架進行了全面介紹,但對于其中的前沿技術僅做了初步探討,未進行更深入的剖析。因此,筆者計劃繼續以系列文章的形式,介紹其中涉及的相關前沿技術。

首先,將介紹 MindVLA 中采用的“MoE + Sparse Attention”高效結構。

二、MoE + Sparse Attention 高效結構

稀疏注意力(Sparse Attention)與混合專家架構(MoE)是提升大模型效率與性能的核心技術。MindGPT 針對大語言模型(LLM)進行了重新設計與預訓練,使其具備了 3D 空間理解和 3D 推理能力,不過這在一定程度上增加了大語言模型(LLM)的參數量。即便采用英偉達(NV)大力宣傳的 Thor - U 智駕芯片,在端側部署時仍有可能會出現推理效率低下的問題。 所以模型采用了 MOE 架構+SparseAttention,實現模型容量擴容的同時不會大幅度增加推理負擔。

img

由上圖可以看到,MindGPT 使用混合專家(MoE)架構(有 E1-E8 個專家),由 Router 動態選擇激活部分專家(而非全部),只在需要時調用相關子模型。稀疏注意力(Sparse Attention)則限制注意力機制的復雜度,只關注關鍵輸入部分(如相關物體或動作),而不是全局計算。在這張圖中,它的實現過程是:

每一層的 token 并不全互相注意,而是:

  • 利用 Router 分配 token 給不同的 expert
  • 每個 expert 內部只在局部或關鍵 token 上建立注意力連接

這種結構既節省計算,又保持了輸入的局部結構性,尤其適合 3D 場景中的空間約束。

2.1 Sparse Attention

參考論文 Generating Long Sequences with Sparse Transformers

傳統 transformer 的全連接注意力復雜度為O(n2)O(n^2)O(n2),對于高維空間場景(例如 3D Token 很多)會顯著拖慢速度、增加計算。

稀疏注意力的核心目標是:

  • 減少 token-to-token 的注意力連接(只對一部分 token 建立 attention)
  • 降低計算復雜度,同時保持關鍵 token 的交互質量

那么它是如何實現目標的呢?下面將結合Sparse Transformer代碼進行介紹。

Sparse Transformer 是由OpenAI提出的稀疏注意力的最早實現之一,其核心思想是用 規則稀疏模式(Regular Sparse Patterns) 替代標準全連接注意力(full self-attention)。在保持表示能力的同時,將注意力復雜度從

O(n2)O(n^2)O(n2)降低為O(nn)O(n\sqrt n)Onn?.

2.1.1 Sparse Attention 圖結構解析

img

Strided attention(跳躍連接)

每個 token 關注步長為 s 的若干 token,例如:

位置:      0   1   2   3   4   5   6   7   8
strided:   ↑       ↑       ↑       ↑

token 8 會關注 0, 2, 4, 6 這些步長為 2 的 token。

Local attention(局部窗口)

每個 token 也關注自己附近的窗口內 token,比如前后 2 個:

位置:       5
局部窗口:   3   4   5   6   7
組合結構

將兩者合并后,注意力圖是 局部窗口 + 跳躍連接,形成稀疏但有覆蓋力的結構:

Token 位置:         8
局部連接:         6 7 8
跳躍連接:     0 2 4

這種結構可以保證每個 token 都能快速傳播到遠端(通過跳躍),并同時保留局部建模能力。

2.1.2 代碼實現解析

由于 OpenAI Sparse Transformer 沒開源,這里參考了其思想的一個流行實現:[OpenNMT-py 或 custom PyTorch 實現],也可參考 Reformer 等模型實現方式。

稀疏注意力 mask 構造(關鍵)
def build_sparse_attention_mask(seq_len, block_size=64, num_local_blocks=1, stride=2):"""構造稀疏注意力 mask:局部 + 跳躍"""mask = torch.zeros(seq_len, seq_len, dtype=torch.bool)for i in range(seq_len):# 添加局部窗口(例如前后1個block)for j in range(-num_local_blocks, num_local_blocks + 1):idx = i + j * block_sizeif 0 <= idx < seq_len:mask[i, idx] = True# 添加跳躍連接(stride)for j in range(0, seq_len, stride):mask[i, j] = Truereturn mask

這個 mask 會用于注意力權重:

attn_scores = torch.matmul(query, key.transpose(-2, -1))  # [B, H, N, N]
attn_scores[~mask] = -inf  # 掩蔽非連接位置
attn_probs = softmax(attn_scores)
應用在 Attention 模塊

核心 attention 模塊不變,只是加了 mask:

def sparse_attention(query, key, value, mask):attn_scores = torch.matmul(query, key.transpose(-2, -1))attn_scores = attn_scores.masked_fill(~mask, float('-inf'))attn_probs = torch.softmax(attn_scores, dim=-1)return torch.matmul(attn_probs, value)

這樣就可以在不修改 Transformer 主體結構的前提下使用稀疏連接。

以下是一個 9×9 attention matrix 的稀疏連接可視化(● 表示有連接):

Token ID →0 1 2 3 4 5 6 7 8┌──────────────────
0 │●       ●       ●
1 │  ●     ●     ●
2 │    ●   ●   ●
3 │      ● ● ●
4 │      ● ● ●
5 │      ● ● ●
6 │    ●   ●   ●
7 │  ●     ●     ●
8 │●       ●       ●

中間對角線為 **局部 attention,**分布的條紋為 跳躍 attention。

2.1.3 復雜度分析

標準全連接 Self-Attention 的公式是:

img

QKTQK^TQKT:產生 n×n 的權重矩陣 → 計算復雜度是:O(n2d)O(n^2 d)O(n2d);

Softmax ()V :O(n2d)O(n^2 d)O(n2d);

整體復雜度為:O(n2d)O(n^2 d)O(n2d),這意味著當序列變長時(如 n=8192),計算量和內存都會劇增。

Sparse Transformer 通過限制每個 token 只關注O(n)O(\sqrt{n})O(n?)個位置,從而稀疏 attention 矩陣。

每個 token 的 attention 鏈接數為k=O(n)k=O(\sqrt{n})k=O(n?)**,**所有 token 的總鏈接數就是n?k=n?nn?k=n?\sqrt{n}n?k=n?n?

由于只需要對是n?nn?\sqrt{n}n?n? 個位置計算 QK? dot product,而不是n2n^2n2 ,每個位置依然是**O(d)的向量操作,**所以 Sparse Transformer 的復雜度是是O(n?n)O(n?\sqrt{n})O(n?n?)

2.2 MoE

MoE(專家混合體)是神經網絡的一種架構模式,該模式將一個層或操作(例如線性層、多層感知機或注意力投影)的計算拆分為多個“專家”子網絡。這些子網絡各自獨立地進行計算,其計算結果會被整合,以生成 MoE 層的最終輸出。MoE 架構可分為密集型和稀疏型,前者意味著在處理每個輸入時都會啟用所有專家,后者則表示每個輸入僅使用部分專家。因此,MoE 架構具備以下優勢:

  • 提升計算效率
  • 在不顯著增加推理成本的前提下,擴大模型容量(參數量)

這些優勢與大模型的應用難題完美匹配,故而在該領域得到了較為廣泛的應用。

2.2.1 MoE 結構解析

本節首先描述 MoE 的核心組件,然后以 DeepSpeed-MoE 源代碼為例進行詳細解析。

以 PyTorch 為例,MoE 的核心組成部分通常包括以下幾個模塊:

1.Gate 模塊(路由器)

負責為每個輸入樣本選擇合適的專家(通常是 top-k 策略):

# 偽代碼
scores = gate(x)  # (batch_size, num_experts)
top_k_scores, top_k_indices = torch.topk(scores, k=2)
  • scores 通常是通過一個線性層獲得,表示輸入樣本對各個專家的偏好程度。
  • 路由器可能帶有噪聲或正則(如 Switch Transformer 中的 noisy gating)。
2.Experts 模塊(多個子網絡)

每個專家是一個獨立的神經網絡(比如一個 MLP):

class Expert(nn.Module):def __init__(self, hidden_dim):self.ff = nn.Sequential(nn.Linear(hidden_dim, 4*hidden_dim),nn.ReLU(),nn.Linear(4*hidden_dim, hidden_dim))

通常通過參數共享或并行執行多個專家。

3.Dispatcher(稀疏調度器)

根據 Gate 的輸出,將輸入路由給選中的專家,并收集輸出:

 for i in range(num_experts):expert_input = input[mask[:, i]]expert_output = experts[i](expert_input)output[mask[:, i]] = expert_output * gate_scores[:, i]

這一步驟通常要做優化,否則容易成為性能瓶頸。

2.2.2 DeepSpeed-MoE 示例代碼

源碼地址:https://github.com/microsoft/DeepSpeed/tree/master/deepspeed/moe

其核心組件為deepspeed.moe.layer.MoEdeepspeed.moe.layers.gates 類。

1.MoE 類(deepspeed.moe.layer.MoE

作為入口類,集成了路由器、專家、通信邏輯:

class MoE(nn.Module):def __init__(self, hidden_size, experts=..., ep_size=..., k=1):self.experts = Experts()self.gate = TopKGate()...
  • ep_size: 每個專家組的并行數(Expert Parallelism)。
  • k: top-k gating.
  • 使用了通信優化如 All-to-All 分發樣本。
2.構造函數 init

根據官方文檔,MoE 的初始化簽名如下,參數豐富且功能強大:

class MoE(nn.Module):def __init__(self,hidden_size: int,expert: nn.Module,num_experts: int = 1,ep_size: int = 1,k: int = 1,capacity_factor: float = 1.0,eval_capacity_factor: float = 1.0,min_capacity: int = 4,use_residual: bool = False,noisy_gate_policy: Optional[str] = None,drop_tokens: bool = True,use_rts: bool = True,use_tutel: bool = False,enable_expert_tensor_parallelism: bool = False,top2_2nd_expert_sampling: bool = True)
  • hidden_size:輸入和輸出的維度;
  • expert:作為子模塊傳入的專家網絡(如 MLP);
  • num_experts:專家總數;
  • ep_size:專家并行維度;
  • k:選用 top?k 路由;
  • capacity_factoreval_capacity_factor:訓練/評估期間專家最大處理 token 數比例;
  • min_capacity:每個專家至少能接收的 token 數;
  • use_residual:是否啟用 Residual MoE 結構;
  • noisy_gate_policydrop_tokensuse_rts:路由噪聲、token 丟棄、隨機選擇;
  • enable_expert_tensor_parallelism:專家參數 tensor 切分;
  • top2_2nd_expert_sampling:top?2 第二專家采樣策略。

這些選項為 MoE 的訓練/推理提供了高度靈活性

3.前向函數 forward

forward 函數定義如下:

def forward(self, hidden_states: Tensor, used_token: Optional[Tensor] = None) -> Tuple[Tensor, Tensor, Tensor]:

返回三元組 (output, l_aux, exp_counts),分別為輸出、auxiliary loss、各專家激活次數

forward 函數的核心步驟可以總結為以下 5 部分:

def forward(self, hidden_states, used_token=None):# 1?? Gating 階段:計算每個 token 的專家 logits,并選出 top?k 專家gates, load, indices, expert_capacity = self.gate(hidden_states, self.training)# gates: (B, k) 專家權重,load: auxiliary balance loss,indices: 專家索引# 2?? Capacity 控制:根據 capacity_factor 限制每個專家最多處理的 token 數# 用 expert_capacity 來計算實際可接收的 token 數# 3?? Dispatch 階段:將 token 分發給對應專家dispatch_mask, combine_mask = create_masks(indices, expert_capacity)# dispatch_mask: 用于提取每個專家的 token# 重塑 hidden_states 方便通信:expert_inputs = torch.einsum("b h, b e -> e b h", hidden_states, dispatch_mask)# 4?? all_to_all 分發 token:跨 GPU 路由 token 到對應專家所在 GPUexpert_inputs = all_to_all(expert_inputs, self.expert_parallel_group)# 5?? 專家計算階段:每個專家在本地 receive 的 token 上執行 forwardexpert_outputs = self.experts(expert_inputs)# 6?? all_to_all 收集結果:各專家輸出回傳給原始 GPUexpert_outputs = all_to_all(expert_outputs, self.expert_parallel_group)# 7?? 合并輸出:將專家輸出按照 token-group 重組回 batch 維度output = torch.einsum("e b h, b e -> b h", expert_outputs, combine_mask)return output, load, indices.bincount(...)
4.TopKGate 類(deepspeed.moe.layers.gates

實現 top-k 路由,并支持 noisy gate:

class TopKGate(nn.Module):def forward(self, input):logits = self.w_gating(input)topk_vals, topk_indices = torch.topk(logits, k)...

還包括負載均衡 loss。

5.Expert 通信部分

使用 all_to_all 通信分發數據,保證跨 GPU 的負載均衡和數據交換效率。

在多 GPU(分布式)訓練中,如果我們有多個專家網絡(Experts),這些專家可能是跨 GPU 分布的。舉個例子:

  • 有 4 張 GPU,每張 GPU 上部署 2 個專家,共 8 個專家;
  • 假設 batch 里的一部分 token 需要被路由到第 3 個專家(在 GPU 2 上),另一部分需要被送到第 6 個專家(在 GPU 4 上);
  • 那么就必須跨 GPU 發送這些 token —— 所以通信效率就非常關鍵。

這時候就需要 all_to_all 機制來高效完成這個通信過程。

torch.distributed.all_to_all 是一種跨 GPU 的點對點通信機制,作用是每張 GPU 都給其他所有 GPU 發送一塊數據,同時從其他 GPU 收到對應的數據塊。

具體來說:

  • 每個進程(GPU)上都有自己的輸入 token;
  • 每個進程根據路由器(Gate)的輸出,將 token 分為 N 份,分別屬于 N 個專家(也就是 N 個目標 GPU);
  • 然后用 all_to_all 一次性把這 N 份數據分發到對應的 GPU 上;
  • 所有專家完成前向計算后,再用 all_to_all 把結果發回。

參考 deepspeed/moe/utils/all_to_all.py

def all_to_all(input, group):# input shape: (num_local_experts, tokens_per_expert, hidden_size)output = torch.empty_like(input)torch.distributed.all_to_all_single(output, input, group=group)return output

通常輸入需要 reshape 成:

[local_experts, tokens_per_expert, hidden_dim]

之后經過兩次 all_to_all:

  • tokens 分發階段:將 token 從本地發送到它所需的專家所在的 GPU;
  • 結果收集階段:將處理后的輸出再收集回原始的 GPU。

參考鏈接

Applying Mixture of Experts in LLM Architectures

https://www.cnblogs.com/theseventhson/p/18247463

需要 reshape 成:

[local_experts, tokens_per_expert, hidden_dim]

之后經過兩次 all_to_all:

  • tokens 分發階段:將 token 從本地發送到它所需的專家所在的 GPU;
  • 結果收集階段:將處理后的輸出再收集回原始的 GPU。

參考鏈接

Applying Mixture of Experts in LLM Architectures

https://www.cnblogs.com/theseventhson/p/18247463

https://zhuanlan.zhihu.com/p/1888975857147691214

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94996.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94996.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94996.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何將yolo訓練圖像數據庫的某個分類的圖像取出來

COCO 數據集 - Ultralytics YOLO 文檔 比如我只想從數據集中取手機的圖像&#xff0c;來用于我的訓練&#xff0c;懶得自己一張一張標注&#xff0c;方法如下 # -*- coding: utf-8 -*- import json import os import shutil from pathlib import Path from tqdm import tqdm i…

【WPF】WPF 自定義控件實戰:從零打造一個可復用的 StatusIconTextButton (含避坑指南)

&#x1f527; WPF 自定義控件實戰&#xff1a;從零打造一個可復用的 StatusIconTextButton&#xff08;含避坑指南&#xff09;發布于&#xff1a;2025年8月29日 標簽&#xff1a;WPF、C#、自定義控件、MVVM、Generic.xaml、屬性綁定、TemplateBinding&#x1f4cc; 引言 在 W…

中國國際商會副秘書長徐梁一行到訪國聯股份

2025年08月27日&#xff0c;中國國際商會副秘書長徐梁等一行到訪國聯股份&#xff0c;國聯股份創始人、CEO/總裁錢曉鈞&#xff0c;國聯股份副總裁、衛多多/紙多多CEO黃莎莎等熱情招待來訪一行&#xff0c;并展開深入交流。來訪一行首先參觀了國聯股份數字經濟展廳&#xff0c;…

換公司如何快速切入軟件項目工程

一、前言 作為程序員&#xff0c;根據自身職業發展&#xff0c;會通過跳槽謀求更進一步的發展&#xff0c;這時進入新公司&#xff0c;接觸全新的項目工程和業務&#xff0c;如何快速的切入&#xff0c;形成認識呢&#xff1f;就算不跳槽&#xff0c;公司業務調整&#xff0c;也…

Linux系統——EXT2 文件系統

磁盤文件 文件屬性 文件內容文件內容 —— 數據塊&#xff0c;文件屬性 —— inodeLinux 文件在磁盤中的存儲&#xff0c;是將 屬性 與 內容 分開存儲的內存&#xff1a;掉電易失&#xff0c;磁盤&#xff1a;永久性存儲介質圖片來自百度磁盤訪問的基本單元&#xff1a;扇區 …

Qt中的鎖(1)

Qt中的鎖&#xff08;1&#xff09; 加鎖&#xff0c;把多個要訪問的公共資源通過鎖保護起來&#xff0c;把并行執行變成串行執行&#xff0c; 多個線程執行加鎖的對象得是同一個對象&#xff0c;不同對象不會互斥 代碼&#xff1a;//添加一個static成員static int num;//創建鎖…

數據結構 02(線性:順序表)

目錄 線性表 順序表 概念與結構 動態順序表的實現 頭文件的創建 順序表初始化 順序表的擴容 尾插功能 頭插功能 尾刪功能 頭刪功能 查找功能 任意位置前插入 任意位置前刪除 銷毀 動態順序表整體呈現 SeqList.h SeqList.c 線性表 線性表是n個具有相同特性的數…

自助餐廳:自主取餐的平衡術

自助餐廳&#xff0c;本質是通過 “固定客單價 自主取餐” 的模式&#xff0c;把 “吃什么、吃多少” 的選擇權還給用戶&#xff0c;同時用運營設計平衡 “用戶體驗” 與 “餐廳成本”—— 它不是 “讓用戶吃垮餐廳” 的游戲&#xff0c;而是餐飲行業里 “效率與體驗結合” 的…

TypeScript: Reflect.ownKeys 操作(針對 Symbol)

Reflect.ownKeys 是 JavaScript ES6 引入的 Reflect API 中的一個方法&#xff0c;用于獲取目標對象的所有自身屬性鍵&#xff08;包括字符串鍵和 Symbol 鍵&#xff09;。1.基本概念&#xff1a;Reflect.ownKeys(target)&#xff1a;接受一個對象 target 作為參數&#xff0c;…

一般納稅人

目錄 一文詳解&#xff1a;什么是一般納稅人&#xff1f; 一、核心定義&#xff1a;什么是一般納稅人&#xff1f; 二、成為一般納稅人的兩種途徑 三、一般納稅人的關鍵特點與運作機制 四、一般納稅人的優點與缺點 五、與小規模納稅人的核心區別 六、企業應如何選擇&…

@HAProxy 介紹部署使用

文章目錄**1. HAProxy 簡介****1.1 什么是 HAProxy&#xff1f;****1.2 核心特性****1.3 關鍵術語****2. 安裝 HAProxy****2.1 在 Ubuntu/Debian 上安裝****2.2 在 CentOS/RHEL/Rocky Linux/AlmaLinux 上安裝****3. 配置與使用****3.1 核心配置文件結構****3.2 基礎配置示例&am…

Two-Twer模型做歌曲智能推薦與規則算法對比的優缺點分析

基于規則與機器學習驅動的音樂推薦&#xff1a;核心差異分析1.推薦精度2. 個性化能力3. 模型適應性&#xff08;潛在特征關聯發現&#xff09;4. 可擴展性與復雜性成本5. 冷啟動/數據稀疏階段表現6. 聽感匹配與主觀反饋1.推薦精度 規則推薦&#xff1a; 依賴預設的 if-then 邏…

【完整源碼+數據集+部署教程】停車位狀態檢測系統源碼和數據集:改進yolo11-DCNV2-Dynamic

背景意義 隨著城市化進程的加快&#xff0c;城市交通擁堵問題日益嚴重&#xff0c;停車難成為了許多城市居民面臨的普遍問題。有效的停車管理不僅可以提高城市交通的流動性&#xff0c;還能減少因尋找停車位而造成的時間浪費和環境污染。因此&#xff0c;開發一個高效的停車位狀…

《Password Guessing Using Random Forest》論文解讀

論文填補了傳統統計方法&#xff08;如 PCFG、Markov&#xff09;與深度學習方法&#xff08;如 LSTM、GAN&#xff09;之間的研究空白&#xff0c;提出基于隨機森林的口令猜測框架 RFGuess&#xff0c;覆蓋三種核心猜測場景&#xff0c;為口令安全研究提供了全新技術路線。一、…

項目一系列-第9章 集成AI千帆大模型

第9章 集成AI千帆大模型 學習目標 能夠說清楚健康評估模塊在項目中的作用能夠掌握千帆大模型的開通和對接能夠掌握健康評估模塊中的prompt提示詞編寫能夠自主完成健康評估模塊的接口開發 分析設計 需求說明 健康評估是指老人辦理入住前需上傳體檢報告&#xff0c;由AI自動…

vben admin5組件文檔(豆包版)---VbenTree

VbenTree 用法說明 VbenTree 是 Vben5 中基于 radix-vue 實現的樹形組件&#xff0c;支持單選、多選、展開/折疊、權限控制等功能。以下是其核心用法說明&#xff1a; 1. 基礎引入 import { VbenTree } from vben-core/shadcn-ui;2. 核心屬性&#xff08;Props&#xff09;屬性…

postman常用快捷鍵

作為一名IT程序猿&#xff0c;不懂一些工具的快捷方式&#xff0c;應該會被鄙視的吧。收集了一些Postman的快捷方式&#xff0c;大家一起動手操作~ 1小時postman接口測試從入門到精通教程簡單操作 操作mac系統windows系統 打開新標簽 ?TCtrl T關閉標簽?WCtrl W強制關閉標簽…

【物聯網】什么是 DHT11(數字溫濕度傳感器)?

正面照片&#xff08;藍色傳感器朝上&#xff0c;針腳朝下&#xff09; 絲印標注非常清晰&#xff1a; 左邊 → S &#x1f449; 信號 (DATA) 中間 → &#x1f449; VCC (電源&#xff0c;3.3V 或 5V) 右邊 → - &#x1f449; GND (地) ? 正確接法&#xff08;Arduino Nano…

光譜相機在霧霾監測中有何優勢?

光譜相機在霧霾監測中的優勢主要體現在多維度數據采集和環境適應性方面&#xff0c;結合最新技術進展分析如下&#xff1a;一、核心優勢?穿透性監測能力? 短波紅外&#xff08;SWIR&#xff09;波段可穿透霧霾顆粒&#xff0c;結合可見光成像實現霧霾濃度與能見度的同步監測&…

【c++】超好玩游戲

#include <iostream> #include <vector> #include <conio.h> #include <windows.h> #include <time.h>using namespace std;// 游戲常量 const int WIDTH 40; const int HEIGHT 20; const int PADDLE_WIDTH 5;// 方向枚舉 enum Direction { S…