首页 > 其他分享 >性能评估工具Profiler的使用与相关介绍

性能评估工具Profiler的使用与相关介绍

时间:2024-09-09 14:23:16浏览次数:13  
标签:name 性能 torch Profiler state dict model profiler 评估

性能评估工具Profiler

经历三天的性能评估工具探索,终于找到了正确使用Profiler的正确使用方法。

环境搭建

#python环境搭建(python=3.10)
conda create --prefix=/path/to/you/env/name python=3.10
#torch环境搭建(CUDA12.1,linux,pip)
pip3 install torch torchvision torchaudio
#transformers库安装
pip install transformers
#tqdm库安装
pip install tqdm
#tensorboard库安装
pip install tensorboard
#torch-tb-profiler库安装
pip install torch-tb-profiler

完成以上环境安装后基本完成了使用profiler工具需要准备的大部分内容,接下来是代码部分需要注意的地方

代码内容

这里使用的代码内容需要注意几个关键点内容

模型文件的格式要求:没有要求!需要把预训练模型加载入适配的网络框架中。这里以两个方面的模型为例子:

一是NLP网络模型,这里使用了.bin与.safetensor格式的预训练模型文件

.bin文件的加载方式:

model_name = "facebook/opt-125m"

# 加载预训练的模型架构和tokenizer
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 将模型移动到GPU
model.to(device)

# 加载自定义权重
state_dict = torch.load('opt-125m/pytorch_model.bin', map_location=device)
model.load_state_dict(state_dict)

# 创建一个简单的数据输入并将其移动到GPU
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors="pt").to(device)

# 定义一个前向传播函数
def forward_pass(inputs):
    with torch.no_grad():
        output = model(**inputs)
    return output

.safetensor网络格式加载方式

# 设置设备为GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 模型名称
model_name = "facebook/opt-125m"

# 加载预训练的模型架构和tokenizer
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 将模型移动到GPU
model.to(device)

# 加载 .safetensor 文件
safe_tensor_path = 'opt-125m-4bit/gptq_model-4bit-128g.safetensors'

# 使用 safetensors 库加载模型权重
state_dict = OrderedDict()
with safe_open(safe_tensor_path, framework="pt") as f:
    for k in f.keys():
        state_dict[k] = f.get_tensor(k)

# 手动映射和加载权重
model_state_dict = model.state_dict()
for name, param in state_dict.items():
    if name in model_state_dict:
        model_state_dict[name].copy_(param)
    else:
        print(f"Skipping {name} as it is not found in the model state dict.")

# 创建一个简单的数据输入并将其移动到GPU
text = "Hello, how are you?"
inputs = tokenizer(text, return_tensors="pt").to(device)

# 定义一个前向传播函数
def forward_pass(inputs):
    with torch.no_grad():
        output = model(**inputs)
    return output

上述内容中需要注意的是这里的safetensor格式内容是通过量化后得到的,所以需要对模型的权重进行手动映射。

上述内容仅仅是对不同模型的加载,而后还需要做的是将完整的模型放入profiler工具的函数下进行前向传播以帮助工具捕获模型具体的流程:

# 使用torch.profiler进行性能分析
import torch.profiler
from tqdm import tqdm
from torch.profiler import ProfilerActivity

#尝试使用tensorboard可视化性能评估各项参数
with torch.profiler.profile(
    schedule=torch.profiler.schedule(wait=2,warmup=2,active=6,repeat=1),
    on_trace_ready=torch.profiler.tensorboard_trace_handler(dir_name='performance/'),
    activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA],
    with_stack=True,
)as profiler:
    # with torch.no_grad():
    for batch_idx in tqdm(range(16), desc='Profiling ...'):
        forward_pass(inputs)
        profiler.step()

这个过程就可以帮助我们完成tensorboard可读文件的生成与存储。最后可以使用命令或者vscode中直接启动TensorBoard会话的方式开始分析模型性能。

使用命令:

tensorboard --logdir\=logs

vscode直接启动:

接下来就是评估模型的tensorboard界面内容了,使用上述两种方式中的其中一种你都可以得到如下界面:

主界面

在这个界面中就可以对模型的各项运行性能进行一个详细的观测:在上面的界面中有GPU Sunmmary面板,这个面板中包含了GPU的基本信息、算力与使用率以及使用效率,右上角则为各种设备的使用时间与使用率。在小批次推理过程中,量化前后的网络模型体现并不明显,主要运行时间集中在CPU的计算过程中,这个过程主要是CPU对数据传输的过程,想要加速这个过程需要对CPU的使用做一定的处理。

算子级别概览

在上面界面中会展示每个算子执行的时间,可以在执行总时间饼状图中看到每个算子的执行时间占比。

kernel级别概览

这个界面中主要展示的是我们使用的代码、模型执行过程中调用的GPU函数。

trace详细执行计划图

在这个界面中展示了详细到流程的执行时间,函数,算子,CPU,GPU使用情况以及具体的那一部分内容是通过什么芯片进行计算的,占用了多少时间等内容,可以通过alt+鼠标滚轮进行放大缩小。在实际的量化过程中我们都是基于GPU的运算来进行的。也就是执行时间最少的那一部分内容,需要注意的是这里是使用较少批次的推理过程会有这样的情况。

上图为缩放后的界面内容,这个部分可以看到具体的使用函数以及CPU分配的计算信息。

标签:name,性能,torch,Profiler,state,dict,model,profiler,评估
From: https://blog.csdn.net/qq_41878154/article/details/142058164

相关文章

  • C++ 多线程代码性能分析——Oracle Developer Studio工具教程
        最近写项目的时候,为了提升性能,把原来一些单线程的代码改成了并行运行。这里我用到的用于评估性能提升效果的工具是OracleDeveloperStudio,不过刚上手时,发现网上相关的教程和博客较少,有些功能的使用也是摸索着过来的,这一过程可谓是十分痛苦了……如今距离初次接触......
  • Java 同步锁性能分析
    同步锁在多线程编程中是保证线程安全的重要工具,其性能开销一直是不可忽视的存在。(一)性能验证说明为了直观说明我们可以直接先准备两个Java代码用例,我们通过高并发环境下的计数器递增操作来对比使用同步锁和不使用同步锁的性能差异。1.使用同步锁的代码示例使用ReentrantLock来保护......
  • JAVA开源项目 学生心理咨询评估系统 计算机毕业设计
    本文项目编号T017,文末自助获取源码\color{red}{T017,文末自助获取源码}......
  • Java中的集合框架深度解析:从ArrayList到ConcurrentHashMap的性能考量
    Java中的集合框架深度解析:从ArrayList到ConcurrentHashMap的性能考量大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的集合框架为开发者提供了多种数据结构,每种数据结构都有其特定的使用场景和性能特征。本文将深度解析Java中的主要集合类,从Array......
  • 如何使用useMemo来优化React组件的性能?
    useMemo是React提供的一个Hook,它可以用来记忆复杂计算的结果,避免在每次渲染时都进行重复计算,从而优化组件的性能。以下是如何正确使用useMemo来优化React组件性能的一些步骤:确定计算是否昂贵:仅当计算是昂贵的(即消耗大量CPU时间)时,才考虑使用useMemo。对于简单......
  • FZU软件工程课程学习过程中的自我评估以及软件工程学习指南
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标初步了解博客园和github的使用,体会AIGC在辅助完成任务上的效率和便捷,理解程序与程序员在AI时代的关系......
  • 自我评估随笔
    1.自我评估(1)专业知识能力具体描述编程语言基础掌握基本的的编程语言,如c语言、python等,能够较简洁明了的根据需求写出代码,同时刷完了pta乙级的全部题目,对编程语言的掌握相对熟练算法能力自学数据结构与算法,同时也会在csdn等平台进行交流学习,向编程大佬学习一些巧妙......
  • 强化学习指南:训练过程与评估过程的区别
    强化学习指南:训练过程与评估过程的区别在强化学习(RL)中,训练和评估是两个截然不同但密切相关的过程。本指南将详细解释这两个过程的区别,以及如何正确实施它们。1.训练过程训练是RL中最核心的部分,它是智能体学习策略的过程。1.1训练的目的训练的目的是让智能体通过与环......
  • 春日新生:学生心理咨询评估系统
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......
  • 5G时代下的移动应用性能优化与安全挑战
    随着第五代移动通信技术(5G)的商用部署,移动应用迎来了前所未有的发展机遇,同时也面临着性能优化与安全挑战的双重考验。5G技术以其高带宽、低延迟和大连接数的特点,为移动应用提供了更强大的网络支撑,但同时也对应用的性能表现和安全防护提出了更高的要求。本文将结合实际案例,深入......