[英]Python extension module using TensorFlow C API
我編寫了一個 Python 擴展模塊,它通過 C API 使用 TensorFlow。 我按照https://www.tensorflow.org/install/lang_c 中的描述安裝了 API。 就其本身而言,我的模塊工作正常。 但是,如果我輸入我的擴展模塊,也進口tensorflow,Python的崩潰,此錯誤。
[libprotobuf ERROR external/protobuf_archive/src/google/protobuf/descriptor_database.cc:58] File already exists in database: tensorflow/core/protobuf/master.proto
[libprotobuf FATAL external/protobuf_archive/src/google/protobuf/descriptor.cc:1370] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size):
libc++abi.dylib: terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size):
Abort trap: 6
我相信這是因為 C API 包含它自己的 TensorFlow 完整副本,所以現在我將兩個不同的副本同時加載到同一個進程中。
解決這個問題的方法是什么? 我如何擁有使用 TensorFlow 的 Python 代碼,並調用使用 TensorFlow 的 C 代碼?
TensorFlow 使用 Protobuf 並通過使用特定名稱注冊消息類型來全局存儲數據。
在您的情況下,TensorFlow 和您的擴展都與 Protobuf(可能是靜態的)相關聯,並且在初始化時嘗試注冊所有必要的消息。 第一個 (TensorFlow) 成功,第二個失敗並顯示此消息,該消息指定某人 (TensorFlow..) 已經注冊了這樣的消息。
盡量不要鏈接TensorFlow庫(依賴於Protobuf)並動態加載。
這可以使用dlopen()
但是您必須使用dlsym()
手動獲取所有 TF 方法,這與您想要的有點不同。
如果你編譯一個 Python 擴展,我猜你正在編譯一個共享對象,所以我希望它與 TensorFlow 動態鏈接。 您用於編譯的命令行是什么? 你用過-fPIC
嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.