找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

649

积分

0

好友

88

主题
发表于 16 小时前 | 查看: 1| 回复: 0

图片

图片

在分析和理解大模型(LLM)时,我们常通过架构图来了解其网络结构(如下[1])。然而,这类人工绘制的图示通常不会包含详尽的计算细节,例如张量(Tensor)的维度变化和具体操作过程。为深入分析数据从输入到输出的完整流程,本文将以DeepSeek-V3模型为例,介绍一种使用PyTorch进行网络计算图可视化的实用方法。

图片

利用 torchvista [2] 工具,我们可以将 PyTorch 定义的 DeepSeek-V3 模型进行可视化,并在 Jupyter Notebook 等环境中获得一个可交互的计算流图,如下图所示。该可视化方法主要具备以下特点:

  • 每个张量(Tensor)均会标注其尺寸信息;
  • 每个模块可展开至底层的 PyTorch 基本操作;
  • 采用类定义的模块支持折叠,展示深度可灵活调节;
  • 可直接在界面中查看每个操作的具体定义。

图片

示例地址(若无法访问,请参考文末的 GitHub 地址):
https://colab.research.google.com/drive/1q0NAAnCP_e0c53wacM5H0cqDzguqTOER?usp=sharing

下面,我们将分步介绍如何构建此交互式计算图。

一、torchvista 基本使用

torchvista 是一款交互式可视化工具,可直接在 Notebook 环境中对 PyTorch 模型(nn.Module)的前向传播过程进行可视化。它非常适用于辅助理解模型推理时的详细计算流程。

首先进行工具安装:

!pip install --upgrade torchvista

我们构建一个简单的线性层模型来测试其功能:

import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvista import trace_model

# 模型定义:
class LinearModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(10, 5)
    def forward(self, x):
        return self.linear(x)

# 创建模型、定义输入
model = LinearModel()
example_input = torch.randn(2, 10)

# 调用 torchvista 来可视化模型
trace_model(
    model,  # 模型
    example_input, # 输入
    collapse_modules_after_depth=3,
    show_non_gradient_nodes=False,
    forced_module_tracing_depth=None,
    height=500,
    export_format=None
)

输出结果如下图所示:
图片

trace_model 函数的关键参数说明:

  • collapse_modules_after_depth:模块自动折叠的深度,默认为0。
  • show_non_gradient_nodes:是否显示不参与梯度计算的节点。
  • forced_module_tracing_depth:控制追踪(trace)的层数。设置较小的值可以降低图形渲染的计算成本,默认值为None
  • height:Notebook中图形显示框的高度。
  • export_format:支持导出为 'png'、'svg'、'html' 格式。

图片

实用提示:

  1. 当生成交互图速度较慢时,可尝试降低 forced_module_tracing_depth 参数的值。
  2. 如果遇到非 nn.Module 模块显示错误,可尝试将其替换为对应的 PyTorch 底层操作。

二、DeepSeek-V3模型的可视化实战

使用 PyTorch 构建 DeepSeek-V3 模型会涉及到量化、FP8计算等技术,可参考官方文档[3]进行模型搭建。由于模型依赖一些 GPU kernel,首先需要在 Notebook 中安装 triton 库:

# 安装 triton
!pip install --upgrade triton

然后,参照官方代码(参考:https://huggingface.co/deepseek-ai/DeepSeek-V3)搭建对应的模型。我们首先尝试可视化一个包含 MLA 和 FFN 层的 Block 的计算过程。

args = ModelArgs()
model = Block(0, args)
torch.set_default_dtype(torch.bfloat16)
tokens = torch.randn((1, 1024, 2048) , dtype=torch.bfloat16)
freqs_cis = precompute_freqs_cis(args)
seqlen = tokens.size(1)
freqs_cis = freqs_cis[0:seqlen]
mask = torch.full((seqlen, seqlen), float("-inf"), device=tokens.device).triu_(1)
trace_model(model, (tokens,0, freqs_cis, mask), export_format='png')

Block 中 MLA 子模块的计算流图如下:
图片

为了观察模型整体结构,我们将模型总层数修改为2:

n_layers: int = 2   # 总层数 -> 2
n_dense_layers: int = 1

然后运行以下代码进行可视化:

args = ModelArgs()
model = Transformer(args)
torch.set_default_dtype(torch.bfloat16)
x = torch.randint(0, args.vocab_size, (2, 128)) # batch_size: 2, sequence_length:128
trace_model(model, (x,))

获得的计算流图如下图所示,可以清晰地看到两个Block中FFN层的主要差异:一个使用标准的MLP,另一个则采用了MoE(混合专家)结构。
图片

展开MoE模块,可以查看其内部详细的计算流程:
图片

总结

交互式计算流图为模型可视化和理解提供了强大助力,能够有效帮助开发者梳理模型的计算过程,实现张量尺寸的追踪和PyTorch操作的直观查看。本文以DeepSeek-V3模型为例进行了探索,通过计算流图可以直观地洞察模型内部的诸多计算细节。

本文用例地址:

参考:




上一篇:IntelliJ IDEA 2025.3深度体验:AI功能升级与统一版本全解析
下一篇:Linux命令实战指南:10分钟掌握高效运维与开发的必备技巧
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-10 21:03 , Processed in 0.079173 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表