一般深度学习的模型安装的选项如下:
(1)本地服务器(Local Server)。
(2)云端服务器(Cloud Server)。
(3)边缘运算(IoT Hub):譬如要侦测全省的温度,我们会在各县市安装上千个传感器,每个IoT Hub会负责多个传感器的信号接收、初步过滤和分析,分析完成后再将数据送到数据中心。
呈现的方式可能是网页、手机App或桌面程序,以下先就网页开发作一说明。
若是自行开发网页程序,并且安装在本地服务器的话,可以运用Python套件,例如Django、Flask或Streamlit,快速建立网页。其中Streamlit最为简单,不需要懂HTML/CSS/Javascript,只靠Python一招半式就可以搞定一个初阶的网站,以下我们实际建立一个手写阿拉伯数字的辨识网站。
(1)安装Streamlit套件:pip install streamlit。
(2)执行此Python程序,必须以streamlit run开头,而非python执行,例如,streamlit run 05_07_web.py。
(3)网页显示后,拖曳myDigits目录内的任一文件至画面中的上传图片文件区域,就会显示辨识结果,也可以使用绘图软件书写数字。
程序代码说明如下。
完整程序请参阅【05_07_web.py】。
(1)加载相关套件。
(2)模型加载:其中@st.cache可以将模型存储至快取(Cache),避免每一次请求都至硬盘读取,拖慢预测速度。
(3)上传图文件。
(4)文件上传后,执行下列工作。
第24~28行:把图像缩小成宽高各为(28, 28)。
第31行:RGB的白色为255,但训练数据MNIST的白色为0,故需反转颜色。
第34行:辨识上传文件。
TorchServe与TensorFlow Serving类似,直接提供一个具有弹性且强大的网页服务,支持平行处理、分散处理及批处理,架构如图5.1所示。
图5.1 TorchServe系统架构,图片来源:TorchServe GitHub [8]
TorchServe安装非常复杂,笔者花了一天才测试成功,详细说明可参阅TorchServe官网 [9] 。依照TorchServe GitHub说明,安装及使用程序如下。
(1)安装Java Run Time(JRE),必须为v.11版以上(https://download.java.net/java/GA/jdk11/9/GPL/openjdk-11.0.2_windows-x64_bin.zip),并在环境变量Path中加入C:\Program Files\Java\jdk-11.0.2\bin,在环境变量CLASSPATH中加入C:\Program Files\Java\jdk-11.0.2\lib。
(2)安装TorchServe,指令如下。 注意,官网漏列captum套件安装,未安装时会出现错误信息“Load model failed” :
pip install torchserve torch-model-archiver torch-workflow-archiver captum
(3)下载TorchServe GitHub原始码:https://github.com/pytorch/serve.git。
(4)复制模型:建立model_store子目录,自https://download.pytorch.org/models/densenet161-8d451a50.pth下载训练好的DenseNet模型至model_store子目录,注意,必须是torch.save(model.state_dict(), "model.pt"),而非torch.save(model, 'model.pt')。
(5)在serve目录下开启cmd或终端机,产生模型存盘(Archive):会产生densenet161.mar文件,笔者已将下列指令存成archive.bat。
torch-model-archiver --force --model-name densenet161 --version 1.0 --model-file examples\image_classifier\densenet_161\model.py --serialized-file model_store\densenet161-8d451a50.pth --extra-files examples\image_classifier\index_to_name.json --handler image_classifier --export-path=model_store
(6)启动TorchServe服务器端:注意有无错误信息,默认会启动三个worker,笔者已将下列指令存成run.bat,参数--ncs会忽略上次执行的组态文件,预设为背景(Background)执行:
torchserve --start --ncs --model-store model_store --models densenet161.mar
(7)再安装Google RPC (GRPC)相关套件,以利联机TorchServe服务器:
pip install -U grpcio protobuf grpcio-tools
(8)产生GRPC客户端组态文件,笔者已将下列指令存成generate_inference_client.bat:
python -m grpc_tools.protoc --proto_path=frontend/server/src/main/resources/proto/--python_out=ts_scripts --grpc_python_out=ts_scripts frontend/server/src/main/resources/proto/inference.proto frontend/server/src/main/resources/proto/management.proto
(9)预测:指定一张图片(kitten.jpg),送出请求,笔者已将下列指令存成inference.bat:
python ts_scripts/torchserve_grpc_client.py infer densenet161 examples/image_classifier/kitten.jpg
执行结果:如下,预测为虎斑猫(tabby),概率为46%。
(10)停止TorchServe服务器执行。
torchserve --stop
范例.使用模型辨识MNIST,说明如何运作自定义的模型服务。
程序参阅serve\examples\image_classifier\mnist\README.md,整理如下,相关文件均位于serve\examples\image_classifier\mnist目录:
(1)建立模型结构:内容如mnist.py。
(2)准备训练好的模型文件:mnist_cnn.pt。
(3)输入数据处理:内容如mnist_handler.py。
(4)产生模型存盘(Archive):会产生mnist.mar文件。
torch-model-archiver --model-name mnist --version 1.0 --model-file examples/image_classifier/mnist/mnist.py --serialized-file examples/image_classifier/mnist/mnist_cnn.pt--handler examples/image_classifier/mnist/mnist_handler.py --export-path=model_store
(5)启动TorchServe服务器端:注意有无错误信息。
torchserve --start --ncs --model-store model_store --models mnist.mar
(6)预测:指定一张图片(2.png),送出请求。
python ts_scripts/torchserve_grpc_client.py infer mnist examples\image_classifier\mnist\test_data\2.png
执行结果:2,辨识无误,如果要使用自己的图像,注意要黑白反转。
由上述范例可以看出Server端完全不必编写程序,非常方便。但是,前置安装要细心处理,忽略一个步骤,可能就会发生错误,serve\examples目录下还有很多的范例模型,读者可以自己试试看。