想象你正在经营一家为整座城市供餐的“超级中央厨房”。这家厨房不是一开张就把锅碗瓢盆乱堆一气,而是先画好设计图:炒菜区、备菜区、冷库、传菜通道各占一角,每个区域互相配合又不抢道。寒武纪MLU(Machine Learning Unit)芯片,就是一张为人工智能量身定制的“超级厨房设计图”——它把海量的计算单元、存储单元和传输通道,像厨房的灶台、货架和传菜电梯一样,安排得井井有条。这篇文章将带你走进MLU芯片内部,用小白的视角看懂它的硬件设计与计算能力:从张量计算单元如何“掌勺”,到片上存储如何“备菜”,再到数据如何在不同模块间“传菜”。你会发现,芯片架构并不神秘,它和一家高效运转的厨房一样,比拼的是分工、配合与流程优化。
理解MLU架构,是从事国产AI芯片选型、部署与性能调优的通行证,让你在算力国产化浪潮中不再“知其然而不知其所以然”。
目录
可视化演示
展示进程-资源分配图,通过有向图环检测算法自动识别死锁状态,切换不同配置观察死锁形成。
本节配有交互动效(进入视口后自动加载,约 3KB)。
资源分配图死锁检测 进程节点 资源节点 死锁环 cycle = deadlock 有向图中存在环则发生死锁
整体架构布局:一张“超级中央厨房”的设计图
想象你正在经营一家为整座城市供餐的“超级中央厨房”。这家厨房不是一开张就把锅碗瓢盆乱堆一气,而是先画好设计图:炒菜区、备菜区、冷库、传菜通道各占一角,每个区域互相配合又不抢道。寒武纪MLU芯片的架构设计,就像画这样一张厨房设计图——先把功能分区规划好,再考虑怎么让各个区域高效协作。
MLU把芯片划分为几个明确的功能域。计算核心域相当于灶台区,所有张量处理核心(TPC)都集中在这里;存储与IO域相当于仓库和出入口,负责运进数据、送出结果;控制调度单元则像厨房总指挥,负责下发指令、协调各区域的工作节奏。这种模块化布局的最大好处是:不同功能块可以并行运转,互不干扰,也不会因为某个区域拥堵而拖垮整条流水线。
在芯片物理实现上,各个模块通过片内总线相连,数据与指令沿着总线流动。控制调度单元下发一条指令,计算核心域执行运算,存储域供应数据——三者就像一台精密运转的机器。但现实并非完美并行:计算单元等数据时只能空转,存储单元忙不过来时计算单元也只能等待。任何一个环节慢下来,整条线的效率都会被拖低。这种串行等待的关系,可以用一个简单的延迟模型来描述:
这三部分时间累加,就是一次完整任务的耗时。所以工程师优化MLU时,不只是让灶台(计算单元)火更大,还会让备菜更快、传菜通道更宽,把每一部分时间都压下去。这正是“整体架构布局”的核心思想:先搭好合理的框架,再谈局部提速。理解了这张设计图,后面所有模块的讨论就都有了地图上的坐标。
- 总延迟表示从数据进入芯片到得出结果所花费的总时间
- 计算耗时计算核心真正执行运算的时间,相当于厨师下锅翻炒的时长
- 访存耗时等待数据从存储中取出的时间,好比等冷库出货
- 搬运耗时数据在模块之间传递花费的时间,好比传菜通道上的通行时间
张量计算单元:掌勺大厨与配菜师团队
超级厨房的核心是掌勺的大厨。MLU芯片的“大厨”是围绕张量计算设计的众多张量处理核心(TPC)。TPC并不是单打独斗,它内部包含三种角色:矩阵运算引擎、矢量运算单元和累加器,分别像大厨、配菜师傅和调料称量师。三者配合,才能把一道AI“菜”高效做出来。
矩阵运算引擎专门处理深度学习中最常见的矩阵乘法。矩阵乘法可以比喻为按菜谱配菜:矩阵A的每一行是一份菜谱的配料需求,矩阵B的每一列是一种食材的配给清单,两者相乘得到每道菜的最终用量矩阵C。深度学习模型的卷积、全连接等操作,本质上都可以拆解为矩阵乘法,因此矩阵运算引擎的吞吐直接决定了芯片的AI算力:
除了矩阵运算引擎,TPC还配备矢量运算单元,负责处理逐元素的激活函数、归一化等操作,就像配菜师傅把各类配料备齐;累加器则以更高精度保存中间结果,避免多次累加造成精度损失,如同用精密电子秤称量调料,保证每份菜口味稳定。算子映射则是把AI模型里的各种算子翻译成TPC上可执行的指令序列,相当于把菜谱翻译成厨师能看懂的步骤卡。理解了TPC内部的分工,就明白为什么AI芯片如此看重“张量”——因为深度学习模型几乎全是矩阵运算的组合。
- 左乘矩阵$A_{m \times k}$ 是形状为 $m$ 行 $k$ 列的输入矩阵,相当于 $m$ 份菜谱、每份涉及 $k$ 种配料
- 右乘矩阵$B_{k \times n}$ 是形状为 $k$ 行 $n$ 列的输入矩阵,相当于 $k$ 种配料对应 $n$ 个菜品的配给方案
- 输出矩阵$C_{m \times n}$ 是运算结果矩阵,$m$ 行 $n$ 列,代表每份菜谱在每个菜品上的最终用量
- 乘加含义$C$ 中每个元素是 $A$ 的一行与 $B$ 的一列逐项相乘再累加的结果,即行与列的点积
片上存储层次:备菜台与小冷库
厨房要快,食材就不能总从远处的大冷库搬。MLU在芯片内部安排了多级片上存储——SRAM。SRAM容量不大,但速度极快,相当于灶台边的备菜台:食材现取现用,不用每次跑大冷库。整个存储层次像一个金字塔:越靠近计算单元,容量越小、速度越快;越远离,容量越大、速度越慢。
片上存储设计讲究分级缓冲。数据先从外部大容量内存(如HBM)搬进片上SRAM,再被计算单元取用。计算单元直接访问SRAM的速度比访问HBM快一个数量级,但如果数据搬进SRAM后只用一次就丢弃,带宽就白白浪费了。所以MLU特别强调“数据复用”——让同一份数据被多次使用,减少重复搬运。这就像一份高汤被多个菜品反复取用,而不是每道菜都重新熬一锅。
带宽是整个系统的生命线。存储带宽B表示每秒能搬运多少数据。对于采用双倍速率(DDR/HBM)的接口,带宽由接口频率、数据位宽和双倍速率共同决定:
实际应用中,一次矩阵乘法需要把输入特征图、权重从HBM搬到SRAM,再流经计算单元。如果数据复用设计得好,一次搬运可以支撑多次乘加运算,计算利用率就会显著提升。这正是“用搬运次数换计算效率”的智慧:SRAM容量不是越大越好,关键是让每一块SRAM里的数据都被榨干价值。
- 接口频率$f$ 是存储接口的时钟频率,单位GHz,相当于传送带每秒滚动的圈数
- 数据位宽$W$ 是每个时钟周期并行传输的数据线数量,单位bit,相当于传送带的宽度
- 双倍速率$\times 2$ 表示在时钟的上升沿和下降沿各传一次数据,相当于传送带正转和反转都在送货
- 带宽结果$B$ 是每秒能搬运的数据量,单位GB/s,是衡量存储系统吞吐能力的核心指标
互联与带宽:传菜通道与冷库传送带
一家大型厨房,炒好的菜要同时送往几十个包间;一个多芯片AI系统,数据要在不同芯片之间高频流动。MLU的互联方案就是为AI“吃数据”而生的传菜系统。没有畅通的传菜通道,灶台火力再旺,菜品也送不出去。
片间互联解决的是“多张卡怎么协作”的问题。训练大模型时,单张芯片装不下全部模型参数,需要多块MLU组成集群。片间互联通道把多块芯片连成一张大网,每一跳都在搬运着梯度与权重。HBM接口则是芯片与外部高带宽内存之间的“冷库传送带”,提供数TB/s级别的带宽,确保计算单元永远有数据可算。PCIe通道主要负责与主机CPU通信,相当于厨房对外的进货大门,接收指令和预处理后的数据。
多条通道并行,总带宽叠加。如果每条通道的带宽为 $B_{\text{per}}$,共有 $N_{\text{link}}$ 条通道,则聚合带宽为:
除了带宽,还有一致性协议在幕后工作。多块芯片同时读写同一份数据时,一致性协议保证大家看到的是最新值,避免“数据打架”。这就像多个厨房共用一个食材账本,必须确保谁取了多少都记录清楚。缓存一致性是复杂但必要的机制,也是国产互联方案走向成熟的关键挑战。
- 单通道带宽$B_{\text{per}}$ 是每一条互联通道在单位时间内能传输的数据量,相当于一辆传菜小车的载货量
- 并行通道数$N_{\text{link}}$ 是同时工作的通道数量,相当于同时派出的小车数量
- 聚合带宽$B_{\text{total}}$ 是所有通道合并后的总吞吐,单位通常为GB/s
- 线性扩展通道数越多总带宽越高,“堆通道”是扩展吞吐的基本思路,但成本也随之上升
算力评估指标:出菜速度的核算方法
饭店好不好,不看灶台最大火力,而看实际翻台率。评估MLU芯片,也不能只盯标称峰值算力。峰值算力是理论极限,相当于所有大厨拼命颠勺时的极限出菜数;真实项目里,还要看能效比、实际利用率和模型吞吐,这些指标共同决定了芯片在真实负载下的表现。
能效比衡量的是“每度电做多少菜”,即每瓦特功耗能完成的计算量。对数据中心而言,电费是运营成本的大头;对边缘设备而言,功耗直接决定散热方案和电池续航。因此能效比是AI芯片的重要评价维度。而实际利用率则反映了计算单元在真实任务中被有效使用的程度:
实际利用率和峰值算力之间的差距,往往就是存储带宽和互联带宽拖的后腿。一个模型在MLU上的吞吐,即每秒能处理多少样本,是用户最关心的终极指标。它综合反映了架构设计与软件调优的水平。“能用上的算力才是真算力”,这句话解释了为什么有些芯片标称算力很高,跑起真实模型却不如预期。选型时,务必用真实模型跑一跑吞吐和利用率,而不是只看宣传册上的数字。
- 有效计算时间$T_{\text{compute}}$ 是计算单元满负荷执行运算的累计时间
- 总任务时间$T_{\text{total}}$ 是整个任务从开始到结束的完整耗时,包含等待、搬运、计算
- 利用率$\eta$ 表示计算单元被有效利用的比例,越接近100%说明空转越少
- 百分比换算$\times 100\%$ 把小数比例转换为直观的百分数,方便对比不同配置的效果
场景适配优化:不同宴席的接待方案
超级中央厨房要应对各种宴席:婚宴、商务宴、外卖单。MLU也需要针对不同的AI工作负载做适配优化。最常见的两类场景是训练与推理,它们的需求差异很大,就像研发新菜谱和按菜谱批量出菜是两种完全不同的活儿。
训练场景像研发新菜谱:要反复试验、调整配比,需要高精度和大批量数据,计算强度极高,对存储带宽的消耗也非常大。推理场景像按已定菜谱批量出菜:延迟要低、吞吐要高,精度要求相对宽松,可以适当使用低精度量化(如FP16/INT8)来提速。因此MLU在不同场景下会采用不同的数据精度和算子调度策略,例如训练用FP32保证收敛质量,推理用INT8换取更高吞吐。评价适配效果,常用加速比。假如一个模型在原平台的运行时间是 $T_{\text{baseline}}$,在MLU上的时间是 $T_{\text{MLU}}$,加速比为:
典型模型方面,卷积网络(如ResNet)在MLU上表现优异,因为卷积可以映射为大量并行矩阵运算;Transformer结构则对存储带宽和互联要求更高,是新一代芯片优化重点。性能调优时,工程师会把小算子融合成大算子、调整数据在SRAM中的排布、选择合适精度,让每一拍时钟都用在刀刃上。就像厨师会根据宴席类型调整备菜流程——宴席不同,后厨的动线也要跟着变。
- 基线时间$T_{\text{baseline}}$ 是参考硬件平台上跑通同一模型的耗时
- MLU时间$T_{\text{MLU}}$ 是MLU上的运行耗时
- 加速比$S$ 表示MLU比基线快多少倍,$S = 2$ 即快一倍
- 相对比较加速比是相对值,基线选不同平台结果也不同,对比时需说明硬件环境与精度配置
软件栈配合:菜谱管理与配菜师
光有灶台还不够,厨房正常运转还需要菜谱管理软件、预制菜包和熟练的服务员。MLU的软件栈就是AI芯片的“操作系统与服务体系”。寒武纪推出的CNToolkit是完整的开发工具链,内置编译器、调试器和性能分析工具,把开发者写的AI模型编译成MLU能执行的指令序列。
算子库CNNL就像预制菜包:把常用的卷积、归一化、池化等算子预编译好,开发者直接调用,不用从零手写底层实现。框架适配层则负责对接TensorFlow、PyTorch等主流深度学习框架,让开发者几乎无感地切换硬件后端——就像点菜系统升级了,但顾客点菜的方式没变。当模型从CPU/GPU迁移到MLU时,数据要经过主机端再到设备端,端到端延迟可以记为:
虚拟化与多卡管理让一块物理MLU可以分割给多个用户使用,就像厨房里的多个档口共享中央资源。完整的软件栈决定了芯片的“好用程度”:硬件是实力,软件是演技,两者配合才能把芯片性能真正发挥出来。对开发者而言,选芯片也是在选软件生态——工具链顺不顺,直接决定项目落地的速度。
- 主机端时间$T_{\text{host}}$ 涵盖数据预处理、内存拷贝和框架调度耗时
- 设备端时间$T_{\text{device}}$ 是MLU上真正的kernel执行时间
- 端到端延迟$T_{\text{e2e}}$ 是用户从发起请求到拿到结果的总感知时间
- 串行叠加主机端与设备端依次完成,优化既要减少kernel耗时,也要减少数据拷贝
AI 应用场景
场景1:云端大模型训练集群
阶段:模型训练与算力供给
解决的问题:传统GPU平台成本高、供应链受制约,大模型训练亟需国产算力底座。MLU通过多卡互联和HBM大带宽,为超大规模参数训练提供高吞吐、低成本的算力方案。
具体案例:某AI公司用8卡MLU370服务器训练130亿参数的语言模型。工程师通过CNToolkit把PyTorch模型编译优化,采用数据并行加张量并行策略,使多卡线性加速比达到7.2倍,训练吞吐较单卡提升近7倍。
场景2:智慧园区边缘推理
阶段:模型推理部署
解决的问题:边缘盒子功耗受限(通常低于30W),同时要跑多路视频分析。MLU高能效比设计让推理在低功耗下保持高吞吐,一台设备取代多台通用CPU服务器。
具体案例:某安防厂商在园区出入口部署内嵌MLU的智能分析盒,同时运行人脸检测、口罩识别、车辆识别三个模型,端到端时延均低于50ms,功耗仅25W,满足7×24小时不间断运行要求。
场景3:国产化算力迁移
阶段:系统迁移与适配
解决的问题:信创项目要求核心系统使用国产芯片。MLU提供完善的PyTorch/TensorFlow适配层,将迁移成本降到最低,避免“换芯片等于重写系统”的难题。
具体案例:某银行风控系统原运行在NVIDIA GPU上,迁移到MLU时复用90%的Python业务代码,仅需替换底层推理后端并重新编译算子,性能与原有系统持平,顺利通过监管验收。
Python 演示
"""MLU两级流水线模拟器模拟数据块依次经过"搬运(Load)"和"计算(Compute)"两个阶段,展示流水线重叠如何提升整体吞吐与部件利用率""" class MLU_PipelineSim: """模拟MLU上数据搬运与计算两级流水线""" def __init__(self, load_latency=4, compute_latency=6): self.load_latency = load_latency # 搬运阶段耗时(周期) self.compute_latency = compute_latency # 计算阶段耗时(周期) self.load_free = 0 # 搬运单元下次空闲时刻 self.compute_free = 0 # 计算单元下次空闲时刻 self.load_busy = 0 # 搬运单元累计忙碌周期 self.compute_busy = 0 # 计算单元累计忙碌周期 def run(self, num_blocks): """按贪心调度送入 num_blocks 个数据块""" finish_time = 0 for _ in range(num_blocks): load_start = max(self.load_free, 0) load_end = load_start + self.load_latency compute_start = max(load_end, self.compute_free) compute_end = compute_start + self.compute_latency self.load_free = load_end self.compute_free = compute_end self.load_busy += self.load_latency self.compute_busy += self.compute_latency finish_time = compute_end return { "总耗时": finish_time, "搬运利用率": round(self.load_busy / finish_time * 100, 1), "计算利用率": round(self.compute_busy / finish_time * 100, 1), } if __name__ == "__main__": print("===== MLU 两级流水线模拟 =====") for n in [1, 4, 20]: sim = MLU_PipelineSim(load_latency=4, compute_latency=6) result = sim.run(n) print(f"数据块数: {n:>2} 总耗时: {result['总耗时']:>3} 周期 " f"搬运利用率: {result['搬运利用率']}% " f"计算利用率: {result['计算利用率']}%")
compute_start = max(load_end, self.compute_free)计算必须等数据搬运完成且计算单元空闲,这是流水线调度的核心约束self.load_free = load_end更新搬运单元的可用时刻,让下一个数据块能紧接着开始搬运self.load_busy += self.load_latency累计搬运单元的忙碌周期,用于最终计算利用率for _ in range(num_blocks)顺序调度所有数据块,模拟真实场景中连续不断的数据流round(self.load_busy / finish_time * 100, 1)用忙碌时间除以总耗时算出利用率百分比,直观反映部件空转程度
常见误区
误区选AI芯片只看TOPS(每秒万亿次运算),觉得数字越大,跑模型就一定越快。
正解峰值算力只是理论极限,就像厨房灶台的最大火力。实际出菜速度还取决于备菜、传菜是否跟得上。存储带宽、数据搬运、算子调度效率都可能成为瓶颈。MLU即使标称算力很高,如果模型对带宽消耗大、数据复用做得不好,实际利用率可能不到50%。选型必须拿真实模型测吞吐和延迟。
为何常见:厂商宣传页永远把峰值TOPS放在最显眼的位置,数字对比最直观,容易让人忽略真实负载下的复杂情况。
误区既然都是AI加速芯片,CUDA写的程序改个名字、换个编译器就能跑在MLU上。
正解MLU有自己独立的软件栈,包括CNToolkit工具链、CNNL算子库、框架适配层。CUDA代码不能直接运行在MLU上,需要通过寒武纪的算子接口改写或迁移。好在PyTorch/TensorFlow等框架适配层做得较完善,大部分业务代码可以复用,但底层自定义算子仍需要重写。
为何常见:绝大多数AI开发者只用过CUDA生态,惯性思维认为AI芯片应当兼容CUDA,忽略了各家芯片指令集和运行时本质上并不通用。
误区芯片里的SRAM容量越大,性能就一定越强,就像电脑内存越大越流畅一样。
正解SRAM占芯片面积、增加功耗,而且如果数据复用设计不好,容量再大带宽一样是瓶颈。MLU的片上存储设计追求的是容量、带宽与计算单元的平衡——关键在于数据能反复被使用,而不是单纯堆容量。备菜台再大,如果每道菜都用新食材,传菜通道还是会堵。
为何常见:人们习惯用“容量大小”衡量存储好坏,与日常使用电脑的经验一致,但芯片设计是系统工程,瓶颈往往在更隐蔽的地方。
误区反正都是跑同一个AI模型,训练调好了,推理直接部署就行,不用管。
正解训练和推理对算力的需求差异很大。训练追求高精度和大批量数据,需要FP32甚至更高精度;推理追求低延迟和高吞吐,可以用FP16/INT8量化,还可以做算子融合、剪枝等优化。MLU针对两类场景做了差异化设计——训练看重多卡互联带宽,推理看重单卡能效和延迟。两者混为一谈,往往会浪费芯片一半的潜力。
为何常见:训练和推理在通俗语境里都叫“跑AI”,初学者很容易忽略它们在精度、延迟、吞吐上的不同侧重点。
面试题
Q1. 寒武纪MLU中执行矩阵乘法的核心计算单元是?
- A.张量处理核心← 正确答案
- B.指令控制单元
- C.PCIe控制器单元
- D.地址译码缓冲区
答案:A。张量处理核心(TPC)是MLU执行矩阵乘法等张量运算的主力,就像厨房里掌勺的大厨;指令控制、PCIe传输、地址译码都是辅助性模块,不直接参与矩阵计算。
Q2. 下列哪项属于MLU的片上存储层次?
- A.SRAM高速缓存← 正确答案
- B.机械硬盘存储
- C.固态硬盘阵列
- D.光盘只读库
答案:A。MLU的片上存储层次以SRAM为关键构成,容量小但速度极快,相当于灶台旁的备菜台;机械硬盘、固态硬盘、光盘都属于外部存储设备,与芯片不在同一个层级。
Q3. 为什么MLU峰值算力很高时,实际利用率也可能较低?
- A.存储带宽拖慢数据搬运← 正确答案
- B.芯片自身散热不良
- C.指令集过于复杂
- D.工作频率设置过高
答案:A。峰值算力只是理论上限,数据搬运速度跟不上,计算单元就会空转等待,利用率自然低。就像灶台火力再大,备菜送菜跟不上也白搭;散热、指令集、频率不是利用率低的常见主因。
Q4. 以下哪些因素会影响MLU的实际算力表现?
- A.片上存储带宽← 正确答案
- B.片间互联带宽← 正确答案
- C.峰值算力标称值
- D.算子调度效率← 正确答案
答案:ABD。片上存储带宽决定数据投喂速度,片间互联带宽影响多卡扩展效率,算子调度效率决定计算单元是否空转;峰值算力标称值是理论上限,不是“影响因素”,而是衡量对象本身的属性。
Q5. 寒武纪MLU的官方软件工具链被称为什么?
- A.CNToolkit工具链← 正确答案
- B.CUDA工具套件
- C.ROCm开发平台
- D.OpenCL编译器
答案:A。CNToolkit是寒武纪官方开发工具链,包含编译器、调试器、性能分析等完整工具;CUDA是NVIDIA的生态,ROCm是AMD的生态,OpenCL是通用并行计算框架,都不属于寒武纪。
Q6. MLU训练场景与推理场景的主要区别是什么?
- A.训练重精度推理重延迟← 正确答案
- B.训练用GPU推理用CPU
- C.训练无需存储参与
- D.推理无需计算单元
答案:A。训练像研发菜谱,追求精度和大批量,需要高精度计算;推理像按菜谱出菜,追求上菜速度和吞吐,可用低精度量化提速。两者都用AI加速芯片,且都需要存储和计算单元,B、C、D均为错误表述。
Q7. HBM高带宽内存对MLU的核心价值是什么?
- A.提供超高内存带宽← 正确答案
- B.显著降低芯片功耗
- C.直接减小核心面积
- D.简化散热器设计
答案:A。HBM的核心价值是提供远高于普通DDR内存的带宽,让计算单元不被数据饿死,相当于给高速灶台配上超宽传送带;功耗、核心面积、散热主要取决于制程工艺和封装设计,不是HBM的直接功能。
Q8. 关于MLU“数据复用”的说法,正确的是?
- A.降低对片外带宽的需求← 正确答案
- B.需要片上存储配合← 正确答案
- C.提升计算单元利用率← 正确答案
- D.只适用于训练场景
答案:ABC。数据复用让同一份数据在片上多次使用,减少重复搬运,从而降低片外带宽压力,这离不开SRAM的配合,也能有效提高计算利用率;数据复用在训练和推理中都很重要,不止训练场景。
Q9. 能效比(FLOPS/W)衡量的是什么?
- A.每瓦特完成的运算量← 正确答案
- B.芯片的制造工艺制程
- C.芯片封装体本身的尺寸
- D.片上缓存的总容量大小
答案:A。能效比 = 算力 ÷ 功耗,表示每消耗1瓦特电能可以完成多少次运算,是AI芯片的重要评价维度;工艺制程、封装尺寸、缓存容量是芯片的其他物理属性,与能效比的定义不直接相关。
Q10. 在MLU上部署模型时,常用的性能调优手段有哪些?
- A.调整算子融合方式← 正确答案
- B.优化数据布局← 正确答案
- C.选择合适数据精度← 正确答案
- D.更换操作系统
答案:ABC。算子融合可减少kernel启动开销,数据布局优化能提升SRAM命中率,精度选择(FP16/INT8)可提升吞吐;更换操作系统属于运维层面操作,不改变模型在芯片上的执行效率,并非性能调优手段。