// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved. // // Licensed 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. #include #include #include #include "paddle/fluid/framework/op_registry.h" #include "paddle/fluid/framework/operator.h" #include "paddle/fluid/platform/enforce.h" #include "paddle/phi/core/generator.h" namespace paddle { namespace operators { template class CPUReadFileKernel : public framework::OpKernel { public: void Compute(const framework::ExecutionContext& ctx) const override { auto filename = ctx.Attr("filename"); std::ifstream input(filename.c_str(), std::ios::in | std::ios::binary | std::ios::ate); std::streamsize file_size = input.tellg(); input.seekg(0, std::ios::beg); auto* out = ctx.Output("Out"); std::vector out_shape = {file_size}; out->Resize(phi::make_ddim(out_shape)); uint8_t* data = out->mutable_data(ctx.GetPlace()); input.read(reinterpret_cast(data), file_size); } }; class ReadFileOp : public framework::OperatorWithKernel { public: using framework::OperatorWithKernel::OperatorWithKernel; void InferShape(framework::InferShapeContext* ctx) const override { PADDLE_ENFORCE_EQ(ctx->HasOutput("Out"), true, platform::errors::InvalidArgument( "Output(Out) of ReadFileOp is null.")); auto out_dims = std::vector(1, -1); ctx->SetOutputDim("Out", phi::make_ddim(out_dims)); } protected: phi::KernelKey GetExpectedKernelType( const framework::ExecutionContext& ctx) const override { return phi::KernelKey(framework::proto::VarType::UINT8, platform::CPUPlace()); } }; class ReadFileOpMaker : public framework::OpProtoAndCheckerMaker { public: void Make() override { AddOutput("Out", "The output tensor of ReadFile op"); AddComment(R"DOC( This operator read a file. )DOC"); AddAttr("filename", "Path of the file to be readed.") .SetDefault({}); } }; } // namespace operators } // namespace paddle namespace ops = paddle::operators; REGISTER_OPERATOR( read_file, ops::ReadFileOp, ops::ReadFileOpMaker, paddle::framework::EmptyGradOpMaker, paddle::framework::EmptyGradOpMaker) REGISTER_OP_CPU_KERNEL(read_file, ops::CPUReadFileKernel)