This repository has been archived by the owner on Nov 17, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MXNet Extensions enhancements2 (#19016)
* initial commit * split lib_api.h into lib_api.cc, updated examples for 2.0/gluon * fixed licenses * whitespace * whitespace * modernize * fix modernize * fix modernize * fix modernize * fixed move * added lib_api.cc to CMakeLists.txt for example libs * working example * remove GLOBAL to fix protobuf issue * fixed library unload * added test target * fixed sanity * changed destructor to default * added /LD option for customop_gpu_lib target * moved /LD inside the <> * diff compile flags for relu_lib.cu and lib_api.cc * set CMAKE_VERBOSE_MAKEFILE for debug * added -v to ninja * added /MT * another try * changed /MT to -MT * set flags for cxx separately * split /LD /MT flags * refactored cuda APIs into header file * removed debugging stuff * updated instructions for gpu build * moved building into cmakelists * moved build stuff into separate CMakeLists.txt * fixed gpu example * fixed license * added dlmc library dependency * added nnvm dependency * removed nnvm dmlc dependencies, added WINDOWS_EXPORT_ALL_SYMBOLS option * fixed WINDOWS_EXPORT_ALL_SYMBOLS * changed nnvm to shared library * backed out external ops changes * split relu example into separate files to test separate lib_api.h/cc * sanity * addressed initial review items Co-authored-by: Ubuntu <ubuntu@ip-172-31-6-220.us-west-2.compute.internal>
- Loading branch information
1 parent
9268f89
commit 8379740
Showing
23 changed files
with
2,150 additions
and
1,556 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -24,7 +24,7 @@ | |
*/ | ||
|
||
#include <iostream> | ||
#include "lib_api.h" | ||
#include "mxnet/lib_api.h" | ||
|
||
using namespace mxnet::ext; | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
/* | ||
* Licensed to the Apache Software Foundation (ASF) under one | ||
* or more contributor license agreements. See the NOTICE file | ||
* distributed with this work for additional information | ||
* regarding copyright ownership. The ASF licenses this file | ||
* to you under the Apache License, Version 2.0 (the | ||
* "License"); you may not use this file except in compliance | ||
* with the License. You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, | ||
* software distributed under the License is distributed on an | ||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
* KIND, either express or implied. See the License for the | ||
* specific language governing permissions and limitations | ||
* under the License. | ||
*/ | ||
|
||
/*! | ||
* Copyright (c) 2020 by Contributors | ||
* \file relu_lib.cu | ||
* \brief simple custom relu and noisy relu operator implemented using CUDA function | ||
*/ | ||
|
||
#include <iostream> | ||
#include "relu_lib.h" | ||
|
||
using namespace mxnet::ext; | ||
|
||
MXReturnValue parseAttrs(const std::unordered_map<std::string, std::string>& attrs, | ||
int* num_in, int* num_out) { | ||
*num_in = 1; | ||
*num_out = 1; | ||
return MX_SUCCESS; | ||
} | ||
|
||
MXReturnValue inferType(const std::unordered_map<std::string, std::string>& attrs, | ||
std::vector<int>* intypes, | ||
std::vector<int>* outtypes) { | ||
outtypes->at(0) = intypes->at(0); | ||
return MX_SUCCESS; | ||
} | ||
|
||
MXReturnValue inferShape(const std::unordered_map<std::string, std::string>& attrs, | ||
std::vector<std::vector<unsigned int>>* inshapes, | ||
std::vector<std::vector<unsigned int>>* outshapes) { | ||
outshapes->at(0) = inshapes->at(0); | ||
return MX_SUCCESS; | ||
} | ||
|
||
MXReturnValue forwardCPU(const std::unordered_map<std::string, std::string>& attrs, | ||
std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& res) { | ||
float* in_data = inputs->at(0).data<float>(); | ||
float* out_data = outputs->at(0).data<float>(); | ||
for (int i=0; i<inputs->at(0).size(); i++) { | ||
out_data[i] = in_data[i] > 0 ? in_data[i] : 0; | ||
} | ||
return MX_SUCCESS; | ||
} | ||
|
||
MXReturnValue backwardCPU(const std::unordered_map<std::string, std::string>& attrs, | ||
std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& res) { | ||
float* out_grad = inputs->at(0).data<float>(); | ||
float* in_data = inputs->at(1).data<float>(); | ||
float* in_grad = outputs->at(0).data<float>(); | ||
for (int i=0; i<inputs->at(1).size(); i++) { | ||
in_grad[i] = in_data[i] > 0 ? 1 * out_grad[i] : 0; | ||
} | ||
return MX_SUCCESS; | ||
} | ||
|
||
REGISTER_OP(my_relu) | ||
.setParseAttrs(parseAttrs) | ||
.setInferType(inferType) | ||
.setInferShape(inferShape) | ||
.setForward(forwardCPU, "cpu") | ||
.setForward(forwardGPU, "gpu") | ||
.setBackward(backwardCPU, "cpu") | ||
.setBackward(backwardGPU, "gpu"); | ||
|
||
|
||
MyStatefulReluCPU::MyStatefulReluCPU(const std::unordered_map<std::string, std::string>& attrs) | ||
: attrs_(attrs) {} | ||
|
||
MXReturnValue MyStatefulReluCPU::Forward(std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& op_res) { | ||
return forwardCPU(attrs_, inputs, outputs, op_res); | ||
} | ||
|
||
MXReturnValue MyStatefulReluCPU::Backward(std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& op_res) { | ||
return backwardCPU(attrs_, inputs, outputs, op_res); | ||
} | ||
|
||
MyStatefulReluGPU::MyStatefulReluGPU(const std::unordered_map<std::string, std::string>& attrs) | ||
: attrs_(attrs) {} | ||
|
||
MXReturnValue MyStatefulReluGPU::Forward(std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& op_res) { | ||
return forwardGPU(attrs_, inputs, outputs, op_res); | ||
} | ||
|
||
MXReturnValue MyStatefulReluGPU::Backward(std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& op_res) { | ||
return backwardGPU(attrs_, inputs, outputs, op_res); | ||
} | ||
|
||
|
||
MXReturnValue createOpStateCPU(const std::unordered_map<std::string, std::string>& attrs, | ||
CustomStatefulOp** op_inst) { | ||
*op_inst = new MyStatefulReluCPU(attrs); | ||
return MX_SUCCESS; | ||
} | ||
|
||
MXReturnValue createOpStateGPU(const std::unordered_map<std::string, std::string>& attrs, | ||
CustomStatefulOp** op_inst) { | ||
*op_inst = new MyStatefulReluGPU(attrs); | ||
return MX_SUCCESS; | ||
} | ||
|
||
REGISTER_OP(my_state_relu) | ||
.setParseAttrs(parseAttrs) | ||
.setInferType(inferType) | ||
.setInferShape(inferShape) | ||
.setCreateOpState(createOpStateCPU, "cpu") | ||
.setCreateOpState(createOpStateGPU, "gpu"); | ||
|
||
MXReturnValue noisyForwardCPU(const std::unordered_map<std::string, std::string>& attrs, | ||
std::vector<MXTensor>* inputs, | ||
std::vector<MXTensor>* outputs, | ||
const OpResource& res) { | ||
float* in_data = inputs->at(0).data<float>(); | ||
float* out_data = outputs->at(0).data<float>(); | ||
|
||
mx_cpu_rand_t* states = res.get_cpu_rand_states(); | ||
std::normal_distribution<float> dist_normal; | ||
|
||
for (int i=0; i<inputs->at(0).size(); ++i) { | ||
float noise = dist_normal(*states); | ||
out_data[i] = in_data[i] + noise > 0 ? in_data[i] + noise : 0; | ||
} | ||
return MX_SUCCESS; | ||
} | ||
|
||
REGISTER_OP(my_noisy_relu) | ||
.setParseAttrs(parseAttrs) | ||
.setInferType(inferType) | ||
.setInferShape(inferShape) | ||
.setForward(noisyForwardCPU, "cpu") | ||
.setForward(noisyForwardGPU, "gpu") | ||
.setBackward(backwardCPU, "cpu") | ||
.setBackward(backwardGPU, "gpu"); | ||
|
||
MXReturnValue initialize(int version) { | ||
if (version >= 20000) { | ||
std::cout << "MXNet version " << version << " supported" << std::endl; | ||
return MX_SUCCESS; | ||
} else { | ||
MX_ERROR_MSG << "MXNet version " << version << " not supported"; | ||
return MX_FAIL; | ||
} | ||
} |
Oops, something went wrong.