美文网首页
TensorFlow Serving | GPU & Batch

TensorFlow Serving | GPU & Batch

作者: Anoyi | 来源:发表于2020-11-25 18:07 被阅读0次

    概述

    为了更快的响应用户请求,可以在 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 作业,请选择一个较大的值(可能是几秒钟),以确保良好的吞吐量,但是不要设置太大。

    参考文档

    相关文章

      网友评论

          本文标题:TensorFlow Serving | GPU & Batch

          本文链接:https://www.haomeiwen.com/subject/cgviiktx.html