编译 OneFlow 模型

这篇具有很好参考价值的文章主要介绍了编译 OneFlow 模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本篇文章译自英文文档 Compile OneFlow Models tvm 0.14.dev0 documentation

作者是 BBuf (Xiaoyu Zhang) · GitHub

更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站

本文介绍如何用 Relay 部署 OneFlow 模型。

首先安装 OneFlow 包,可通过 pip 快速安装:

pip install flowvision==0.1.0
python3 -m pip install -f https://release.oneflow.info oneflow==0.7.0+cpu

或参考官网:
https://github.com/Oneflow-Inc/oneflow

目前 TVM 支持 OneFlow 0.7.0,其他版本可能不稳定。

import os, math
from matplotlib import pyplot as plt
import numpy as np
from PIL import Image

# OneFlow 导入
import flowvision
import oneflow as flow
import oneflow.nn as nn

import tvm
from tvm import relay
from tvm.contrib.download import download_testdata

输出结果:

/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional_pil.py:193: DeprecationWarning: BILINEAR is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BILINEAR instead.
  def resize(img, size, interpolation=Image.BILINEAR):
/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional.py:65: DeprecationWarning: NEAREST is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.NEAREST or Dither.NONE instead.
  Image.NEAREST: "nearest",
/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional.py:66: DeprecationWarning: BILINEAR is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BILINEAR instead.
  Image.BILINEAR: "bilinear",
/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional.py:67: DeprecationWarning: BICUBIC is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BICUBIC instead.
  Image.BICUBIC: "bicubic",
/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional.py:68: DeprecationWarning: BOX is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BOX instead.
  Image.BOX: "box",
/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional.py:69: DeprecationWarning: HAMMING is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.HAMMING instead.
  Image.HAMMING: "hamming",
/usr/local/lib/python3.7/dist-packages/flowvision/transforms/functional.py:70: DeprecationWarning: LANCZOS is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.LANCZOS instead.
  Image.LANCZOS: "lanczos",
/usr/local/lib/python3.7/dist-packages/flowvision/data/auto_augment.py:28: DeprecationWarning: BILINEAR is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BILINEAR instead.
  _RANDOM_INTERPOLATION = (Image.BILINEAR, Image.BICUBIC)
/usr/local/lib/python3.7/dist-packages/flowvision/data/auto_augment.py:28: DeprecationWarning: BICUBIC is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.BICUBIC instead.
  _RANDOM_INTERPOLATION = (Image.BILINEAR, Image.BICUBIC)

加载和保存 OneFlow 的预训练模型

model_name = "resnet18"
model = getattr(flowvision.models, model_name)(pretrained=True)
model = model.eval()

model_dir = "resnet18_model"
if not os.path.exists(model_dir):
    flow.save(model.state_dict(), model_dir)

输出结果:

Downloading: "https://oneflow-public.oss-cn-beijing.aliyuncs.com/model_zoo/flowvision/classification/ResNet/resnet18.zip" to /workspace/.oneflow/flowvision_cache/resnet18.zip

  0%|          | 0.00/41.5M [00:00<?, ?B/s]
 19%|#9        | 7.99M/41.5M [00:00<00:00, 41.9MB/s]
 39%|###8      | 16.0M/41.5M [00:00<00:00, 40.1MB/s]
 54%|#####3    | 22.3M/41.5M [00:00<00:00, 45.4MB/s]
 65%|######4   | 26.9M/41.5M [00:00<00:00, 42.8MB/s]
 82%|########2 | 34.1M/41.5M [00:00<00:00, 51.3MB/s]
 95%|#########4| 39.3M/41.5M [00:00<00:00, 47.7MB/s]
100%|##########| 41.5M/41.5M [00:00<00:00, 46.0MB/s]

加载测试图像​

还是用猫的图像:

from PIL import Image

img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"
img_path = download_testdata(img_url, "cat.png", module="data")
img = Image.open(img_path).resize((224, 224))

# 预处理图像,并转换为张量
from flowvision import transforms

my_preprocess = transforms.Compose(
    [
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ]
)
img = my_preprocess(img)
img = np.expand_dims(img.numpy(), 0)

将计算图导入到 Relay 中​

将 OneFlow 计算图转换为 Relay 计算图,输入任意名称。

class Graph(flow.nn.Graph):
    def __init__(self, module):
        super().__init__()
        self.m = module

    def build(self, x):
        out = self.m(x)
        return out

graph = Graph(model)
_ = graph._compile(flow.randn(1, 3, 224, 224))

mod, params = relay.frontend.from_oneflow(graph, model_dir)

使用 Relay 构建​

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

target = tvm.target.Target("llvm", host="llvm")
dev = tvm.cpu(0)
with tvm.transform.PassContext(opt_level=3):
    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 上部署编译好的模型:

target = "cuda"
with tvm.transform.PassContext(opt_level=10):
    intrp = relay.build_module.create_executor("graph", mod, tvm.cuda(0), target)

print(type(img))
print(img.shape)
tvm_output = intrp.evaluate()(tvm.nd.array(img.astype("float32")), **params)

输出结果:

<class 'numpy.ndarray'>
(1, 3, 224, 224)

查找分类集名称​

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

synset_url = "".join(
    [
        "https://raw.githubusercontent.com/Cadene/",
        "pretrained-models.pytorch/master/data/",
        "imagenet_synsets.txt",
    ]
)
synset_name = "imagenet_synsets.txt"
synset_path = download_testdata(synset_url, synset_name, module="data")
with open(synset_path) as f:
    synsets = f.readlines()

synsets = [x.strip() for x in synsets]
splits = [line.split(" ") for line in synsets]
key_to_classname = {spl[0]: " ".join(spl[1:]) for spl in splits}

class_url = "".join(
    [
        "https://raw.githubusercontent.com/Cadene/",
        "pretrained-models.pytorch/master/data/",
        "imagenet_classes.txt",
    ]
)
class_name = "imagenet_classes.txt"
class_path = download_testdata(class_url, class_name, module="data")
with open(class_path) as f:
    class_id_to_key = f.readlines()

class_id_to_key = [x.strip() for x in class_id_to_key]

# 获得 TVM 分数最高的第一个结果
top1_tvm = np.argmax(tvm_output.numpy()[0])
tvm_class_key = class_id_to_key[top1_tvm]

# 将输入转换为 OneFlow 变量,并获取 OneFlow 结果进行比较
with flow.no_grad():
    torch_img = flow.from_numpy(img)
    output = model(torch_img)

    # 获取 OneFlow 分数最高的第一个结果
    top_oneflow = np.argmax(output.numpy())
    oneflow_class_key = class_id_to_key[top_oneflow]

print("Relay top-1 id: {}, class name: {}".format(top1_tvm, key_to_classname[tvm_class_key]))
print(
    "OneFlow top-1 id: {}, class name: {}".format(top_oneflow, key_to_classname[oneflow_class_key])
)

输出结果:

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

下载 Python 源代码:「链接」

下载 Jupyter Notebook:「链接」文章来源地址https://www.toymoban.com/news/detail-621497.html

到了这里,关于编译 OneFlow 模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习AI编译器-LLVM简介

    LLVM的命名最早来源于底层语言虚拟机(Low Level Virtual Machine)的缩写。它是一个用于建立编译器的基础框架,以C++编写。创建此工程的目的是对于任意的编程语言,利用该基础框架,构建一个包括编译时、链接时、执行时等的语言执行器。目前官方的LLVM只支持处理C/C++,Obje

    2024年02月06日
    浏览(30)
  • 【开发环境】Windows下搭建TVM编译器

    关于搭建TVM编译器的官方文档:Install from Source — tvm 0.14.dev0 documentation (apache.org) 1. 安装Anaconda 首先我们需要安装Anaconda,因为其中包含着我们所需要的各类依赖: 进入Anaconda官网https://www.anaconda.com/products/distribution,下载Windows版本,下载完成后运行.exe, 可以更改安装路径(

    2024年02月15日
    浏览(41)
  • 【送书福利-第三十一期】《TVM编译器原理与实践》

    适读人群 :从事AI算法,软件,AI芯片,编译器开发工程技术人员 人工智能(Artificial Intelligence,AI)已经在全世界信息产业中获得广泛应用。深度学习模型推动了AI技术革命,如 TensorFlow、PyTorch、MXNet、Caffe等。大多数现有的系统框架只针对小范围的服务器级 GPU进行过优化,

    2024年01月21日
    浏览(36)
  • 【BBuf的CUDA笔记】九,使用newbing(chatgpt)解析oneflow softmax相关的fuse优化

    随着年纪越来越大,读代码越来越困难,如果你发现看不懂同事写的代码应该怎么办呢?不要担心,大语言模型的时代了来了,chatgpt和gpt4会教会我们怎么读代码。本篇文章就来展示一下使用newbing(chatgpt)来读oneflow softmax相关的fuse优化kernel的过程。本文的代码解释均由chat

    2024年02月01日
    浏览(32)
  • 深度学习编译器相关的优秀论文合集-附下载地址

    公司排名不分先后 目前在AI芯片编译器领域,有很多大公司在进行研究和开发。以下是一些主要的公司和它们在该领域的研究时间: 英伟达(NVIDIA):英伟达是一家全球知名的图形处理器制造商,其在AI芯片编译器领域的研究和开发始于2016年左右。 英特尔(Intel):英特尔是

    2023年04月11日
    浏览(38)
  • AI编译器-图常见优化算法-算子融合

    算子融合(Operator Fusion)是深度学习编译器中的一种优化技术,它可以将多个算子合并为一个更大的算子,以减少计算和内存访问的开销。以下是一些常见的算子融合例子: 卷积和池化融合:将卷积层和池化层融合为一个算子,减少内存访问和计算的开销。 多个全连接层融

    2024年02月10日
    浏览(38)
  • 微软亚洲研究院推出AI编译器界“工业重金属四部曲”

    编者按:编译器在传统计算科学中一直是一个重要的研究课题。在人工智能技术快速发展和广泛应用的今天,人工智能模型需要部署在多样化的计算机硬件架构上。同时,训练和部署大型人工智能模型时又对硬件性能有着更高的要求,有时还需根据硬件定制化代码。这些都对

    2024年02月16日
    浏览(32)
  • c编译器学习02:chibicc文档翻译

    先粗略地看一遍作者的书籍。 https://www.sigbus.info/compilerbook# “低レイヤを知りたい人のためのCコンパイラ作成入門” 为想了解底层的人准备的C编译器制作入门 Rui Ueyama ruiu@cs.stanford.edu 2020-03-16 https://www.sigbus.info/ 植山瑠偉 谷歌软件工程师 我的专业知识涵盖从 HTML/JavaScript 到硬

    2024年02月21日
    浏览(62)
  • 深度学习AI克隆人声模型

    在过去的几年中,人工智能(AI)在音乐产业中的应用已经变得越来越普遍。在这篇博客中,我们将探索如何使用AI生成模型来复制人声,并使用这些复制的人声来唱歌。我会以尽可能详细的方式展示这个过程大纲,并提供相关代码。 我们将使用深度学习的技术,特别是生成模型

    2024年02月15日
    浏览(28)
  • Linux的学习之路:6、Linux编译器-gcc/g++使用

    本文主要是说一些gcc的使用,g++和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译(生成汇编) 3、汇编(生成机器可识别代码 4、链接(生成可执行文件或库文件) 5、函数库 6、静态库和动态库 7、gcc选项 三、思维导图

    2024年04月23日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包