性能评估工具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分配的计算信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值