I am trying to write client code to talk to a tensorflow server. I need the golang compiled protobufs for tensorflow and tensorflow_serving. These are not easy to come by, I managed to do so through this. Basically, using buf to generate them. Here is the 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
This runs successfully, but running the application logs:
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
Note that everything under tensorflow and tensorflow_serving is directly compiled from the original repositories.
It is surprising to me that something as widely used as tensorflow should have an import cycle, but maybe it does. How can I resolve this?
TL;DR
The root cause is that the repositry https://github.com/tensorflow/tensorflow does not organize the proto files correctly (or at least does not make it friendly for Go).
The following two files lead to the import cycle (
xla->xla/service->xla) in Go:tensorflow/compiler/xla/xla.protoimport "tensorflow/compiler/xla/service/hlo.proto"tensorflow/compiler/xla/service/hlo.protoimport "tensorflow/compiler/xla/xla_data.proto"Since
xla_data.protodoes not import any other files, we can move it into its own package to break the import cycle. We can utilize the override feature of buf to do this. Here is the finalbuf.gen.yamlfile:The Full Setup to Compile Tensorflow proto Files with buf
Here is the final directory structure:
buf.gen.yaml: see the "TL;DR" section.
buf.work.yaml:
buf.yaml:
Here is my environment:
Now execute the following commands in the root of this directory:
Notes:
testdatadirectory so thatgo buildwill ignore them.internaldirectory. You can modify thebuf.gen.yamlfile to place them anywhere you want.go build ./...does not report any error. But I'm not sure whether the generated files are valid or not.