This is a WIP!
This project creates a TF Serving API server to serve the excellent Google Parsey McParseface Tensorflow Model.
The upstream project for that model is:
https://github.com/tensorflow/models/tree/master/syntaxnet
However, some modifications to make it usable within TF Serving are in my fork:
https://github.com/dmansfield/models/tree/documents-from-tensor
I don't much like submodules, and anyway the various projects involved (tensorflow, tensorflow serving and tensorflow models) have conflicting submodule revisions.
Here are my build steps:
# gcc 6.1.1 on Fedora 24, bazel 0.3.0
cd /some/path
mkdir api
cd api
pwd # This is the $BASE referenced below
git clone https://github.com/tensorflow/tensorflow.git
git clone https://github.com/dmansfield/models.git
git clone https://github.com/dmansfield/parsey-mcparseface-api.git
git clone https://github.com/tensorflow/serving.git
cd tensorflow
./configure
Answer the questions.
cd ../models
git checkout documents-from-tensor
cd syntaxnet
rm -rf tensorflow
ln -s ../../tensorflow .
cd ../../serving
rm -rf tensorflow tf_models
ln -s ../tensorflow
ln -s ../models .
cd ../parsey-mcparseface-api
vi WORKSPACE
Now edit the tf_workspace hardcoded path (line 19) to point to the $BASE/tensorflow
directory. And then you can start the build, which takes about 20 minutes on my system.
bazel build -c opt parsey_api/...
Then run it:
./bazel-bin/parsey_api/parsey_api --port=9000 parsey_model
For the client, setup is easy:
# node 6.2.0 installed using nvm
cd parsey_client
npm install
Run it with the client (note: the server address 127.0.0.1:9000 is hard-coded into the client. Edit as necessary.
cd parsey_client
node index.js
Good luck and feel free to ask questions via github.
I've included an exported model in the parsey_model/ directory.
To recreate this, you must use the parsey_mcparseface.py script in the tensorflow models fork. To run that, you'll need to fudge the PYTHONPATH. I'm no expert on a great way to do that, I currently end up pointing to something horrible underneath the bazel cache like (fix to your .cache):
export PYTHONPATH=.../.cache/bazel/_bazel_root/235fbe2e0db6dc63104db4cf913de6ec/execroot/serving/bazel-out/local-fastbuild/bin/tensorflow_serving/session_bundle/session_bundle_py_test.runfiles/tf_serving/
Someone can help me here?
Host and port are hardcoded in nodejs client.
Assets that are loaded by the module are loaded based on CWD of serving process, and are required in "syntaxnet/models/parsey_mcparseface" directory, even though they are not probably located there. Current solution is to use a symlink.
It seems to not be threadsafe. If multiple requests are submitted simultaneously it crashes.