apple / turicreate

Turi Create simplifies the development of custom machine learning models.
BSD 3-Clause "New" or "Revised" License
11.2k stars 1.14k forks source link

One-Shot Object Detector data synthesis should use lambda apply #2023

Open nickjong opened 5 years ago

nickjong commented 5 years ago

We’re currently iterating through all the images in a single-threaded loop. This should be parallelized.

nickjong commented 5 years ago

I think this work should wait until we investigate the likely memory issues in #2037/#2038. Parallelizing this process now would both increase the memory footprint and make memory issues harder to debug.

shantanuchhabra commented 5 years ago

During 5.7, some work in this area led to failing the export_coreml unit test. We got an EXC_BAD_ALLOC in the function call to boost::gil::resample_pixels. Attaching stack trace here.

* * thread #9, stop reason = EXC_BAD_ACCESS (code=1, address=0x163f6c410)
    frame #0: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] void boost::gil::detail::element_recursion<1>::static_copy<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >, boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > > >(p1=<unavailable>) at color_base_algorithm.hpp:244:32 [opt]
    frame #1: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] void boost::gil::detail::element_recursion<2>::static_copy<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >, boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > > >(p1=<unavailable>) at color_base_algorithm.hpp:243 [opt]
    frame #2: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] void boost::gil::detail::element_recursion<3>::static_copy<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >, boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > > >(p1=<unavailable>) at color_base_algorithm.hpp:243 [opt]
    frame #3: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] void boost::gil::detail::element_recursion<4>::static_copy<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >, boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > > >(p1=<unavailable>) at color_base_algorithm.hpp:243 [opt]
    frame #4: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] void boost::gil::static_copy<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >, boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > > >(src=<unavailable>) at color_base_algorithm.hpp:525 [opt]
    frame #5: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >::operator=(p=<unavailable>) at pixel.hpp:124 [opt]
    frame #6: 0x00000001255dec51 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > > const&, Eigen::Matrix<float, 3, 3, 0, 3, 3> const&, boost::gil::nearest_neighbor_sampler) [inlined] bool boost::gil::sample<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, float>(src=0x000070000e1af830, p=<unavailable>) at sampler.hpp:53 [opt]
    frame #7: 0x00000001255debf3 libunity_shared.dylib`void boost::gil::resample_pixels<boost::gil::nearest_neighbor_sampler, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, boost::gil::image_view<boost::gil::memory_based_2d_locator<boost::gil::memory_based_step_iterator<boost::gil::pixel<unsigned char, boost::gil::layout<boost::mpl::vector4<boost::gil::red_t, boost::gil::green_t, boost::gil::blue_t, boost::gil::alpha_t>, boost::mpl::range_c<int, 0, 4> > >*> > >, Eigen::Matrix<float, 3, 3, 0, 3, 3> >(src_view=0x000070000e1af830, dst_view=0x000070000e1af770, dst_to_src=0x000070000e1af6c0, sampler=<unavailable>) at resample.hpp:57 [opt]
  * frame #8: 0x00000001255de8de libunity_shared.dylib`turi::one_shot_object_detection::data_augmentation::create_synthetic_image(starter_image_view=0x000070000e1af830, background_view=<unavailable>, parameter_sampler=0x000070000e1af850) at superposition.cpp:54:3 [opt]
    frame #9: 0x00000001255e0164 libunity_shared.dylib`turi::one_shot_object_detection::data_augmentation::create_synthetic_image_from_background_and_starter(starter=0x00007fb6eee36378, background=0x000070000e1afad0, label=<unavailable>, seed=2800302124, row_number=<unavailable>) at one_shot_object_detector.cpp:160:32 [opt]
    frame #10: 0x00000001255e4a1b libunity_shared.dylib`turi::one_shot_object_detection::data_augmentation::augment_data(this=<unavailable>, segment_id=0)::$_10::operator()(unsigned long) const at one_shot_object_detector.cpp:223:13 [opt]
    frame #11: 0x00000001255e69ab libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<void turi::parallel_for<turi::one_shot_object_detection::data_augmentation::augment_data(turi::gl_sframe const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, turi::gl_sarray const&, long long, bool)::$_10>(unsigned long, unsigned long, turi::one_shot_object_detection::data_augmentation::augment_data(turi::gl_sframe const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, turi::gl_sarray const&, long long, bool)::$_10 const&)::'lambda'(), void>::invoke(boost::detail::function::function_buffer&) [inlined] void turi::parallel_for<turi::one_shot_object_detection::data_augmentation::augment_data(turi::gl_sframe const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, turi::gl_sarray const&, long long, bool)::$_10>(this=0x00007fb6ec124a68)::$_10 const&)::'lambda'()::operator()() const at lambda_omp.hpp:115:11 [opt]
    frame #12: 0x00000001255e6984 libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<void turi::parallel_for<turi::one_shot_object_detection::data_augmentation::augment_data(turi::gl_sframe const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, turi::gl_sarray const&, long long, bool)::$_10>(unsigned long, unsigned long, turi::one_shot_object_detection::data_augmentation::augment_data(turi::gl_sframe const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, turi::gl_sarray const&, long long, bool)::$_10 const&)::'lambda'(), void>::invoke(function_obj_ptr=0x00007fb6ec124a68) at function_template.hpp:159 [opt]
    frame #13: 0x000000012405b5d7 libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<turi::parallel_task_queue::launch(boost::function<void ()> const&, int)::$_0, void>::invoke(boost::detail::function::function_buffer&) [inlined] boost::function0<void>::operator(this=<unavailable>)() const at function_template.hpp:768:14 [opt]
    frame #14: 0x000000012405b5c0 libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<turi::parallel_task_queue::launch(boost::function<void ()> const&, int)::$_0, void>::invoke(boost::detail::function::function_buffer&) [inlined] turi::parallel_task_queue::launch(this=<unavailable>)> const&, int)::$_0::operator()() const at thread_pool.cpp:23 [opt]
    frame #15: 0x000000012405b5c0 libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<turi::parallel_task_queue::launch(boost::function<void ()> const&, int)::$_0, void>::invoke(function_obj_ptr=<unavailable>) at function_template.hpp:159 [opt]
    frame #16: 0x0000000124059f49 libunity_shared.dylib`turi::thread_pool::wait_for_task() [inlined] boost::function0<void>::operator()() const at function_template.hpp:768:14 [opt]
    frame #17: 0x0000000124059f31 libunity_shared.dylib`turi::thread_pool::wait_for_task(this=0x00007fb6ee8ddd88) at thread_pool.cpp:193 [opt]
    frame #18: 0x00000001240557d9 libunity_shared.dylib`turi::thread_group::invoke(boost::function<void ()>, turi::thread_group*) [inlined] boost::function0<void>::operator(this=<unavailable>)() const at function_template.hpp:768:14 [opt]
    frame #19: 0x00000001240557c2 libunity_shared.dylib`turi::thread_group::invoke(spawn_function=<unavailable>, group=0x00007fb6ee8ddd88)>, turi::thread_group*) at pthread_tools.cpp:317 [opt]
    frame #20: 0x00000001240586b6 libunity_shared.dylib`void boost::_bi::list2<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<turi::thread_group*> >::operator(this=0x00007fb6ee8d9a98, (null)=<unavailable>, f=<unavailable>, a=<unavailable>, (null)=<unavailable>)<void (*)(boost::function<void ()>, turi::thread_group*), boost::_bi::list0>(boost::_bi::type<void>, void (*&)(boost::function<void ()>, turi::thread_group*), boost::_bi::list0&, int) at bind.hpp:319:9 [opt]
    frame #21: 0x00000001240583ea libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<void, void (*)(boost::function<void ()>, turi::thread_group*), boost::_bi::list2<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<turi::thread_group*> > >, void>::invoke(boost::detail::function::function_buffer&) [inlined] boost::_bi::bind_t<void, void (*)(boost::function<void ()>, turi::thread_group*), boost::_bi::list2<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<turi::thread_group*> > >::operator(this=<unavailable>)() at bind.hpp:1294:16 [opt]
    frame #22: 0x00000001240583db libunity_shared.dylib`boost::detail::function::void_function_obj_invoker0<boost::_bi::bind_t<void, void (*)(boost::function<void ()>, turi::thread_group*), boost::_bi::list2<boost::_bi::value<boost::function<void ()> >, boost::_bi::value<turi::thread_group*> > >, void>::invoke(function_obj_ptr=<unavailable>) at function_template.hpp:159 [opt]
    frame #23: 0x00000001240541b0 libunity_shared.dylib`turi::thread::invoke(void*) [inlined] boost::function0<void>::operator(this=<unavailable>)() const at function_template.hpp:768:14 [opt]
    frame #24: 0x000000012405419c libunity_shared.dylib`turi::thread::invoke(_args=0x00007fb6ee8b36f0) at pthread_tools.cpp:115 [opt]
    frame #25: 0x00007fff67512daa libsystem_pthread.dylib`_pthread_start + 125
    frame #26: 0x00007fff6750f6af libsystem_pthread.dylib`thread_start + 15