Maison > Article > développement back-end > Cycle d'importation dans Tensorflow Protobuf
J'essaie d'écrire du code client pour communiquer avec le serveur Tensorflow. J'ai besoin de protobufs Golang compilés pour tensorflow
和 tensorflow_serving
. Rien de tout cela n’est facile, je l’ai fait grâce à ça. En gros, utilisez buf pour les générer. C'est 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
Exécution réussie, mais journal des applications en cours d'exécution :
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
Veuillez noter que tout ce qui se trouve sous tensorflow
和 tensorflow_serving
est compilé directement à partir du référentiel d'origine.
Cela me surprend que quelque chose d'aussi largement utilisé que Tensorflow devrait avoir un cycle d'importation, mais peut-être que c'est le cas. Comment puis-je résoudre ce problème?
La cause première est que le référentiel https://www.php.cn/link/1a16abf2a3149fc7cd6083687cce01c2 n'organise vraiment pas correctement les fichiers d'origine (ou du moins ne le rend pas convivial).
Les deux fichiers suivants provoquent une boucle d'importation en 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"
Étant donné que xla_data.proto
n'importe aucun autre fichier, nous pouvons le déplacer dans son propre package pour rompre la boucle d'importation. Nous pouvons le faire en utilisant la fonction de superpositionxla_data.proto
不导入任何其他文件,我们可以将其移动到自己的包中以打破导入循环。我们可以利用 buf 的 覆盖功能做这个。这是最终的 buf.gen.yaml
de buf. Voici le fichier final 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
Voici la structure de répertoire finale :
├── buf.gen.yaml ├── buf.work.yaml ├── buf.yaml ├── go.mod ├── go.sum ├── internal │ ├── tensorflow │ └── tensorflow_serving └── testdata ├── serving └── tensorflow
buf.gen.yaml : Voir la section "tl;dr".
buf.work.yaml :
version: v1 directories: - testdata/serving - testdata/tensorflow
buf.yaml :
version: v1 breaking: use: - file lint: use: - default
Voici mon environnement :
$ 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
Exécutez maintenant la commande suivante à la racine de ce répertoire :
$ 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 ./...
Remarques :
testdata
目录中,以便 go build
les ignoreront. internal
目录中生成文件。您可以修改 buf.gen.yaml
des fichiers pour les placer où vous le souhaitez. go build ./...
Aucune erreur ne sera signalée. Mais je ne sais pas si le fichier généré est valide. Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!