Step 0: Imports
from tvm.driver import tvmc
Step 1: Load a model
- 下载模型:
wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx
mv resnet50-v2-7.onnx my_model.onnx
- 模型导入TVMC
此步骤将机器学习模型从支持的框架转换为 TVM 的高级图形表示语言(称为 Relay)。这是为了在tvm中为所有模型提供统一的起点。我们目前支持的框架是:Keras,ONNX,Tensorflow,TFLite和PyTorch。
model = tvmc.load('my_model.onnx') #Step 1: Load
如果想查看Relay,可运行:model.summary()
PS:查看模型Input/shape_dict的一种建议方法是通过 netron
。打开模型后,单击第一个节点以查看输入部分中的名称和形状。
Step 2: Compile
现在我们的模型处于 Relay 中,我们的下一步是将其编译为所需的硬件以在其上运行。我们将此硬件称为目标.此编译过程将模型从 Relay 转换为目标计算机可以理解的较低级别语言。
为了编译模型,需要一个 tvm.target 字符串。要了解有关 tvm.targets 及其选项的更多信息,请查看文档。一些例子包括:
- cuda (Nvidia GPU)
- llvm (CPU)
- llvm -mcpu=cascadelake (Intel CPU)
package = tvmc.compile(model, target="llvm") #Step 2: Compile
编译步骤将返回一个包
Step 3: Run
现在可以在硬件目标上运行已编译的包。设备输入选项包括:CPU、Cuda、CL、Metal 和 Vulkan。
result = tvmc.run(package, device="cpu") #Step 3: Run
可以使用print(result)
打印输出结果
Step 1.1: Tune [Optional & Recommended]
优化:似乎需要运行在编译只后才能用
通过调优可进一步提高运行速度。此可选步骤使用机器学习来查看模型(函数)中的每个操作,并尝试找到一种更快的方法来运行它。我们通过成本模型和基准测试可能的时间表来做到这一点。
简单示例如下:
tvmc.tune(model, target="llvm") #Step 1.1: Optional Tune
注:自动调优过程中,需要xgboost自行搜索优化空间,即需要xgboost的支持,但在执行过程报如下错误:
ImportError: cannot import name 'EarlyStopException' from 'xgboost.core' (/usr/local/lib/python3.8/dist-packages/xgboost/core.py)
查阅资料:
ImportError: cannot import name ‘EarlyStopException’ from ‘xgboost.core'[Bug]
xgboost在1.6.0及之后的版本,去掉了EarlyStopException
函数,同样可在xgboost中的core.py的github中可看到
因此,需要将xgboost版本回退到1.5.x版本
pip uninstall xgboost
pip install xgboost==1.5.0
终端输出结果如下:
可能存在可以忽略的UserWarnings。这应该会使最终结果更快,但可能需要数小时才能调整。
请参阅下面的“‘Saving the Tuning Results”部分。如果要应用优化结果,请确保将优化结果传递到编译中。
#tvmc.compile(model, target="llvm", tuning_records = "records.log") #Step 2: Compile
Example results:
In [102]: print(result)
Execution time summary:
mean (ms) median (ms) max (ms) min (ms) std (ms)
49.7363 49.5313 52.3399 48.5140 0.9405
Output Names:
['output_0']
Saving the tuning results
优化结果可以保存在文件中,供以后重复使用。
Method 1:
log_file = "hello.json"
# Run tuning
tvmc.tune(model, target="llvm", tuning_records=log_file)
...
# Later run tuning and reuse tuning results
tvmc.tune(model, target="llvm",tuning_records=log_file)
Method 2:
# Run tuning
tuning_records = tvmc.tune(model, target="llvm")
...
# Later run tuning and reuse tuning results
tvmc.tune(model, target="llvm",tuning_records=tuning_records)
Saving the model
为了加快速度,以后在加载模型(步骤 1)后,保存 Relay 版本。然后,该模型将显示在您保存它的位置,以便稍后在隐含的语法中使用。
model = tvmc.load('my_model.onnx') #Step 1: Load
model.save(desired_model_path)
Using Autoscheduler
使用下一代 tvm 实现可能更快的运行速度结果。计划搜索空间是自动生成的,这与以前需要手写计划不同。
tvmc.tune(model, target="llvm", enable_autoscheduler = True)
原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/275011.html