diff --git a/docs/debug.rst b/docs/debug.rst index d33568ea3b..25d29848e3 100644 --- a/docs/debug.rst +++ b/docs/debug.rst @@ -11,4 +11,5 @@ Precision debug tools debug/1_getting_started.rst debug/2_config_file_structure.rst debug/api - debug/4_distributed.rst \ No newline at end of file + debug/4_distributed.rst + debug/5_custom_feature_tutorial.ipynb \ No newline at end of file diff --git a/docs/debug/5_custom_feature_tutorial.ipynb b/docs/debug/5_custom_feature_tutorial.ipynb new file mode 100644 index 0000000000..0e658f7b99 --- /dev/null +++ b/docs/debug/5_custom_feature_tutorial.ipynb @@ -0,0 +1,632 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "85a94734", + "metadata": {}, + "source": [ + "# Adding custom feature to precision debug tools\n", + " \n", + "TE comes with several built-in features, such as `LogFp8TensorStats`, which can log statistics for each tensor involved in matrix multiplication (GEMM) operations.\n", + "In this tutorial, we'll demonstrate how to extend TE by adding a custom feature that logs the percentage of elements in a tensor whose absolute values exceed a configurable threshold `t`, as specified in the config file.\n", + "\n", + "Custom features can be used for example for:\n", + "\n", + "1. Logging custom statistics.\n", + "2. Dumping intermediate tensors.\n", + "3. Experiments with modifying intermediate tensors.\n", + "\n", + "How to add custom feature:\n", + "\n", + "1. Add Python with feature class definition which inherits from `transformer_engine.debug.features.api.TEConfigAPIMapper`.\n", + "2. Wrap the class with `@Registry.register_feature(namespace=\"transformer_engine\")`.\n", + "3. Implement some of API calls to nvidia-dl-framework-inspect described [here](../3_api_te_calls.rst).\n", + "\n", + "Let's define a new file at `.../custom_feature_dir/percentage_greater_than_threshold.py` containing the following code:\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b4e7562d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
# Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n",
+       "#\n",
+       "# See LICENSE for license information.\n",
+       "\n",
+       """"PercentageGreaterThanThreshold Feature support for nvidia-dlframework-inspect"""\n",
+       "\n",
+       "from typing import Dict, Optional\n",
+       "\n",
+       "import torch\n",
+       "\n",
+       "from nvdlfw_inspect.registry import Registry, api_method\n",
+       "from nvdlfw_inspect.logging import MetricLogger\n",
+       "import nvdlfw_inspect.api as debug_api\n",
+       "\n",
+       "from transformer_engine.debug.features.api import TEConfigAPIMapper\n",
+       "from transformer_engine.pytorch.tensor import QuantizedTensor, Quantizer\n",
+       "\n",
+       "\n",
+       "# Class should inherit from TEConfigAPIMapper and be registered to the transformer_engine namespace.\n",
+       "@Registry.register_feature(namespace="transformer_engine")\n",
+       "class PercentageGreaterThanThreshold(TEConfigAPIMapper):\n",
+       "\n",
+       "    @api_method\n",
+       "    def inspect_tensor(\n",
+       "        self,\n",
+       "        config: Dict,\n",
+       "        layer_name: str,\n",
+       "        tensor_name: str,\n",
+       "        iteration: int,\n",
+       "        tp_group: torch.distributed.ProcessGroup,\n",
+       "        tensor: torch.Tensor,\n",
+       "        rowwise_quantized_tensor: Optional[torch.Tensor | QuantizedTensor] = None,\n",
+       "        columnwise_quantized_tensor: Optional[torch.Tensor | QuantizedTensor] = None,\n",
+       "        quantizer: Optional[Quantizer] = None,\n",
+       "    ):\n",
+       "        # API call inspect_tensor is used to gather the data about the tensor.\n",
+       "        # All API calls are documented in the `Precision debug tools / API / Calls to Nvidia-DL-Framework-Inspect`\n",
+       "        # section of the documentation.\n",
+       "\n",
+       "        threshold = config["threshold"]\n",
+       "\n",
+       "        # Get the reduction group from the debug tool\n",
+       "        # one can set it using debug_api.set_tensor_reduction_group(group)\n",
+       "        reduction_group = debug_api.get_tensor_reduction_group()\n",
+       "\n",
+       "        # Compute percentage on local tensor\n",
+       "        count = (tensor > threshold).sum().float()\n",
+       "        total = torch.tensor(tensor.numel(), dtype=torch.float32, device=tensor.device)\n",
+       "\n",
+       "        # Perform reduction across the group if needed.\n",
+       "        # Note that we perform all_reduce twice per every tensor, which is suboptimal.\n",
+       "        # For guidance on implementing efficient statistics reduction, see the implementation in the `LogTensorStats` feature.\n",
+       "        # In this tutorial we only showcase basic implementation of the feature.\n",
+       "        if reduction_group is not None:\n",
+       "            torch.distributed.all_reduce(count, group=reduction_group)\n",
+       "            torch.distributed.all_reduce(total, group=reduction_group)\n",
+       "\n",
+       "        percentage = count / total\n",
+       "\n",
+       "        # MetricLogger is a class from nvidia-dlframework-inspect.\n",
+       "        # By using it we can also use functionalities provided by nvidia-dlframework-inspect,\n",
+       "        # like logging to TensorBoard, etc.\n",
+       "        MetricLogger.log_scalar(\n",
+       "            f"{layer_name}_{tensor_name}_percentage_greater_than_threshold", percentage, iteration\n",
+       "        )\n",
+       "\n",
+       "    @api_method\n",
+       "    def inspect_tensor_enabled(\n",
+       "        self, config: Dict, layer_name: str, tensor_name: str, iteration: int\n",
+       "    ):\n",
+       "        # This call is used by TE to determine if the unfused debug layer - which is slower - needs to be run.\n",
+       "        # It returns a tuple (bool, int), where the int indicates the next iteration when the feature will be enabled\n",
+       "        # and bool indicates if the feature should be enabled at the current iteration.\n",
+       "\n",
+       "        run_current = iteration % config["freq"] == 0\n",
+       "        # run in next multiple of freq\n",
+       "        next_iter = iteration + (config["freq"] - iteration % config["freq"])\n",
+       "        return run_current, next_iter\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\\PY{c+c1}{\\PYZsh{} Copyright (c) 2022\\PYZhy{}2025, NVIDIA CORPORATION \\PYZam{} AFFILIATES. All rights reserved.}\n", + "\\PY{c+c1}{\\PYZsh{}}\n", + "\\PY{c+c1}{\\PYZsh{} See LICENSE for license information.}\n", + "\n", + "\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}PercentageGreaterThanThreshold Feature support for nvidia\\PYZhy{}dlframework\\PYZhy{}inspect\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n", + "\n", + "\\PY{k+kn}{from}\\PY{+w}{ }\\PY{n+nn}{typing}\\PY{+w}{ }\\PY{k+kn}{import} \\PY{n}{Dict}\\PY{p}{,} \\PY{n}{Optional}\n", + "\n", + "\\PY{k+kn}{import}\\PY{+w}{ }\\PY{n+nn}{torch}\n", + "\n", + "\\PY{k+kn}{from}\\PY{+w}{ }\\PY{n+nn}{nvdlfw\\PYZus{}inspect}\\PY{n+nn}{.}\\PY{n+nn}{registry}\\PY{+w}{ }\\PY{k+kn}{import} \\PY{n}{Registry}\\PY{p}{,} \\PY{n}{api\\PYZus{}method}\n", + "\\PY{k+kn}{from}\\PY{+w}{ }\\PY{n+nn}{nvdlfw\\PYZus{}inspect}\\PY{n+nn}{.}\\PY{n+nn}{logging}\\PY{+w}{ }\\PY{k+kn}{import} \\PY{n}{MetricLogger}\n", + "\\PY{k+kn}{import}\\PY{+w}{ }\\PY{n+nn}{nvdlfw\\PYZus{}inspect}\\PY{n+nn}{.}\\PY{n+nn}{api}\\PY{+w}{ }\\PY{k}{as}\\PY{+w}{ }\\PY{n+nn}{debug\\PYZus{}api}\n", + "\n", + "\\PY{k+kn}{from}\\PY{+w}{ }\\PY{n+nn}{transformer\\PYZus{}engine}\\PY{n+nn}{.}\\PY{n+nn}{debug}\\PY{n+nn}{.}\\PY{n+nn}{features}\\PY{n+nn}{.}\\PY{n+nn}{api}\\PY{+w}{ }\\PY{k+kn}{import} \\PY{n}{TEConfigAPIMapper}\n", + "\\PY{k+kn}{from}\\PY{+w}{ }\\PY{n+nn}{transformer\\PYZus{}engine}\\PY{n+nn}{.}\\PY{n+nn}{pytorch}\\PY{n+nn}{.}\\PY{n+nn}{tensor}\\PY{+w}{ }\\PY{k+kn}{import} \\PY{n}{QuantizedTensor}\\PY{p}{,} \\PY{n}{Quantizer}\n", + "\n", + "\n", + "\\PY{c+c1}{\\PYZsh{} Class should inherit from TEConfigAPIMapper and be registered to the transformer\\PYZus{}engine namespace.}\n", + "\\PY{n+nd}{@Registry}\\PY{o}{.}\\PY{n}{register\\PYZus{}feature}\\PY{p}{(}\\PY{n}{namespace}\\PY{o}{=}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{transformer\\PYZus{}engine}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{)}\n", + "\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{PercentageGreaterThanThreshold}\\PY{p}{(}\\PY{n}{TEConfigAPIMapper}\\PY{p}{)}\\PY{p}{:}\n", + "\n", + " \\PY{n+nd}{@api\\PYZus{}method}\n", + " \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{inspect\\PYZus{}tensor}\\PY{p}{(}\n", + " \\PY{n+nb+bp}{self}\\PY{p}{,}\n", + " \\PY{n}{config}\\PY{p}{:} \\PY{n}{Dict}\\PY{p}{,}\n", + " \\PY{n}{layer\\PYZus{}name}\\PY{p}{:} \\PY{n+nb}{str}\\PY{p}{,}\n", + " \\PY{n}{tensor\\PYZus{}name}\\PY{p}{:} \\PY{n+nb}{str}\\PY{p}{,}\n", + " \\PY{n}{iteration}\\PY{p}{:} \\PY{n+nb}{int}\\PY{p}{,}\n", + " \\PY{n}{tp\\PYZus{}group}\\PY{p}{:} \\PY{n}{torch}\\PY{o}{.}\\PY{n}{distributed}\\PY{o}{.}\\PY{n}{ProcessGroup}\\PY{p}{,}\n", + " \\PY{n}{tensor}\\PY{p}{:} \\PY{n}{torch}\\PY{o}{.}\\PY{n}{Tensor}\\PY{p}{,}\n", + " \\PY{n}{rowwise\\PYZus{}quantized\\PYZus{}tensor}\\PY{p}{:} \\PY{n}{Optional}\\PY{p}{[}\\PY{n}{torch}\\PY{o}{.}\\PY{n}{Tensor} \\PY{o}{|} \\PY{n}{QuantizedTensor}\\PY{p}{]} \\PY{o}{=} \\PY{k+kc}{None}\\PY{p}{,}\n", + " \\PY{n}{columnwise\\PYZus{}quantized\\PYZus{}tensor}\\PY{p}{:} \\PY{n}{Optional}\\PY{p}{[}\\PY{n}{torch}\\PY{o}{.}\\PY{n}{Tensor} \\PY{o}{|} \\PY{n}{QuantizedTensor}\\PY{p}{]} \\PY{o}{=} \\PY{k+kc}{None}\\PY{p}{,}\n", + " \\PY{n}{quantizer}\\PY{p}{:} \\PY{n}{Optional}\\PY{p}{[}\\PY{n}{Quantizer}\\PY{p}{]} \\PY{o}{=} \\PY{k+kc}{None}\\PY{p}{,}\n", + " \\PY{p}{)}\\PY{p}{:}\n", + " \\PY{c+c1}{\\PYZsh{} API call inspect\\PYZus{}tensor is used to gather the data about the tensor.}\n", + " \\PY{c+c1}{\\PYZsh{} All API calls are documented in the `Precision debug tools / API / Calls to Nvidia\\PYZhy{}DL\\PYZhy{}Framework\\PYZhy{}Inspect`}\n", + " \\PY{c+c1}{\\PYZsh{} section of the documentation.}\n", + "\n", + " \\PY{n}{threshold} \\PY{o}{=} \\PY{n}{config}\\PY{p}{[}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{threshold}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{]}\n", + "\n", + " \\PY{c+c1}{\\PYZsh{} Get the reduction group from the debug tool}\n", + " \\PY{c+c1}{\\PYZsh{} one can set it using debug\\PYZus{}api.set\\PYZus{}tensor\\PYZus{}reduction\\PYZus{}group(group)}\n", + " \\PY{n}{reduction\\PYZus{}group} \\PY{o}{=} \\PY{n}{debug\\PYZus{}api}\\PY{o}{.}\\PY{n}{get\\PYZus{}tensor\\PYZus{}reduction\\PYZus{}group}\\PY{p}{(}\\PY{p}{)}\n", + "\n", + " \\PY{c+c1}{\\PYZsh{} Compute percentage on local tensor}\n", + " \\PY{n}{count} \\PY{o}{=} \\PY{p}{(}\\PY{n}{tensor} \\PY{o}{\\PYZgt{}} \\PY{n}{threshold}\\PY{p}{)}\\PY{o}{.}\\PY{n}{sum}\\PY{p}{(}\\PY{p}{)}\\PY{o}{.}\\PY{n}{float}\\PY{p}{(}\\PY{p}{)}\n", + " \\PY{n}{total} \\PY{o}{=} \\PY{n}{torch}\\PY{o}{.}\\PY{n}{tensor}\\PY{p}{(}\\PY{n}{tensor}\\PY{o}{.}\\PY{n}{numel}\\PY{p}{(}\\PY{p}{)}\\PY{p}{,} \\PY{n}{dtype}\\PY{o}{=}\\PY{n}{torch}\\PY{o}{.}\\PY{n}{float32}\\PY{p}{,} \\PY{n}{device}\\PY{o}{=}\\PY{n}{tensor}\\PY{o}{.}\\PY{n}{device}\\PY{p}{)}\n", + "\n", + " \\PY{c+c1}{\\PYZsh{} Perform reduction across the group if needed.}\n", + " \\PY{c+c1}{\\PYZsh{} Note that we perform all\\PYZus{}reduce twice per every tensor, which is suboptimal.}\n", + " \\PY{c+c1}{\\PYZsh{} For guidance on implementing efficient statistics reduction, see the implementation in the `LogTensorStats` feature.}\n", + " \\PY{c+c1}{\\PYZsh{} In this tutorial we only showcase basic implementation of the feature.}\n", + " \\PY{k}{if} \\PY{n}{reduction\\PYZus{}group} \\PY{o+ow}{is} \\PY{o+ow}{not} \\PY{k+kc}{None}\\PY{p}{:}\n", + " \\PY{n}{torch}\\PY{o}{.}\\PY{n}{distributed}\\PY{o}{.}\\PY{n}{all\\PYZus{}reduce}\\PY{p}{(}\\PY{n}{count}\\PY{p}{,} \\PY{n}{group}\\PY{o}{=}\\PY{n}{reduction\\PYZus{}group}\\PY{p}{)}\n", + " \\PY{n}{torch}\\PY{o}{.}\\PY{n}{distributed}\\PY{o}{.}\\PY{n}{all\\PYZus{}reduce}\\PY{p}{(}\\PY{n}{total}\\PY{p}{,} \\PY{n}{group}\\PY{o}{=}\\PY{n}{reduction\\PYZus{}group}\\PY{p}{)}\n", + "\n", + " \\PY{n}{percentage} \\PY{o}{=} \\PY{n}{count} \\PY{o}{/} \\PY{n}{total}\n", + "\n", + " \\PY{c+c1}{\\PYZsh{} MetricLogger is a class from nvidia\\PYZhy{}dlframework\\PYZhy{}inspect.}\n", + " \\PY{c+c1}{\\PYZsh{} By using it we can also use functionalities provided by nvidia\\PYZhy{}dlframework\\PYZhy{}inspect,}\n", + " \\PY{c+c1}{\\PYZsh{} like logging to TensorBoard, etc.}\n", + " \\PY{n}{MetricLogger}\\PY{o}{.}\\PY{n}{log\\PYZus{}scalar}\\PY{p}{(}\n", + " \\PY{l+s+sa}{f}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+si}{\\PYZob{}}\\PY{n}{layer\\PYZus{}name}\\PY{l+s+si}{\\PYZcb{}}\\PY{l+s+s2}{\\PYZus{}}\\PY{l+s+si}{\\PYZob{}}\\PY{n}{tensor\\PYZus{}name}\\PY{l+s+si}{\\PYZcb{}}\\PY{l+s+s2}{\\PYZus{}percentage\\PYZus{}greater\\PYZus{}than\\PYZus{}threshold}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{,} \\PY{n}{percentage}\\PY{p}{,} \\PY{n}{iteration}\n", + " \\PY{p}{)}\n", + "\n", + " \\PY{n+nd}{@api\\PYZus{}method}\n", + " \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{inspect\\PYZus{}tensor\\PYZus{}enabled}\\PY{p}{(}\n", + " \\PY{n+nb+bp}{self}\\PY{p}{,} \\PY{n}{config}\\PY{p}{:} \\PY{n}{Dict}\\PY{p}{,} \\PY{n}{layer\\PYZus{}name}\\PY{p}{:} \\PY{n+nb}{str}\\PY{p}{,} \\PY{n}{tensor\\PYZus{}name}\\PY{p}{:} \\PY{n+nb}{str}\\PY{p}{,} \\PY{n}{iteration}\\PY{p}{:} \\PY{n+nb}{int}\n", + " \\PY{p}{)}\\PY{p}{:}\n", + " \\PY{c+c1}{\\PYZsh{} This call is used by TE to determine if the unfused debug layer \\PYZhy{} which is slower \\PYZhy{} needs to be run.}\n", + " \\PY{c+c1}{\\PYZsh{} It returns a tuple (bool, int), where the int indicates the next iteration when the feature will be enabled}\n", + " \\PY{c+c1}{\\PYZsh{} and bool indicates if the feature should be enabled at the current iteration.}\n", + "\n", + " \\PY{n}{run\\PYZus{}current} \\PY{o}{=} \\PY{n}{iteration} \\PY{o}{\\PYZpc{}} \\PY{n}{config}\\PY{p}{[}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{freq}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{]} \\PY{o}{==} \\PY{l+m+mi}{0}\n", + " \\PY{c+c1}{\\PYZsh{} run in next multiple of freq}\n", + " \\PY{n}{next\\PYZus{}iter} \\PY{o}{=} \\PY{n}{iteration} \\PY{o}{+} \\PY{p}{(}\\PY{n}{config}\\PY{p}{[}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{freq}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{]} \\PY{o}{\\PYZhy{}} \\PY{n}{iteration} \\PY{o}{\\PYZpc{}} \\PY{n}{config}\\PY{p}{[}\\PY{l+s+s2}{\\PYZdq{}}\\PY{l+s+s2}{freq}\\PY{l+s+s2}{\\PYZdq{}}\\PY{p}{]}\\PY{p}{)}\n", + " \\PY{k}{return} \\PY{n}{run\\PYZus{}current}\\PY{p}{,} \\PY{n}{next\\PYZus{}iter}\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "# Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n", + "#\n", + "# See LICENSE for license information.\n", + "\n", + "\"\"\"PercentageGreaterThanThreshold Feature support for nvidia-dlframework-inspect\"\"\"\n", + "\n", + "from typing import Dict, Optional\n", + "\n", + "import torch\n", + "\n", + "from nvdlfw_inspect.registry import Registry, api_method\n", + "from nvdlfw_inspect.logging import MetricLogger\n", + "import nvdlfw_inspect.api as debug_api\n", + "\n", + "from transformer_engine.debug.features.api import TEConfigAPIMapper\n", + "from transformer_engine.pytorch.tensor import QuantizedTensor, Quantizer\n", + "\n", + "\n", + "# Class should inherit from TEConfigAPIMapper and be registered to the transformer_engine namespace.\n", + "@Registry.register_feature(namespace=\"transformer_engine\")\n", + "class PercentageGreaterThanThreshold(TEConfigAPIMapper):\n", + "\n", + " @api_method\n", + " def inspect_tensor(\n", + " self,\n", + " config: Dict,\n", + " layer_name: str,\n", + " tensor_name: str,\n", + " iteration: int,\n", + " tp_group: torch.distributed.ProcessGroup,\n", + " tensor: torch.Tensor,\n", + " rowwise_quantized_tensor: Optional[torch.Tensor | QuantizedTensor] = None,\n", + " columnwise_quantized_tensor: Optional[torch.Tensor | QuantizedTensor] = None,\n", + " quantizer: Optional[Quantizer] = None,\n", + " ):\n", + " # API call inspect_tensor is used to gather the data about the tensor.\n", + " # All API calls are documented in the `Precision debug tools / API / Calls to Nvidia-DL-Framework-Inspect`\n", + " # section of the documentation.\n", + "\n", + " threshold = config[\"threshold\"]\n", + "\n", + " # Get the reduction group from the debug tool\n", + " # one can set it using debug_api.set_tensor_reduction_group(group)\n", + " reduction_group = debug_api.get_tensor_reduction_group()\n", + "\n", + " # Compute percentage on local tensor\n", + " count = (tensor > threshold).sum().float()\n", + " total = torch.tensor(tensor.numel(), dtype=torch.float32, device=tensor.device)\n", + "\n", + " # Perform reduction across the group if needed.\n", + " # Note that we perform all_reduce twice per every tensor, which is suboptimal.\n", + " # For guidance on implementing efficient statistics reduction, see the implementation in the `LogTensorStats` feature.\n", + " # In this tutorial we only showcase basic implementation of the feature.\n", + " if reduction_group is not None:\n", + " torch.distributed.all_reduce(count, group=reduction_group)\n", + " torch.distributed.all_reduce(total, group=reduction_group)\n", + "\n", + " percentage = count / total\n", + "\n", + " # MetricLogger is a class from nvidia-dlframework-inspect.\n", + " # By using it we can also use functionalities provided by nvidia-dlframework-inspect,\n", + " # like logging to TensorBoard, etc.\n", + " MetricLogger.log_scalar(\n", + " f\"{layer_name}_{tensor_name}_percentage_greater_than_threshold\", percentage, iteration\n", + " )\n", + "\n", + " @api_method\n", + " def inspect_tensor_enabled(\n", + " self, config: Dict, layer_name: str, tensor_name: str, iteration: int\n", + " ):\n", + " # This call is used by TE to determine if the unfused debug layer - which is slower - needs to be run.\n", + " # It returns a tuple (bool, int), where the int indicates the next iteration when the feature will be enabled\n", + " # and bool indicates if the feature should be enabled at the current iteration.\n", + "\n", + " run_current = iteration % config[\"freq\"] == 0\n", + " # run in next multiple of freq\n", + " next_iter = iteration + (config[\"freq\"] - iteration % config[\"freq\"])\n", + " return run_current, next_iter" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Code\n", + "Code(filename='./custom_feature_dir/percentage_greater_than_threshold.py', language='python')" + ] + }, + { + "cell_type": "markdown", + "id": "1fd2c750-a859-49ab-bcdd-6e7bd0d7efbb", + "metadata": {}, + "source": [ + "Let's prepare simple config file `custom_feature_example_config.yaml` and training script." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "279c93c0-6d7e-4c02-a00f-e5b40496b5fd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
stats:\n",
+       "  enabled: True\n",
+       "  layers:\n",
+       "    layer_name_regex_pattern: .*\n",
+       "  transformer_engine:\n",
+       "    PercentageGreaterThanThreshold:\n",
+       "      enabled: True\n",
+       "      tensors: [activation]\n",
+       "      threshold: 0.1\n",
+       "      freq: 5\n",
+       "    LogTensorStats:\n",
+       "      enabled: True\n",
+       "      tensors: [activation]\n",
+       "      stats: [min]\n",
+       "      freq: 5\n",
+       "
\n" + ], + "text/latex": [ + "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n", + "\\PY{n}{stats}\\PY{p}{:}\n", + " \\PY{n}{enabled}\\PY{p}{:} \\PY{k+kc}{True}\n", + " \\PY{n}{layers}\\PY{p}{:}\n", + " \\PY{n}{layer\\PYZus{}name\\PYZus{}regex\\PYZus{}pattern}\\PY{p}{:} \\PY{o}{.}\\PY{o}{*}\n", + " \\PY{n}{transformer\\PYZus{}engine}\\PY{p}{:}\n", + " \\PY{n}{PercentageGreaterThanThreshold}\\PY{p}{:}\n", + " \\PY{n}{enabled}\\PY{p}{:} \\PY{k+kc}{True}\n", + " \\PY{n}{tensors}\\PY{p}{:} \\PY{p}{[}\\PY{n}{activation}\\PY{p}{]}\n", + " \\PY{n}{threshold}\\PY{p}{:} \\PY{l+m+mf}{0.1}\n", + " \\PY{n}{freq}\\PY{p}{:} \\PY{l+m+mi}{5}\n", + " \\PY{n}{LogTensorStats}\\PY{p}{:}\n", + " \\PY{n}{enabled}\\PY{p}{:} \\PY{k+kc}{True}\n", + " \\PY{n}{tensors}\\PY{p}{:} \\PY{p}{[}\\PY{n}{activation}\\PY{p}{]}\n", + " \\PY{n}{stats}\\PY{p}{:} \\PY{p}{[}\\PY{n+nb}{min}\\PY{p}{]}\n", + " \\PY{n}{freq}\\PY{p}{:} \\PY{l+m+mi}{5}\n", + "\\end{Verbatim}\n" + ], + "text/plain": [ + "stats:\n", + " enabled: True\n", + " layers:\n", + " layer_name_regex_pattern: .*\n", + " transformer_engine:\n", + " PercentageGreaterThanThreshold:\n", + " enabled: True\n", + " tensors: [activation]\n", + " threshold: 0.1\n", + " freq: 5\n", + " LogTensorStats:\n", + " enabled: True\n", + " tensors: [activation]\n", + " stats: [min]\n", + " freq: 5" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Code\n", + "Code(filename='./custom_feature_dir/custom_feature_example_config.yaml', language='python')" + ] + }, + { + "cell_type": "markdown", + "id": "3929f293-7ac1-48b0-8a4d-23bb6976aa0b", + "metadata": {}, + "source": [ + "To use this feature one needs to add `.../custom_feature_dir` to `debug_api.initialize(feature_dirs=...`." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "d82f1c82", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "NVDLFW INSPECT - 2025-10-17 14:16:42,204 - WARNING - Reduction group initialized for tensor reduction before logging statistics. If per-rank statistics are required, pass `skip_reduction=True` when invoking the API. To pass another reduction group, use `reduction_group` kwarg when invoking the API.\n" + ] + } + ], + "source": [ + "import os, time\n", + "import torch\n", + "import transformer_engine.pytorch as te\n", + "import nvdlfw_inspect.api as debug_api\n", + "\n", + "te_dir = os.environ[\"TE_PATH\"] # setup TE dir as environment variable to run this script\n", + "log_dir = os.environ.get(\"LOG_PATH\", \"./log\")\n", + "\n", + "debug_api.initialize(\n", + " config_file=te_dir + \"/docs/debug/custom_feature_dir/custom_feature_example_config.yaml\",\n", + " feature_dirs=[\n", + " te_dir + \"/transformer_engine/debug/features\", \n", + " te_dir + \"/docs/debug/custom_feature_dir\" # One needs to add path to the custom feature dir here\n", + " ],\n", + " log_dir=log_dir,\n", + " default_logging_enabled=True)\n", + "\n", + "debug_api.set_tensor_reduction_group(None) # For distributed training one needs to set the reduction group\n", + "\n", + "module = te.Linear(128, 128, name=\"linear_1\")\n", + "inp = torch.randn(128, 128).cuda()\n", + "\n", + "# Simple training loop with measuring the time\n", + "times = []\n", + "for _ in range(100):\n", + " time_start = time.time()\n", + " inp.normal_()\n", + " out = module(inp)\n", + " out.sum().backward()\n", + " torch.cuda.synchronize()\n", + " time_end = time.time()\n", + " times.append(time_end - time_start)\n", + "\n", + " debug_api.step()" + ] + }, + { + "cell_type": "markdown", + "id": "e4f129a9", + "metadata": {}, + "source": [ + "Now, let's plot the gathered stats." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b68a21ea", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Fq+88kqd10EqwAghRA+2bt3KALDLly+zDRs2MFtbW5afn88YY+yZZ55hAwYMYIwx5u3tzUaOHKlzXQBs5cqVwn+vXLmSAWBz5szRudz48eOZk5NTpetQq9XM09OTTZw4Uef03bt3MwDsn3/+EU7j11faggULmJWVFSssLBROmzlzJvP29hb+++TJkwwAO3nypM51o6OjGQC2detW4bRBgwax4OBgndtTq9UsJCSEtWzZUjitffv2ZZ4XQggh9Q//fnjs2DGWkpLC4uLi2M6dO5mTkxOztLRk8fHxLCYmhonFYvbhhx/qXPfWrVtMIpHonN6vXz8GgG3evFnnst9//z0DwD777LMya1Cr1Ywxxv79918GgP3000865x86dKjM6d7e3mXeJxUKBZPJZOy1114TTvv111/LfQ9krHrvq0VFRczJyYl17dqVKZVK4XLbtm1jAFi/fv2E03bs2MFEIhH7999/dW5z8+bNDAA7e/Zsmfvj1eR++Pd1X19fncegVqtZy5YtWWhoqPCc8o+zRYsWbMiQIZU+9vPnzzMA7IcffhBOq+j5y8nJYQ4ODmz+/Pk6pyclJTF7e3ud02fOnMkAsOXLl1f4+Ev75JNPGAAWHR1d5jwATCqVssjISOG0GzduMABs/fr1NX58/O//4MGDdZ6zJUuWMLFYzDIzMytd60svvcTK+4jKH2M5OTmx9PR04fTff/+dAWAHDx4UTqvo+anu38P+/fuFY9qK1GQ9HTp0YK6uriwtLU047caNG0wkErEZM2YIp/HPHf9zUigUTCqVspEjR+o8l//9738ZADZz5swK18fYk597bGxsmfO6du3KevToUen1S0tJSSlzvF6VqVOnMldXV1ZSUiKclpiYyEQiEXvvvfeE08r73frll1/KvB49/fwwVvYzBM/b21vn+Xn//feZtbU1u3//vs7lli9fzsRisfAcvfLKK8zOzk5nzcTwaHyPEKJ3kydPRkFBAf744w/k5OTgjz/+qHB0rzIvvPCCzn/36dMHaWlpQjt9eTiOwzPPPIO//voLubm5wum7du2Cp6cnevfuLZxmaWkp/P+cnBykpqaiT58+yM/PR3h4eI3X+7T09HScOHECkydPFm4/NTUVaWlpCA0NxYMHD5CQkAAAcHBwwJ07d/DgwYM63y8hhBDTGzx4MFxcXODl5YUpU6bAxsYG+/fv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7733nrxu3To5Ly9P7ujokGU5sZ97WQ5tuSgvL5f/6Z/+6ZyfJdrz7na75U8++UT+5JNPZADyY489Jn/yySfqRpQf/ehHcnZ2tvw///M/8sGDB+Xrr79enjt3rjw8PKzexpVXXik/+eST6p+ne+3Qi6keu9frla+77jq5tLRU3r9//7jXAY/Ho97G2Y99un87ejLV43e73fK3vvUteffu3fLp06flt956S77gggvk+fPnyyMjI+ptJOJzL/T398upqanyz3/+8wlvw8jPPcUXz6eS83wq2c+lZDl5zqeS+VxKlpP7fCqZz6VkmedTscCi1ASefPJJuby8XLbZbPKqVavkDz74QP3Z5ZdfLt9+++3jLv+b3/xGXrBggWyz2eTzzjtP/vOf/xznI44OABN+/fKXv1Qvc/bj/+Y3v6n+XRUWFsrXXHONvG/fvvgffBTcfPPNclFRkWyz2eSSkhL55ptvlk+cOKH+PJGfe1mW5ddff10GINfV1Z3zs0R73nfu3Dnh/+viMQaDQfk73/mOXFhYKNvtdvmqq6465++loqJCfvjhh8d9b6rXDr2Y6rGfPn160teBnTt3qrdx9mOf7t+Onkz1+IeGhuSrr75azs/Pl61Wq1xRUSHfdddd55wQJeJzL/ziF7+QU1JS5L6+vglvw8jPPcUfz6eS73wq2c+lZDl5zqeS+VxKlpP7fCqZz6VkmedTsSDJsizPtMuKiIiIiIiIiIhoJpgpRUREREREREREcceiFBERERERERERxR2LUkREREREREREFHcsShERERERERERUdyxKEVERERERERERHHHohQREREREREREcUdi1JERERERERERBR3LEoREREREREREVHcsShFRERERERERERxx6IUERERERERERHFHYtSREREREREREQUdyxKERERERERERFR3P1/wEbI1dCmQUcAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from custom_feature_dir.utils import plot_stats\n", + "\n", + "plot_stats(log_dir)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/debug/custom_feature_dir/custom_feature_example_config.yaml b/docs/debug/custom_feature_dir/custom_feature_example_config.yaml new file mode 100644 index 0000000000..ab0369866f --- /dev/null +++ b/docs/debug/custom_feature_dir/custom_feature_example_config.yaml @@ -0,0 +1,15 @@ +stats: + enabled: True + layers: + layer_name_regex_pattern: .* + transformer_engine: + PercentageGreaterThanThreshold: + enabled: True + tensors: [activation] + threshold: 0.1 + freq: 5 + LogTensorStats: + enabled: True + tensors: [activation] + stats: [min] + freq: 5 \ No newline at end of file diff --git a/docs/debug/custom_feature_dir/percentage_greater_than_threshold.py b/docs/debug/custom_feature_dir/percentage_greater_than_threshold.py new file mode 100644 index 0000000000..ff5524acf3 --- /dev/null +++ b/docs/debug/custom_feature_dir/percentage_greater_than_threshold.py @@ -0,0 +1,78 @@ +# Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# See LICENSE for license information. + +"""PercentageGreaterThanThreshold Feature support for nvidia-dlframework-inspect""" + +from typing import Dict, Optional + +import torch + +from nvdlfw_inspect.registry import Registry, api_method +from nvdlfw_inspect.logging import MetricLogger +import nvdlfw_inspect.api as debug_api + +from transformer_engine.debug.features.api import TEConfigAPIMapper +from transformer_engine.pytorch.tensor import QuantizedTensor, Quantizer + + +# Class should inherit from TEConfigAPIMapper and be registered to the transformer_engine namespace. +@Registry.register_feature(namespace="transformer_engine") +class PercentageGreaterThanThreshold(TEConfigAPIMapper): + + @api_method + def inspect_tensor( + self, + config: Dict, + layer_name: str, + tensor_name: str, + iteration: int, + tp_group: torch.distributed.ProcessGroup, + tensor: torch.Tensor, + rowwise_quantized_tensor: Optional[torch.Tensor | QuantizedTensor] = None, + columnwise_quantized_tensor: Optional[torch.Tensor | QuantizedTensor] = None, + quantizer: Optional[Quantizer] = None, + ): + # API call inspect_tensor is used to gather the data about the tensor. + # All API calls are documented in the `Precision debug tools / API / Calls to Nvidia-DL-Framework-Inspect` + # section of the documentation. + + threshold = config["threshold"] + + # Get the reduction group from the debug tool + # one can set it using debug_api.set_tensor_reduction_group(group) + reduction_group = debug_api.get_tensor_reduction_group() + + # Compute percentage on local tensor + count = (tensor > threshold).sum().float() + total = torch.tensor(tensor.numel(), dtype=torch.float32, device=tensor.device) + + # Perform reduction across the group if needed. + # Note that we perform all_reduce twice per every tensor, which is suboptimal. + # For guidance on implementing efficient statistics reduction, see the implementation in the `LogTensorStats` feature. + # In this tutorial we only showcase basic implementation of the feature. + if reduction_group is not None: + torch.distributed.all_reduce(count, group=reduction_group) + torch.distributed.all_reduce(total, group=reduction_group) + + percentage = count / total + + # MetricLogger is a class from nvidia-dlframework-inspect. + # By using it we can also use functionalities provided by nvidia-dlframework-inspect, + # like logging to TensorBoard, etc. + MetricLogger.log_scalar( + f"{layer_name}_{tensor_name}_percentage_greater_than_threshold", percentage, iteration + ) + + @api_method + def inspect_tensor_enabled( + self, config: Dict, layer_name: str, tensor_name: str, iteration: int + ): + # This call is used by TE to determine if the unfused debug layer - which is slower - needs to be run. + # It returns a tuple (bool, int), where the int indicates the next iteration when the feature will be enabled + # and bool indicates if the feature should be enabled at the current iteration. + + run_current = iteration % config["freq"] == 0 + # run in next multiple of freq + next_iter = iteration + (config["freq"] - iteration % config["freq"]) + return run_current, next_iter diff --git a/docs/debug/custom_feature_dir/utils.py b/docs/debug/custom_feature_dir/utils.py new file mode 100644 index 0000000000..a19a3beaab --- /dev/null +++ b/docs/debug/custom_feature_dir/utils.py @@ -0,0 +1,49 @@ +# Copyright (c) 2022-2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# See LICENSE for license information. + +"""Utils for plotting stats in the tutorial""" + + +import os +import matplotlib.pyplot as plt + + +def plot_stats(log_dir): + + # print and plot the stats + stat_file = os.path.join( + log_dir, "nvdlfw_inspect_statistics_logs", "nvdlfw_inspect_globalrank-0.log" + ) + + min_values = [] + custom_feature_values = [] + + with open(stat_file, "r") as f: + import re + + number_pattern = re.compile(r"[-+]?\d*\.\d+|\d+") + + for line in f: + if "min" in line: + matches = number_pattern.findall(line) + if matches: + min_values.append(float(matches[-1])) + if "percentage_greater_than_threshold" in line: + matches = number_pattern.findall(line) + if matches: + custom_feature_values.append(float(matches[-1])) + + # plot 2 figures side by side + fig, axs = plt.subplots(1, 2, figsize=(12, 5)) + + axs[0].plot(min_values, label="min") + axs[0].legend() + axs[0].set_title("Min values") + + axs[1].plot(custom_feature_values, label="percentage_greater_than_threshold_0.1") + axs[1].legend() + axs[1].set_title("Percentage greater than threshold 0.1 values") + + plt.tight_layout() + plt.show()