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

Importzyklus in Tensorflow Protobuf

王林
Freigeben: 2024-02-06 11:09:07
nach vorne
582 Leute haben es durchsucht

张量流 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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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
Nach dem Login kopieren

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

buf.work.yaml:

version: v1
directories:
  - testdata/serving
  - testdata/tensorflow
Nach dem Login kopieren

buf.yaml:

version: v1
breaking:
  use:
    - file
lint:
  use:
    - default
Nach dem Login kopieren

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
Nach dem Login kopieren

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 ./...
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage