跳转到内容

添加新Op

添加Op包含如下步骤:

  1. 添加对应的Backend的Op实现(CPU)
  2. 添加Op的类型枚举
  3. 在对应的Backend注册实现的Op
  4. 添加Op的前端表示

添加对应的Backend的Op实现

CPU

  1. CPU目录下添加CPUAbc.hpp、CPUAbc.cpp,也可以运行new_op.py生成两文件。
  2. 类声明。 继承基类Op,主要实现reshape()和execute()等。
  3. 实现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

  1. 在对应的Backend.cpp文件中引用CPUAbc.hpp
  2. 在对用的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];
}
};