性能评估工具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