我需要做推论。没有训练,只是简单的推断。
在python3中,现在我的非常基本的tensorflow“纯推理”代码正在执行以下操作:
import tensorflow as tf # This is a 600MB library (at version 2.5)
from PIL import Image
import io
model = tf.saved_model.load('models/some-version')
infer = model.signatures['serving_default']
image = Image.open('someFile.jpg')
bytes = io.BytesIO()
image.save(bytes, format='JPEG')
inputs = [bytes.getvalue()]
predictions = infer(inputs=tf.constant(inputs))这可以很好地工作。但是我的问题是:这个tensorflow python3库太大了!现在大约600MB。每当一个新的tensorflow版本发布时,它就变得越来越大!使用tensorflow 2.3 (即使用swig而不是pybind)时,库大小约为300MB。然后它达到了400,500,最近是600MB (2.5版)!
当我使用golang绑定(而不是python)执行相同的推理调用时,我所需要的只是libtensorflow.so.2 (275MB)和libtensorflow_framework.so.2 (25MB)文件,它们比当前600MB的文件夹(/usr/local/lib/python3.9/site-packages/tensorflow).小得多
所以我真正的问题是:在python3中,我可以使用tensorflow进行推理而不会那么臃肿吗?
以前有一个contrib.predictor模块,但在TensorFlow1.15版本中就有了,tensorflow V2不再提供该模块。当然,tensorflow_lite总是存在的,但它们是不同的。在golang中,我可以使用“真正的”TF绑定,而不会如此臃肿(我的意思是,它仍然是275MB+25MB,但它仍然不到600MB,而且它不会在每个新版本中都保持增长)。
有没有人能够在使用python3中的TensorFlow2.5只做推理(不训练)的同时控制库的大小?
如果python中有任何"contrib“模块可以做到这一点,我会很乐意使用它。
谢谢!
发布于 2021-07-01 23:39:49
最后,我围绕C绑定构建了一个简单的python包装器,只有两个简单的函数:第一个函数使用TF_LoadSessionFromSavedModel()“加载”模型,第二个函数使用TF_SessionRun()“推断”我的输入。结果是更快的启动时间(使用python中的C绑定“加载”模型只需要76ms,而使用完整的tensorflow python模块加载模型需要5秒以上的时间,我猜是因为执行了更多的“检查”?奇怪,但我会接受它,因为它是一个改进)。由此产生的docker图像大小是300MB,而不是几乎1 GB。因此,这对我来说是有效的,目前。我只是有点失望,tensorflow项目似乎并不关心磁盘空间。其他一切看起来都很好!
https://stackoverflow.com/questions/68169561
复制相似问题