ホームページ  >  記事  >  バックエンド開発  >  tensorflow protobuf のインポートサイクル

tensorflow protobuf のインポートサイクル

王林
王林転載
2024-02-06 11:09:07531ブラウズ

张量流 Protobuf 中的导入周期

質問内容

tensorflowサーバーと通信するためのクライアントコードを書こうとしています。 tensorflowtensorflow_serving 用にコンパイルされた golang protobuf が必要です。どれも簡単なことではありませんが、私はこれを乗り越えました。基本的には buf を使用して生成します。これは buf yaml です:

リーリー

正常に実行されましたが、実行中のアプリケーション ログ:

リーリー

tensorflowtensorflow_serving の下にあるものはすべて、元のリポジトリから直接コンパイルされることに注意してください。

tensorflow のように広く使用されているものにインポート サイクルがあるとは驚きですが、おそらくそうでしょう。この問題はどうすれば解決できますか?


正解


tl;dr

根本的な原因は、リポジトリ https://www.php.cn/link/1a16abf2a3149fc7cd6083687cce01c2 が実際には元のファイルを正しく整理していない (または、少なくとも使いやすくしていない) ことです。 )。

次の 2 つのファイルにより、go でインポート ループが発生します (xla->xla/service->xla):

  • tensorflow/compiler/xla/xla.proto

    • インポート「tensorflow/compiler/xla/service/hlo.proto」
  • tensorflow/compiler/xla/service/hlo.proto

    • インポート「tensorflow/compiler/xla/xla_data.proto」

xla_data.proto は他のファイルをインポートしないため、それを独自のパッケージに移動してインポート ループを中断できます。これは、buf の override 関数 を使用して行うことができます。これは最後の buf.gen.yaml ファイルです:

リーリー

buf を使用して tensorflow proto ファイルをコンパイルするための設定を完了する

これは最終的なディレクトリ構造です:

リーリー

buf.gen.yaml: 「tl;dr」セクションを参照してください。

buf.work.yaml:

リーリー

buf.yaml:

リーリー

これは私の環境です:

リーリー

次に、このディレクトリのルート ディレクトリで次のコマンドを実行します。 リーリー

コメント:

    tensorflow リポジトリは
  1. testdata ディレクトリにクローンされるため、go build はそれらを無視します。
  2. インストール プログラムは、
  3. internal ディレクトリにファイルを生成します。 buf.gen.yaml ファイルを変更して、任意の場所に配置できます。
  4. go build ./... はエラーを報告しません。ただし、生成されたファイルが有効かどうかはわかりません。

以上がtensorflow protobuf のインポートサイクルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。