环境:Ubuntu16.04 LTS
Docker 18.09.7
Nvidia-docker2 2.0.3
Nvidia-container-runtime 2.0.0
Nvidia driver 390.87
CUDA 9.0
CUDNN 7.1
Tensorflow-serving:1.12.0-gpu
NVIDIA driver的安装请参考链接:【Linux】Ubuntu16.04安装NVIDIA驱动390.87。
CUDA和CUDNN的安装请参考链接:【CUDA】linux ubuntu16.04 卸载cuda8.0 安装cuda9.0。
Docker的安装请参考链接:【Docker】Ubuntu16.04安装docker。
Nvidia-docker2的安装请参考链接:【Docker】Ubuntu16.04安装nvidia-docker2。
先查看一下docker的信息。
docker version
这里我使用的tensorflow serving 1.12.0-gpu的版本。
docker pull tensorflow/serving:1.12.0-gpu
这里下载源码是因为源码里有可以直接测试的模型。
git clone https://github.com/tensorflow/serving
为了和tensorflow serving镜像的版本保持一致,clone源码之后我将源码也切换到r1.12分支上。
git checkout r1.12
这里使用的RESTful API的方式。更多内容请参考RESTful API。
docker run --runtime=nvidia --rm -p 8501:8501 \
-v "/home/myworl/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu:/models/half_plus_two" \
-e MODEL_NAME=half_plus_two \
-t tensorflow/serving:1.12.0-gpu &
另一种写法:
docker run --runtime=nvidia --rm -p 8501:8501 \
--mount type=bind,\
source=/home/myworl/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_gpu,\
target=/models/half_plus_two \
-e MODEL_NAME=half_plus_two -t tensorflow/serving &
几点说明:
1. --runtime=nvidia, 修改docker的Runtime为nvidia runtime工作。
2. --rm表示如果实例已经存在,则先remove掉该实例再重新启动新实例。
3. -p,指定主机到docker容器的端口映射。
4. -e,设置环境变量。
5. -t,指定的是挂载到哪个容器。
6. -v,docker数据卷,挂载宿主机的一个目录。
比如这里是将我下载的tensorflow serving的源码目录下的saved_model_half_plus_two_gpu挂载到docker容器的/models/half_plus_two。tensorflow_model_server会自动在这个目录下去加载模型。
7. --mount,也是进行挂载,老版本的docker没有--mount这个命令。
source:指定要运行部署的模型地址,也就是挂载的源,这个是在宿主机上的servable模型目录(pb格式模型而不是checkpoint模型)。
saved_model_half_plus_two_gpu的文件结构应该是这样。
saved_model_half_plus_two_gpu下有一个文件夹00000123,这个表示模型的版本号。00000123下面有一个pb模型和一个variables文件夹。
target: 这个是要挂载的目标位置,就是挂载到docker容器中的哪个位置,这是docker容器中的目录,模型默认挂在/models/目录下,如果改变路径会出现找不到model的错误。
注意:--mount后面的几个“,”不能有空格。
成功运行模型之后,终端输出如下信息:
另开一个终端,输入
curl -d '{"instances": [1.0, 2.0, 5.0]}' \
-X POST http://localhost:8501/v1/models/half_plus_two:predict
输出:
说明已经成功调用到模型了。