Shortcuts

Source code for torchfunc.performance

r"""
**This package allows you to get info and tips about performance of your neural networks.**

Following functions should be considered as general recommendations.
For specific/customized tips, use specific submodules.

"""

import typing

import torch

import torchfunc

from . import layers, technology
from .layers import Depthwise, Inplace
from .technology import TensorCores


[docs]def report(module: torch.nn.Module) -> typing.Dict[str, typing.Any]: r"""**Run essential module's performance analysis with default settings.** Following tests will be performed: - Module being an instance of `torch.nn.ScriptModule` - Apex (mixed precision training) availability - Any inplace ops used - Analysis of compliance with `TensorCores` technology - Any depthwise convolution used Report returns data in machine-ready type; if you wish to have easy to follow guidelines use function `tips`. **Example**:: model = torch.nn.Sequential( torch.nn.Linear(784, 100), torch.nn.ReLU(), torch.nn.Linear(100, 50), torch.nn.ReLU(), torch.nn.Linear(50, 10), ) report = torchfunc.performance.report(model) Parameters ---------- module: torch.nn.Module Module to be tested against test suite. Returns ------- Dict[str, Any] Dictionary with keys: - torchscript: True if module is an instance of torch.jit.ScriptModule - apex: True if apex installed (recommended mixed precision training library from NVidia for PyTorch) - tensorcores: same as `torchscript.performance.technology.TensorCores` - inplace: same as `torchscript.performance.layers.Inplace` - depthwise: same as `torchscript.performance.layers.Depthwise` """ return { "torchscript": isinstance(module, torch.jit.ScriptModule), "apex": torchfunc.installed("apex"), "tensorcores": TensorCores().modules(module), "inplace": Inplace().modules(module), "depthwise": Depthwise().modules(module), }
# Text parsing is not the prettiest thing ever :(
[docs]def tips(module: torch.nn.Module, general: bool = True, specific: bool = True): r"""**Return string describing possible performance improvements one can undertake.** Internally report will be called and it's output parsed and described. It is the easiest way to get information about your module/network and to quickly check possible performance improvements you could use. **Example**:: model = torch.nn.Sequential( torch.nn.Linear(784, 100), torch.nn.ReLU(), torch.nn.Linear(100, 50), torch.nn.ReLU(), torch.nn.Linear(50, 10), ) print(torchfunc.performance.tips(model)) # Display found vulnerabilities Parameters ---------- module: torch.nn.Module Module to be tested against test suite. general: bool, optional Return general (not specific to your module) tips. Default: True specific: bool, optional Return specific tips for your module. Default: True Returns ------- str Human readable version of report, highlighting steps one can take to improve module's performance. """ def general_tips(): return ( "\n===========================GENERAL TIPS===========================\n" + "\n- Make sure you are running newest PyTorch version. " + "See available releases: https://github.com/pytorch/pytorch/tags\n" + "- Use GPU for larger batches, CPU might be suitable for smaller jobs.\n" + "- Use mixed-precision training on GPU, preferably automated, e.g. NVIDIA Apex: https://github.com/NVIDIA/apex.\n" ) def specific_tips(): def parse_string(text: str) -> str: if text != "": return "\n=======> " + text return text def torchscript(): if not isinstance(module, torch.jit.ScriptModule): return ( "Module should be an instance of torch.jit.ScriptModule.\n" + "See https://pytorch.org/docs/stable/jit.html for more information." ) return "" def apex(): if not torchfunc.installed("apex"): return ( "NVIDIA's Apex is not installed. It is the easiest way to use mixed precision training.\n" + "See https://github.com/NVIDIA/apex for more information and installation." ) return "" specific_tips = "" specific_tips += parse_string(torchscript()) specific_tips += parse_string(apex()) specific_tips += parse_string(Inplace().tips(module)) specific_tips += parse_string(Depthwise().tips(module)) specific_tips += parse_string(TensorCores().tips(module)) if specific_tips != "": specific_tips = ( "\n===========================SPECIFIC TIPS===========================\n" + specific_tips ) return specific_tips ########################################################################### # # MAIN LOGIC # ########################################################################### results = "" if general: results += general_tips() if specific: results += specific_tips() return results