怎么实现PyTorch模型编译

其他教程   发布日期:2025年04月18日   浏览次数:166

今天小编给大家分享一下怎么实现PyTorch模型编译的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

准备

首先应安装 PyTorch。此外,还应安装 TorchVision,并将其作为模型合集 (model zoo)。

可通过 pip 快速安装:

  1. pip install torch==1.7.0
  2. pip install torchvision==0.8.1

或参考官网:pytorch.org/get-started…

PyTorch 版本应该和 TorchVision 版本兼容。

目前 TVM 支持 PyTorch 1.7 和 1.4,其他版本可能不稳定。

  1. import tvm
  2. from tvm import relay
  3. import numpy as np
  4. from tvm.contrib.download import download_testdata
  5. # 导入 PyTorch
  6. import torch
  7. import torchvision

加载预训练的 PyTorch 模型

  1. model_name = "resnet18"
  2. model = getattr(torchvision.models, model_name)(pretrained=True)
  3. model = model.eval()
  4. # 通过追踪获取 TorchScripted 模型
  5. input_shape = [1, 3, 224, 224]
  6. input_data = torch.randn(input_shape)
  7. scripted_model = torch.jit.trace(model, input_data).eval()
  8. 输出结果:

Downloading: "download.pytorch.org/models/resn…" to /workspace/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth

0%| | 0.00/44.7M [00:00<?, ?B/s] 11%|# | 4.87M/44.7M [00:00<00:00, 51.0MB/s] 22%|##1 | 9.73M/44.7M [00:00<00:00, 49.2MB/s] 74%|#######3 | 32.9M/44.7M [00:00<00:00, 136MB/s] 100%|##########| 44.7M/44.7M [00:00<00:00, 129MB/s]

加载测试图像

经典的猫咪示例:

  1. from PIL import Image
  2. img_url = "https://cache.yisu.com/upload/information/20230426/112/17141.png?raw=true"
  3. img_path = download_testdata(img_url, "cat.png", module="data")
  4. img = Image.open(img_path).resize((224, 224))
  5. # 预处理图像,并将其转换为张量
  6. from torchvision import transforms
  7. my_preprocess = transforms.Compose(
  8. [
  9. transforms.Resize(256),
  10. transforms.CenterCrop(224),
  11. transforms.ToTensor(),
  12. transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
  13. ]
  14. )
  15. img = my_preprocess(img)
  16. img = np.expand_dims(img, 0)

将计算图导入 Relay

将 PyTorch 计算图转换为 Relay 计算图。input_name 可以是任意值。

  1. input_name = "input0"
  2. shape_list = [(input_name, img.shape)]
  3. mod, params = relay.frontend.from_pytorch(scripted_model, shape_list)

Relay 构建

用给定的输入规范,将计算图编译为 llvm target。

  1. target = tvm.target.Target("llvm", host="llvm")
  2. dev = tvm.cpu(0)
  3. with tvm.transform.PassContext(opt_level=3):
  4. lib = relay.build(mod, target=target, params=params)

输出结果:

/workspace/python/tvm/driver/build_module.py:268: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
"target_host parameter is going to be deprecated. "

在 TVM 上执行可移植计算图

将编译好的模型部署到 target 上:

  1. from tvm.contrib import graph_executor
  2. dtype = "float32"
  3. m = graph_executor.GraphModule(lib["default"](dev))
  4. # 设置输入
  5. m.set_input(input_name, tvm.nd.array(img.astype(dtype)))
  6. # 执行
  7. m.run()
  8. # 得到输出
  9. tvm_output = m.get_output(0)

查找分类集名称

在 1000 个类的分类集中,查找分数最高的第一个:

  1. synset_url = "".join(
  2. [
  3. "https://raw.githubusercontent.com/Cadene/",
  4. "pretrained-models.pytorch/master/data/",
  5. "imagenet_synsets.txt",
  6. ]
  7. )
  8. synset_name = "imagenet_synsets.txt"
  9. synset_path = download_testdata(synset_url, synset_name, module="data")
  10. with open(synset_path) as f:
  11. synsets = f.readlines()
  12. synsets = [x.strip() for x in synsets]
  13. splits = [line.split(" ") for line in synsets]
  14. key_to_classname = {spl[0]: " ".join(spl[1:]) for spl in splits}
  15. class_url = "".join(
  16. [
  17. "https://raw.githubusercontent.com/Cadene/",
  18. "pretrained-models.pytorch/master/data/",
  19. "imagenet_classes.txt",
  20. ]
  21. )
  22. class_name = "imagenet_classes.txt"
  23. class_path = download_testdata(class_url, class_name, module="data")
  24. with open(class_path) as f:
  25. class_id_to_key = f.readlines()
  26. class_id_to_key = [x.strip() for x in class_id_to_key]
  27. # 获得 TVM 的前 1 个结果
  28. top1_tvm = np.argmax(tvm_output.numpy()[0])
  29. tvm_class_key = class_id_to_key[top1_tvm]
  30. # 将输入转换为 PyTorch 变量,并获取 PyTorch 结果进行比较
  31. with torch.no_grad():
  32. torch_img = torch.from_numpy(img)
  33. output = model(torch_img)
  34. # 获得 PyTorch 的前 1 个结果
  35. top1_torch = np.argmax(output.numpy())
  36. torch_class_key = class_id_to_key[top1_torch]
  37. print("Relay top-1 id: {}, class name: {}".format(top1_tvm, key_to_classname[tvm_class_key]))
  38. print("Torch top-1 id: {}, class name: {}".format(top1_torch, key_to_classname[torch_class_key]))

输出结果:

Relay top-1 id: 281, class name: tabby, tabby cat
Torch top-1 id: 281, class name: tabby, tabby cat

以上就是怎么实现PyTorch模型编译的详细内容,更多关于怎么实现PyTorch模型编译的资料请关注九品源码其它相关文章!