Skip to content

Commit

Permalink
[Docs] Update SessionGroup document. (DeepRec-AI#311)
Browse files Browse the repository at this point in the history
  • Loading branch information
shanshanpt authored Jul 13, 2022
1 parent fc005bd commit 3d1b640
Showing 1 changed file with 32 additions and 7 deletions.
39 changes: 32 additions & 7 deletions docs/SessionGroup.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,22 @@
## 简介
当前Inference场景中,无论用户直接使用TFServing还是使用TF提供的C++接口调用Session::Run,都无法实现多个Session并发处理Request,导致单个Session无法很好的实现CPU or GPU的有效利用。用户如果通过多Instance方式(多进程),无法共享底层的Variable,导致大量使用内存,并且每个Instance各自加载一遍模型,严重影响资源的使用率和模型加载效率。

SessionGroup功能提供了可以配置一组Session,并且将Request通过Round Robin方式分发到某一个Session。SessionGroup中的每个Session有私有的线程池,并且支持每个线程池绑定底层的CPU Core,这样可以最大程度的避免共享资源导致的锁冲突开销。SessionGroup中唯一共享的资源是Variable,所有Session共享底层的Variable,并且模型加载只需要加载一次。
SessionGroup功能提供了可以配置一组Session,并且将Request通过Round Robin(支持用户自定义策略)方式分发到某一个Session。SessionGroup中的每个Session有私有的线程池,并且支持每个线程池绑定底层的CPU Core,这样可以最大程度的避免共享资源导致的锁冲突开销。SessionGroup中唯一共享的资源是Variable,所有Session共享底层的Variable,并且模型加载只需要加载一次。

通过使用SessionGroup,可以解决内存占用大,但模型CPU使用率低的问题,大大提高CPU利用率。此外SessionGroup也可以在GPU场景下通过多Session并发执行,大大提高GPU的利用效率。
通过使用SessionGroup,可以解决内存占用大,但模型CPU使用率低的问题,大大提高资源利用率,在保证latency的前提下极大提高QPS。此外SessionGroup也可以在GPU场景下通过多Session并发执行,大大提高GPU的利用效率。

## 接口介绍

### 直接使用Session::Run场景调用SessionGroup
如果用户直接使用Session::Run方式实现的Serving,可以参考以下使用方式来使用SessionGroup。
如果用户使用Tensorflow Serving进行服务,可以使用我们提供的代码: [AlibabaPAI/serving](https://github.com/AlibabaPAI/serving/commits/deeprec),这里已经提供了接入SessionGroup的功能。也可以使用我们提供的[Processor](https://github.com/alibaba/DeepRec/tree/main/serving)代码,Processor没有提供RPC服务框架,需要用户完善,接入自有RPC框架中。

如果用户使用的是自有seving框架,那么需要做的修改如下。

### 1.直接Session::Run进行serving场景
在Inference场景下,如果用户直接使用Session::Run方式实现的Serving,可以参考以下使用方式来使用SessionGroup。

#### 创建SessionGroup

如果是手动创建Session::Run方式实现的Serving,那么将serving框架中NewSession改为NewSessionGroup。
session_num指定SessionGroup中创建多少个Session,用户可以通过评估当前单个Session的CPU利用率,判断需要创建多少个Session。比如如果当前单个Session CPU的最高利用率为20%,建议用户配置4个Session。

```c++
Expand All @@ -23,8 +28,9 @@ TF_RETURN_IF_ERROR(NewSessionGroup(*session_options_,
TF_RETURN_IF_ERROR((*session_group)->Create(meta_graph_def_.graph_def()));

```
参考代码: [Processor](https://github.com/alibaba/DeepRec/blob/main/serving/processor/serving/model_session.cc#L143)
#### Session Run
#### SessionGroup Run
用户原有代码使用Session::Run可以直接替换为SessionGroup::Run
Expand All @@ -33,7 +39,26 @@ status = session_group_->Run(run_options, req.inputs,
req.output_tensor_names, {}, &resp.outputs, &run_metadata);
```
参考代码: [Processor](https://github.com/alibaba/DeepRec/blob/main/serving/processor/serving/model_session.cc#L308)

### 2.通过SavedModelBundle进行serving场景
TFServing使用的是SavedModelBundle进行serving的,相关的代码修改参考:[SessionGroup](https://github.com/AlibabaPAI/serving/commit/8b92300da84652f00f13fd20f5df0656cfa26217),推荐直接使用我们提供的TFServing代码。

#### TFServing中使用SessionGroup

支持SessionGroup的TFServing代码见:[AlibabaPAI/serving](https://github.com/AlibabaPAI/serving/commits/deeprec)

编译文档见:[TFServing编译](https://deeprec.readthedocs.io/zh/latest/TFServing-Compile-And-Install.html)

使用方式如下:
```c++
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --tensorflow_intra_op_parallelism=16 --tensorflow_inter_op_parallelism=16 --use_per_session_threads=true --session_num_per_group=4 --model_base_path=/xxx/pb
```

### TFServing中使用SessionGroup
当前SessionGroup正在支持TFServing(正在开发中)
主要参数:
```c++
session_num_per_group:表示session group中创建几个sessions。

use_per_session_threads:为true表示每个session使用独立的线程池,减少session之间的干扰,建议配置为true。每个session的线程池都是通过tensorflow_intra_op_parallelis和tensorflow_inter_op_parallelism控制大小。
```

0 comments on commit 3d1b640

Please sign in to comment.