TensorFlow Serving | GPU & Batch
概述
为了更快的响应用户请求,可以在 GPU 服务器上部署 Serving,也可以通过配置 Batching 相关参数来调优。
TensorFlow Serving With GPUs
1、安装 nvidia-docker
使用 GPU 部署 Serving 之前,除了安装 Docker,还需如下操作
- 更新系统适配的 NVIDIA 驱动程序
- 安装
nvidia-docker
,参考文档: nvidia-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 作业,请选择一个较大的值(可能是几秒钟),以确保良好的吞吐量,但是不要设置太大。