👻
Tensorflow ServingのgRPCクライアントをGoで実装するのに必要なコード生成について
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です。
Discussion