👻

Tensorflow ServingのgRPCクライアントをGoで実装するのに必要なコード生成について

2 min read

Tensorflow ServingのgRPCクライアントをGo言語(バージョン: 1.14.2)で実装するのに必要なコード生成を行う手順を共有します。protocのインストールや、その他のgo getで入れる必要のあるものについては省略しています。

まずtensorflowのコードを取得して、go generateでコード生成できるようにlibtensorflowをビルドします。

ghq get https://github.com/tensorflow/tensorflow.git
cd ${GOPATH}/src/github.com/tensorflow/tensorflow
git checkout -b v2.3.1 refs/tags/v2.3.1
bazel build -c opt //tensorflow/tools/lib_package:libtensorflow
tar xzvf bazel-bin/tensorflow/tools/lib_package/libtensorflow.tar.gz -C /usr/local

gRPC用のコード生成する場合go generateする前にファイルを変更しておくと手間が省けます。

/tensorflow/go/genop/generate.sh
@@ -54,6 +54,7 @@ export PATH=$PATH:${GOPATH}/bin
 mkdir -p ../vendor
 for FILE in ${TF_DIR}/tensorflow/core/framework/*.proto \
     ${TF_DIR}/tensorflow/core/protobuf/*.proto \
+    ${TF_DIR}/tensorflow/core/example/*.proto \
     ${TF_DIR}/tensorflow/stream_executor/*.proto; do
   ${PROTOC} \
     -I ${TF_DIR} \

go generateでコード生成させます。

go generate github.com/tensorflow/tensorflow/tensorflow/go/op

$GOPATH/src/github.com/tensorflow/tensorflow/tensorflow/go/vendorにgRPCに必要なコードが生成されます。他にもコード生成されますが、今回は関係ありません。

次にTensorflow Servingから必要なコードを生成します。

ghq get https://github.com/tensorflow/serving.git
cd ${GOPATH}/src/github.com/tensorflow/serving
git checkout -b 2.3.0 refs/tags/2.3.0
cd ..
mv tensorflow/tensorflow/go/op/vendor .
PROTOC_OPTS='-I tensorflow -I serving --go_out=plugins=grpc:vendor'
eval "protoc $PROTOC_OPTS serving/tensorflow_serving/apis/*.proto"
eval "protoc $PROTOC_OPTS serving/tensorflow_serving/config/*.proto"
eval "protoc $PROTOC_OPTS serving/tensorflow_serving/util/*.proto"
eval "protoc $PROTOC_OPTS serving/tensorflow_serving/sources/storage_path/*.proto"
rm  vendor/tensorflow_serving/apis/prediction_log.pb.go
mv vendor ${GOPATH}/src/path/to/project/

毎回WARNING: Missing 'go_package' option inが出ますが、コードは生成されています。prediction_log.pb.goがあるとビルド時にエラーが出るのと、使用していないコードだったので削除しています。vendor移動後はプロジェクトの構造は以下のようになっているとします。

プロジェクトの構造
.
├── main.go
└── vendor
    ├── github.com
    └── tensorflow_serving

以上で準備完了です。google.golang.org/grpcなどをgo getして、main.goを実装してからgo buildすればOKです。