TVMC python:一种TVM的高级API


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 及其选项的更多信息,请查看文档。一些例子包括:

  1. cuda (Nvidia GPU)
  2. llvm (CPU)
  3. 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)打印输出结果

优化:似乎需要运行在编译只后才能用

通过调优可进一步提高运行速度。此可选步骤使用机器学习来查看模型(函数)中的每个操作,并尝试找到一种更快的方法来运行它。我们通过成本模型和基准测试可能的时间表来做到这一点。

简单示例如下:

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

终端输出结果如下:
image

可能存在可以忽略的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

(0)
上一篇 2022年7月17日 21:21
下一篇 2022年7月17日 21:22

相关推荐

发表回复

登录后才能评论