ONE - On-device Neural Engine
Loading...
Searching...
No Matches
onert::backend::trix::ops::BulkPipelineModel Class Reference

#include <BulkPipelineModel.h>

Public Types

enum class  BufferOwnership { OWNER , SHARED }
 

Public Member Functions

 BulkPipelineModel (const std::string &model_path, int device_id, BufferOwnership ownership=BufferOwnership::OWNER)
 
 ~BulkPipelineModel ()
 
 BulkPipelineModel (const BulkPipelineModel &)=delete
 
BulkPipelineModeloperator= (const BulkPipelineModel &)=delete
 
bool initialize ()
 
bool prepare ()
 
void release ()
 
bool isPrepared () const
 
void run (const std::vector< const IPortableTensor * > &inputs, std::vector< IPortableTensor * > &outputs)
 
void shareBuffersFrom (const BulkPipelineModel &owner)
 
void setNextModel (std::shared_ptr< BulkPipelineModel > next)
 
std::shared_ptr< BulkPipelineModelgetNextModel ()
 
void setBufferOwnership (BufferOwnership ownership)
 
void waitForBufferReady ()
 
void markBufferReady ()
 
void startAsyncBufferFill ()
 
const npubin_meta * metadata () const
 
uint64_t programSize () const
 
uint64_t weightSize () const
 
uint32_t modelId () const
 
npudev_h device () const
 
const std::string & modelPath () const
 
BufferOwnership ownership () const
 

Detailed Description

Definition at line 35 of file BulkPipelineModel.h.

Member Enumeration Documentation

◆ BufferOwnership

Constructor & Destructor Documentation

◆ BulkPipelineModel() [1/2]

onert::backend::trix::ops::BulkPipelineModel::BulkPipelineModel ( const std::string &  model_path,
int  device_id,
BufferOwnership  ownership = BufferOwnership::OWNER 
)

Definition at line 26 of file BulkPipelineModel.cc.

28 : _model_path(model_path), _device_id(device_id), _ownership(ownership)
29{
30 // DO NOTHING
31}

◆ ~BulkPipelineModel()

onert::backend::trix::ops::BulkPipelineModel::~BulkPipelineModel ( )

Definition at line 33 of file BulkPipelineModel.cc.

References release().

◆ BulkPipelineModel() [2/2]

onert::backend::trix::ops::BulkPipelineModel::BulkPipelineModel ( const BulkPipelineModel )
delete

Member Function Documentation

◆ device()

npudev_h onert::backend::trix::ops::BulkPipelineModel::device ( ) const
inline

Definition at line 74 of file BulkPipelineModel.h.

74{ return _dev; }

Referenced by shareBuffersFrom().

◆ getNextModel()

std::shared_ptr< BulkPipelineModel > onert::backend::trix::ops::BulkPipelineModel::getNextModel ( )
inline

Definition at line 63 of file BulkPipelineModel.h.

63{ return _next_model; };

◆ initialize()

bool onert::backend::trix::ops::BulkPipelineModel::initialize ( )

Definition at line 35 of file BulkPipelineModel.cc.

36{
37 if (_initialized.load())
38 {
39 return true;
40 }
41
42 if (!loadMetadata())
43 {
44 return false;
45 }
46
47 _initialized = true;
48 return true;
49}

◆ isPrepared()

bool onert::backend::trix::ops::BulkPipelineModel::isPrepared ( ) const
inline

Definition at line 56 of file BulkPipelineModel.h.

56{ return _prepared; }

Referenced by shareBuffersFrom().

◆ markBufferReady()

void onert::backend::trix::ops::BulkPipelineModel::markBufferReady ( )

Definition at line 190 of file BulkPipelineModel.cc.

191{
192 {
193 std::lock_guard<std::mutex> lock(_buffer_mutex);
194 _buffer_ready = true;
195 }
196 _buffer_cv.notify_all();
197}

Referenced by prepare(), and startAsyncBufferFill().

◆ metadata()

const npubin_meta * onert::backend::trix::ops::BulkPipelineModel::metadata ( ) const
inline

Definition at line 70 of file BulkPipelineModel.h.

70{ return _meta.get(); }

◆ modelId()

uint32_t onert::backend::trix::ops::BulkPipelineModel::modelId ( ) const
inline

Definition at line 73 of file BulkPipelineModel.h.

73{ return _model_id; }

Referenced by shareBuffersFrom().

◆ modelPath()

const std::string & onert::backend::trix::ops::BulkPipelineModel::modelPath ( ) const
inline

Definition at line 75 of file BulkPipelineModel.h.

75{ return _model_path; }

Referenced by shareBuffersFrom().

◆ operator=()

BulkPipelineModel & onert::backend::trix::ops::BulkPipelineModel::operator= ( const BulkPipelineModel )
delete

◆ ownership()

BufferOwnership onert::backend::trix::ops::BulkPipelineModel::ownership ( ) const
inline

Definition at line 76 of file BulkPipelineModel.h.

76{ return _ownership; }

Referenced by setBufferOwnership().

◆ prepare()

bool onert::backend::trix::ops::BulkPipelineModel::prepare ( )

Definition at line 51 of file BulkPipelineModel.cc.

52{
53 if (_prepared.load())
54 {
55 return true;
56 }
57
58 try
59 {
60 if (_ownership == BufferOwnership::OWNER)
61 {
62 openDevice();
63 allocateBuffers();
64 fillBuffers();
66 registerModel();
67 }
68
69 _prepared = true;
70 return true;
71 }
72 catch (const std::exception &e)
73 {
74 std::cerr << "Failed to prepare model " << _model_path << ": " << e.what() << std::endl;
75 release();
76 return false;
77 }
78}

References markBufferReady(), OWNER, and release().

◆ programSize()

uint64_t onert::backend::trix::ops::BulkPipelineModel::programSize ( ) const
inline

Definition at line 71 of file BulkPipelineModel.h.

71{ return _meta->program_size; }

◆ release()

void onert::backend::trix::ops::BulkPipelineModel::release ( )

Definition at line 80 of file BulkPipelineModel.cc.

81{
82 // Cancel a asynchronous job
83 if (_async_fill_future.valid())
84 {
85 _async_fill_future.wait();
86 }
87
88 if (_ownership == BufferOwnership::OWNER)
89 {
90 unregisterModel();
91 closeDevice();
92 }
93
94 if (_fp)
95 {
96 fclose(_fp);
97 _fp = nullptr;
98 }
99
100 _program_buffer.reset();
101 _weight_buffer.reset();
102 _meta.reset();
103 _meta_size = 0;
104 _model_id = 0;
105
106 _prepared = false;
107}

References OWNER.

Referenced by prepare(), and ~BulkPipelineModel().

◆ run()

void onert::backend::trix::ops::BulkPipelineModel::run ( const std::vector< const IPortableTensor * > &  inputs,
std::vector< IPortableTensor * > &  outputs 
)

Definition at line 109 of file BulkPipelineModel.cc.

111{
112 if (!_prepared.load())
113 {
114 throw std::runtime_error("Model is not prepared: " + _model_path);
115 }
116
117 if (!_meta)
118 {
119 throw std::runtime_error("Model metadata is not loaded: " + _model_path);
120 }
121
122 // Prepare input buffers
123 input_buffers input;
124 input.num_buffers = _meta->input_seg_num;
125 for (uint32_t i = 0; i < input.num_buffers; i++)
126 {
127 uint32_t idx = _meta->input_seg_idx[i];
128 input.bufs[i].addr = inputs[i]->buffer();
129 input.bufs[i].type = BUFFER_MAPPED;
130 input.bufs[i].size = _meta->segment_size[idx];
131 }
132
133 // Prepare output buffers
134 output_buffers output;
135 output.num_buffers = _meta->output_seg_num;
136 for (uint32_t i = 0; i < output.num_buffers; i++)
137 {
138 uint32_t idx = _meta->output_seg_idx[i];
139 output.bufs[i].addr = outputs[i]->buffer();
140 output.bufs[i].type = BUFFER_MAPPED;
141 output.bufs[i].size = _meta->segment_size[idx];
142 }
143
144 // Execute the model
145 int ret = runNPU_model(_dev, _model_id, NPU_INFER_BLOCKING, &input, &output, nullptr, nullptr);
146 if (ret < 0)
147 {
148 throw std::runtime_error("runNPU_model() failed for " + _model_path +
149 ", ret: " + std::to_string(ret));
150 }
151}

◆ setBufferOwnership()

void onert::backend::trix::ops::BulkPipelineModel::setBufferOwnership ( BufferOwnership  ownership)
inline

Definition at line 64 of file BulkPipelineModel.h.

64{ _ownership = ownership; }

References ownership().

◆ setNextModel()

void onert::backend::trix::ops::BulkPipelineModel::setNextModel ( std::shared_ptr< BulkPipelineModel next)

Definition at line 174 of file BulkPipelineModel.cc.

175{
176 _next_model = next;
177}

◆ shareBuffersFrom()

void onert::backend::trix::ops::BulkPipelineModel::shareBuffersFrom ( const BulkPipelineModel owner)

Definition at line 153 of file BulkPipelineModel.cc.

154{
155 if (_ownership == BufferOwnership::OWNER)
156 {
157 throw std::runtime_error("Cannot share buffers with owner model: " + _model_path);
158 }
159
160 if (!owner.isPrepared())
161 {
162 throw std::runtime_error("Owner model is not prepared: " + owner.modelPath());
163 }
164
165 // Sharing the buffers
166 _program_buffer = owner._program_buffer;
167 _weight_buffer = owner._weight_buffer;
168
169 // Sharing the device and model id
170 _dev = owner.device();
171 _model_id = owner.modelId();
172}

References device(), isPrepared(), modelId(), modelPath(), and OWNER.

◆ startAsyncBufferFill()

void onert::backend::trix::ops::BulkPipelineModel::startAsyncBufferFill ( )

Definition at line 199 of file BulkPipelineModel.cc.

200{
201 _buffer_ready = false;
202 _buffer_error = false;
203 _async_fill_future = std::async(std::launch::async, [this] {
204 try
205 {
206 fillBuffers();
208 }
209 catch (const std::exception &e)
210 {
211 {
212 std::lock_guard<std::mutex> lock(_buffer_mutex);
213 _buffer_ready = false;
214 _buffer_error = true;
215 }
216 _buffer_cv.notify_all();
217 std::cerr << "Failed to fill buffers asynchronously: " << e.what() << std::endl;
218 }
219 });
220}

References markBufferReady().

◆ waitForBufferReady()

void onert::backend::trix::ops::BulkPipelineModel::waitForBufferReady ( )

Definition at line 179 of file BulkPipelineModel.cc.

180{
181 std::unique_lock<std::mutex> lock(_buffer_mutex);
182 _buffer_cv.wait(lock, [this] { return _buffer_ready.load() || _buffer_error.load(); });
183
184 if (_buffer_error.load())
185 {
186 throw std::runtime_error("Buffer fill failed");
187 }
188}

◆ weightSize()

uint64_t onert::backend::trix::ops::BulkPipelineModel::weightSize ( ) const
inline

Definition at line 72 of file BulkPipelineModel.h.

72{ return _meta->weight_size; }

The documentation for this class was generated from the following files: