Maison > développement back-end > Golang > le corps du texte

Cycle d'importation dans Tensorflow Protobuf

王林
Libérer: 2024-02-06 11:09:07
avant
549 Les gens l'ont consulté

张量流 Protobuf 中的导入周期

Contenu de la question

J'essaie d'écrire du code client pour communiquer avec le serveur Tensorflow. J'ai besoin de protobufs Golang compilés pour tensorflowtensorflow_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
Copier après la connexion

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
Copier après la connexion

Veuillez noter que tout ce qui se trouve sous tensorflowtensorflow_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?


Bonne réponse


tl;dr

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
Copier après la connexion

Configuration complète pour la compilation de fichiers proto tensorflow à l'aide de buf

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
Copier après la connexion

buf.gen.yaml : Voir la section "tl;dr".

buf.work.yaml :

version: v1
directories:
  - testdata/serving
  - testdata/tensorflow
Copier après la connexion

buf.yaml :

version: v1
breaking:
  use:
    - file
lint:
  use:
    - default
Copier après la connexion

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
Copier après la connexion

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 ./...
Copier après la connexion

Remarques :

    Les référentiels
  1. tensorflow clonés dans testdata 目录中,以便 go build les ignoreront.
  2. L'installateur créera internal 目录中生成文件。您可以修改 buf.gen.yaml des fichiers pour les placer où vous le souhaitez.
  3. 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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!