python - 有没有办法在没有完整的 tensorflow python 库的情况下仅使用 tensorflow.saved_model.load() 进行推理
问题描述
我需要做推理。没有训练,只是简单的推理。
在 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)进行相同的推理调用时,我需要的只是比当前 600MB 文件夹小得多的 libtensorflow.so.2 (275MB) 和 libtensorflow_framework.so.2 (25MB) 文件( /usr/local/lib/python3.9/site-packages/tensorflow)。
所以我真正的问题是:在 python3 中,我可以使用 tensorflow 进行推理而不会产生所有的膨胀吗?
曾经有一个 contrib.predictor 模块,但它在 tensorflow 中直到 1.15,不再适用于 tensorflow V2。并且肯定总是有 tensorflow_lite,但那些不一样。在 golang 中,我可以使用“真正的” TF 绑定而不会有太多的膨胀(我的意思是,它仍然是 275MB+25MB,但这仍然小于 600MB,而且它不会在每个新版本中都保持增长)。
在 python3 中使用 tensorflow 2.5 仅进行推理(无训练)时,是否有人能够检查库大小?
如果python中有任何“contrib”模块可以这样做,我很乐意使用它。
谢谢!
解决方案
我最终围绕 C 绑定构建了一个简单的 python 包装器,只有两个简单的函数:第一个使用 TF_LoadSessionFromSavedModel()“加载”模型,第二个使用 TF_SessionRun()“推断”我的输入。结果是更快的启动时间(使用 python 中的 C 绑定“加载”模型只需要 76 毫秒,而使用完整的 tensorflow python 模块加载它需要超过 5 秒,我猜是因为更多正在执行“检查”?很奇怪,但我会接受它,因为它是一种改进)。生成的 docker 映像大小为 300MB,而不是几乎 1 GB。所以这对我有用,现在。我对 tensorflow 项目似乎不太关心磁盘空间感到有点失望。其他一切似乎都很好!
推荐阅读
- python - 当这个问题出现时,如果我想继续我的代码怎么办?RuntimeError:未找到最佳参数
- django - 如何在 DRF 中创建多个实例?
- python - 如何使用 python 从 Cardinal Scale 头的串口读取序列值?
- css - 是否可以通过另一个元素的值设置元素的 CSS 值?
- docker - Traefik 2 仪表板自定义上下文路径
- javascript - 如何在角度中使超级参数可选?
- excel - 依赖于范围内另一个动态单元格的单元格的值
- reactjs - onChange 事件在移动设备上不起作用
- qaf - 无法从soap api响应验证xpath
- ios - 在图表中绘制负值时,在 swift UI “无效的框架尺寸(负或非有限)”中面临错误