{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"- Torch-tensorRT compilation does not work well for the 'tf' type of EfficientNet due to its dynamic padding function. To force it to be static, I editted the timm source and saved it in '/kaggle/input/timm-0-6-12-tf-effv2s-1520-912'. This is only for 1520x912 inputs. Other shape of images and training use are not recommended.\n- Once you got the compilation completed, the editted timm package does not need to be used in inference.","metadata":{}},{"cell_type":"code","source":"!pip install /kaggle/input/pytorch112-cu113/{torch-1.12.1+cu113-cp37-cp37m-linux_x86_64.whl,torchvision-0.13.1+cu113-cp37-cp37m-linux_x86_64.whl}\n!pip install /kaggle/input/torch-tensorrt-pkg/nvidia_pyindex-1.0.9-py3-none-any.whl\n!mkdir -p /tmp/pip/cache/\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia-cublas-cu11-2022.4.8.xyz /tmp/pip/cache/nvidia-cublas-cu11-2022.4.8.tar.gz\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia-cuda-runtime-cu11-2022.4.25.xyz /tmp/pip/cache/nvidia-cuda-runtime-cu11-2022.4.25.tar.gz\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia-cudnn-cu11-2022.5.19.xyz /tmp/pip/cache/nvidia-cudnn-cu11-2022.5.19.tar.gz\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia_cublas_cu117-11.10.1.25-py3-none-manylinux1_x86_64.whl /tmp/pip/cache/\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia_cuda_runtime_cu117-11.7.60-py3-none-manylinux1_x86_64.whl /tmp/pip/cache/\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia_cudnn_cu116-8.4.0.27-py3-none-manylinux1_x86_64.whl /tmp/pip/cache/\n!cp /kaggle/input/torch-tensorrt-pkg/nvidia_tensorrt-8.4.3.1-cp37-none-linux_x86_64.whl /tmp/pip/cache/\n!pip install --no-index --find-links /tmp/pip/cache/ nvidia_tensorrt\n#install torch_tensorrt\n!pip install /kaggle/input/torch-tensorrt-pkg/torch_tensorrt-1.2.0-cp37-cp37m-linux_x86_64.whl","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-03-07T11:10:49.500866Z","iopub.execute_input":"2023-03-07T11:10:49.501363Z","iopub.status.idle":"2023-03-07T11:13:32.551084Z","shell.execute_reply.started":"2023-03-07T11:10:49.501259Z","shell.execute_reply":"2023-03-07T11:13:32.549912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install /kaggle/input/nvidia-dali-wheel/nvidia_dali_nightly_cuda110-1.22.0.dev20221213-6757685-py3-none-manylinux2014_x86_64.whl","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-03-07T11:13:32.553726Z","iopub.execute_input":"2023-03-07T11:13:32.554103Z","iopub.status.idle":"2023-03-07T11:13:55.546955Z","shell.execute_reply.started":"2023-03-07T11:13:32.554064Z","shell.execute_reply":"2023-03-07T11:13:55.545808Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip uninstall -y timm\nimport sys\nsys.path.append('/kaggle/input/timm-0-6-12-tf-effv2s-1520-912')","metadata":{"execution":{"iopub.status.busy":"2023-03-07T11:13:55.54969Z","iopub.execute_input":"2023-03-07T11:13:55.550816Z","iopub.status.idle":"2023-03-07T11:13:58.374903Z","shell.execute_reply.started":"2023-03-07T11:13:55.550773Z","shell.execute_reply":"2023-03-07T11:13:58.373601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import os\nimport pickle\nimport random\nimport math\nfrom pathlib import Path\nimport time\n\nfrom joblib import Parallel, delayed\nimport shutil\nimport cv2\nfrom tqdm.auto import tqdm\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import KFold, StratifiedKFold\nfrom sklearn.metrics import roc_auc_score, auc, precision_recall_curve\nimport timm\nfrom albumentations  import *\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.nn import Parameter\nfrom torch.optim import Adam, SGD, AdamW\nfrom torch.utils.data import DataLoader, Dataset\nimport torch_tensorrt\nimport tensorrt\n\nimport gc\n\n%matplotlib inline\nimport matplotlib.pyplot as plt\n\nprint('torch version:', torch.__version__)\nprint('timm version:', timm.__version__)\n\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint('device:', device)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-07T11:13:58.377831Z","iopub.execute_input":"2023-03-07T11:13:58.378239Z","iopub.status.idle":"2023-03-07T11:14:03.552173Z","shell.execute_reply.started":"2023-03-07T11:13:58.378193Z","shell.execute_reply":"2023-03-07T11:14:03.551093Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%writefile model_compile.py\n\nimport sys\nsys.path.append('/kaggle/input/timm-0-6-12-tf-effv2s-1520-912')\n\nimport glob\n\nimport os\nimport pickle\nimport random\nimport math\n\nfrom joblib import Parallel, delayed\nimport shutil\nimport cv2\nfrom tqdm.auto import tqdm\nimport numpy as np\nimport pandas as pd\nfrom sklearn.model_selection import KFold, StratifiedKFold\nfrom sklearn.metrics import roc_auc_score\nimport timm\nfrom albumentations  import *\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\nfrom torch.nn import Parameter\nfrom torch.optim import Adam, SGD, AdamW\nfrom torch.utils.data import DataLoader, Dataset\nimport gc\nimport torch.backends.cudnn as cudnn\n\nimport matplotlib.pyplot as plt\n\nprint('torch version:', torch.__version__)\nprint('timm version:', timm.__version__)\n\ndevice = 'cuda' if torch.cuda.is_available() else 'cpu'\nprint('device:', device)\n\nimport torch\nimport torch.nn.functional as F\n# import nvidia.dali.fn as fn\n# import nvidia.dali.types as types\n# from nvidia.dali import pipeline_def\n# from nvidia.dali.types import DALIDataType\n# from pydicom.filebase import DicomBytesIO\n# from nvidia.dali.plugin.pytorch import feed_ndarray, to_torch_type\n\n\nos.environ['CUDA_MODULE_LOADING']='LAZY'\n\nimport torch_tensorrt\nimport tensorrt\ncudnn.benchmark = True\n\nclass config:\n    seed = 10\n    batch_size = 32\n    n_folds = 4\n    name = 'tf_efficientnetv2_s'\n    \nSIZE = (1520, 912)\ndef seed_everything(seed: int):    \n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = True\nseed_everything(config.seed)\n\ndef gem(x, p:int=3, eps:float=1e-6):\n    return F.avg_pool2d(x.clamp(min=eps).pow(p), (x.size(-2), x.size(-1))).pow(1.0 / p)\n\n\nclass GeM(nn.Module):\n    def __init__(self, p:int=3, eps:float=1e-6, p_trainable=False):\n        super(GeM, self).__init__()\n        if p_trainable:\n            self.p = Parameter(torch.ones(1) * p)\n        else:\n            self.p = p\n        self.eps = eps\n\n    def forward(self, x):\n        ret = gem(x, p=self.p, eps=self.eps)\n        return ret\n\n    def __repr__(self):\n        return (\n            self.__class__.__name__\n            + \"(\"\n            + \"p=\"\n            + \"{:.4f}\".format(self.p.data.tolist()[0])\n            + \", \"\n            + \"eps=\"\n            + str(self.eps)\n            + \")\"\n        )\n    \nclass MammoModel(nn.Module):\n    def __init__(self, name, *, pretrained=False, in_chans=1, p=3, p_trainable=False, eps=1e-6):\n        super().__init__()\n        model = timm.create_model(name, pretrained=pretrained, in_chans=in_chans)\n        clsf = model.default_cfg['classifier']\n        n_features = model._modules[clsf].in_features\n        model._modules[clsf] = nn.Identity()\n        \n        self.fc = nn.Linear(n_features, 1)\n        self.model = model\n\n        self.pool = nn.Sequential(\n            GeM(p=p, eps=eps, p_trainable=p_trainable),\n            nn.Flatten())\n    \n    def forward(self, x):\n        # x = self.model(x)\n        x = self.model.forward_features(x)\n        x = self.pool(x)\n        logits = self.fc(x)\n        return logits\n    \ndef tensorrt_compile(path, config, name, fold):\n    model = MammoModel(config.name, pretrained=False)\n    current_params = model.state_dict()\n    trained_params = torch.load(path, map_location='cpu')['model']\n    for key in current_params.keys():\n        if key == 'model.conv_stem.conv.weight':\n            current_params[key] = trained_params['model.conv_stem.weight']\n        elif key == 'model.blocks.1.0.conv_exp.conv.weight':\n            current_params[key] = trained_params['model.blocks.1.0.conv_exp.weight']\n        elif key == 'model.blocks.2.0.conv_exp.conv.weight':\n            current_params[key] = trained_params['model.blocks.2.0.conv_exp.weight']\n        elif key == 'model.blocks.3.0.conv_dw.conv.weight':\n            current_params[key] = trained_params['model.blocks.3.0.conv_dw.weight']\n        else:\n            current_params[key] = trained_params[key]\n    model.load_state_dict(current_params)\n    model.load_state_dict(torch.load(path, map_location=device)['model'])\n    model.eval().to(device)\n\n    # The compiled module will have precision as specified by \"op_precision\".\n    # with torch_tensorrt.logging.debug():\n    trt_model_fp32 = torch_tensorrt.compile(\n        model,\n        inputs=[\n            torch_tensorrt.Input(\n            [config.batch_size, 1, SIZE[0], SIZE[1]],\n            dtype=torch.float32\n        )],\n        enabled_precisions={torch.float32},  # Run with FP16\n        workspace_size=1 << 32,\n    #     debug=True,\n        require_full_compilation=True,\n    ) \n    torch.jit.save(trt_model_fp32, f'{name}-seed{config.seed}-{fold}.ts')\n    \n    del trt_model_fp32\n    torch.cuda.empty_cache()\n    gc.collect()\n    print('ok')\n    \n    \n\n\nfor fold in range(config.n_folds):\n    print('fold:', fold)\n    path = f'/kaggle/input/rsna-efficientnetv2s-swa/efficientnetv2_s_seed_10_fold{fold}_best_score_ver084_swa.pth'\n    name = 'efficientnetv2s_ver084'\n    tensorrt_compile(path, config, name, fold)","metadata":{"execution":{"iopub.status.busy":"2023-03-07T11:16:44.481276Z","iopub.execute_input":"2023-03-07T11:16:44.481675Z","iopub.status.idle":"2023-03-07T11:16:44.491034Z","shell.execute_reply.started":"2023-03-07T11:16:44.481639Z","shell.execute_reply":"2023-03-07T11:16:44.490077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!python model_compile.py","metadata":{"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-02-26T04:24:13.895383Z","iopub.execute_input":"2023-02-26T04:24:13.895761Z","iopub.status.idle":"2023-02-26T04:24:43.598097Z","shell.execute_reply.started":"2023-02-26T04:24:13.895729Z","shell.execute_reply":"2023-02-26T04:24:43.596899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}