@@ -160,11 +160,32 @@ void setup_output_storage(
160
160
161
161
inline std::unique_ptr<Module> load_module_from_buffer (
162
162
const void * ptr,
163
+ std::optional<const std::string>& data_map_path,
163
164
size_t ptr_len,
164
165
std::unique_ptr<runtime::EventTracer> event_tracer,
165
166
Program::Verification program_verification) {
166
167
EXECUTORCH_SCOPE_PROF (" load_module_from_buffer" );
167
168
auto loader = std::make_unique<BufferDataLoader>(ptr, ptr_len);
169
+
170
+ if (data_map_path.has_value ()) {
171
+ Result<MmapDataLoader> data_map_loader_res = MmapDataLoader::from (
172
+ data_map_path->c_str (),
173
+ MmapDataLoader::MlockConfig::UseMlockIgnoreErrors);
174
+ THROW_IF_ERROR (
175
+ data_map_loader_res.error (),
176
+ " Failed to create MmapDataLoader from file %s, error: 0x:%" PRIx32,
177
+ data_map_path->c_str (),
178
+ static_cast <uint32_t >(data_map_loader_res.error ()));
179
+ auto data_map_loader =
180
+ std::make_unique<MmapDataLoader>(std::move (data_map_loader_res.get ()));
181
+ return std::make_unique<Module>(
182
+ std::move (loader),
183
+ nullptr , // memory_allocator
184
+ nullptr , // temp_allocator
185
+ std::move (event_tracer), // event_tracer
186
+ std::move (data_map_loader)); // data_map_loader
187
+ }
188
+
168
189
return std::make_unique<Module>(
169
190
std::move (loader),
170
191
nullptr , // memory_allocator
@@ -504,27 +525,31 @@ struct PyMethodMeta final {
504
525
struct PyModule final {
505
526
explicit PyModule (
506
527
const py::bytes& buffer,
528
+ std::optional<const std::string>& data_path,
507
529
bool enable_etdump,
508
530
size_t debug_buffer_size = 0 ,
509
531
Program::Verification program_verification =
510
532
Program::Verification::InternalConsistency)
511
533
: debug_buffer_size_(debug_buffer_size),
512
534
module_(load_module_from_buffer(
513
535
buffer.cast<std::string_view>().data(),
536
+ data_path,
514
537
py::len(buffer),
515
538
setup_event_tracer(enable_etdump, debug_buffer_size),
516
539
program_verification)) {}
517
540
518
541
explicit PyModule (
519
542
const void * ptr,
520
543
size_t ptr_len,
544
+ std::optional<const std::string>& data_path,
521
545
bool enable_etdump,
522
546
size_t debug_buffer_size = 0 ,
523
547
Program::Verification program_verification =
524
548
Program::Verification::InternalConsistency)
525
549
: debug_buffer_size_(debug_buffer_size),
526
550
module_(load_module_from_buffer(
527
551
ptr,
552
+ data_path,
528
553
ptr_len,
529
554
setup_event_tracer (enable_etdump, debug_buffer_size),
530
555
program_verification)) {}
@@ -551,12 +576,13 @@ struct PyModule final {
551
576
// Module is only valid as long as the python buffer is alive.
552
577
static std::unique_ptr<PyModule> load_from_buffer (
553
578
const py::bytes& buffer,
579
+ std::optional<const std::string>& data_path,
554
580
bool enable_etdump,
555
581
size_t debug_buffer_size = 0 ,
556
582
Program::Verification program_verification =
557
583
Program::Verification::InternalConsistency) {
558
584
return std::make_unique<PyModule>(
559
- buffer, enable_etdump, debug_buffer_size, program_verification);
585
+ buffer, data_path, enable_etdump, debug_buffer_size, program_verification);
560
586
}
561
587
562
588
static std::unique_ptr<PyModule> load_from_file (
@@ -576,11 +602,13 @@ struct PyModule final {
576
602
577
603
static std::unique_ptr<PyModule> load_from_bundled_program (
578
604
PyBundledModule& m,
605
+ std::optional<const std::string>& data_path,
579
606
bool enable_etdump,
580
607
size_t debug_buffer_size = 0 ) {
581
608
return std::make_unique<PyModule>(
582
609
m.get_program_ptr (),
583
610
m.get_program_len (),
611
+ data_path,
584
612
enable_etdump,
585
613
debug_buffer_size);
586
614
}
@@ -1390,6 +1418,7 @@ PYBIND11_MODULE(EXECUTORCH_PYTHON_MODULE_NAME, m) {
1390
1418
" _load_for_executorch_from_buffer" ,
1391
1419
&PyModule::load_from_buffer,
1392
1420
py::arg (" buffer" ),
1421
+ py::arg (" data_path" ) = std::nullopt ,
1393
1422
py::arg (" enable_etdump" ) = false ,
1394
1423
py::arg (" debug_buffer_size" ) = 0 ,
1395
1424
py::arg (" program_verification" ) =
@@ -1399,6 +1428,7 @@ PYBIND11_MODULE(EXECUTORCH_PYTHON_MODULE_NAME, m) {
1399
1428
" _load_for_executorch_from_bundled_program" ,
1400
1429
&PyModule::load_from_bundled_program,
1401
1430
py::arg (" ptr" ),
1431
+ py::arg (" data_path" ) = std::nullopt ,
1402
1432
py::arg (" enable_etdump" ) = false ,
1403
1433
py::arg (" debug_buffer_size" ) = 0 ,
1404
1434
call_guard);
0 commit comments