TVM设备与目标交互:深度学习模型部署的核心机制解析
1. 项目概述TVM中的设备与目标交互在深度学习模型部署的实战中我们常常会遇到一个核心矛盾模型是在高性能GPU上训练出来的但最终却要运行在五花八门的硬件上比如手机CPU、嵌入式NPU甚至是定制的FPGA。这个从“训练环境”到“部署环境”的鸿沟就是TVMTensor Virtual Machine这类编译栈要解决的核心问题。而“设备”与“目标”的交互正是跨越这道鸿沟的桥梁。简单来说“目标”描述了我们希望代码最终在什么样的硬件和软件环境下运行它定义了硬件的指令集架构如ARMv8、具体的计算单元如CPU的-mcpu参数、操作系统如Linux和运行时库如OpenCL。而**“设备”** 则代表了程序执行时实际握在手里的那块物理或逻辑硬件实体它负责承载计算、管理内存。很多刚接触TVM的朋友会把这两者混淆或者觉得配置起来很麻烦。实际上理解并正确配置它们是让模型在目标硬件上“跑起来”且“跑得快”的第一步。这就像你要出差“目标”是你行程单上的目的地和交通方式例如北京乘坐高铁而“设备”就是你实际坐上去的那列具体的高铁车厢。行程单目标决定了你能否到达以及大致的路线而具体的车厢设备则决定了你旅途中的实际体验。本文将从一个实践者的角度深入拆解TVM中设备与目标的概念、交互方式以及那些官方文档里不会细说的“踩坑”经验。2. 核心概念深度解析目标与设备的本质2.1 目标部署环境的蓝图目标tvm.target.Target不是一个运行时概念而是一个编译期概念。它是在编译模型时告诉TVM编译器“请为这样的环境生成代码”。一个完整的目标定义通常包含几个关键维度硬件架构这是最核心的比如llvm(x86/ARM CPU)、cuda(NVIDIA GPU)、opencl(支持OpenCL的GPU/加速器)、vulkan(移动端/跨平台GPU)、metal(Apple GPU)。对于ARM CPU我们还会指定具体的-mcpu例如-mcpucortex-a53或-mcpuapple-m1。操作系统与运行时例如-system-lib用于生成独立的系统库或者与-runtimec配合指定为纯C运行时环境。对于嵌入式场景可能还需要指定-mattr机器属性来启用特定扩展指令集。硬件特性通过-mattr可以微调例如对于ARM CPUneon启用NEON SIMD指令v8.2a启用特定ARMv8.2的特性。一个典型的目标字符串看起来像这样“llvm -mcpuskylake-avx512”或“cuda -archsm_86”。在代码中我们这样创建目标对象import tvm # 为 NVIDIA RTX 3080 (Ampere架构) 定义目标 cuda_target tvm.target.Target(“cuda -archsm_86”) # 为树莓派4B (Cortex-A72) 定义目标 arm_target tvm.target.Target(“llvm -mtripleaarch64-linux-gnu -mcpucortex-a72”)注意-mtriple用于明确指定目标三元组架构-厂商-操作系统在交叉编译时至关重要它能确保编译器生成正确的汇编代码和调用约定。2.2 设备代码执行的沙箱设备tvm.runtime.Device是运行时的实体。它代表了TVM计算图或算子实际执行时所处的物理或逻辑上下文。每个设备都有其对应的设备APIDevice API负责管理该设备上的内存分配、数据拷贝、内核启动等操作。在TVM中设备通过设备类型DLDeviceType和设备ID来标识。常见的设备类型有kDLCPU(1),kDLCUDA(2),kDLOpenCL(4),kDLVulkan(7),kDLMetal(8) 等。设备ID通常用于区分同类型的多个设备比如多卡GPU系统中的GPU:0和GPU:1。创建和切换设备是运行时的工作import tvm # 获取本地CPU设备 cpu_dev tvm.cpu() # 获取第一个CUDA GPU设备 gpu_dev tvm.cuda(0) # 在OpenCL设备上运行 opencl_dev tvm.opencl(0)设备的核心职责是内存管理。在TVM中tvm.nd.array创建数组时必须指定一个设备上下文。数组数据将驻留在该设备的内存中。不同设备间的数据移动如从CPU拷贝到GPU必须显式进行这是异构计算中性能考量的关键点。2.3 目标与设备的关联与解耦理解了各自定义它们的交互关系就清晰了编译时依赖目标运行时依赖设备。编译器根据“目标”生成适配的代码模块runtime.Module。运行时我们需要将编译好的模块加载到正确的“设备”上执行。目标必须与设备兼容。你不能为一个cuda目标编译的模块加载到opencl设备上运行这会导致运行时错误。同样为ARMv8编译的模块也无法在x86CPU上运行。一个目标可以对应多个同类型设备。例如用“cuda -archsm_70”目标编译的模块可以在任何计算能力 sm_70 的NVIDIA GPU设备上运行。这种设计实现了解耦同一份针对某个“目标”编译的部署包如动态库.so或.tar可以分发到任何满足该目标规格的“设备”上运行只要设备驱动和运行时环境正确。3. 完整工作流实操从编译到部署让我们通过一个完整的端到端例子看看目标和设备是如何在TVM工作流中协同工作的。我们将把一个简单的神经网络层部署到本地GPUCUDA上。3.1 步骤一模型定义与计算图构建首先我们使用TVM的Tensor ExpressionTE来定义一个简单的二维矩阵乘法MatMul操作这可以看作是神经网络中的一个全连接层。import tvm from tvm import te import numpy as np # 定义矩阵尺寸 M, N, K 1024, 1024, 1024 # 使用TE定义计算 A te.placeholder((M, K), name‘A’, dtype‘float32’) B te.placeholder((K, N), name‘B’, dtype‘float32’) k te.reduce_axis((0, K), name‘k’) C te.compute( (M, N), lambda i, j: te.sum(A[i, k] * B[k, j], axisk), name‘C’ ) # 创建调度 s te.create_schedule(C.op)这里我们还没有涉及任何目标或设备只是在定义抽象的计算逻辑。3.2 步骤二针对目标进行编译接下来我们指定目标并编译这个计算。假设我们的部署环境是一块具有Ampere架构的NVIDIA GPU如RTX 30系列。# 1. 定义目标 target tvm.target.Target(“cuda -archsm_86”) # sm_86 对应 Ampere架构 # 2. 使用AutoTVM进行调优可选但关键 # 在实际生产中我们会使用tune接口来搜索最优内核配置这里为演示省略直接编译。 log_file “matmul.log” # 假设我们已有调优记录可以加载。若无则使用默认调度。 # ctx tvm.context(str(target)) # measure_option autotvm.measure_option(builderautotvm.LocalBuilder(), runnerautotvm.LocalRunner(repeat3, number100, timeout4)) # task autotvm.task.create(“matmul”, args(M, N, K, ‘float32’, ‘float32’), targettarget) # tuner autotvm.tuner.XGBTuner(task) # tuner.tune(n_trial500, measure_optionmeasure_option, callbacks[autotvm.callback.log_to_file(log_file)]) # 3. 应用默认调度并编译 with tvm.transform.PassContext(opt_level3): # 构建运行时模块 mod tvm.build(s, [A, B, C], targettarget, name“matmul”)tvm.build函数是核心。它接收调度s、输入输出占位符、以及目标target然后调用底层的LLVM/NVCC/其他编译器生成针对该目标硬件优化过的机器代码并封装成一个可运行的模块mod。这个mod是目标相关的。3.3 步骤三在设备上运行编译完成后我们进入运行时阶段。此时需要具体的设备。# 1. 创建运行时设备 dev tvm.cuda(0) # 获取第一个CUDA设备 # 2. 在设备上分配内存并准备数据 # 创建随机数据在CPU上 np_a np.random.uniform(size(M, K)).astype(np.float32) np_b np.random.uniform(size(K, N)).astype(np.float32) # 将数据拷贝到设备内存中创建TVM NDArray a tvm.nd.array(np_a, devicedev) # 关键指定devicedev b tvm.nd.array(np_b, devicedev) # 在设备上分配输出内存 c tvm.nd.empty((M, N), devicedev, dtype“float32”) # 3. 加载模块到设备并执行 # mod是编译好的模块它包含了针对CUDA设备的内核函数 mod(a, b, c) # 这行代码会在dev设备上启动内核计算 # 4. 将结果拷贝回CPU验证 tvm_output c.numpy() # 进行简单的正确性验证使用CPU计算作为基准 np.testing.assert_allclose(np.dot(np_a, np_b), tvm_output, rtol1e-3) print(“GPU计算验证成功”)这个过程清晰地展示了分离mod是根据targetcuda sm_86编译的但它是在具体的devtvm.cuda(0)上被加载和执行的。tvm.nd.array构造函数中的device参数确保了数据位于正确的设备内存空间。3.4 步骤四交叉编译与远程部署对于嵌入式设备如树莓派、手机我们通常在更强大的开发机宿主机上进行交叉编译然后将编译产物部署到目标设备上运行。这里的目标和设备是物理分离的。在宿主机x86上定义目标并交叉编译# 宿主机上执行 target tvm.target.Target(“llvm -mtripleaarch64-linux-gnu -mcpucortex-a72 -mattrneon”) with tvm.transform.PassContext(opt_level3): # 交叉编译生成适用于ARM64的设备代码 mod tvm.build(s, [A, B, C], targettarget) # 将编译好的模块保存为动态库 mod.export_library(“lib_matmul_arm.so”)将动态库lib_matmul_arm.so和TVM运行时库拷贝到树莓派ARM设备上。在树莓派设备上加载并运行# 树莓派上执行 import tvm from tvm import rpc # 加载交叉编译好的模块 loaded_mod tvm.runtime.load_module(“lib_matmul_arm.so”) # 获取本地ARM CPU设备 dev tvm.cpu() # 准备数据并运行与本地运行类似 a tvm.nd.array(np_a, devicedev) b tvm.nd.array(np_b, devicedev) c tvm.nd.empty((M, N), devicedev, dtype“float32”) loaded_mod(a, b, c)在这个场景中宿主机上的target精确描述了远程树莓派的硬件特性而树莓派上的dev则是代码最终执行的物理环境。RPC远程过程调用机制进一步抽象了这种交互使得我们可以从宿主机直接调用远程设备上的函数。4. 高级交互模式与性能考量4.1 异构计算与多设备协作复杂的模型可能需要在多个设备上协同执行。TVM通过tvm.runtime.DeviceAPI和计算图划分来实现这一点。例如一个模型可能前半部分在CPU上进行数据预处理后半部分在GPU上进行密集计算。策略是使用TVM的图执行器Graph Executor并手动进行图划分relay.transform.AnnotateTarget和relay.transform.MergeCompilerRegions为计算图的不同部分指定不同的目标。编译后运行时调度器会根据设备标注将不同的算子分发到对应的设备上执行并自动插入必要的数据传输操作。# 伪代码示意实际使用Relay import tvm.relay as relay # ... 构建Relay计算图 ... # 标注目标将某些算子标记为在CUDA上运行其余在LLVM上运行 mod relay.transform.AnnotateTarget([“cuda”])(mod) mod relay.transform.MergeCompilerRegions()(mod) # 编译 with tvm.transform.PassContext(opt_level3): lib relay.build(mod, target{“cuda”: cuda_target, “llvm”: cpu_target}) # 运行时需要创建多个设备对象 cpu_dev tvm.cpu() gpu_dev tvm.cuda(0) # 图执行器会处理跨设备的数据流4.2 目标与自动调度器TVM的自动调度器如Ansor、AutoScheduler严重依赖目标信息来进行搜索。不同的硬件目标意味着完全不同的优化空间CPU优化重点在于循环平铺tiling、向量化vectorization、并行化parallel和缓存层次结构利用。GPU优化重点在于线程块block和线程thread的维度配置、共享内存使用、内存合并访问。特殊加速器可能需要定制化的张量指令Tensor Intrinsics。在调用tune接口时传入正确的target是调度器能够生成高效代码的前提。它会根据目标硬件特性在对应的搜索空间内寻找最优配置。4.3 内存布局与设备亲和性设备内存的布局如NCHW vs NHWC对性能有巨大影响。TVM的编译器可以根据目标设备偏好自动进行布局转换优化。例如CUDA设备通常更偏好NHWC格式而某些NPU可能固定要求NCHW。在定义计算和编译时可以通过layout参数进行提示。设备亲和性是指将计算和数据尽可能保持在同一个设备上以减少昂贵的数据传输PCIe带宽。在编写异构程序时一个重要的经验法则是尽量减少主机CPU与设备GPU之间的数据拷贝。应该尽可能在设备上完成整个计算流水线只在最终需要结果时才将数据拷回。5. 常见问题排查与实战技巧在实际操作中设备与目标配置不当是导致模型无法运行或性能低下的主要原因。下面是一些典型问题及解决方案。5.1 编译与运行时错误排查表错误现象可能原因排查步骤与解决方案RuntimeError: Check failed: ...提示设备API不匹配编译目标与运行设备类型不兼容。例如为llvm编译的模块在cuda设备上运行。1. 检查tvm.build()时传入的target字符串。2. 检查运行时tvm.nd.array或模块加载时指定的device类型是否与目标匹配。3. 确保设备驱动已正确安装如CUDA驱动。交叉编译后在目标设备上运行出现Illegal instruction目标中指定的CPU架构或特性-mcpu,-mattr高于目标设备的实际能力。1. 在目标设备上使用lscpu或cat /proc/cpuinfo查看CPU型号和支持的特性。2. 调整编译目标使用更保守的配置例如将-mcpucortex-a76改为-mcpucortex-a53或移除激进的-mattr如sve2。CUDA错误no kernel image is available for execution编译目标的-arch计算能力版本高于运行GPU的实际计算能力。1. 使用nvidia-smi查询GPU型号并查找其对应的计算能力如RTX 3080是sm_86。2. 确保target中的-arch参数等于或低于GPU实际能力。TVM支持向后兼容为sm_75编译的代码可以在sm_86上运行反之则不行。模型能运行但性能极差1. 使用了通用的、未调优的调度。2. 内存布局不佳导致设备内存访问效率低。3. 频繁的CPU/GPU数据拷贝。1.必须使用AutoTVM或AutoScheduler进行调优加载调优记录.log文件。2. 使用性能分析工具如Nsight Systems for CUDA查看内核执行时间和内存带宽利用率。3. 检查计算图确保算子融合良好减少中间内存分配和拷贝。RPC连接远程设备失败防火墙、端口、或RPC服务器未正确启动。1. 在目标设备上确认tvm.rpc.server已启动并监听正确端口。2. 检查宿主机与目标设备网络是否通畅。3. 对于嵌入式设备确保TVM运行时库已正确部署。5.2 实战经验与技巧目标字符串的“保守”原则在交叉编译时如果不确定目标设备的具体型号应选择该系列中较老、较通用的架构。例如为Android ARMv8设备编译使用“llvm -mtripleaarch64-linux-android -mcpucortex-a53”比cortex-a76有更好的兼容性。因为为低版本生成的代码通常能在高版本上运行。利用Target的host属性在异构编译中除了主要计算设备的目标如cuda还有一个host目标通常是llvm用于处理设备上无法运行的控制逻辑如条件判断、循环调度。在tvm.build中可以通过targettvm.target.Target(target, hosthost_target)来分别指定。设备内存的预分配与池化对于实时性要求高的应用频繁调用设备内存分配tvm.nd.empty可能带来开销。可以考虑在初始化时预分配一块大的内存池然后在应用生命周期内复用。TVM的vm运行时和某些自定义内存管理器支持此功能。调试小技巧先跑通CPU目标。当为复杂的新硬件如自定义加速器开发支持时一个有效的策略是首先将目标设置为llvm确保整个计算图编译和运行逻辑在CPU上是正确的。然后再将目标切换到新硬件集中精力解决硬件特定的代码生成和运行时问题。这能帮你快速定位问题是出在模型逻辑上还是出在硬件后端上。理解tvm.runtime.load_module的行为这个函数不仅用于加载本地文件它实际上是TVM运行时模块的动态加载入口。它可以加载本地文件路径.so,.tarRPC服务器返回的远程模块句柄通过const字节数组形式嵌入到程序中的模块数据 灵活运用这个特性可以实现模块的远程更新、动态加载等高级部署模式。设备与目标的交互是TVM将深度学习模型高效、灵活部署到多样硬件平台的基石。正确理解这对概念能让你在模型部署的道路上避开许多陷阱真正发挥出目标硬件的计算潜力。记住目标是编译器的导航图设备是运行时的执行引擎两者各司其职又紧密配合共同完成了从高级计算描述到本地高效代码执行的魔法。

相关新闻

三步彻底解决程序运行问题:VC++运行库一键安装完全指南

三步彻底解决程序运行问题:VC++运行库一键安装完全指南

三步彻底解决程序运行问题:VC运行库一键安装完全指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经满怀期待地打开新下载的游戏&#xf…

2026/8/3 23:21:21 阅读更多 →
Linux审计日志分析实战:使用audit-userspace识别系统入侵行为

Linux审计日志分析实战:使用audit-userspace识别系统入侵行为

Linux审计日志分析实战:使用audit-userspace识别系统入侵行为 【免费下载链接】audit-userspace Linux audit userspace repository 项目地址: https://gitcode.com/gh_mirrors/au/audit-userspace audit-userspace是Linux系统中一套强大的审计日志分析工具集…

2026/8/3 23:21:21 阅读更多 →
为什么选择SZTextView?揭秘这款占位符控件的5大优势

为什么选择SZTextView?揭秘这款占位符控件的5大优势

为什么选择SZTextView?揭秘这款占位符控件的5大优势 【免费下载链接】SZTextView A drop-in UITextView replacement which gives you: a placeholder. 项目地址: https://gitcode.com/gh_mirrors/sz/SZTextView SZTextView是一款专为iOS开发者打造的UITextV…

2026/8/3 23:21:21 阅读更多 →

最新新闻

StartupOS Android开发模板:Bazel+Firebase打造高效移动应用

StartupOS Android开发模板:Bazel+Firebase打造高效移动应用

StartupOS Android开发模板:BazelFirebase打造高效移动应用 【免费下载链接】startup-os Working examples of Googles Open Source stack and deployment to the cloud. 项目地址: https://gitcode.com/gh_mirrors/st/startup-os StartupOS Android开发模板…

2026/8/3 23:51:35 阅读更多 →
量子导引检测:从不完美测量到鲁棒性框架的实践指南

量子导引检测:从不完美测量到鲁棒性框架的实践指南

1. 项目背景与核心挑战:当量子导引遇上“不完美”的现实 在量子信息领域,量子导引是一个既迷人又关键的概念。简单来说,它描述了一种非对称的量子关联:一方(Alice)可以通过对自己拥有的粒子进行测量&#x…

2026/8/3 23:51:35 阅读更多 →
Demo跑通就能投简历?大模型求职真正筛掉你的是权限和日志

Demo跑通就能投简历?大模型求职真正筛掉你的是权限和日志

《别急着重做计算机专业就业,先看岗位到底在筛什么》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。摘要我最近翻简历的时候发现一个现象:很多同学的Agent项目都差不多——调一…

2026/8/3 23:51:35 阅读更多 →
ModernWMS终极部署指南:中小企业如何零成本搭建专业级仓储管理系统

ModernWMS终极部署指南:中小企业如何零成本搭建专业级仓储管理系统

ModernWMS终极部署指南:中小企业如何零成本搭建专业级仓储管理系统 【免费下载链接】ModernWMS The open source simple and complete warehouse management system is derived from our many years of experience in implementing erp projects. We stripped the o…

2026/8/3 23:50:35 阅读更多 →
拆解draw.io首次加载慢:从字体阻塞到前端性能优化实战

拆解draw.io首次加载慢:从字体阻塞到前端性能优化实战

1. 从一次真实的“等待”说起:为什么draw.io的首次加载如此磨人? 如果你和我一样,经常需要画流程图、架构图或者UML图,那么draw.io(现在也叫diagrams.net)大概率是你的工具箱里的常客。它免费、开源、功能强…

2026/8/3 23:50:35 阅读更多 →
MaxCompute实战避坑指南:权限、性能、成本与数据安全核心要点解析

MaxCompute实战避坑指南:权限、性能、成本与数据安全核心要点解析

1. 项目概述:为什么MaxCompute的“小问题”能卡住整个项目?在数据仓库和离线计算的实战里,阿里云MaxCompute(原名ODPS)几乎是国内大数据工程师绕不开的平台。它稳定、能处理海量数据,但就像一辆性能强悍但操…

2026/8/3 23:50:35 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →