如何按目录过滤.pstats文件?Nerfacto性能分析求助
优化NerfStudio Nerfacto性能分析的方案
按目录过滤cProfile结果
1. 用pstats脚本预处理
写个简单的Python脚本加载原始profile文件,只保留你关注的项目目录下的函数:
import pstats # 替换为你的nerfstudio项目根目录 TARGET_DIR = "/path/to/your/nerfstudio" # 加载原始profile数据 stats = pstats.Stats("profile_data.profile") # 清理路径前缀,方便过滤 stats.strip_dirs() # 筛选出路径包含TARGET_DIR的函数 filtered_funcs = [func for func in stats.stats if TARGET_DIR in func[0]] stats.filter_stats(*filtered_funcs) # 保存过滤后的结果 stats.dump_stats("filtered_profile.profile")
之后用Snakeviz打开过滤后的文件:
py -m snakeviz filtered_profile.profile
2. Snakeviz界面直接过滤
Snakeviz顶部的搜索框支持模糊匹配,直接输入nerfstudio或nerfacto,就能只显示和目标模块相关的函数,不用提前处理文件。
更适合大型项目的性能分析工具
针对NerfStudio这类依赖PyTorch的大型训练项目,以下工具比cProfile更高效:
py-spy:采样式分析,开销极低,适合长时间训练任务。安装后直接启动分析:
# 启动训练时同时记录profile py-spy record -o profile.svg -- python -m ns-train nerfacto --data poster # 或者attach到已运行的训练进程(替换<PID>为进程号) py-spy record -o profile.svg -p <PID>生成的SVG可视化文件能清晰展示函数时间占比,默认不会追踪Python/PyTorch内置函数。
torch.profiler:PyTorch官方工具,专门针对张量运算、CUDA操作优化。可以在训练代码中插入profiler逻辑:
import torch.profiler # 在训练循环外初始化profiler with torch.profiler.profile( activities=[torch.profiler.ProfilerActivity.CPU, torch.profiler.ProfilerActivity.CUDA], schedule=torch.profiler.schedule(wait=1, warmup=1, active=3), on_trace_ready=torch.profiler.tensorboard_trace_handler("./profile_logs"), record_shapes=True, profile_memory=True ) as prof: for step in range(total_train_steps): # 你的训练步骤代码 train_step() # 标记profiler步骤 prof.step()之后用TensorBoard查看结果:
tensorboard --logdir ./profile_logs可以精准过滤
nerfacto模块的函数,还能分析CUDA内存和运算耗时。line_profiler:行级性能分析,适合定位具体函数内的瓶颈代码。给目标函数添加
@profile装饰器后,运行:kernprof -l -v your_train_script.py需要注意适配NerfStudio的入口脚本,可能需要修改
ns-train的启动逻辑来引入装饰器。
内容的提问来源于stack exchange,提问作者Youssef Haddouda
相关产品推荐
相关产品推荐

