Ich versuche, Client-Code für die Kommunikation mit dem Tensorflow-Server zu schreiben. Ich brauche Golang-Protobufs, die für tensorflow
和 tensorflow_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 tensorflow
和 tensorflow_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?
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
├── 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
$ 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
$ 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:
testdata
目录中,以便 go build
internal
目录中生成文件。您可以修改 buf.gen.yaml
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!