// // Module.hpp // MNN // // Created by MNN on 2019/11/25. // Copyright © 2018, Alibaba Group Holding Limited // #ifndef MNN_Train_Module_hpp #define MNN_Train_Module_hpp #include #include #include #include namespace MNN { class Session; namespace Express { struct SubGraph; class MNN_PUBLIC Module { public: Module() = default; virtual ~Module() = default; virtual std::vector onForward(const std::vector& inputs) = 0; Express::VARP forward(Express::VARP input); std::vector parameters() const; bool loadParameters(const std::vector& parameters); void setIsTraining(const bool isTraining); bool getIsTraining(); void clearCache(); const std::string& name() const { return mName; }; void setName(std::string name) { mName = std::move(name); } const std::string type() const { return mType; } void setType(std::string type) { mType = std::move(type); } // Return the parameter index int addParameter(Express::VARP parameter); void setParameter(Express::VARP parameter, int index); static Module* createEmpty(const std::vector& parameters); struct BackendInfo { MNNForwardType type = MNN_FORWARD_CPU; BackendConfig* config = nullptr; }; struct Config { // Load module as dynamic, default static bool dynamic = false; // for static mode, if the shape is mutable, set true, otherwise set false to avoid resizeSession freqencily bool shapeMutable = true; // Pre-rearrange weights or not. Disabled by default. // The weights will be rearranged in a general way, so the best implementation // may not be adopted if `rearrange` is enabled. bool rearrange = false; BackendInfo* backend = nullptr; // base module const Module* base = nullptr; }; static Module* load(const std::vector& inputs, const std::vector& outputs, const uint8_t* buffer, size_t length, const Config* config = nullptr); static Module* load(const std::vector& inputs, const std::vector& outputs, const char* fileName, const Config* config = nullptr); // Shared RuntimeManager static Module* load(const std::vector& inputs, const std::vector& outputs, const char* fileName, const std::shared_ptr rtMgr, const Config* config = nullptr); static Module* load(const std::vector& inputs, const std::vector& outputs, const uint8_t* buffer, size_t length, const std::shared_ptr rtMgr, const Config* config = nullptr); static Module* extract(std::vector inputs, std::vector outputs, bool fortrain, const std::map& subGraph = {}); static Module* clone(const Module* module, const bool shareParams = false); struct Info { // Input info load from model std::vector inputs; // The Module's defaultFormat, NCHW or NHWC Dimensionformat defaultFormat; // Runtime Info std::shared_ptr runTimeManager; // Input Names By Order std::vector inputNames; // Output Names By Order std::vector outputNames; // The MNNConvert's Version build the module std::string version; // The bizCode of MNN model std::string bizCode; // MetaData std::map metaData; // uuid std::string uuid; }; const Info* getInfo() const; class CloneContext { public: std::shared_ptr pRuntimeManager; }; virtual Module* clone(CloneContext* ctx) const { return nullptr; } void registerModel(const std::vector>& children); static void destroy(Module* m); int traceOrOptimize(Interpreter::SessionMode stage); std::vector> getChildren() const { return mChildren; } protected: virtual int onOptimize(Interpreter::SessionMode stage) { return 0; } virtual void onClearCache() { } Module* cloneBaseTo(CloneContext* ctx, Module* module) const; std::vector> mChildren; std::vector mParameters; private: void _collectParameters(std::vector& result) const; bool mIsTraining = true; std::string mName; std::string mType; }; struct SubGraph { std::vector inputs; std::vector outputs; std::shared_ptr m; }; } // namespace Train } // namespace MNN #endif