bojone / bert4keras

keras implement of transformers for humans
https://kexue.fm/archives/6915
Apache License 2.0
5.37k stars 927 forks source link

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

Open wangzeyao opened 4 years ago

wangzeyao commented 4 years ago

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

基本信息

核心代码

使用example 里的 autotile_csl

自我尝试

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

bojone commented 4 years ago

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

wangzeyao commented 4 years ago

推断时有用显卡么?还是纯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]

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

bojone commented 4 years ago

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

wangzeyao commented 4 years ago

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

bojone commented 4 years ago

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

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

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

luoy2 commented 4 years ago

推断时有用显卡么?还是纯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

zhnglicho commented 4 years ago

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

liprais commented 4 years ago

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

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

zhnglicho commented 4 years ago

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

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

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

wangzeyao commented 4 years ago

推断时有用显卡么?还是纯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被占用,进程也能查到但推断速度依然很慢,后面改用抽取式了,效果还好一点,谢谢回复

HQH981118 commented 4 years ago

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

dawson-chen commented 3 years ago

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

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

yuanXuX commented 3 years ago

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

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

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

WMeng1 commented 3 years ago

我用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,请问有大神遇到过这种问题么

luoyujiaye commented 2 years ago

请问, 模型是怎么转换成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 的问题。

junjianli106 commented 2 years ago

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