开发者学堂课程【PAL 平台学习路线:机器学习入门到应用:PAI-Blade 通用推理优化:系统优化实践(上)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/855/detail/14119
PAI-Blade 通用推理优化:系统优化实践(上)
内容介绍:
一.AI推理加速
二.Blade
三.Blade 示例
Blade 是 pai 团队自主研发的推理优化工具,主要内容为如何使用 blade 优化 Tensorflow 模型。
一.AI 推理加速
Blade 作为一款加速推理工具,它有如下四个特点:
1.blade 支持市面上主流的深度学习框架
包括 flow 和 Py,同时对于主流的模型种类,不管是 NLP 还是 CV 的模型,还是 ASR 的模型,都具有不错的支持
2.自动优化
通过自动优化的手段大大降低了用户优化模型的门槛,用户不再需要深入的算法知识,模型知识或者是加速硬件的知识,即可以对模型进行游玩,同时 blade 的整个优化过程对用户透明,不需要去了解推理优化过程中比较复杂问题。
3.blade 适配不同的硬件
不管是 gpu,cpu 是端测的意见不对,都有比较好的适配。
4.生产环境检验
第四也是最重要的一点,blade 是经过阿里生产环境检验的产品,不管是在 eas 的在线推理服务场景中,还是在手淘端测的场景中均有不错的表现。
二.Blade
1.blade 技术架构
当我们需要对一个模型优化的时候,我们需要把模型提供给 blade.
如果您的模型是 py 模型,可以提供 script,如果你的模型是 Tensofrflow 模型,你可以提供 Pro pb,除了模型本身以外,为了达到更好的优化效果,用户还可以提供一些优化配置,用来描述模型的一些特征,优化配置我们会在后面的事例中看到,同时为了更精准的指导 py 对模型进行优化,用户还可以提供测试数据.
当用户的模型配置和数据加载到 blade 之后,blade 首先会做算图的优化,所谓计算图的优化是一种的优化手段,它是跟设备无关的,这里主要包括一些常量表达式,共同表达式去除等等,除了这些比较通用的优化之外 blade 还有一些有一些比较特别的手段,比如 ai 是 pai 团队自主研发的深度学习编译器,它可以将计算图生成为高效编译器,从而大大提升模型的执行效率。
另外我们也可以通过量化的手段来把模型的尺寸变小,达到加速推理速度的目的,在不同的硬件上面,我们还存在于场上的加速度,比如在 pu 上面有 mkl 或者在其他的硬件端的硬件设备上也有相对应的加速库,blade 可以做到对这些加速库的无缝集成,整个的优化过程,blade 会去智能的组装不同的优化手段,让他们在一起配合,从而达到一个联合优化的目的,为用户输出一个最终的优化模型,最终优化模型的格式与用户输入的格式是相同的。比如说如果用户输入的是 py 模型,那么优化完产生的也是py模型,如果用户输入的是 flow pb 那么优化完产生的也是 flow pb,是为了减少用户在 blade 工程上面所造成的累加,除了优化的模型之外,blade 的还会声称一个优化的说明,在优化说明内部,我可以观察到本次优化更详细的信息。包括使用的硬件,软件的相关信息。以及 blade 内每一个加速手段生效的情况的说明会在后面多次观察到。
2.blade 产品形态
同时 blade 作为一款产品,可以方便的在不同的环境中供用户使用,我们这里主要分两种情况,一种是如果您的产品使用了 pad 的大量产品,那么你可以在开发的过程中在 pai 的 dsw 的镜像里面或者在训练的过程中拍的 pai-DLC的镜像里面可以直接使用blade,作为一个默认的包安装在这两个产品之中,同时如果您使用了 eas 作为模型的部署,那么也在 eas 中做了默认的集成,不再需要带运行或是做其他的。操作机可以使用 blade,可以使用 eas 来运行类的优化完的模型,我们还开发了一个用户,甚至连在开发和训练中集成模型都不需要,只需要在模型上线之前额外配置一个分类的在上线前机构完成型的优化,此做法存在模型的优化过程和在线的步骤过程融为一体,整体更加丝滑顺畅。
如果你使用的是自有的开发环境,为了作为一个没有帮助可以直接在开发或者是训练环境中进行安装,安装完了之后即可。有一个简单的派送就可以完成模型的优化。同时如果是使用了自定义的部署环境,不管是派送的环境还是直接加的环境,都提供对应的 SDK,同时 SDK 可以做到对用户的环境尽量想清楚,在派送时只需要 import 的 plugin即可,假设只需要额外再链接一个 blade 的 sheer,除此之外不需要改动任何的用户代码
三.Blade 示例
如何在不同的环境下使用 blade,四个示例分别是:Mask RCNNBertPTQEAS Plugin。
1. Blade 基本使用
安装
(1):!pip3 install tensorflow-gpu==1.15.0
首先安装 gpu 包
(2): pip installpai_blade_gpu==3.16.0-f
https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/release/repo.html
如果使用 gpu 包安装 blade_gpu==3.16.0最新版本,安装仓库在后面。
(3):!pip list grep blade
pai-blade-gpu3.16.0
此时查看到3.16.0已经安装完成
(4):!nvcc --version
nvcc:NVIDIA (R)Cuda compiler driver
Copyright (c)2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools,release 10.0,V10.0.130
Cuda10环境
(5): nvidia-smi
Mon Aug3019:13:21 2021
测试环境中有2张 T4卡
(6)导入 Blade
import os
import numpy as np
import tensorflow.compat.v1 as tf
import blade
第一步 import blade
使用 blade 接口优化操作
(7)准备模型与数据
在调用接口之前需要做数据模型准备工作
演示优化 rcnn 模型,先将其下载
!rm-f mask_rcnn_resnet50_atrous_coco_2018_01_28.pb mask_rcnn_test_img.jpg
!Wgethttp://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/mask_rcnn/mask_rcnn_resnet50_atrous_coco_2018_01_28.pb!Wgethttp://pai-bl.de.oss-cn-zhangjiakou.aliyuncs.com/demo/mask_rcnn/mask_rcnn_test_ing.jpg
--2021-08-30 19:13:25--http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/mask_rcnn/mask_rcnn_resnet50_atrous_coco_2018_01_28.pb
Resolving pai-blade.oss-cn-zhangjiakou.aliyuncs.com (pai-blade.oss-cn-zhangjiakou.aliyuncs.com)...47.92.17.105
Connecting to pai-blade.oss-cn-zhangjiakou.aliyuncs.com (pai-blade.oss-cn-zhangjiakou.aliyuncs.com)47.92.17.1051:80...connected.
HTTP request sent,awaiting response...200 OK
Length:145011833 (138M)[application/octet-stream]
Saving to:'mask_rcnn_resnet50_atrous_coco_2018_01_28.pb'
1145.011
.83323.8M8/s
1n5.8s
(8)
from
IPython.display import display
from PIL import Image
import numpy as np
img Image.open('maskrcnn_test_img.jpg')
display(img)
img_data np.asarray(img)
img_data np.expand dims(img data,axis=0)
print(img_data.shape)
print(img_data.dtype)
test_data ={'image_tensor:0':img_data}
(1,375,500,3)
Unit8
//此图片时 rcnn 官方训练中的一张里面有很多物体,通过 PIL 加载后可以看到是一张,375×500,类型是 uint8.
(9)
graph_def= tf.GraphDef()
with open('mask_rcnn_resnet50_atrous_coco_2018_01_28.pb','rb')as f:
graph_def.ParseFromString(f.read())
是一个 graph_def 直接读出即可。
(10)执行优化
input_nodes=['image_tensor']
output_nodes ['detection_boxes','detection_scores','detection_classes','num_detections','detection_masks']
optimized_model,_,report blade.optimize(
graph_def,
#待优化的模型,此处是 tf.GraphDef,也可以配置 savedModel 的路径.
"o1',#优化级别,o1(无损优化)或02(量化优化).
device_type='gpu',
#目标设备,gpu/cpu/edge.(设备类型)
inputs=input_nodes,
#输入节点(只有一组输入输出)也可以不提供,PAI-Blade 敏提版会自行发断
outputs=output_nodes#输出节点
test_data=[test_data}测试数据(可以接受多组测试数据,放在同一个列表中即可)
}
调用 blade 执行优化,blade 只有一个优化接口,blade.optimize。
执行接口会看到类似如下图输入
Blade 会将当前进行阶段打印以及优化执行的消息出
在优化完成后会打印 finish。
存在返回值
第一个返回值 optimized_model:将优化完的返回值放在此处,输入对象是 graph_def,产生的也是 graph_def。
同时还产生一个优化报告 report。
(11)查看优化报告
print("Report:{)"format(report))
Report:
"software_context":
"software":"tensorflow",
"version":"1.15.0"
"software":"cuda",
"version":"10.0.0"
"hardware_context":{
"device_type":"gpu",
"microarchitecture":"T4"
"user_config":""
"diagnosis":
"model":"tmp_graph.pbtxt",
"test data source":"user provided",
"shape_variation":"dynamic",
“message'":",
"test_data_info":"image_tensor:0 shape:(1,375,500,3)data type:uint8",
"optimizations":
{
"name":"TfStripUnusedNodes",
"status":"effective",
"speedup":"na",
"pre_run":“na",
"post run":"na"
"name":"TfStripDebugops",
"status":"effective",
"speedup":“"na",
"pre_run":"na",
"postrun":"na"
"name":"TfStripDebugops",
"status":"effective",
"speedup":"na",
"pre_run":"na",
"post_run":"na"
"name":"TfFoldConstants",
"status":"effective",
"speedup":"na",
"pre_run":"na",
"post_run":"na"
"name":"TfNonMaxSuppressionOpt",
"status":"effective",
"speedup":"1.68",
"pre_run":"579.67ms",
"post_run":"345.89 ms"
1
"overall":
"baseline":"558.78 ms",
"optimized":"345.22 ms"
"speedup":"1.62"
},
"model_info":{
"input_format":"frozen_pb"
"compatibility_list":
"device_type":"gpu",
"microarchitecture":"T4"
}
"model_sdk":{}
}
将其打印查看,会产生软件硬件环境信息比如code版本,flow版本信息,还有诊断信息比如:shape_variation":"dynamic", 是动态变化的(高度,维度都可以变化),还可以看到测试数据基本信息。
"optimizations":会将blade经过尝试后的优化手段存在此处。最重要的:pre_run 生效,pre_run生效需要579.67ms,还可以看到整个模型优化效果"overall",两者优化效果相似。
兼容项列表,模型优化与硬件相关,放在T4卡上;如需要其他卡则在其他卡上进行优化。
(12)验证模型性能
:import time
def benchmark(model):
fetch_list ['detection_boxes:0','detection_scores:0','detection_classes:0','num_detections:0','detection_masks:0']
tf.reset_default_graph()
with tf.Session()as sess:
sess.graph.as_default()
tf.import_graph_def(model,name="")
#Warmup!
for i in range(0,10):
sess.run(fetch_list,test_data)
Benchmark!
num_runs =50
start time.time()
for i in range(0,num_runs):
sess.run(fetch_list,test_data)
elapsed time.e()-start
rt_ms elapsec num_runs 1000.0
Show the result!
print("Latency of model:{.2f}ms."format(rt_ms))
跑50次取平均推理时间,可以看到此代码没有与blade相关
(13)对原模型测速。
:benchmark(graph_def)
Latency of model:568.11 ms.
与前面579.67ms 基本对应
(14)对优化后的模型测速
把 blade 需要的所有依赖全部 import 进来
:import blade.runtime.tensorflow
benchmark(optimized_model)
Latency of model:337.11 ms.
可以看到优化大概是337ms,与前面345.89 ms计本对应
(15)保存优化结果
:tf.train.write_graph(optimized_model,"./""optimized.pb",as_text=False)
:'./optimized.pb'
验证 ok 将优化后模型保存,整个优化过程结束。
2. 优化 Tensorflow ASR 模型
整个过程与前面所讲基本相同。
(1)安装
pip3 install tensorflow-gpum=1.15.0
(2):pip install pai_blade_gpu==3.16.0-f hutps://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/release/repo.html
(3):Ipip list I grep blade
pai-blade-gpu
3.16.0
(4):Invcc --version
nvcc:NVIDIA (R)Cuda compiler driver
Copyright (c)2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools,release 10.0,V10.0.130
(5)导入 Blade
import os
import numpy as np
import tensorlow.compat.vl as tf
import blade
(6):准备模型与数据
!rm -f frozen.pb test_bc4.npy
!wget https://pai-blade.cn-hangzhou.oss.aliyun-inc.com/test_public_model/bbs/tf_aicompiler_demo/frozen.pb
准备了 test_bc4测试数据。
(7)加载模型和测试数据
graph_def tf.GraphDef()
with open('./frozen.pb',
'rb')as f:
graph_def.ParseFrimString(f.read())
test_data np.load('test_bc4.npy',allow_pickle=True,encoding='bytes',)item()
test_data
//与上文相同有 2个加载和输入
:{b'encoder_.memory_.placeholder:0':array([5.6524896,-6.493541,-15.712473,:.,
-2.8141196,-12.232562],dtype=f1oat32),
5.6796246,
b'encoder_memory_length_placeholder:0':array([71,72,54,92],dtype=int32))
Placeholder,memory_length典型的 asr 模型
(9)优化模型
optimized_model,_,report blade.optimize(
graph_def,
"01',
#待优化的模型,此处是 tf.GraphDef,也可以配置为 SavedMode lg 的路径.
#优化级别,01或02。
device_type='gpu',
#目标设备,gpu/cpu/edge.
config=blade.Config(),
inputs=['encoder_memory_placeholder','encoder_memory_length_placeholder'],
outputs=['score','seq_id'],
testdata=[test data]
[Progress]5%,phase:user_test_data_validation.
[Progress]10%,phase:test_data_deduction.
[Progress]15%,phase:CombinedSequence_4.
2821-08-3014:41:80,321[14722】[NF0
[:8]No trt library is found in the current environment.
2821-08-3614:41:80,321【14722】[NF0
[:8]No trt library is found in the current environment
调用 blade.optimize 接口,放入模型选择 o1,优化选择 gpu(提供微调选项,选择默认值)
(10)查看优化报告
print("Report:{}"format(report))
Report:{
"software_context":
"software";"tensorflow",
"version":1.15.0"
"software":"cuda",
"version":"10.0.0"
}
"hardware_context":
"device_type":"gpu",
"microarchitecture":"T4",
"user_config":"",
"diagnosis":{
"model":"tmp_graph.pbtxt"
"test_data_source":"user provided",
"shape_variation":"dynamic",
"message":"
"test_data_info":"encoder_memory_placeholder:0 shape:(163840,data type:float32\nencoder_memory_length_placeholder:0 sh
pe:(4,)data type:int32"
"optimizations":
"name":"TfstripUnusedNodes",
"shape_variation":"dynamic",
"message":
"test_data_info":"encoder_memory_placeholder:0 shape:(163840,)data type:float32\nencoder_memory_length_placeholder:0 sha
pe:(4,)data type:int32"
},
"optimizations":
"name":"TfStripUnusedNodes",
"status":"effective",
"speedup":"na",
"pre_run":"na",
"postrun":"na"
"name":"TfStripDebugops",
"status":"effective",
"speedup":"na",
"pre_run":"na",
"post run":"na"
"name":"TfFoldConstants",
"status":"effective",
"speedup":"na",
"pre_run":"na",
"post run":"na"
"name":"TfAicompilerGpu",
"status":"effective",
"speedup":"1.89”,
"pre_run":"100.60 ms"
"p0st_run":“53.15ms"
"overall":{
"baseline":"95.70 ms",
"optimized":"52.41 ms",
"speedup":"1.83"
'model info":(
"input_format":"frozen_pb"
"compatibility_list":
"device_type":"gpu",
"microarchitecture":"T4"
"model_sdk":{}
}
"TfAicompilerGpu"减小,速度被提升,整个加速器由编译优化所带来,会根据模型,测试数据来查看是否需要优化生效。可以看到确实优化被加速。
(13)验证模型性能
import time
def benchmark(model):
tf.reset_default_graph()
with tf.Session()as sess:
sess.graph.as default()
tf.import_graph_def(model,name="")
Warmup!
for i in range(0,10):
sess.run(['score','seq_id'],test_data)
Benchmark!
num_runs 1000
start time.time()
for i in range(0,num_runs):
sess.run(['score','seq_id'],test_data)
elapsed time.time()-start
rt_ms elapsed num_runs 1000.0
Show the result!
#Benchmark!
cest-data
num_runs 1000
start time.time()
for i in range(0,num_runs):
sess.run(['score','seq_id'],test_data)
elapsed time.time()-start
rt_ms elapsed num_runs 1000.0
Show the result!
print("Latency of model:{:.2f}ms.".format(rt_ms))
写出 Benchmark!函数,不存在任何 blac e 特殊代码
(14)对原模型测速。
benchmark(graph_def)
Latency of model:97.46 ms.
(15)对优化后的模型测速
97.46 ms.与前面速度基本相同
import blade.runtime.tensorflow
os.environ ['TAO_COMPILATION_MODE_ASYNC=''0'
benchmark(optimized_model)
Latency of model:51.87 ms.
不同:将异步编译关掉
os.environ ['TAO_COMPILATION_MODE_ASYNC=''0'
为了明确测试优化效果,改成同步。,用户基本不需要做额外事情,就可以对其优化。
3.优化 Tensorflow ASR 模型
(1)安装
pip3 install tensorflow-gpum=1.15.0
(2):pip install pai_blade_gpu==3.16.0-f hutps://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/release/repo.html
(3):Ipip list I grep blade
pai-blade-gpu
3.16.0
(4):Invcc --version
nvcc:NVIDIA (R)Cuda compiler driver
Copyright (c)2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools,release 10.0,V10.0.130
导入 Blade
(5):import os
import numpy as np
import tensorlow.compat.vl as tf
import blade
(6)准备模型与数据
wgethttps://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/t_resnet50_v1.5/frozen.pb
wgethttps://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/test_bc32.npy
wgethttps://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/calib_data_test_bc32.npy
--2021-08-3014:59:41--https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/frozen.pb
Resolving pai-blade.oss-cn-zhangjiakou.aliyuncs.com (pai-blade.oss-cn-zhangjiakou.aliyuncs.com)...47.92.17.105
Connecting to pai-blade.oss-cn-zhangjiakou.aliyuncs.com (pai-blade.oss-cn-zhangjiakou.aliyuncs.com)47.92.17.105:443...connected.
HTTP request sent,awaiting response...200 OK
Length:102562463 (98M)[application/octet-stream]
Saving to:'frozen.pb.1'
100%(======================>】102,562,46335.3B/51n2.8S
2021-08-3014:59:44(35.3MB/s)-'frozen.pb.1'saved[102562463/102562463]
--2021-08-30 14:59:45--https://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/test_public_model/bbs/tf_resnet50_v1.5/test_bc32.npy
Resolving pai-blade.oss-cn-zhangjiakou.aliyuncs.com (pai-blade.oss-cn-zhangjiakou.aliyuncs.com)...47.92.17.105
Connecting to pai-blade.oss-cn-zhangjiakou.aliyuncs.com (pai-blade.oss-cn-zhangjiakou.aliyuncs.com)47.92.17.105:443...connected.
HTTP request sent,awaiting response...200 OK
Length:19267933 (18M)[application/octet-stream]
优化 resnet50,格式 frozen.pb,
测试数据:
格外准备数据集 calib_data_test_bc32.npy(比测试数据大一些)对模型数据集权重进行调节。全部准备完成后开始优化工作
(7)加载模型。
graph_def tf.GraphDef()
with open('frozen.pb','rb')as f:
graph_def.ParseFromString(f.read())
#加数调试数据。
test_data np.load('test_bc32.npy',allow_pickle=True,encoding='bytes',).item()
#加载校正数据集。
calib_data np.load('calib_data_test_bc32.npy',allow_pickle=True,encoding='bytes',)
通过 graph_def 将数据模型全部加载。
(8)执行优化
:optimized_model,opt_spec,report blade.optimize(
model=graph_def,
optimization_level='o2',
device_type='gpu',
test_data=test_data,
calib_data=calib_data
WARNING:tensorflow:From :6:remove_training_nodes (from tensorflow.python.framework.graph_util_imp
is deprecated and will be removed in a future version.
Instructions for updating:
Use 'tf.compat.v1.graph_util.remove_training_nodes'
WARNING:tensorflow:From :6:extract_sub_graph (from tensorflow.python.framework.graph_util_impl)i
s deprecated and will be removed in a future version.
Instructions for updating:
优化级别从 o1变为 o2,载 test_data=test_data,
calib_data=calib_data,都传入了一组数据。当优化过程执行完毕查看优化报告。
(10)查看优化报告
print("Report:()"format(report))
Report:{
"software_context":
"software":"tensorflow",
"version'":"1.15.0"
"software":"cuda",
"version":"10.8.0"},
"hardware context":{
"device_type":"gpu",
"microarchitecture":"T4"},
"user_config":""
"diagnosis":
"model":"tmp_graph.pbtxt",
"test_data_source":"user provided",
"shape_variation":"dynamic",
"message":"
"test_data_info":"input_tensor:0 shape:(32,224,224,3)data type:float32"
"optimizations'":{
"name":"TfStripUnusedNodes",
status":"effective",
Python 3
dified
"speedup":"na",
"prerun":"na",
rs ago
"post_run":"na"
es ago
rs ago
"name":"TfFoldConstants",
58g0
"status":"effective",
"speedup":"na",
"pre_run":"na",
"post_run":"na"
"name":"TfFoldBatchNorms",
"status":"effective",
"speedup":"0.82",
"pre run":"86.59 ms"
"p0 st_run":"105.73ms'
"name":"TfBladeInt8"
"status":"effective",
"speedup":"1.92"
"pre run":"94.32 ms"
"p0st_run":"49.23ms"
"name":"TfstripUnusedNodes",
"status":"effective",
"speedup":"na",
"pre run":"na",
"post run":"na",
"name":"TfstripDebugops",
"status":"effective",
"speedup":“"na",
"pre_run":"na",
"post_run“:"na"
"pre run":"94.32 ms"
utes ago
ours ago
"name":"TfStripDebugops",
"status":"effective",
utes ago
"speedup":"na",
"pre_run":"na",
"post run":"na"
"name":"TfFoldConstants",
"status":"effective",
"speedup":"1.60"
"pre_run":"83.98 ms"
"post_run":"52.52 ms"
"overall":{
"baseline":"82.14 ms",
"optimized":"53.31 ms",
"speedup":"1.54"
"modelinfo":{
"input_format":"frozen_pb"
"compatibility_list":[
"device type":"gpu",
"microarchitecture":"T4"
"model_sdk":{}
}
被提升到49ms,提升一倍速度
验证模型性能
import time
sago
def benchmark(model):
tf.reset_default_graph()
with tf.Session()as sess:
sess.graph.as_default()
tf.import_graph_def(model,name="")
#Warmup!
for i in range(0,10):
sess.run(['ArgMax'],test_data)
Benchmark!
num_runs 100
start time.time()
for i in range(0,num_runs):
sess.run(['ArgMax'],test_data)
elapsed time.time()-start
rt_ms elapsed num_runs 1000.0
Show the result!
print("Latency of model:(:.2f}ms.".format(rt_ms))
对原模型测速。
:benchmark(graph_def)
Latency of model:81.92 ms.
对优化后的模型测速
import blade.runtime.tensorflow
benchmark(optimized_model)
Latency of model:51.90 ms.
自动调整模型参数
:quant_config={
'weight_ajustment':'true'#默认为'false',
optimized_model,opt_spec,report blade.optimize(
model=graph_def,
optimization_level='02',
device_type='gpu',
test_data=test_data,
calib_data=calib_data,
config=blade.Config(quant_config=quant_config)
执行原模型,测速81.92 ms.
优化后的模型测速51ms
在优化过程中还存在准确性的考验,会获得模型准确度的指示,通过 weight_ajustment 开启调整,从而尽可能降低模型在优化过程中带来的损失,我们可以看到量化 config 实际上是通过 config 参数到了里面后,其他的参数都没有变化。你也可以再看看我的视频之后我去尝试一下参数在精度上面会不会带来更多的一些提升。
4.EAS Plugin
pycat eas_demo.json
"name":"blade_eas_plugin_demo",
"model_path":"http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/demo/aicompiler_eas_example.tar.gz",
"processor":"tensorflow_gpu_1.15",
"plugins":
"command":"blade -mode eas_plugin --optimize_for gpu",
"config":
"modelinfo":{
"frozen.pb":{
"inputs":
"encoder_memory_placeholder","encoder_memory_length placeholder"
"optimization_level":"ol",
"outputs'":{"score","seq-id"},
"test data":"test_bc4.npy"
"gpu":
"resource":"T4_8CORE",
"image":"registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest"}
"metadata":(
"cuda":"10.0"
"cpu":7,
"gpu":1
"mem0ry":16000,
"instance":
"region":"cn-hangzhou",
"resource":"eas-r-mvezgfq84g71ctzd00'
关于 EAS Plugin 信息暂不介绍,阿里云官网存在相关介绍。
主要 在 EAS 服务上如何开启 Plugin 自动地完成一轮优化
eas_demo.json 是非常典型的,服务的配置文件,这里包括了名称,新的地址,使用什么样的形式来进行,所以还能够看到了一些资源,比如说 CPU gpu 的一些资源组的一些原信息。
其实刚才讲的模型的名称,模型路径 Pro ,以及原信,息就可以足够拉起在线的服务,blade 如果要进行。相应的优化只需要在此代码中额外的添加一段 plugin。在 Plugin 中有几个关键字段,优化一个在 GPU 上运行的模型。
"command":"blade -mode eas_plugin --optimize_for gpu"
Blade,模式是 eas plugin 的模式。为 GPU 的设备而优化,同时需要指定一个执 行 plugin 的镜像。
image":"registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest"}
此 plugin 镜像是当前最新版本的 plugin 镜像
接下来看见的内容与前面部分看见的内容比较相似。
包里面有一个模型文件,叫 frozen.pb,节点是:
"encoder_memory_placeholder","encoder_memory_length placeholder"
优化级别:o1, 输出节点:"outputs'":{"score","seq-id"},
测试数据文件:"test data":"test_bc4.npy"(在前面节点看到的数据几乎相同)
优化需要 gpu 执行,优化插件,"resource":"T4_8CORE",
提供资源进行执行,将内容放入此资源组即可。
启用服务,Eascmd list 查看当前当前账户下不存在 Eas 服务,使用 Eas create 创建服务
可以观察到在创建服务的过程中存在一个日志:正在执行~优化,
剩下的过程与普通的 eas 服务相同,会慢慢拉起用户需要的实例数最终在线运行 Service is running。