bert4keras icon indicating copy to clipboard operation
bert4keras copied to clipboard

请问部署tf serving 推断时间特别长可能的原因是什么呢?

Open wangzeyao opened this issue 4 years ago • 16 comments

提问时请尽可能提供如下信息:

基本信息

  • 你使用的操作系统: Ubuntu 16.04
  • 你使用的Python版本: 3.6.9
  • 你使用的Tensorflow版本: 1.15.0
  • 你使用的Keras版本: 2.4.3
  • 你使用的bert4keras版本: 0.7.4
  • 你使用纯keras还是tf.keras: tf.keras
  • 你加载的预训练模型: bert wwm

核心代码

使用example 里的 autotile_csl

自我尝试

模型保存后转换成pb+variable的格式部署到tf serving容器,GPU是V100,请求一次tf serving服务的时间为两秒多,请问是跟模型有关系吗?

wangzeyao avatar Jul 09 '20 06:07 wangzeyao

推断时有用显卡么?还是纯cpu?seq2seq的解码本身是慢一些。

bojone avatar Jul 11 '20 01:07 bojone

推断时有用显卡么?还是纯cpu?seq2seq的解码本身是慢一些。

你好,推断的时候用了V100的显卡。我的理解是beam search解码是在得到模型的输出后进行的。但是得到模型输出这个过程(通过向tf serving容器发送请求)就需要两秒多。比如说自动摘要的例子中,AutoTitle类里的predict函数:

start = time.time()
r = requests.post('url地址',data=test_data_json,headers=headers) # 向部署了模型的tf serving发送请求以获得模型输出,
end = time.time()
print(end-start)
out = np.array(json.loads(r.text)['outputs']) # 这里的out就等于原来的 model.predict([token_ids, segment_ids])
return out[:,1]

最终打印出来的时间基本在两秒左右

wangzeyao avatar Jul 13 '20 06:07 wangzeyao

那你测过直接预测时需要多长时间么?就是不包装为tf serving,直接在模型脚本那里预测。

bojone avatar Jul 13 '20 13:07 bojone

测过,模型输入到输出大概是0.02秒

wangzeyao avatar Jul 14 '20 06:07 wangzeyao

测过,模型输入到输出大概是0.02秒

这也太快了吧,我用RTX测,平均也要500ms左右~

如果你原来的预测没问题,那么tf serving我也帮不了你了,因为我也没搞过tf serving,不熟悉相关内容~

bojone avatar Jul 14 '20 06:07 bojone

推断时有用显卡么?还是纯cpu?seq2seq的解码本身是慢一些。

你好,推断的时候用了V100的显卡。我的理解是beam search解码是在得到模型的输出后进行的。但是得到模型输出这个过程(通过向tf serving容器发送请求)就需要两秒多。比如说自动摘要的例子中,AutoTitle类里的predict函数:

start = time.time()
r = requests.post('url地址',data=test_data_json,headers=headers) # 向部署了模型的tf serving发送请求以获得模型输出,
end = time.time()
print(end-start)
out = np.array(json.loads(r.text)['outputs']) # 这里的out就等于原来的 model.predict([token_ids, segment_ids])
return out[:,1]

最终打印出来的时间基本在两秒左右

tf serving 第一次启动的话, 需要warm up, 所以第一次预测会很慢, 但是接下来应该会比较快。 第二条是你确定你tf serving docker container是用上了gpu吗? 是不是按照官方的GPU教程pull的镜像, 且安装了 nvdia-docker?https://www.tensorflow.org/tfx/serving/docker

docker pull tensorflow/serving:latest-gpu
docker run --runtime=nvidia -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/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:latest-gpu &

我记得以前尝试的时候, 使用nvdia-docker 就没有办法使用docker-compose, 你可以试试跑推断的时候 watch -n0.1 nvidia-smi 看看你的GPU usage

luoy2 avatar Jul 15 '20 23:07 luoy2

请问, 模型是怎么转换成pb+variable的格式 ?

zhnglicho avatar Jul 30 '20 07:07 zhnglicho

请问, 模型是怎么转换成pb+variable的格式 ?

model.save(base + '/150k/1',save_format='tf')

liprais avatar Aug 03 '20 03:08 liprais

请问, 模型是怎么转换成pb+variable的格式 ?

model.save(base + '/150k/1',save_format='tf')

谢谢, 我已经找到了, 这是我的用法 https://github.com/ZhuiyiTechnology/pretrained-models/issues/5#issuecomment-667067036

zhnglicho avatar Aug 03 '20 05:08 zhnglicho

推断时有用显卡么?还是纯cpu?seq2seq的解码本身是慢一些。

你好,推断的时候用了V100的显卡。我的理解是beam search解码是在得到模型的输出后进行的。但是得到模型输出这个过程(通过向tf serving容器发送请求)就需要两秒多。比如说自动摘要的例子中,AutoTitle类里的predict函数:

start = time.time()
r = requests.post('url地址',data=test_data_json,headers=headers) # 向部署了模型的tf serving发送请求以获得模型输出,
end = time.time()
print(end-start)
out = np.array(json.loads(r.text)['outputs']) # 这里的out就等于原来的 model.predict([token_ids, segment_ids])
return out[:,1]

最终打印出来的时间基本在两秒左右

tf serving 第一次启动的话, 需要warm up, 所以第一次预测会很慢, 但是接下来应该会比较快。 第二条是你确定你tf serving docker container是用上了gpu吗? 是不是按照官方的GPU教程pull的镜像, 且安装了 nvdia-docker?https://www.tensorflow.org/tfx/serving/docker

docker pull tensorflow/serving:latest-gpu
docker run --runtime=nvidia -p 8501:8501 \
--mount type=bind,\
source=/tmp/tfserving/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:latest-gpu &

我记得以前尝试的时候, 使用nvdia-docker 就没有办法使用docker-compose, 你可以试试跑推断的时候 watch -n0.1 nvidia-smi 看看你的GPU usage

前段时间按照链接里的步骤试了一下,在容器里能看到GPU被占用,进程也能查到但推断速度依然很慢,后面改用抽取式了,效果还好一点,谢谢回复

wangzeyao avatar Aug 10 '20 06:08 wangzeyao

@wangzeyao 时间是不是主要花费在tensor数据的传输上面了?可以通过修改一下模型的输出,保证数据的传输是beam_search函数所必要的就足够了。

HQH981118 avatar Oct 16 '20 10:10 HQH981118

我用bert+crf在tf2.2和tf1.14上做过测试。 tf1.14版本模型在tf serving上慢了1倍,tf2.2的慢了3倍。

原因不太好分析,但感觉用原生tf1重构一下模型,然后把参数迁移过来应该可以解决。

dawson-chen avatar Apr 19 '21 12:04 dawson-chen

我用bert+crf在tf2.2和tf1.14上做过测试。 tf1.14版本模型在tf serving上慢了1倍,tf2.2的慢了3倍。

原因不太好分析,但感觉用原生tf1重构一下模型,然后把参数迁移过来应该可以解决。

请问tf1.14是怎么把模型存为pb格式的?

yuanXuX avatar Jul 20 '21 04:07 yuanXuX

我用bert+crf在tf2.2和tf1.14上做过测试。 tf1.14版本模型在tf serving上慢了1倍,tf2.2的慢了3倍。 原因不太好分析,但感觉用原生tf1重构一下模型,然后把参数迁移过来应该可以解决。

请问tf1.14是怎么把模型存为pb格式的?

tf1.15的tf.keras有内置的保存.pb的方法;我部署的模型在跑批处理的时候推理速度奇慢,看了资源管理发现容器占用的CPU和内存都很低,CPU在10%几,内存占用1G,请问有大神遇到过这种问题么

WMeng1 avatar Aug 11 '21 00:08 WMeng1

请问, 模型是怎么转换成pb+variable的格式 ?

model.save(base + '/150k/1',save_format='tf')

谢谢, 我已经找到了, 这是我的用法 ZhuiyiTechnology/pretrained-models#5 (comment)

请问一下, 你在用这种方法生成pb模型之后, 通过tf serving部署, 有没有遇到 Input to reshape is a tensor with XXX values, but the requested shape has XX 的问题。

luoyujiaye avatar Jan 13 '22 06:01 luoyujiaye

@wangzeyao 请问最后解决了挂载到tf-serving后推理速度较长的原因了吗?

junjianli106 avatar Aug 23 '22 01:08 junjianli106