Created by: barrierye
更新
-
去除了pipeline profiler对用户无用的信息
- 各个op的get data、push data耗时信息
- virtual op操作耗时信息
- pipeline service push data、fetch data的耗时信息
这些信息不应该由用户感知(可能会让用户感到困惑),而是仅作为框架优化使用。
-
pipeline.yml 添加 channel size 配置的支持
-
【接口改动】 op添加 load_private_obj 接口,让每个op线程创建单独的实例资源。同时preprocess、process、postprocess添加入参 private_obj我们不建议在线程版中开op并发 -
【代码结构改动】 重构pipeline server,将dag部分分离出来,便于后续进程化service;并修改了一些变量名以增强易读性
-
【接口改动】 init_op函数添加concurrency_idx入参(为了让某些GPU模块在并发时放在不同卡上)用户可以通过self.concurrency_idx 获取当前线程(进程)的index -
进程版可以使用profiler
-
添加进程版Servicer配置选项,支持启动多个servicer进程
(每来一个rpc请求,重新构建DAG,支持线程/进程版op)每个进程维护一个size=1的线程池+一个DAG Executor -
让 pipeline.yaml 文件各变量更加友好
port: gRPC端口号 worker_num: gRPC线程池大小(进程版 Servicer 中为进程数 & 每个进程中的线程池大小),`默认为1` build_dag_each_worker: 是否使用进程版 Servicer,`默认为false` dag: is_thread_op: 是否使用线程版Op,`默认为true` client_type: 使用 brpc 或 grpc client,`默认为brpc` retry: DAG Executor 在失败后重试次数,`默认为1` use_profile: 是否在 Server 端打印日志,`默认为false`
-
支持从client端获取profile,日志将打在标准输出
client.predict(feed_dict, fetch=None, asyn=False, profile=False)
-
添加analyse模块(部分是timeline代码),用于分析OP的并发数: 通常QPS是受使用GPU的OP所限制,故期望QPS=耗时最多的GPU部分的QPS,而每个OP的concurrency=单OP耗时*期望QPS。目前只支持每个模型在不同卡上的情况(多个模型在一个卡上会互相影响,无法推理耗时)
修复
- fix: client只能连接一个endpoint的问题
- fix: channel output-buffer 中最后一个op取元素时不拷贝(针对某些需要手动释放内存的对象)
- fix: 多个rpc service并发下,profiler错误的问题(在profiler中加了把锁)
- fix: dag fetch线程同时唤醒所有等待线程,而获得锁的等待线程不一定是对应resp数据的线程
- fix: 进程版Channel由于multiprocess.queue限制,往空queue里填数据不会及时被所有进程感知
- fix: 线程版、进程版均不能正常close问题