1616#include < algorithm>
1717#include < string>
1818#include < vector>
19-
20- using anakin::graph::GraphGlobalMem;
21- using anakin::PTuple;
22- using anakin::AK_FLOAT ;
23- using anakin::saber::Shape;
19+ #include " paddle/fluid/inference/anakin/convert/helper.h"
2420
2521namespace paddle {
2622namespace inference {
2723namespace anakin {
2824
29- template <typename TargetT>
30- void AffineChannelOpConverter<TargetT>::operator ()(
25+ template <typename TargetT, ::anakin::Precision PrecisionT >
26+ void AffineChannelOpConverter<TargetT, PrecisionT >::operator ()(
3127 const framework::proto::OpDesc &op, const framework::BlockDesc &block_desc,
3228 const framework::Scope &scope, bool test_mode) {
3329 framework::OpDesc op_desc (op, nullptr );
3430 PADDLE_ENFORCE_EQ (op_desc.Input (" X" ).size (), 1 );
3531 PADDLE_ENFORCE_EQ (op_desc.Output (" Out" ).size (), 1 );
3632
3733 auto op_name = op_desc.Type () + " :" + op_desc.Output (" Out" ).front ();
38-
3934 auto input_name = op_desc.Input (" X" ).front ();
4035 auto output_name = op_desc.Output (" Out" ).front ();
36+ this ->engine_ ->AddOp (op_name, " AffineChannel" , {input_name}, {output_name});
4137
4238 // Copy the Scale to CPUPlace and get the pointer.
4339 auto *scale_v = scope.FindVar (op_desc.Input (" Scale" ).front ());
4440 PADDLE_ENFORCE_NOT_NULL (scale_v);
45- auto *scale_t = scale_v->GetMutable <framework::LoDTensor>();
46- std::unique_ptr<framework::LoDTensor> scale_tensor (
47- new framework::LoDTensor ());
48- scale_tensor->Resize (scale_t ->dims ());
49- TensorCopySync ((*scale_t ), platform::CPUPlace (), scale_tensor.get ());
41+ auto weight1 = pblock_from_var<TargetT>(*scale_v);
42+ this ->engine_ ->AddOpAttr (op_name, " weight_1" , *weight1);
5043
5144 // Copy the Bias to CPUPlace and get the pointer.
5245 auto *bias_v = scope.FindVar (op_desc.Input (" Bias" ).front ());
5346 PADDLE_ENFORCE_NOT_NULL (bias_v);
54- auto *bias_t = bias_v->GetMutable <framework::LoDTensor>();
55- std::unique_ptr<framework::LoDTensor> bias_tensor (new framework::LoDTensor ());
56- bias_tensor->Resize (bias_t ->dims ());
57- TensorCopySync ((*bias_t ), platform::CPUPlace (), bias_tensor.get ());
58-
59- this ->engine_ ->AddOp (op_name, " AffineChannel" , {input_name}, {output_name});
60-
61- // Generate the Scale parameter of Anakin.
62- auto scale_shape = framework::vectorize2int (scale_t ->dims ());
63- while (scale_shape.size () < 4 ) {
64- scale_shape.insert (scale_shape.begin (), 1 );
65- }
66- Shape anakin_scale_shape (scale_shape);
67- auto *weight1 =
68- GraphGlobalMem<TargetT>::Global ().template new_block <AK_FLOAT >(
69- anakin_scale_shape);
70- float *scale_cpu_data =
71- static_cast <float *>(weight1->h_tensor ().mutable_data ());
72- std::copy_n (scale_tensor->data <float >(), scale_tensor->numel (),
73- scale_cpu_data);
74- weight1->d_tensor ().set_shape (anakin_scale_shape);
75- weight1->d_tensor ().copy_from (weight1->h_tensor ());
76- this ->engine_ ->AddOpAttr (op_name, " weight_1" , *weight1);
77-
78- // Generate the Bias parameter of Anakin.
79- auto bias_shape = framework::vectorize2int (bias_t ->dims ());
80- while (bias_shape.size () < 4 ) {
81- bias_shape.insert (bias_shape.begin (), 1 );
82- }
83- Shape anakin_bias_shape (bias_shape);
84- auto *weight2 =
85- GraphGlobalMem<TargetT>::Global ().template new_block <AK_FLOAT >(
86- anakin_bias_shape);
87- float *bias_cpu_data =
88- static_cast <float *>(weight2->h_tensor ().mutable_data ());
89- std::copy_n (bias_tensor->data <float >(), bias_tensor->numel (), bias_cpu_data);
90- weight2->d_tensor ().set_shape (anakin_bias_shape);
91- weight2->d_tensor ().copy_from (weight2->h_tensor ());
47+ auto weight2 = pblock_from_var<TargetT>(*bias_v);
9248 this ->engine_ ->AddOpAttr (op_name, " weight_2" , *weight2);
9349}
9450
@@ -97,8 +53,21 @@ void AffineChannelOpConverter<TargetT>::operator()(
9753} // namespace paddle
9854
9955#ifdef PADDLE_WITH_CUDA
100- REGISTER_CUDA_ANAKIN_OP_CONVERTER (
101- affine_channel, AffineChannelOpConverter<::anakin::saber::NV >);
56+ using affine_channel_nv_fp32 =
57+ ::paddle::inference::anakin::AffineChannelOpConverter<
58+ ::anakin::saber::NV , ::anakin::Precision::FP32 >;
59+ using affine_channel_nv_int8 =
60+ ::paddle::inference::anakin::AffineChannelOpConverter<
61+ ::anakin::saber::NV , ::anakin::Precision::INT8 >;
62+ REGISTER_CUDA_ANAKIN_OP_CONVERTER (affine_channel, affine_channel_nv_fp32);
63+ REGISTER_CUDA_INT8_ANAKIN_OP_CONVERTER (affine_channel, affine_channel_nv_int8);
10264#endif
103- REGISTER_CPU_ANAKIN_OP_CONVERTER (
104- affine_channel, AffineChannelOpConverter<::anakin::saber::X86 >);
65+
66+ using affine_channel_cpu_fp32 =
67+ ::paddle::inference::anakin::AffineChannelOpConverter<
68+ ::anakin::saber::X86 , ::anakin::Precision::FP32 >;
69+ using affine_channel_cpu_int8 =
70+ ::paddle::inference::anakin::AffineChannelOpConverter<
71+ ::anakin::saber::X86 , ::anakin::Precision::INT8 >;
72+ REGISTER_CPU_ANAKIN_OP_CONVERTER (affine_channel, affine_channel_cpu_fp32);
73+ REGISTER_CPU_INT8_ANAKIN_OP_CONVERTER (affine_channel, affine_channel_cpu_int8);
0 commit comments