【TVM教程】为 ARM CPU 自动调优卷积网络

ARM-CPU卷积网络的自动调谐 ARM-CPU卷积网络的自动调谐 为特定的ARM设备自动调谐对于获得最佳性能至关重要。这是一个关于如何调整整个卷积网络的资料。 以模板的形式编写了TVM中ARM CPU的操作实现。模板有许多可调旋钮(平铺系数、矢量化、展开等)。将调整神经网络中的所有卷积和深度卷积算子。在调优之后,生成一个日志文件,其中存储了所有所需操作符的最佳旋钮值。当TVM编译器编译这些运算符时,它将查询此日志文件以获得最佳的旋钮值。 还发布了一些arm设备的预调参数。可以转到arm cpu基准测试来查看结果。 本文不会在Windows 阅读详情

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/

作者:Lianmin Zheng, Zhao Wu, Eddie Yan

针对特定 ARM 设备的自动调优对于获得最佳性能至关重要,本文介绍如何调优整个卷积网络。

TVM 中 ARM CPU 的算子实现是以 template 形式编写的,该 template 有许多可调参数(tile 因子,vectorization,unrolling等)。对神经网络中的所有卷积和深度卷积算子调优后,会生成一个日志文件,它存储所有必需算子的最佳参数值。当 TVM 编译器编译这些算子时,会查询这个日志文件,从而获取最佳参数值。

我们还发布了一些 ARM 设备的预调参数。可以前往 ARM CPU Benchmark 查看结果。

注意,本教程无法在 Windows 或最新版本的 macOS 上运行。若要运行,需要将本教程的主体包装在 if name == “main”: 块中。

安装依赖

要在 TVM 中使用 autotvm 包,需要安装额外的依赖(如果用的是 Python2,请将「3」更改为「2」):

pip3 install --user psutil xgboost tornado cloudpickle

为了让 TVM 在调优中运行更快,推荐使用 Cython 作为 TVM 的 FFI。在 TVM 的根目录下,执行如下命令:(若使用 Python2,将「3」改为「2」):

pip3 install --user cython
sudo make cython3

在 Python 代码中导入包:

import os
import numpy as np

import tvm
from tvm import relay, autotvm
import tvm.relay.testing
from tvm.autotvm.tuner import XGBTuner, GATuner, RandomTuner, GridSearchTuner
from tvm.contrib.utils import tempdir
import tvm.contrib.graph_executor as runtime

定义网络

首先要在 relay 前端 API 中定义网络,可以从 relay.testing 加载一些预定义的网络,还可以从 MXNet、ONNX 和 TensorFlow 加载模型。

def get_network(name, batch_size):
    """获取网络的符号定义和随机权重"""
    input_shape = (batch_size, 3, 224, 224)
    output_shape = (batch_size, 1000)

    if "resnet" in name:
        n_layer = int(name.split("-")[1])
        mod, params = relay.testing.resnet.get_workload(
            num_layers=n_layer, batch_size=batch_size, dtype=dtype
        )
    elif "vgg" in name:
        n_layer = int(name.split("-")[1])
        mod, params = relay.testing.vgg.get_workload(
            num_layers=n_layer, batch_size=batch_size, dtype=dtype
        )
    elif name == "mobilenet":
        mod, params = relay.testing.mobilenet.get_workload(batch_size=batch_size)
    elif name == "squeezenet_v1.1":
        mod, params = relay.testing.squeezenet.get_workload(
            batch_size=batch_size, version="1.1", dtype=dtype
        )
    elif name == "inception_v3":
        input_shape = (batch_size, 3, 299, 299)
        mod, params = relay.testing.inception_v3.get_workload(batch_size=batch_size, dtype=dtype)
    elif name == "mxnet":
        # MXNet 模型的示例
        from mxnet.gluon.model_zoo.vision import get_model

        block = get_model("resnet18_v1", pretrained=True)
        mod, params = relay.frontend.from_mxnet(block, shape={"data": input_shape}, dtype=dtype)
        net = mod["main"]
        net = relay.Function(
            net.params, relay.nn.softmax(net.body), None, net.type_params, net.attrs
        )
        mod = tvm.IRModule.from_expr(net)
    else:
        raise ValueError("Unsupported network: " + name)

    return mod, params, input_shape, output_shape

启动 RPC Tracker

TVM 使用 RPC session 与 ARM 板进行通信,在调优期间,调优器会将生成的代码发送到板上并测试板上代码的速度。

为了加速调优,TVM 使用 RPC Tracker(集中的控制器节点)来管理分布式设备。例如,若有 10 部手机,可以将它们全部注册到 Tracker,并行运行 10 次测试,从而加快调优过程。

要启动 RPC tracker,在主机上运行如下命令。在整个调优过程中都需要 tracker,因此需要为此命令打开一个新终端:

python -m tvm.exec.rpc_tracker --host=0.0.0.0 --port=9190

预期输出:

INFO:RPCTracker:bind to 0.0.0.0:9190

将设备注册到 RPC Tracker

接下来把设备注册到 Tracker。第一步是为 ARM 设备构建 TVM runtime。

  python -m tvm.exec.rpc_server --tracker=[HOST_IP]:9190 --key=rk3399

(将 [HOST_IP] 换为你的主机 IP 地址)

  • 对于 Android:按照此 说明 在 Android 设备上安装 TVM RPC APK,确保可以通过 Android rpc 测试。在调优期间,打开手机开发者选项并勾选「在更改期间保持屏幕唤醒」,为手机接通电源。

注册设备后,通过查询 rpc_tracker 来确认是否注册成功

python -m tvm.exec.query_rpc_tracker --host=0.0.0.0 --port=9190

例如,如果有 2 台华为 mate10 pro、11 台树莓派 3B 和 2 台 rk3399,则输出是

Queue Status
----------------------------------
key          total  free  pending
----------------------------------
mate10pro    2      2     0
rk3399       2      2     0
rpi3b        11     11    0
----------------------------------

将多个设备注册到 tracker,从而加快调优测试。

设置调优选项

在调优之前,进行配置。这里以 RK3399 板为例。根据自己的设备修改 target 和 device_key。若用 Android 手机,请将 use_android 设置为 True。

#### 设备配置 ####
# 将 "aarch64-linux-gnu" 替换为单板的正确 target。
# 此 target 用于交叉编译。可以通过:code:`gcc -v` 来查询。
target = tvm.target.Target("llvm -device=arm_cpu -mtriple=aarch64-linux-gnu")

# 根据设备替换 device_key 的值
device_key = "rk3399"

# 若使用 Android 手机,设置 use_android 为 True
use_android = False

#### 调优选项 ####
network = "resnet-18"
log_file = "%s.%s.log" % (device_key, network)
dtype = "float32"

tuning_option = {
    "log_filename": log_file,
    "tuner": "xgb",
    "n_trial": 1500,
    "early_stopping": 800,
    "measure_option": autotvm.measure_option(
        builder=autotvm.LocalBuilder(build_func="ndk" if use_android else "default"),
        runner=autotvm.RPCRunner(
            device_key,
            host="127.0.0.1",
            port=9190,
            number=5,
            timeout=10,
        ),
    ),
}

开始调优

下面开始从网络中提取调优任务,并开始调优。接下来我们提供一个简单的实用函数。它只是一个初始实现,按顺序对任务列表进行调优。未来会引入更复杂的调优 scheduler。

# 可跳过此函数的实现。
def tune_tasks(
    tasks,
    measure_option,
    tuner="xgb",
    n_trial=1000,
    early_stopping=None,
    log_filename="tuning.log",
    use_transfer_learning=True,
):
    # 创建 tmp 日志文件
    tmp_log_file = log_filename + ".tmp"
    if os.path.exists(tmp_log_file):
        os.remove(tmp_log_file)

    for i, tsk in enumerate(reversed(tasks)):
        prefix = "[Task %2d/%2d] " % (i + 1, len(tasks))

        # 创建调优器
        if tuner == "xgb":
            tuner_obj = XGBTuner(tsk, loss_type="reg")
        elif tuner == "xgb_knob":
            tuner_obj = XGBTuner(tsk, loss_type="reg", feature_type="knob")
        elif tuner == "xgb_itervar":
            tuner_obj = XGBTuner(tsk, loss_type="reg", feature_type="itervar")
        elif tuner == "xgb_curve":
            tuner_obj = XGBTuner(tsk, loss_type="reg", feature_type="curve")
        elif tuner == "xgb_rank":
            tuner_obj = XGBTuner(tsk, loss_type="rank")
        elif tuner == "xgb_rank_knob":
            tuner_obj = XGBTuner(tsk, loss_type="rank", feature_type="knob")
        elif tuner == "xgb_rank_itervar":
            tuner_obj = XGBTuner(tsk, loss_type="rank", feature_type="itervar")
        elif tuner == "xgb_rank_curve":
            tuner_obj = XGBTuner(tsk, loss_type="rank", feature_type="curve")
        elif tuner == "xgb_rank_binary":
            tuner_obj = XGBTuner(tsk, loss_type="rank-binary")
        elif tuner == "xgb_rank_binary_knob":
            tuner_obj = XGBTuner(tsk, loss_type="rank-binary", feature_type="knob")
        elif tuner == "xgb_rank_binary_itervar":
            tuner_obj = XGBTuner(tsk, loss_type="rank-binary", feature_type="itervar")
        elif tuner == "xgb_rank_binary_curve":
            tuner_obj = XGBTuner(tsk, loss_type="rank-binary", feature_type="curve")
        elif tuner == "ga":
            tuner_obj = GATuner(tsk, pop_size=50)
        elif tuner == "random":
            tuner_obj = RandomTuner(tsk)
        elif tuner == "gridsearch":
            tuner_obj = GridSearchTuner(tsk)
        else:
            raise ValueError("Invalid tuner: " + tuner)

        if use_transfer_learning:
            if os.path.isfile(tmp_log_file):
                tuner_obj.load_history(autotvm.record.load_from_file(tmp_log_file))

        # 开始调优
        tsk_trial = min(n_trial, len(tsk.config_space))
        tuner_obj.tune(
            n_trial=tsk_trial,
            early_stopping=early_stopping,
            measure_option=measure_option,
            callbacks=[
                autotvm.callback.progress_bar(tsk_trial, prefix=prefix),
                autotvm.callback.log_to_file(tmp_log_file),
            ],
        )

    # 选择最佳记录到缓存文件
    autotvm.record.pick_best(tmp_log_file, log_filename)
    os.remove(tmp_log_file)

最后启动调优任务,并评估端到端性能。

def tune_and_evaluate(tuning_opt):
    # 从 relay 程序中提取工作负载
    print("Extract tasks...")
    mod, params, input_shape, _ = get_network(network, batch_size=1)
    tasks = autotvm.task.extract_from_program(
        mod["main"], target=target, params=params, ops=(relay.op.get("nn.conv2d"),)
    )

    # 运行调优任务
    print("Tuning...")
    tune_tasks(tasks, **tuning_opt)

    # 编译具有历史最佳记录的内核
    with autotvm.apply_history_best(log_file):
        print("Compile...")
        with tvm.transform.PassContext(opt_level=3):
            lib = relay.build_module.build(mod, target=target, params=params)

        # 导出库
        tmp = tempdir()
        if use_android:
            from tvm.contrib import ndk

            filename = "net.so"
            lib.export_library(tmp.relpath(filename), ndk.create_shared)
        else:
            filename = "net.tar"
            lib.export_library(tmp.relpath(filename))

        # 上传模块到设备
        print("Upload...")
        remote = autotvm.measure.request_remote(device_key, "127.0.0.1", 9190, timeout=10000)
        remote.upload(tmp.relpath(filename))
        rlib = remote.load_module(filename)

        # 上传参数到设备
        dev = remote.device(str(target), 0)
        module = runtime.GraphModule(rlib["default"](dev))
        data_tvm = tvm.nd.array((np.random.uniform(size=input_shape)).astype(dtype))
        module.set_input("data", data_tvm)

        # 评估
        print("Evaluate inference time cost...")
        print(module.benchmark(dev, number=1, repeat=10))

# 不在网页服务器中运行调优,因为它耗时很久。
# 取消注释运行下一行
# tune_and_evaluate(tuning_option)

样本输出

调优需要编译许多程序,并从中提取特征,所以推荐使用高性能的 CPU。下面列出了一个输出示例。在 32T AMD Ryzen Threadripper 设备上,大约耗时 2 个小时。

Extract tasks...
Tuning...
[Task  1/12]  Current/Best:   22.37/  52.19 GFLOPS | Progress: (544/1000) | 406.59 s Done.
[Task  2/12]  Current/Best:    6.51/  18.77 GFLOPS | Progress: (608/1000) | 325.05 s Done.
[Task  3/12]  Current/Best:    4.67/  24.87 GFLOPS | Progress: (480/1000) | 372.31 s Done.
[Task  4/12]  Current/Best:   11.35/  46.83 GFLOPS | Progress: (736/1000) | 602.39 s Done.
[Task  5/12]  Current/Best:    1.01/  19.80 GFLOPS | Progress: (448/1000) | 262.16 s Done.
[Task  6/12]  Current/Best:    2.47/  23.76 GFLOPS | Progress: (672/1000) | 563.85 s Done.
[Task  7/12]  Current/Best:   14.57/  33.97 GFLOPS | Progress: (544/1000) | 465.15 s Done.
[Task  8/12]  Current/Best:    1.13/  17.65 GFLOPS | Progress: (576/1000) | 365.08 s Done.
[Task  9/12]  Current/Best:   14.45/  22.66 GFLOPS | Progress: (928/1000) | 724.25 s Done.
[Task 10/12]  Current/Best:    3.22/  15.36 GFLOPS | Progress: (864/1000) | 564.27 s Done.
[Task 11/12]  Current/Best:   11.03/  32.23 GFLOPS | Progress: (736/1000) | 635.15 s Done.
[Task 12/12]  Current/Best:    8.00/  21.65 GFLOPS | Progress: (1000/1000) | 1111.81 s Done.
Compile...
Upload...
Evaluate inference time cost...
Mean inference time (std dev): 162.59 ms (0.06 ms)

下载 Python 源代码:tune_relay_arm.py

下载 Jupyter Notebook:tune_relay_arm.ipynb

TVM在ARM GPU上优化移动深度学习 TVM在ARM GPU上优化移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长。与在台式机平台上所做的类似,在移动设备中使用GPU可以提高推理速度和能源效率。但是,大多数现有的深度学习框架都不能很好地支持移动GPU。困难在于移动GPU架构和台式机GPU架构之间的差异。这意味着在移动GPU上进行优化需要付出特殊的努力。繁琐的额外工作最终导致大多数深度学习框架中对移动GPU的支持不佳。 TVM通过引入统一的IR堆栈解决了部署不同硬件的困难,通过该IR堆栈可以轻松完成针对不同硬件 阅读详情

相关推荐

TVM自动调优实战:从AutoTVM到Meta Schedule的演进与性能对比

本文深入对比了TVM自动调优系统的三代演进:从需要手动编写模板的AutoTVM,到全自动的Ansor,再到统一且可扩展的Meta Schedule。文章通过代码实例解析了各代系统的核心原理、优势与局限,并提供了实战选型指南,帮助开发者根据项目需求(如动态形状支持、硬件特定指令利用)选择最合适的AI模型部署优化方案。

weixin_29292535的博客 355

【tvm官网教程01】设计和架构-1

【tvm官网教程01】设计和架构-1目的1. 编译流1.1 关键数据结构1.2 Transformations1.2.1 变换的分类1.2.2 relay/transform1.2.2.1 子函数1.2.2.2 overall问题1.2.3 tir/transform1.3 搜索空间和基于学习的transformation1.4 Target Translation1.5 Runtime Execution1.6 小结2. 逻辑组件2.1 tvm/support2.2 tvm/runtime2.3 tvm

B10030607的博客 1994

TVM 优化 ARM GPU 上的移动深度学习

TVM 优化 ARM GPU 上的移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长。与桌面平台上所做的类似,在移动设备中使用 GPU 既有利于推理速度,也有利于能源效率。但是,大多数现有的深度学习框架并不很好地支持移动 GPU。难点在于移动 GPU 架构和桌面 GPU 架构之间的区别。这意味着在移动 GPU 上进行优化需要特别努力。非平凡的额外工作最终导致移动 GPU 在大多数深度学习框架中支持不力。 TVM 通过引入统一的 IR 堆栈,解决为不同硬件部署的困难,从而轻松

吴建明wujianming_110117 1277

【从零开始学深度学习编译器】一,深度学习编译器及TVM 介绍

0x0. 介绍 大家好呀,在过去的半年到一年时间里,我分享了一些算法解读,算法优化,模型转换相关的一些文章。这篇文章是自己开启学习深度学习编译器的第一篇文章,后续也会努力更新这个系列。这篇文章是开篇,所以我不会具体讲解TVM的知识,更多的是介绍一下我自己眼中的深度学习编译器是什么?以及为什么我要选择学习TVM,最后我也会给出一个让读者快速体验TVM效果的一个开发环境搭建的简要教程。 0x1. 为什么需要深度学习编译器? 深度学习编译器这个词语,我们可以先拆成两个部分来看。 首先谈谈深度学习领域。从训练框架角

I good vegetable a! 4091

ARM CPU神经网络自动调度

ARM CPU神经网络自动调度 对特定设备和工作负载进行自动调整对于获得最佳性能至关重要。这是一个有关如何通过RPC使用自动调度器为ARM CPU调整整个神经网络的教程。 为了自动调整神经网络,将网络划分为小的子图,对其进行独立调整。每个子图被视为一个搜索任务。任务调度程序可以对时间进行分片,为这些任务动态分配时间资源。任务调度程序可以预测每个任务对端到端执行时间的影响,优先安排可以最大程度地减少执行时间的任务。 对于每个子图,使用compute声明tvm/python/topi,获取张量表达式形式的计算D

吴建明wujianming_110117 773

TVM学习教程

目录Step 1:TVM 视频介绍Step 2:研读 TVM 论文Step 3:了解 TVM 官网中可以学习的资料Step 4:上手 TVM CodeStep 5:TVM 其他相关资料 Step 1:TVM 视频介绍 https://www.bilibili.com/video/av29521815/ Step 2:研读 TVM 论文 https://www.usenix.org/system/files/osdi18-chen.pdf Step 3:了解 TVM 官网中可以学习的资料 https://tv

qq_33287871的博客 3077

TVM安装教程(踩坑记录)

TVM安装教程以及一些踩坑记录

m0_49339981的博客 2279

FPGA以太网通信实战(一):实现MDIO接口驱动,掌控PHY芯片的钥匙

本文介绍了以太网通信技术及其核心组件。首先概述了以太网的发展历程,从标准以太网(10Mbps)到万兆以太网(10Gbps)的技术演进。重点分析了以太网接口的两大核心部件:MAC控制器负责数据链路层协议处理,PHY芯片负责物理信号转换和连接管理。文章详细解读了MDIO接口规范,包括帧格式和读写时序,并以YT8531 PHY芯片为例,介绍了其寄存器配置方法。最后设计了一个FPGA实现方案,通过MDIO接口完成PHY芯片的软复位和状态监测功能,并利用LED指示灯实时显示网络连接速率。

weixin_64402689的博客 1662

MNN卷积性能提升90%!ARMv86正式投用

ARMv86指令集新增了通用矩阵乘指令与bf16的支持,这些指令理论性能是ARMv82sdot的2倍;使用这些指令实现int8/bf16矩阵乘能够带来显著的性能提升。本文使用ARMv86的新增指令对MNN的ConvInt8和MatMul算子进行实现,最高得到了大约90%的性能提升。技术背景为了提升端侧推理速度,降低内存占用,MNN除了支持fp32的模型推理外,还支持fp16, bf16, int8...

淘系技术 2769

Labview执行adbshell操作

一、目录 1、实现思路 2、adbshell工具配置 3、Labview执行命令窗口 1、实现思路 使用Labview的优点: 1、可以配合电源系统或者调用其他接口工具实现更高程度的自动化测试; 2、直接执行Linux相关命令,编写相关执行顺序或者逻辑更简易; --------可以用adbpush命令将.sh的脚本文件推入控制器内部执行; 3、Ubuntu系统比较大,如果只是日常执行脚本测试还是比较占用磁盘空间; 2、adbshell工具配置 1)下载adbshell工具; adbshell工具下载链

zataji的博客 2053

三相电机控制入门:端电压、相电压、线电压到底怎么测?(附实测波形对比)

本文为三相电机控制初学者提供了端电压、相电压和线电压的完整测量指南。通过厘清三者的物理定义与测量方法,详细讲解了如何搭建虚拟星形点电路,并对比分析了方波、SPWM和SVPWM三种主流控制模式下关键电压波形的核心特征与差异,帮助工程师掌握正确的示波器测量与波形解读技巧。

oauth7security的博客 650

【TVM教程】为 Mobile GPU 自动调优卷积网络

首先要在 Relay 前端 API 中定义网络,可以从 relay.testing 加载一些预定义的网络,也可以从 MXNet、ONNX 和 TensorFlow 加载模型。

HyperAI超神经 831

FreeSWITCH编译安装详细文档

本文档详细介绍了在Ubuntu 22.04系统上从源码编译安装FreeSWITCH的完整流程。主要内容包括:1)系统环境准备和依赖库安装;2)关键依赖库spandsp和sofia-sip的编译安装;3)FreeSWITCH源码的特定版本(v1.6.0)编译配置,包括禁用SignalWire模块的配置方法;4)系统服务配置,包括创建专用用户、设置权限以及配置systemd服务文件。文档特别提供了版本控制说明,确保后期能切换到相同的版本环境,并附有详细的命令操作步骤和注意事项。

唯有代码让我痴狂 1369

ARM CPU自动调度神经网络

ARM CPU自动调度神经网络 对特定设备和工作负载进行自动调度,对于获得最佳性能至关重要。通过RPC使用自动调度器为ARM CPU调度整个神经网络。 为了自动调度神经网络,将网络划分为小的子图,进行独立调度。每个子图被视为一个搜索任务。任务调度程序对时间进行分片,为这些任务动态分配时间资源。任务调度程序预测每个任务对端到端执行时间的影响,确定最大程度地减少执行时间的任务的优先级。 对于每个子图,使用compute声明tvm/python/topi,获取张量表达式形式的计算DAG。使用自动调度器来构造此DA

吴建明wujianming_110117 913

告别深度学习!用5个麦克风搞定多说话人分离:ReTM算法保姆级教程

本文详细介绍了ReTM算法,这是一种无需深度学习、仅需5个麦克风即可实现多说话人语音分离的创新信号处理方法。它通过估计相对传递矩阵,利用空间物理信息在混响环境中分离语音,具有数据需求低、计算复杂度小、无需先验几何信息等优势,特别适合嵌入式设备和资源受限场景。

desk3的博客 157

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

算法如诗的博客 258

keras用cpu加速_在CPU上加速卷积神经网络

文:刘忆智 王贻达 AWS AI在AWS AI,我们发现虽然GPU在深度学习里扮演着重要角色,实际操作中有很多卷积神经网络推理其实都由CPU上完成,无论是在云上还是在终端。经过一番评测,我们认识到没有一款深度学习框架可以在各种主流CPU(包括Intel, AMD和ARM)都高效地进行卷积神经网络推理,主要原因是大家的做法都过于依赖第三方库,再加上框架本身不可避免地带来了一些overhead。为了做...

weixin_28366353的博客 818

大数据分析工具Power BI(二):Power BI下载安装和模块介绍

首先在Microsoft官方网站上下载PowerBI Desktop,然后进行安装。id=58494点击"Next"后会弹出下载框,进行下载即可,下载好的PowerBI名称为"PBIDesktopSetup_x64.exe",也可以在"资料"中获取安装包,双击安装包即可安装。

Lansonli(蓝深李)的博客 2319

【TVM教程】在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM

Apache TVM是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →本节使用示例说明如何使用 TVM 在带有 CMSIS-NN 的 Arm® Cortex®-M55 CPU 和 Ethos™-U55 NPU 的裸机上运行模型。Cortex®-M55 是一款用于嵌入式设备的小型低功耗 CPU。CMSIS-NN 是针对 Arm® Cortex®-M CPU 优化的内核集合。

HyperAI超神经 2001

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

TVM:简介

TVM:简介概述 Apache TVM 是一个用于 CPU、GPU 和机器学习加速器的开源机器学习编译器框架。它旨在使机器学习工程师能够在任何硬件后端上高效地优化和运行计算。本教程的目的是通过定义和演示关键概念,引导您了解 TVM 的所有主要功能。新用户应该能够从头到尾完成本教程的工作,并能够操作 TVM 进行自动模型优化,同时对 TVM 架构及其工作原理有基本的了解。 内容 介绍 安装 TVM 使用命令行界面编译和优化模型 使用 Python 接口编译和优化模型 使用张量表达式使用运算符 使用模板和 A

weixin_44966641的博客 4758

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

tictoc正方形网络模型_在CPU上加速卷积神经网络

文:刘忆智 王贻达 AWS AI在AWS AI,我们发现虽然GPU在深度学习里扮演着重要角色,实际操作中有很多卷积神经网络推理其实都由CPU上完成,无论是在云上还是在终端。经过一番评测,我们认识到没有一款深度学习框架可以在各种主流CPU(包括Intel, AMD和ARM)都高效地进行卷积神经网络推理,主要原因是大家的做法都过于依赖第三方库,再加上框架本身不可避免地带来了一些overhead。为了做...

weixin_39845241的博客 404

TVM ImageNet 性能基准测试完全指南:从 NVIDIA GPU 到 ARM/Mali、Adreno 嵌入式平台的端到端复现

本指南围绕 Apache TVM 开源仓库中 [apps/benchmark](https://link.gitcode.com/i/f762676a8e95bcf027d49bc8d0d138e1) 目录提供的官方 ImageNet 性能基准脚本展开,系统讲解如何在不同硬件平台(NVIDIA GPU、AMD GPU、ARM CPU、Mali GPU、Adreno GPU)上复现 TVM 的推理性

gitblog_00360的博客 461

从零到一:TVM编译工程师的实战进阶指南

本文为深度学习编译工程师提供了一份TVM实战进阶指南。从环境搭建、核心IR与优化哲学解析,到ResNet-18模型在CPU/GPU及树莓派等边缘设备的完整优化部署流程,系统讲解了如何利用TVM实现深度学习模型的高效编译与硬件优化,助力开发者跨越部署鸿沟。

agile9scrum的博客 629

TVM 从入门到精通 | 安装 TVM (Part 2)

By 超神经内容一览:TVM 共有三种安装方法:从源码安装、使用 Docker 镜像安装和 NNPACK Contrib 安装。本文讲解如何通过 Docker 镜像 和 NNPACK Contrib 安装。

HyperAI超神经 1283

深度学习编译器优化与自动调优技术解析

深度学习编译器作为连接算法模型与底层硬件的关键技术,通过多层中间表示(IR)和自动调优技术,显著提升神经网络执行效率。其核心原理包括计算图优化、张量表达式生成和目标代码生成,特别针对GPU/CPU等硬件特性进行深度优化。TVM、Ansor等主流框架通过自动调度和搜索算法(如贝叶斯优化、强化学习)实现算子融合、内存访问优化等关键改进,在ResNet、BERT等模型上取得1.7倍以上加速效果。该技术广泛应用于边缘计算、模型部署等场景,与模型量化结合可进一步提升推理性能,是AI工程化落地的关键技术支撑。

weixin_33725807的博客 404
上一篇: 【vLLM 学习】使用 ROCm 安装
下一篇: 成功率可达100%,药物开发公司Cellarity联手英伟达,基于强化学习优化靶向分子
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值