| 61 | } |
| 62 | |
| 63 | PYBIND11_MODULE(turbo_transformers_cxx, m) { |
| 64 | char *argv[] = {strdup("turbo_transformers_cxx"), nullptr}; |
| 65 | int argc = 1; |
| 66 | loguru::init(argc, argv); |
| 67 | |
| 68 | auto config_module = |
| 69 | m.def_submodule("config", "compile configuration of turbo_transformers"); |
| 70 | |
| 71 | BindConfig(config_module); |
| 72 | |
| 73 | m.def("set_stderr_verbose_level", |
| 74 | [](int v) { loguru::g_stderr_verbosity = v; }); |
| 75 | m.def("enable_perf", &core::EnableGperf); |
| 76 | m.def("disable_perf", &core::DisableGperf); |
| 77 | m.def("set_num_threads", &core::SetNumThreads); |
| 78 | |
| 79 | py::class_<core::Tensor>(m, "Tensor") |
| 80 | .def_static("from_dlpack", |
| 81 | [](py::capsule capsule) -> std::unique_ptr<core::Tensor> { |
| 82 | auto tensor = (DLManagedTensor *)(capsule); |
| 83 | PyCapsule_SetName(capsule.ptr(), "used_tensor"); |
| 84 | return absl::make_unique<core::Tensor>(tensor); |
| 85 | }) |
| 86 | .def("to_dlpack", |
| 87 | [](core::Tensor &tensor) -> py::capsule { |
| 88 | auto *dlpack = tensor.ToDLPack(); |
| 89 | return py::capsule(dlpack, "dltensor", DLPack_Capsule_Destructor); |
| 90 | }) |
| 91 | .def("n_dim", &core::Tensor::n_dim) |
| 92 | .def("shape", &core::Tensor::shape) |
| 93 | .def("float_data", &core::Tensor::data<float>) |
| 94 | .def_static("create_empty", [] { return core::Tensor(nullptr); }); |
| 95 | |
| 96 | py::class_<layers::BERTEmbedding>(m, "BERTEmbedding") |
| 97 | .def(py::init( |
| 98 | [](core::Tensor &word_embeddings, core::Tensor &position_embeddings, |
| 99 | core::Tensor &token_type_embeddings, |
| 100 | core::Tensor &layer_norm_weights, |
| 101 | core::Tensor &layer_norm_bias) -> layers::BERTEmbedding * { |
| 102 | return new layers::BERTEmbedding( |
| 103 | std::move(word_embeddings), std::move(position_embeddings), |
| 104 | std::move(token_type_embeddings), std::move(layer_norm_weights), |
| 105 | std::move(layer_norm_bias)); |
| 106 | })) |
| 107 | .def("__call__", &layers::BERTEmbedding::operator()); |
| 108 | |
| 109 | py::class_<layers::BertAttention>(m, "BertAttention") |
| 110 | .def(py::init([](core::Tensor &qkv_weight, core::Tensor &qkv_bias, |
| 111 | core::Tensor &dense_weight, core::Tensor &dense_bias, |
| 112 | core::Tensor &layer_norm_weight, |
| 113 | core::Tensor &layer_norm_bias, |
| 114 | int num_attention_heads) -> layers::BertAttention * { |
| 115 | return new layers::BertAttention( |
| 116 | std::move(qkv_weight), std::move(qkv_bias), std::move(dense_weight), |
| 117 | std::move(dense_bias), std::move(layer_norm_weight), |
| 118 | std::move(layer_norm_bias), num_attention_heads); |
| 119 | })) |
| 120 | .def("__call__", &layers::BertAttention::operator()); |
nothing calls this directly
no test coverage detected