添加新Op
添加Op包含如下步骤:
- 添加对应的Backend的Op实现(CPU)
- 添加Op的类型枚举
- 在对应的Backend注册实现的Op
- 添加Op的前端表示
添加对应的Backend的Op实现
CPU
- 在CPU目录下添加CPUAbc.hpp、CPUAbc.cpp,也可以运行new_op.py生成两文件。
- 类声明。 继承基类Op,主要实现reshape()和execute()等。
- 实现CPUOpCreator。
示例如下:
#ifndef MLLM_CPUABC_H#define MLLM_CPUABC_H
#include "Op.hpp"#include "CPUBackend.hpp"
namespace mllm {
class CPUAbc final : public Op {public: CPUAbc(Backend *bn, string opName, int param1, bool param2, int threadCount); virtual ~CPUAbc() = default; //计算outputs的Tensor大小 virtual ErrorCode reshape(vector<shared_ptr<Tensor>> inputs, vector<shared_ptr<Tensor>> outputs) override; //进行计算,对outputs赋值 virtual ErrorCode execute(vector<shared_ptr<Tensor>> inputs, vector<shared_ptr<Tensor>> outputs) override; //加载权重参数(非必须重载) virtual ErrorCode load(AbstructLoader &loader) override; //释放权重参数, 与load成对出现(非必须重载) virtual ErrorCode free(vector<shared_ptr<Tensor>> inputs, vector<shared_ptr<Tensor>> outputs) override; //对outputs(inputs)进行内存管理(非必须重载) virtual ErrorCode setUp(vector<shared_ptr<Tensor>> inputs, vector<shared_ptr<Tensor>> outputs) override;
private: // Op的参数 int param1_; bool param2_; int thread_count = 4;};
class CPUAbcCreator : public CPUBackend::Creator {public: virtual Op *create(OpParam op_param, Backend *bn, string name, int threadCount) const { //在此处读取CPUAbc的参数 //OpParam为vector<float> int param1 = (int)op_param["param1"]; bool param2 = (bool)op_param["param2"]; return new CPUAbc(bn, name, param1, param2, threadCount); }};
} // namespace mllm
#endif // MLLM_CPUABC_H
添加Op的类型枚举
在OpDefined.hpp文件中添加Op的类型枚举。
#ifndef MLLM_OPDEFINED_H#define MLLM_OPDEFINED_H
#include <string>#include <vector>using std::string;using std::vector;
namespace mllm {enum OpType { INVALID_VALUE = 0, PARAMETER, ADD, ... ... ABC, //<==在此添加 OP_NUM};
static const vector<string> OpNames = { "INVALID_VALUE", "Parameter", "Add", ... ... "Abc", //<==在此添加 "OP_NUM"};} // namespace mllm#endif
在对应的Backend注册实现的Op
- 在对应的Backend.cpp文件中引用CPUAbc.hpp
- 在对用的Backend.cpp文件中添加addCreator
#include "CPUBackend.hpp"#include "CPUView.hpp" ... ...#include "CPUAbc.hpp" //<==在此添加
... ... ... ...
void CPUBackend::registerOps() { addCreator(PARAMETER, (CPUBackend::Creator *)(new CPUParameterCreator())); ... ... addCreator(ABC, (CPUBackend::Creator *)(new CPUAbcCreator())); //<==在此添加}
添加Op的前端表示
在Layer.hpp中通过添加对应的Layer实现Op的前端表示。
class ABC final : public Layer {public: ABC() = default; ABC(std::string name) { init(std::move(name), OpType::ABC); } Tensor operator()(Tensor input) { auto ts = run({input}, 1); return ts[0]; }};