Huawei Ascend加速卡
Huawei Ascend ACL支持接口编程,ACL接口相关的介绍,请点击此处
ModelBox为更好的支持Stream并发编程,默认情况下,ModelBox的Ascend ACL接口全部采用Stream模式,开发者需要在编程时,使用Ascend ACL的Stream接口以提升性能。
Ascend ACL功能单元接口
ModelBox框架会自动管理Stream,开发功能单元时,开发者可以通过Process的入参获取到Stream,之后可以用于ACL接口的调用中。
在实现功能单元之前,Ascend ACL相关的功能单元,需要从AscendFlowUnit
派生,并实现AscendProcess
接口。
#include <modelbox/device/ascend/device_ascend.h>
class ExampleAscendFlowUnit : public modelbox::AscendFlowUnit {
public:
ExampleAscendFlowUnit() = default;
virtual ~ExampleAscendFlowUnit() = default;
// 数据处理接口,需要实现AscendProcess,第二个参数为Ascend ACL Stream。
virtual modelbox::Status AscendProcess(std::shared_ptr<modelbox::DataContext> data_ctx, aclrtStream stream);
};
除AscendProcess以外,其他接口和通用功能单元一致,AscendProcess接口如下:
modelbox::Status ExampleAscendFlowUnit::AscendProcess(
std::shared_ptr<modelbox::DataContext> data_ctx, aclrtStream stream) {
auto inputs = ctx->Input("input");
auto outputs = ctx->Output("output");
// 申请内存
std::vector<size_t> data_size_list(1, 2, 3);
outputs->Build(data_size_list);
// 循环处理每个输入数据,并产生相关的输出结果。
for (size_t i = 0; i < inputs->Size(); ++i) {
// 获取数据元数据信息
auto meta = inputs[i].Get("Meta", "Default");
// 获取输入,输出的内存指针。输入为const只读数据,输出为可写入数据。
auto input_data = inputs[i].ConstData();
auto output_data = outputs[i].MutableData();
// 使用Stream处理数据
// aclmdlExecuteAsync(model_id_, input.get(), output.get(), stream);
// 设置输出Meta
outputs[i].Set("Meta", "Meta Data");
}
return modelbox::STATUS_OK;
}
由于不确定输入数据是否是异步执行的数据,如果AscendProcess里需要调用ACL同步接口,则需要在调用前,先调用aclrtSynchronizeStream(stream)
进行数据同步。
modelbox::Status ExampleAscendFlowUnit::AscendProcess(
std::shared_ptr<modelbox::DataContext> data_ctx, aclrtStream stream) {
auto inputs = ctx->Input("input");
auto outputs = ctx->Output("output");
// 同步数据
aclrtSynchronizeStream(stream);
// 申请内存
std::vector<size_t> data_size_list;
for (auto &input : *inputs) {
data_size_list.push_back(input->GetBytes());
}
outputs->Build(data_size_list);
// 循环处理每个输入数据,并产生相关的输出结果。
for (size_t i = 0; i < inputs->Size(); ++i) {
// 获取输入,输出的内存指针。输入为const只读数据,输出为可写入数据。
auto input_data = inputs[i].ConstData();
auto output_data = outputs[i].MutableData();
// 同步拷贝输入到输出
aclrtMemcpy(output_data, outputs[i]->GetBytes(), input_data, inputs[i]->GetBytes(), aclrtMemcpyKind::ACL_MEMCPY_DEVICE_TO_DEVICE);
}
return modelbox::STATUS_OK;
}
数据处理时,Ascend Stream会自动由ModelBox框架生成,再调用Ascend ACL接口时,直接使用此Stream对象即可。