TensorFlow Serving | GPU & Batching 性能优化篇

作者: Anoyi

打开App

概述

为了更快的响应用户请求,可以在 GPU 服务器上部署 Serving,也可以通过配置 Batching 相关参数来调优。

TensorFlow Serving With GPUs

1、安装 nvidia-docker

使用 GPU 部署 Serving 之前,除了安装 Docker,还需如下操作

2、Docker 运行示例

docker run -d \
  --runtime nvidia \
  -p 8501:8501 \
  -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/model" \
  tensorflow/serving:latest-gpu

3、指定 GPU & 限制内存

在多块 GPU 的服务器上,指定使用某块或某几块 GPU,可以通过系统环境变量 CUDA_VISIBLE_DEVICES 来设置;若需使用单块 GPU 的部分内存,则可以用过 serving 的配置参数 --per_process_gpu_memory_fraction 来设置。

假设服务器上有 4 块 32GB 的 GPU,要使用第 1 和第 2 块 GPU,每块限制使用 16GB,示例:

docker run -d \
  --runtime nvidia \
  -p 8501:8501 \
  -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/model" \
  -e CUDA_VISIBLE_DEVICES="0,1" \
  tensorflow/serving:latest-gpu \
  --per_process_gpu_memory_fraction=0.5

--per_process_gpu_memory_fraction 设置每个进程占用 GPU 内存空间的百分比,取值范围是 0.0 ~ 1.0,默认值 0.0。若设置为 1.0,则会为 serving 分配所有 GPU 内存;若设置为 0.0,则会为 serving 自动分配一个值。

Batch Scheduling Parameters and Tuning

控制 Batch Scheduling 的参数如下:

  • max_batch_size:任何 Batch 的最大大小,该参数控制「吞吐量/延迟」的平衡,并且可以避免了 Batch 过大以至于超出了某些资源的限制(例:GPU 内存可以保存一批数据)。
  • batch_timeout_micros:执行 Batch 之前等待的最长时间(即使未达到 max_batch_size),该参数用于控制尾部延迟。
  • num_batch_threads:并行化程度,即同时处理的最大 Batch 数。
  • max_enqueued_batches:可以排入调度程序的 Batch 数量。通过拒绝需要很长时间才能到达的请求,而不是全部积压到队列,从而来限制排队延迟。

最佳的参数设置取决于系统、模型、系统、环境以及吞吐量、延迟等,最好通过实验测试来选择其值。下面的一些准则可能会帮助您选择更优解。

基本准则

首先,在进行实验时,应将 max_enqueued_batches 临时设置为非常高的值。然后,对于生产环境,请考虑将 max_enqueued_batches 设置为等于 num_batch_threads,以便最大程度地减少服务器上的排队延迟,使服务器始终保持忙碌状态。对于 Batch 作业,请将 max_enqueued_batches 设置为足够大的值,但也应该理性设置,避免内存不足导致系统崩溃。

其次,如果出于系统架构的原因,需要限制 Batch Size(例如:设置为 100、200 或 400,而不是介于 1 ~ 400 之间的任何值):如果使用 BatchingSession,则可以设置 allowed_batch_sizes 参数;否则,可以在回调代码中使用虚拟元素填充 Batch。

CPU 服务器

请考虑以下配置:num_batch_threads 等于 CPU 内核数; max_batch_size 值很高; batch_timeout_micros 设置为 0,然后使用 1 - 10 毫秒范围内的 batch_timeout_micros 值进行实验,0 可能是最佳值。

GPU 服务器

  • num_batch_threads 设置为 CPU 内核数;
  • 调整 max_batch_size 时,将 batch_timeout_micros 临时设置为非常高的值,在吞吐量和平均延迟之间达到所需的平衡,推荐设置为 100 - 10000;
  • batch_timeout_micros 的最佳值通常为几毫秒,具体取决于您的目标和上下文,在某些工作负载下,可以考虑设置为 0;对于 Batch 作业,请选择一个较大的值(可能是几秒钟),以确保良好的吞吐量,但是不要设置太大。

参考文档

看法

看法

昵称
邮箱