From e968a5f9b4f6a9ca8a24cd9e7d38b27a588c18de Mon Sep 17 00:00:00 2001 From: sennnnn <201730271412@mail.scut.edu.cn> Date: Wed, 14 Apr 2021 19:20:03 +0800 Subject: [PATCH] When the user doesn't have root right, torch.utils.cpp_extension.load will return error message if we don't assign accessible path to arg:build_directory. * Set accessible path to arg:build_directory of torch.utils.cpp_extension.load(); * Add Pytorch-0.4.1 with cuda support installation documentation; * Add .gitignore to ignore some uncessary file; --- .gitignore | 22 +++++ README.md | 2 +- .../__pycache__/__init__.cpython-36.pyc | Bin 321 -> 0 bytes .../inplace_abn/__pycache__/bn.cpython-36.pyc | Bin 6886 -> 0 bytes .../__pycache__/functions.cpython-36.pyc | Bin 6286 -> 0 bytes lib/models/sync_bn/inplace_abn/functions.py | 84 +++++++++++++----- torch_installation.md | 21 +++++ 7 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 .gitignore delete mode 100644 lib/models/sync_bn/inplace_abn/__pycache__/__init__.cpython-36.pyc delete mode 100644 lib/models/sync_bn/inplace_abn/__pycache__/bn.cpython-36.pyc delete mode 100644 lib/models/sync_bn/inplace_abn/__pycache__/functions.cpython-36.pyc create mode 100644 torch_installation.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c4516c1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Repo create +data/ +log/ +output/ +pretrained_models/ + +# Generated by vscode +.vscode +__pycache__/ +build/ + +# Custom +detail-api/ +*.py[co] +/temp*/ +/temp*.*/ + +# Unknown +scripts/ + +# Model parameters +*.pth \ No newline at end of file diff --git a/README.md b/README.md index 5372054c..4651eca1 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ Performance on the Cityscapes dataset. The models are trained and tested with th ## Quick start ### Install -1. Install PyTorch=0.4.1 following the [official instructions](https://pytorch.org/) +1. Install PyTorch=0.4.1 following the [official instructions](https://pytorch.org/) or [this](torch_installation.md) 2. git clone https://github.com/HRNet/HRNet-Semantic-Segmentation $SEG_ROOT 3. Install dependencies: pip install -r requirements.txt diff --git a/lib/models/sync_bn/inplace_abn/__pycache__/__init__.cpython-36.pyc b/lib/models/sync_bn/inplace_abn/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index c42d09f5dab345a3c3405dade95701bfd648b208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmYL^y-ve06ovhhzZSIz z?gfcjx}VNDzLt*97K{0G^6}ybA)he+hk?3+ai@TWG*lBqB{fVk!zHJfF&&sth9;7c ziDhgOnLy4rBn`eOJWILf`E}{%xAsAA>lXF$pf{7P)4(VB&7)cut0%uiwJP$v=RY5# z$BW;U^1dv}bmm!Q2W&TRL;&!!*S)RBuD5OoF^mu~A_2UU;RrS2`&_&YwjIUT_u7dp s6S}K}>6;dugF>pZqO&`!tG1w(>TEYEmF*^(^b diff --git a/lib/models/sync_bn/inplace_abn/__pycache__/bn.cpython-36.pyc b/lib/models/sync_bn/inplace_abn/__pycache__/bn.cpython-36.pyc deleted file mode 100644 index 77d9df516833b7a7112ea4df8af116e2e100a6a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6886 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 diff --git a/lib/models/sync_bn/inplace_abn/functions.py b/lib/models/sync_bn/inplace_abn/functions.py index 17d11077..b222d4d3 100644 --- a/lib/models/sync_bn/inplace_abn/functions.py +++ b/lib/models/sync_bn/inplace_abn/functions.py @@ -1,3 +1,4 @@ +import os from os import path import torch.autograd as autograd @@ -6,14 +7,20 @@ from torch.utils.cpp_extension import load _src_path = path.join(path.dirname(path.abspath(__file__)), "src") -_backend = load(name="inplace_abn", - extra_cflags=["-O3"], - sources=[path.join(_src_path, f) for f in [ - "inplace_abn.cpp", - "inplace_abn_cpu.cpp", - "inplace_abn_cuda.cu" - ]], - extra_cuda_cflags=["--expt-extended-lambda"]) +build_folder = path.join(path.split(_src_path)[0], "build") + +if not path.exists(build_folder): + os.makedirs(build_folder, 0o777) + +_backend = load( + name="inplace_abn", + extra_cflags=["-O3"], + sources=[ + path.join(_src_path, f) for f in + ["inplace_abn.cpp", "inplace_abn_cpu.cpp", "inplace_abn_cuda.cu"] + ], + extra_cuda_cflags=["--expt-extended-lambda"], + build_directory=build_folder) # Activation names ACT_RELU = "relu" @@ -73,9 +80,19 @@ def _act_backward(ctx, x, dx): class InPlaceABN(autograd.Function): + @staticmethod - def forward(ctx, x, weight, bias, running_mean, running_var, - training=True, momentum=0.1, eps=1e-05, activation=ACT_LEAKY_RELU, slope=0.01): + def forward(ctx, + x, + weight, + bias, + running_mean, + running_var, + training=True, + momentum=0.1, + eps=1e-05, + activation=ACT_LEAKY_RELU, + slope=0.01): # Save context ctx.training = training ctx.momentum = momentum @@ -95,7 +112,8 @@ def forward(ctx, x, weight, bias, running_mean, running_var, # Update running stats running_mean.mul_((1 - ctx.momentum)).add_(ctx.momentum * mean) - running_var.mul_((1 - ctx.momentum)).add_(ctx.momentum * var * count / (count - 1)) + running_var.mul_((1 - ctx.momentum)).add_(ctx.momentum * var * + count / (count - 1)) # Mark in-place modified tensors ctx.mark_dirty(x, running_mean, running_var) @@ -122,13 +140,15 @@ def backward(ctx, dz): _act_backward(ctx, z, dz) if ctx.training: - edz, eydz = _backend.edz_eydz(z, dz, weight, bias, ctx.affine, ctx.eps) + edz, eydz = _backend.edz_eydz(z, dz, weight, bias, ctx.affine, + ctx.eps) else: # TODO: implement simplified CUDA backward for inference mode edz = dz.new_zeros(dz.size(1)) eydz = dz.new_zeros(dz.size(1)) - dx, dweight, dbias = _backend.backward(z, dz, var, weight, bias, edz, eydz, ctx.affine, ctx.eps) + dx, dweight, dbias = _backend.backward(z, dz, var, weight, bias, edz, + eydz, ctx.affine, ctx.eps) dweight = dweight if ctx.affine else None dbias = dbias if ctx.affine else None @@ -136,9 +156,21 @@ def backward(ctx, dz): class InPlaceABNSync(autograd.Function): + @classmethod - def forward(cls, ctx, x, weight, bias, running_mean, running_var, - extra, training=True, momentum=0.1, eps=1e-05, activation=ACT_LEAKY_RELU, slope=0.01): + def forward(cls, + ctx, + x, + weight, + bias, + running_mean, + running_var, + extra, + training=True, + momentum=0.1, + eps=1e-05, + activation=ACT_LEAKY_RELU, + slope=0.01): # Save context cls._parse_extra(ctx, extra) ctx.training = training @@ -169,9 +201,10 @@ def forward(cls, ctx, x, weight, bias, running_mean, running_var, vars = comm.gather(vars) mean = means.mean(0) - var = (vars + (mean - means) ** 2).mean(0) + var = (vars + (mean - means)**2).mean(0) - tensors = comm.broadcast_coalesced((mean, var), [mean.get_device()] + ctx.worker_ids) + tensors = comm.broadcast_coalesced( + (mean, var), [mean.get_device()] + ctx.worker_ids) for ts, queue in zip(tensors[1:], ctx.worker_queues): queue.put(ts) else: @@ -181,7 +214,8 @@ def forward(cls, ctx, x, weight, bias, running_mean, running_var, # Update running stats running_mean.mul_((1 - ctx.momentum)).add_(ctx.momentum * mean) - running_var.mul_((1 - ctx.momentum)).add_(ctx.momentum * var * count / (count - 1)) + running_var.mul_((1 - ctx.momentum)).add_(ctx.momentum * var * + count / (count - 1)) # Mark in-place modified tensors ctx.mark_dirty(x, running_mean, running_var) @@ -208,7 +242,8 @@ def backward(ctx, dz): _act_backward(ctx, z, dz) if ctx.training: - edz, eydz = _backend.edz_eydz(z, dz, weight, bias, ctx.affine, ctx.eps) + edz, eydz = _backend.edz_eydz(z, dz, weight, bias, ctx.affine, + ctx.eps) if ctx.is_master: edzs, eydzs = [edz], [eydz] @@ -221,7 +256,8 @@ def backward(ctx, dz): edz = comm.reduce_add(edzs) / (ctx.master_queue.maxsize + 1) eydz = comm.reduce_add(eydzs) / (ctx.master_queue.maxsize + 1) - tensors = comm.broadcast_coalesced((edz, eydz), [edz.get_device()] + ctx.worker_ids) + tensors = comm.broadcast_coalesced( + (edz, eydz), [edz.get_device()] + ctx.worker_ids) for ts, queue in zip(tensors[1:], ctx.worker_queues): queue.put(ts) else: @@ -232,7 +268,8 @@ def backward(ctx, dz): edz = dz.new_zeros(dz.size(1)) eydz = dz.new_zeros(dz.size(1)) - dx, dweight, dbias = _backend.backward(z, dz, var, weight, bias, edz, eydz, ctx.affine, ctx.eps) + dx, dweight, dbias = _backend.backward(z, dz, var, weight, bias, edz, + eydz, ctx.affine, ctx.eps) dweight = dweight if ctx.affine else None dbias = dbias if ctx.affine else None @@ -253,4 +290,7 @@ def _parse_extra(ctx, extra): inplace_abn = InPlaceABN.apply inplace_abn_sync = InPlaceABNSync.apply -__all__ = ["inplace_abn", "inplace_abn_sync", "ACT_RELU", "ACT_LEAKY_RELU", "ACT_ELU", "ACT_NONE"] +__all__ = [ + "inplace_abn", "inplace_abn_sync", "ACT_RELU", "ACT_LEAKY_RELU", "ACT_ELU", + "ACT_NONE" +] diff --git a/torch_installation.md b/torch_installation.md new file mode 100644 index 00000000..fbeff2d4 --- /dev/null +++ b/torch_installation.md @@ -0,0 +1,21 @@ +# How to install Pytorch==0.4.1 with cuda support. + +Firstly, you can initialize a new conda environment. Note that you'd better create a environment based on python 3.6. + +``` +conda create -n hrnet python=3.6 +``` + +Then you can manually install cudatoolkit 9.0. + +``` +conda install cudatoolkit=9.0 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/ +``` + +Then install Pytorch-0.4.1. + +``` +pip install http://download.pytorch.org/whl/cu90/torch-0.4.1-cp36-cp36m-linux_x86_64.whl +``` + +Then install other modules like: Cython, opencv-python and so on. \ No newline at end of file