Spaces:
Build error
Build error
// Copyright (c) OpenMMLab. All rights reserved | |
using dipu::diopi_helper::toDiopiScalar; | |
using dipu::diopi_helper::toDiopiTensorHandle; | |
void roi_align_forward_impl(Tensor input, Tensor rois, Tensor output, | |
Tensor argmax_y, Tensor argmax_x, | |
int aligned_height, int aligned_width, | |
float spatial_scale, int sampling_ratio, | |
int pool_mode, bool aligned) { | |
DISPATCH_DEVICE_IMPL(roi_align_forward_impl, input, rois, output, argmax_y, | |
argmax_x, aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
} | |
void roi_align_backward_impl(Tensor grad_output, Tensor rois, Tensor argmax_y, | |
Tensor argmax_x, Tensor grad_input, | |
int aligned_height, int aligned_width, | |
float spatial_scale, int sampling_ratio, | |
int pool_mode, bool aligned) { | |
DISPATCH_DEVICE_IMPL(roi_align_backward_impl, grad_output, rois, argmax_y, | |
argmax_x, grad_input, aligned_height, aligned_width, | |
spatial_scale, sampling_ratio, pool_mode, aligned); | |
} | |
void roi_align_forward_diopi(Tensor input, Tensor rois, Tensor output, | |
Tensor argmax_y, Tensor argmax_x, | |
int aligned_height, int aligned_width, | |
float spatial_scale, int sampling_ratio, | |
int pool_mode, bool aligned) { | |
auto input_p = toDiopiTensorHandle(input); | |
diopiDevice_t device; | |
diopiGetTensorDevice(input_p, &device); | |
if (device == diopi_host) { | |
roi_align_forward_impl(input, rois, output, argmax_y, argmax_x, | |
aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
return; | |
} | |
diopiContext ctx(dipu::getCurrentDIPUStream().rawstream()); | |
diopiContextHandle_t ch = &ctx; | |
auto rois_p = toDiopiTensorHandle(rois); | |
auto out_p = toDiopiTensorHandle(output); | |
auto argmax_y_p = toDiopiTensorHandle(argmax_y); | |
auto argmax_x_p = toDiopiTensorHandle(argmax_x); | |
bool is_mock_cuda = input.device().type() == dipu::DIPU_DEVICE_TYPE; | |
if (is_mock_cuda && reinterpret_cast<void *>(diopiRoiAlignMmcv) != nullptr) { | |
auto ret = diopiRoiAlignMmcv( | |
ch, out_p, argmax_y_p, argmax_x_p, input_p, rois_p, aligned_height, | |
aligned_width, sampling_ratio, pool_mode, spatial_scale, aligned); | |
if (ret == diopiSuccess) return; | |
} | |
LOG(WARNING) << "Fallback to cpu: mmcv ext op roi_align_forward"; | |
auto input_cpu = input.cpu(); | |
auto rois_cpu = rois.cpu(); | |
auto out_cpu = output.cpu(); | |
auto argmax_y_cpu = argmax_y.cpu(); | |
auto argmax_x_cpu = argmax_x.cpu(); | |
roi_align_forward_impl(input_cpu, rois_cpu, out_cpu, argmax_y_cpu, | |
argmax_x_cpu, aligned_height, aligned_width, | |
spatial_scale, sampling_ratio, pool_mode, aligned); | |
output.copy_(out_cpu); | |
} | |
void roi_align_backward_diopi(Tensor grad_output, Tensor rois, Tensor argmax_y, | |
Tensor argmax_x, Tensor grad_input, | |
int aligned_height, int aligned_width, | |
float spatial_scale, int sampling_ratio, | |
int pool_mode, bool aligned) { | |
auto grad_output_ = toDiopiTensorHandle(grad_output); | |
diopiDevice_t device; | |
diopiGetTensorDevice(grad_output_, &device); | |
if (device == diopi_host) { | |
roi_align_backward_impl(grad_output, rois, argmax_y, argmax_x, grad_input, | |
aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
return; | |
} | |
auto rois_ = toDiopiTensorHandle(rois); | |
auto argmax_y_ = toDiopiTensorHandle(argmax_y); | |
auto argmax_x_ = toDiopiTensorHandle(argmax_x); | |
auto grad_input_ = toDiopiTensorHandle(grad_input); | |
diopiContext ctx(dipu::getCurrentDIPUStream().rawstream()); | |
diopiContextHandle_t ch = &ctx; | |
bool is_mock_cuda = grad_output.device().type() == dipu::DIPU_DEVICE_TYPE; | |
if (is_mock_cuda && | |
reinterpret_cast<void *>(diopiRoiAlignBackwardMmcv) != nullptr) { | |
auto ret = diopiRoiAlignBackwardMmcv(ch, grad_input_, grad_output_, rois_, | |
argmax_y_, argmax_x_, aligned_height, | |
aligned_width, sampling_ratio, | |
pool_mode, spatial_scale, aligned); | |
if (ret == diopiSuccess) return; | |
} | |
LOG(WARNING) << "Fallback to cpu: mmcv ext op roi_align_backward"; | |
auto grad_output_cpu = grad_output.cpu(); | |
auto rois_cpu = rois.cpu(); | |
auto argmax_y_cpu = argmax_y.cpu(); | |
auto argmax_x_cpu = argmax_x.cpu(); | |
auto grad_input_cpu = grad_input.cpu(); | |
roi_align_backward_impl(grad_output_cpu, rois_cpu, argmax_y_cpu, argmax_x_cpu, | |
grad_input_cpu, aligned_height, aligned_width, | |
spatial_scale, sampling_ratio, pool_mode, aligned); | |
grad_input.copy_(grad_input_cpu); | |
} | |
void roi_align_forward(Tensor input, Tensor rois, Tensor output, | |
Tensor argmax_y, Tensor argmax_x, int aligned_height, | |
int aligned_width, float spatial_scale, | |
int sampling_ratio, int pool_mode, bool aligned) { | |
roi_align_forward_diopi(input, rois, output, argmax_y, argmax_x, | |
aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
roi_align_forward_impl(input, rois, output, argmax_y, argmax_x, | |
aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
} | |
void roi_align_backward(Tensor grad_output, Tensor rois, Tensor argmax_y, | |
Tensor argmax_x, Tensor grad_input, int aligned_height, | |
int aligned_width, float spatial_scale, | |
int sampling_ratio, int pool_mode, bool aligned) { | |
roi_align_backward_diopi(grad_output, rois, argmax_y, argmax_x, grad_input, | |
aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
roi_align_backward_impl(grad_output, rois, argmax_y, argmax_x, grad_input, | |
aligned_height, aligned_width, spatial_scale, | |
sampling_ratio, pool_mode, aligned); | |
} | |