{"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":"code","source":"!pip install /kaggle/input/rsna-2022-whl/{pydicom-2.3.0-py3-none-any.whl,pylibjpeg-1.4.0-py3-none-any.whl,python_gdcm-3.0.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl}\n!pip install /kaggle/input/nvidia-dali-wheel/nvidia_dali_nightly_cuda110-1.22.0.dev20221213-6757685-py3-none-manylinux2014_x86_64.whl\n!pip install /kaggle/input/nvidia-dali-wheel/dicomsdl-0.109.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl\n\n\n\nuse_compile = True\n# if use_compile:\n#upgrade pytorch to 1.12\n!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\n\nimport os\nos.environ['CUDA_MODULE_LOADING']='LAZY'\nimport torch_tensorrt\nimport tensorrt","metadata":{"_kg_hide-input":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2023-02-18T11:56:49.483045Z","iopub.execute_input":"2023-02-18T11:56:49.483795Z","iopub.status.idle":"2023-02-18T12:02:16.75923Z","shell.execute_reply.started":"2023-02-18T11:56:49.483708Z","shell.execute_reply":"2023-02-18T12:02:16.757982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# !pip install -q --no-index --find-links=/kaggle/input/timm-wheel timm pillow\n!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-02-18T12:07:32.207784Z","iopub.execute_input":"2023-02-18T12:07:32.208259Z","iopub.status.idle":"2023-02-18T12:07:34.1001Z","shell.execute_reply.started":"2023-02-18T12:07:32.208216Z","shell.execute_reply":"2023-02-18T12:07:34.098999Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import sys\n# sys.path.append('/kaggle/input/timm0612/pytorch-image-models-main')\nimport gdcm\nimport glob\n# import torch_tensorrt\n# import tensorrt\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 pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom pydicom.pixel_data_handlers import apply_windowing\nimport dicomsdl\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)\n\ntorch.backends.cuda.matmul.allow_tf32 = False","metadata":{"execution":{"iopub.status.busy":"2023-02-18T12:02:26.856685Z","iopub.execute_input":"2023-02-18T12:02:26.858088Z","iopub.status.idle":"2023-02-18T12:02:30.008777Z","shell.execute_reply.started":"2023-02-18T12:02:26.858038Z","shell.execute_reply":"2023-02-18T12:02:30.006873Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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(42)","metadata":{"execution":{"iopub.status.busy":"2023-02-18T12:02:30.011637Z","iopub.execute_input":"2023-02-18T12:02:30.012031Z","iopub.status.idle":"2023-02-18T12:02:30.023158Z","shell.execute_reply.started":"2023-02-18T12:02:30.011989Z","shell.execute_reply":"2023-02-18T12:02:30.021932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"import torch.nn.functional as F\ndef inference_fn(test_loader, model, device):\n    model.eval()\n    preds = []\n    for inputs in test_loader:\n        inputs = inputs.to(device)\n        with torch.no_grad():\n            y_preds = model(inputs)\n        preds.append(y_preds.squeeze().sigmoid().to('cpu').numpy())\n    predictions = np.concatenate(preds)\n    return predictions\n\n\nimport torch.cuda.amp as amp\ndef inference_fn_compile(test_loader, model, device):\n    model.eval()\n    preds = []\n    for inputs in test_loader:\n        inputs = inputs.to(device).half()\n        inputs = pad_to_batch_size(inputs, config.batch_size)\n        with torch.no_grad():\n            with amp.autocast(enabled=True):\n                y_preds = model(inputs)\n        preds.append(y_preds.squeeze().sigmoid().to('cpu').numpy())\n    predictions = np.concatenate(preds)\n    return predictions\n\n\ndef pad_to_batch_size(image, batch_size):\n    B = len(image)\n    if B == batch_size:\n        return image\n    pad = F.pad(input=image, pad=(0, 0, 0, 0, 0, 0, 0, batch_size - B), mode='constant', value=0)\n    return pad","metadata":{"execution":{"iopub.status.busy":"2023-02-18T12:02:30.19123Z","iopub.execute_input":"2023-02-18T12:02:30.191953Z","iopub.status.idle":"2023-02-18T12:02:30.202419Z","shell.execute_reply.started":"2023-02-18T12:02:30.191916Z","shell.execute_reply":"2023-02-18T12:02:30.201401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%writefile model_compile.py\n# https://www.kaggle.com/code/tivfrvqhs5/torch-tensorrt-infer-fp16-and-fp32-benchmarks/notebook\n# https://www.kaggle.com/code/hengck23/3hr-tensorrt-nextvit-example/notebook\n# https://www.kaggle.com/competitions/rsna-breast-cancer-detection/discussion/375881\n\nimport sys\nsys.path.append('/kaggle/input/timm-0-6-12-tf-effv2s-1520-912')\n\nimport gdcm\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 pydicom\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nfrom pydicom.pixel_data_handlers import apply_windowing\nimport dicomsdl\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\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 = 5\n    name = 'tf_efficientnetv2_s'\n    SIZE = (1024, 1024)  \nclass config2:\n    seed = 10\n    batch_size = 32\n    n_folds = 4\n    name = 'tf_efficientnetv2_s'\n    SIZE = (912, 1520)\nclass config3:\n    seed = 10\n    batch_size = 32\n    n_folds = 4\n    name = 'tf_efficientnetv2_s'\n    SIZE = (912, 1520)\n    \n    \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_v2s(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.half()  ### should not be used !!!!!\n    model.eval().to(device)\n    # model.encoder.merge_bn()\n\n    # The compiled module will have precision as specified by \"op_precision\".\n    # with torch_tensorrt.logging.debug():\n    trt_model_fp16 = torch_tensorrt.compile(\n        model,\n        inputs=[\n            torch_tensorrt.Input(\n            [config.batch_size, 1, config.SIZE[1], config.SIZE[0]],\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_fp16, f'{name}-{fold}.ts')\n    \n    del trt_model_fp16\n    torch.cuda.empty_cache()\n    gc.collect()\n    print('ok')\n    \n    \ndef tensorrt_compile_B5(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_dw.conv.weight':\n            current_params[key] = trained_params['model.blocks.1.0.conv_dw.weight']\n        elif key == 'model.blocks.2.0.conv_dw.conv.weight':\n            current_params[key] = trained_params['model.blocks.2.0.conv_dw.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.half()  ### should not be used !!!!!\n    model.eval().to(device)\n    # model.encoder.merge_bn()\n\n    # The compiled module will have precision as specified by \"op_precision\".\n    # with torch_tensorrt.logging.debug():\n    trt_model_fp16 = torch_tensorrt.compile(\n        model,\n        inputs=[\n            torch_tensorrt.Input(\n            [config.batch_size, 1, config.SIZE[1], config.SIZE[0]],\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_fp16, f'{name}-{fold}.ts')\n    \n    del trt_model_fp16\n    torch.cuda.empty_cache()\n    gc.collect()\n    print('ok')\n\n\nfor fold in range(config.n_folds):\n    print('fold:', fold)\n    path = f'/kaggle/input/ver49-weight3/efficientnetv2_s_seed_10_fold{fold}_best_ver49_swa.pth'\n    name = 'ver49'\n    tensorrt_compile_v2s(path, config, name, fold)\n    \nfor fold in range(config2.n_folds):\n    print('fold:', fold)\n    path = f'/kaggle/input/rsna-efficientnetv2-s-pl-4folds/efficientnetv2_s_pl_seed_10_fold{fold}_best_score_ver084.pth'\n    name = 'ver84'\n    tensorrt_compile_v2s(path, config2, name, fold)\n    \nfor fold in range(config3.n_folds):\n    print('fold:', fold)\n    path = f'/kaggle/input/rsna-efficientnetv2-s-pl-4folds/efficientnetv2_s_pl_seed_10_fold{fold}_best_score_ver085.pth'\n    name = 'ver85'\n    tensorrt_compile_B5(path, config3, name, fold)\n\nprint('trt_fp16 ok')","metadata":{"execution":{"iopub.status.busy":"2023-02-18T12:23:04.573723Z","iopub.execute_input":"2023-02-18T12:23:04.574202Z","iopub.status.idle":"2023-02-18T12:23:04.589251Z","shell.execute_reply.started":"2023-02-18T12:23:04.57416Z","shell.execute_reply":"2023-02-18T12:23:04.588192Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gc.collect()\nif use_compile:\n    !python model_compile.py\nelse:\n    !rm model_compile.py","metadata":{"execution":{"iopub.status.busy":"2023-02-18T12:23:07.346155Z","iopub.execute_input":"2023-02-18T12:23:07.346546Z","iopub.status.idle":"2023-02-18T12:31:31.534403Z","shell.execute_reply.started":"2023-02-18T12:23:07.346511Z","shell.execute_reply":"2023-02-18T12:31:31.533273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}