簡體   English   中英

使用 TensorFlow C API 的 Python 擴展模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM