Heim  >  Artikel  >  Backend-Entwicklung  >  Importzyklus in Tensorflow Protobuf

Importzyklus in Tensorflow Protobuf

王林
王林nach vorne
2024-02-06 11:09:07568Durchsuche

张量流 Protobuf 中的导入周期

Frageninhalt

Ich versuche, Client-Code für die Kommunikation mit dem Tensorflow-Server zu schreiben. Ich brauche Golang-Protobufs, die für tensorflowtensorflow_serving kompiliert wurden. Nichts davon ist einfach, ich habe es dadurch geschafft. Verwenden Sie grundsätzlich buf, um sie zu generieren. Das ist buf yaml:

version: v1
managed:
  enabled: true
  optimize_for: code_size

  # go
  go_package_prefix:
    default: "some/path"

plugins:
  - plugin: buf.build/protocolbuffers/go
    out: gen/proto/go

Erfolgreich ausgeführt, aber Anwendungsprotokoll wird ausgeführt:

 package command-line-arguments
     imports my-package/internal/infer
     imports my-package/internal/infer/tensorflow_serving/apis
     imports my-package/internal/infer/tensorflow/core/protobuf
     imports my-package/internal/infer/tensorflow/compiler/xla/stream_executor
     imports my-package/internal/infer/tensorflow/compiler/xla
     imports my-package/internal/infer/tensorflow/compiler/xla/service
     imports my-package/internal/infer/tensorflow/compiler/xla: import cycle not allowed

Bitte beachten Sie, dass alles unter tensorflowtensorflow_serving direkt aus dem Original-Repository kompiliert wird.

Es überrascht mich, dass etwas, das so weit verbreitet ist wie Tensorflow, einen Importzyklus haben sollte, aber vielleicht ist das der Fall. Wie kann ich dieses Problem lösen?


Richtige Antwort


tl;dr

Die Hauptursache ist, dass das Repository https://www.php.cn/link/1a16abf2a3149fc7cd6083687cce01c2 die Originaldateien wirklich nicht richtig organisiert (oder es zumindest nicht benutzerfreundlich macht).

Die folgenden zwei Dateien verursachen eine Importschleife in go (xla->xla/service->xla):

  • tensorflow/compiler/xla/xla.proto

    • import "tensorflow/compiler/xla/service/hlo.proto"
  • tensorflow/compiler/xla/service/hlo.proto

    • import "tensorflow/compiler/xla/xla_data.proto"

Da xla_data.proto keine anderen Dateien importiert, können wir es in ein eigenes Paket verschieben, um die Importschleife zu unterbrechen. Wir können dies mithilfe der Overlay-Funktion von buf tun. Dies ist die endgültige buf.gen.yaml-Datei: xla_data.proto 不导入任何其他文件,我们可以将其移动到自己的包中以打破导入循环。我们可以利用 buf 的 覆盖功能做这个。这是最终的 buf.gen.yaml

version: v1
managed:
  enabled: true
  go_package_prefix:
    default: example.com/mymodule/internal
  override:
    go_package:
      # move the generated xla_data.pb.go file into package xla/data to break the import cycle.
      tensorflow/compiler/xla/xla_data.proto: 'example.com/mymodule/internal/tensorflow/compiler/xla/data'
plugins:
  - name: go
    out: internal
    opt:
      - module=example.com/mymodule/internal

  - name: go-grpc
    out: internal
    opt:
      - module=example.com/mymodule/internal

Komplettes Setup zum Kompilieren von Tensorflow-Protodateien mit buf

Dies ist die endgültige Verzeichnisstruktur:

├── buf.gen.yaml
├── buf.work.yaml
├── buf.yaml
├── go.mod
├── go.sum
├── internal
│   ├── tensorflow
│   └── tensorflow_serving
└── testdata
    ├── serving
    └── tensorflow

buf.gen.yaml: Siehe Abschnitt „tl;dr“.

buf.work.yaml:

version: v1
directories:
  - testdata/serving
  - testdata/tensorflow

buf.yaml:

version: v1
breaking:
  use:
    - file
lint:
  use:
    - default

Das ist meine Umgebung:

$ go version
go version go1.20.3 linux/amd64
$ buf --version
1.17.0
$ protoc --version
libprotoc 3.12.4
$ protoc-gen-go --version
protoc-gen-go v1.30.0
$ protoc-gen-go-grpc --version
protoc-gen-go-grpc 1.3.0
$ git version
git version 2.37.2

Führen Sie nun den folgenden Befehl im Stammverzeichnis dieses Verzeichnisses aus:

$ go mod init example.com/mymodule
$ go get google.golang.org/grpc
$ git clone https://www.php.cn/link/1a16abf2a3149fc7cd6083687cce01c2.git testdata/tensorflow
$ git clone https://github.com/tensorflow/serving.git testdata/serving
$ buf generate
$ go build ./...

Notizen:

    Tensorflow-Repositories, die in
  1. geklont wurden, ignorieren sie. testdata 目录中,以便 go build
  2. Das Installationsprogramm
  3. Dateien, um sie an der gewünschten Stelle zu platzieren. internal 目录中生成文件。您可以修改 buf.gen.yaml
  4. Es werden keine Fehler gemeldet. Ich bin mir jedoch nicht sicher, ob die generierte Datei gültig ist. go build ./...

Das obige ist der detaillierte Inhalt vonImportzyklus in Tensorflow Protobuf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen