KV Cache大模型推理加速功能
KV Cache
KV Cache是大模型标配的推理加速功能,也是推理过程中,显存资源巨大开销的元凶之一。在模型推理时,KV Cache在显存占用量可达30%以上。
目前大部分针对KV Cache的优化工作,主要集中在工程上。比如著名的VLLM,基于paged Attention,最大限度地利用碎片化显存空间,从而提升了空间利用率。
但是这些方案并没有从根本上改变KV Cache占用空间巨大的问题。
我们先来看看KV Cache的基本原理,然后在文章后面详细介绍DeepSeek MLA机制时,再来看DeepSeek-V2是怎么解决这个问题的。
KV Cache基本原理
如果不熟悉Transformer的生成过程,这部分推荐看看国外博主Jay Alammar的这篇文章:https://jalammar.github.io/illustrated-gpt2/
我们先回到Transformer计算Attention的公式,
大模型的推理是一个自回归的过程,即一个从头到尾逐步生成的过程。下一步的输出,取决于上一步。
假如我们需要输出Robot must obey orders这四个字。
模型生成第一步Robot时,会接收一个特殊字符,作为第一步的输入,然后输出Robot。接着将“ Robot”作为第二步的输入,生成must,以此类推,直到模型输出遇到最大长度限制,或者输出了停止字符,则停止输出过程。
我们来模拟一个输出过程中每一步全局的Masked Attention的计算过程。这里公式中忽略了
以便展示。
每一行代表一个查询向量与所有键向量的点积,但由于掩码的存在,每个查询只能访问它自己和之前的键(因果关系)。毕竟在生成的过程中,是不能看到后续的值的。
最后输出的softmax结果大概如下:
然后再将这个softmax结果,和对应的V值进行计算。在这个过程中,上面的矩阵计算,四行的Attention拆解下来如下,
我们可以发现这么一些规律:
每一个
的计算,只取决于当前步的,不需要以前的
。
之前的K和V,在后面会被重复利用。
那么这里就很清楚了,随着生成序列的增加,计算Attention的增多,前面步骤的K和V都需要参与后续的计算。
所以我们如果将之前的K和V都存储下来,就不用在当前这一步,再重新生成计算一次以前生成过的K和V。这就是KV Cache。一种空间换时间的做法。
所以可以看出,随着序列增长,需要存储的K和V逐渐增多,因此推理中产生的开销也会越大。
MOE架构
MOE层替代的是传统Transformer架构中FFN这一层。就是图中框红圈的Feed Forward层。
之前有写过一篇介绍大模型推理加速的文章,
队长:大模型推理加速,从逮虾户说起34 赞同 · 0 评论文章
阐述了FFN层
的几个问题,
第一,是FFN层参数量巨大,大概占了整个模型参数量的三分之二左右。
第二,FFN层的激活存在较大的稀疏性,也就是针对某些问题的输入,FFN层只有部分的参数是有用的。
MOE架构主要针对第二个问题进行了较大的改进。简而言之就是将一个完整的FFN,替换成由多个“专家网络
”组成的神经网络,这个神经网络可以是简单的FFN,或者其它结构。从而在推理或者训练时,能够针对不同的数据进行解耦,增加效率。
从上图的结构可以看出,MOE架构包含两个部分:
一个是之前说的多个专家网络组成的稀疏MOE层。
另一个是门控网络,决定了模型的输入,需要由哪个专家网络进行处理。
这么做的好处在推理中体现如下,
首先,提升了模型的拓展性,MoE的每个专家都负责处理一部分数据。这意味着整个模型可以包含大量的专家(和相应的参数),而每次只有少部分专家被激活处理特定的数据。这样,我们可以扩展模型的能力而不必担心处理速度变慢。
只有被门控机制选中的专家才会参与到当前输入的处理中。这不仅使模型在处理单个任务时更为高效,而且大大减少了不必要的计算,每个专家只计算与其专长相关的数据。
不过,也有随之而来的问题,最主要的问题是,需要设计一个高效和公平的门控机制,即负载均衡问题。它需要确保正确的专家被激活,同时避免某些专家被过度使用而其他专家则几乎闲置。
此外,还得确保每个专家都能得到足够的训练,以避免过拟合或欠拟合的问题,否则输出的稳定性会受到极大影响。
DeepSeek-V2详解
说完了背景知识,KV Cache和MOE,以及它们存在的一些问题。
我们可以来看看DeepSeek-V2对上述两个核心部分到底做了哪些改进。
Multiple Latent Attention
MLA是对传统多头注意力做的改进,其目的有两个:
降低推理过程中的KV Cache资源开销。
缓解MQA、MGA对性能的损耗。
首先来说第一点,之前介绍KV Cache中,提到每一步都需要将K和V缓存下来。假设单个Attention Block块中的多头注意力,有n个头,每个k和v的维度为d,则每一步需要缓存的参数量为
,l为block的块数。
因此,MLA立足于在推理中,降低
。对Key和Value进行了一个低秩联合压缩。
简单理解就是,假设有个矩阵的维度是
,那么可以将其分解为两个的矩阵相乘,而
。这样就降低了存储量。
具体来看看DeepSeek中的具体实现公式:
是对Key和Value压缩后的隐向量,通过一个降维映射矩阵和模型输入得到。的维度,远小于多头key和value的原始维度
。
得到这个
后,具体的key和value,由两个对应的升维矩阵和
还原。
在推理的过程中,只需要缓存每一步的
,然后再计算还原回原始的K和V即可。由于的维度远小于K、V。因此每一步token的推理产生的缓存由之前的,变成
。
另外,之前提到KV Cache中,Q的作用只发生在当下,但是在模型训练的过程中,每个输入的token会通过多头注意力机制生成对应的query、key和value。这些中间数据的维度往往非常高,因此占用的内存量也相应很大。所以论文中也提到,为了降低训练过程中的激活内存activation memory,DeepSeek-V2还对queries进行低秩压缩,即便这并不能降低KV Cache。
对Q的压缩方式和K、V一致。
至此,架构图中红圈部分已解释完毕。
位置编码解耦
从架构图中发现,DeepSeek-V2的q和k各自都有2个部分。1个部分是刚刚解释过的压缩部分,而另外的1个部分,加上了RoPE位置编码
。做了一个位置编码的解耦。
在RoPE的实现中,如果我们要让Q、K带上位置信息,会分别乘以相应的位置编码矩阵。
如果计算
时,就变成了
DeepSeek-V2对Q和K都进行了压缩,则整个过程变成:
这里,
和 分别是用于从低秩表示恢复到原始维度的解压缩矩阵。问题在于,由于低秩表示已经是压缩了的状态,直接在 和 上应用 和
不再等价于在完整的Q和K上应用位置编码。这是因为压缩操作可能已经丢失了某些信息,使得位置编码不能直接和有效地反映原始Q和K的位置关系。
为了解决这个问题,Deepseek-V2设计了两个pe结尾的变量用于储存旋转位置编码的信息,将信息存储和旋转编码解耦开。
最后将这四个变量分别拼接起来,形成带信息压缩的Q、K,以及带位置信息的Q、K,进行最后的计算。
最终,单个Token产生的缓存包含了两个部分,即
。
同时,与GQA和MQA相比,不同于MQA和GQA可能因合并或分组而丢失细节信息,MLA的压缩是基于保持尽可能多的原始信息的前提下进行的。这使得模型在执行注意力操作时,能够利用到更精确的信息,从而提高整体的性能。
DeepSeek MOE
DeepSeekMoE引入了两个主要策略:
细粒度专家分割(Fine-Grained Expert Segmentation):通过将每个FFN专家进一步细分,这允许模型在保持参数总数不变的情况下,激活更多的、更细粒度的专家。这种策略使得各个专家能够专注于更细致的知识领域,提高了专家的专业化程度。
共享专家隔离(Shared Expert Isolation):设置一部分专家作为“共享专家”,这些专家总是被激活,用于捕捉和整合常见的跨上下文知识。这样可以减少路由专家之间的知识冗余,每个路由专家可以更专注于独特的知识领域。
上图摘取自DeepSeek MOE的技术报告,从左到右分别是传统的MOE,细粒度专家分割,细粒度专家分割+共享专家隔离。
这两个策略是对缓解传统MoE的缺陷进行的改进,
知识杂糅(Knowledge Hybridity):传统的MoE模型中,每个专家往往需要处理多种类型的知识,这使得专家难以形成专门化的知识结构。
知识冗余(Knowledge Redundancy):不同的专家在处理不同的输入时可能需要相同的知识,导致多个专家中存在重复的知识,浪费了模型参数。
针对上面的缺陷,业界其实有挺多人做过实验,例如这篇文章,
作者对Mixtral-8x7B进行了实验,想知道模型中不同的专家是否贡献相同。于是作者逐一去掉了网络中的专家,再对模型进行测试。最后发现expert 3的贡献远大于其它专家。
呈现出了一人干活,旁人看戏的特点。
显然,Mixtral-8x7B可能负载均衡没做好,导致了这个问题。
那么Deepseek MoE是否也有类似的问题呢?
从技术报告的说明来看,似乎是没有,因为报告里专门写了一下,当只有4个路由专家被激活时,DeepSeekMoE 的表现(Pile 损失)也与基于GShard架构的同等参数量模型相当。
相关文章:
KV Cache大模型推理加速功能
KV Cache KV Cache是大模型标配的推理加速功能,也是推理过程中,显存资源巨大开销的元凶之一。在模型推理时,KV Cache在显存占用量可达30%以上。 目前大部分针对KV Cache的优化工作,主要集中在工程上。比如著名的VLLM,…...
Windows下安装WSL2下的Ubuntu、docker容器的IP地址(上)
既然容器支持多个应用,那么容易想到应该有对应的ip地址和端口,这样才能和Ubuntu主机进行通讯,ubuntu访问外网也应该有ip能连接到外网才行,要搞清楚这些ip地址的关系才行。 前面两篇文章中说了怎么实现windows和wsl2下的ubuntu的文…...
vue实现中英文切换
第一步:安装插件vue-i18n,npm install vue-i18n 第二步:在src下新建locales文件夹,并在locales下新建index.js、EN.js、CN.js文件 第三步:在EN.js和CN.js文件下配置你想要的字段,例如: //CN.js…...
探索 Vue 3 中 vue-router 的 router.resolve () API
一、router.resolve() 是什么 router.resolve() 就好比是一个精准的 “导航参谋”。当我们在 Vue 3 应用里需要明确某个路由地址对应的详细信息时,它就能派上用场。我们给它传入路由信息,像路径、参数等,它会解析出对应的路由对象࿰…...
Excel 插件推荐:提升Excel能力的效率神器!
一、Excel玩家的觉醒时刻 在财务部的深夜加班现场,李师傅的咖啡杯上凝结着第3圈水渍。眼前的Excel窗口堆叠如俄罗斯方块:重复值删除进度15%、VLOOKUP公式报错3处、合并单元格序号乱成毛线团…这场景是否也戳中了你的痛点? 每个Excel高手都经…...
leetcode_383. 赎金信_java
383. 赎金信https://leetcode.cn/problems/ransom-note/ 1、题目 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字…...
应用安全系列之四十五:日志伪造(Log_Forging)之三
1、简介 针对Java的日志系统有多种,本文主要描述如何通过修改配置文件来解决logback和log4j的日志伪造问题。 2、logback 2.1、系统提供的解决方案 在logback.xml中配置编码器自动转义特殊字符: 复制 <configuration><appender name"C…...
FTPClient开发遇到的坑
1. 生成文件夹乱序 这里用分隔符把路径划分开,意在一层一层创建目录 这里可能会出现乱序 正确的代码 先换一下分隔符 再一次生成所有路径 2.ftpClient 需要指定被动模式才能绕开端口限制 有些 服务器没有打开指定端口,上传文件会出现 425 Canno…...
leetcode0155. 最小栈-medium
1 题目:最小栈 官方标定难度:中 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。 void push(int val) 将元素val推入堆栈。 void pop() 删…...
操作系统 3.6-内存换出
换出算法总览 页面置换算法 FIFO(先进先出): 最简单的页面置换算法,淘汰最早进入内存的页面。 优点:实现简单。 缺点:可能会导致Belady异常,即增加内存反而降低性能。如果刚换入的页面马上又要…...
Python中的数值运算函数及math库详解
文章目录 Python中的数值运算函数及math库详解一、内置数值运算函数1. 基本数值运算函数2. 类型转换函数3. 进制转换函数 二、math库中的数学常数三、math库常用数学函数1. 数论与表示函数2. 幂函数与对数函数3. 三角函数4. 角度转换5. 双曲函数6. 特殊函数 四、实际应用示例1.…...
安卓开发提示Android Gradle plugin错误
The project is using an incompatible version (AGP 8.9.1) of the Android Gradle plugin. Latest supported version is AGP 8.8.0-alpha05 See Android Studio & AGP compatibility options. 改模块级 build.gradle(如果有独立配置):…...
《Uniapp-Vue 3-TS 实战开发》一键授权登录
在使用 UniApp 结合 Vue 3 和 TypeScript 开发时,实现一键授权登录功能通常涉及到调用微信小程序的授权接口(如 wx.getUserProfile 或 wx.login)来获取用户信息和登录凭证,然后将这些信息发送到后端进行验证和处理。以下是一个完整的实现示例,展示如何在 UniApp 中实现一键…...
Windows 图形显示驱动开发-WDDM 1.2功能_WDDM 1.2 和 Windows 8
简介 WDDM 是随 Windows Vista 一起引入的,以取代 Windows XP 或 Windows 2000 显示驱动程序模型 (XDDM) 。 随着 Windows Vista 中的引入,WDDM 体系结构提供了启用新功能的功能,例如桌面组合、增强的容错、视频内存管理器、GPU 计划程序、D…...
155.最小栈
1.题目解析 题目是让我们设计一个栈,它于STL库中栈的区别是支持检索到了最小元素的栈但是需要时间复杂度为常数,我们很容易想到的是记录最小值。但是如果中途删除的话最小值可能失效,所以我们选择用2个栈来实现。 2.算法原理 我们创建2个栈…...
[C语言笔记]10、字符串
前言: C语言的相关知识点的笔记均在下面的专栏链接中,欢迎订阅! c语言笔记_1zero10的博客-CSDN博客 10-1字符数组与字符串 1、字符数组就是一个数组,数组的每一个元素都是一个字符 首先利用字符数组,回顾以前学过…...
Windows系统备份和还原点
一、简介 系统的还原点存储了当前系统的主要状态,包括一些关键的配置信息和参数(包括注册表、系统服务设置、设备驱动程序设置等)。将此时的状态进行备份,在系统发生故障时,可以还原到此还原点的状态中,这…...
内联汇编知识点earlyclobber=
arm64内联汇编格式: asm volatile ("汇编指令1\n\t""汇编指令2\n\t""汇编指令3": 输出操作数列表: 输入操作数列表: 可能被修改的寄存器列表 );示例1:简单的寄存器操作 uint64_t add_numbers(uint64_t a, uint64_t b) {…...
修改ESP32CAM的示例CameraWebServer里的camera_index.h的方法
在这里,默认你已经会使用Arduino IDE或者PlatformIO通过烧录底座对ESP32CAM(如下图)进行烧录,并能通过浏览器对其进行访问。 我们访问到下图的界面时,不禁有个疑问,这个界面是如何生成的,如果我…...
Python学习笔记(二)(字符串)
文章目录 编写简单的程序一、标识符 (Identifiers)及关键字命名规则:命名惯例:关键字 二、变量与赋值 (Variables & Assignment)变量定义:多重赋值:变量交换:(很方便哟) 三、输入与输出 (In…...
ViewModel vs AndroidViewModel:核心区别与使用场景详解
在 Android 的 MVVM 架构中,ViewModel 和 AndroidViewModel 都是用于管理 UI 相关数据的组件,但二者有一些关键区别: 1. ViewModel 基本用途:用于存储和管理与 UI 相关的数据,生命周期与 Activity/Fragment 解耦&…...
Windows环境下 全屏显示某个字符串
case WM_PAINT: {PAINTSTRUCT ps;HDC hdc BeginPaint(hWnd, &ps);// 获取完整客户区尺寸RECT rc;GetClientRect(hWnd, &rc);// 全屏时:整个窗口作为显示区域RECT displayRect rc;// 纯黑背景FillRect(hdc, &displayRect, (HBRUSH) GetStockObject(BLA…...
禅道MCP Server开发实践与功能全解析
一、简介 1、MCP Server核心定义 MCP Server(Meta Command Protocol Server)是一种基于客户端-服务器架构的轻量级服务程序,采用统一的mcp协议格式,通过连接多样化数据源和工具为AI应用提供扩展能力。它作为中间层,实…...
Vue.js组件安全开发实战:从架构设计到攻防对抗
目录 开篇总述:安全视角下的Vue组件开发新范式 一、Vue.js组件开发现状全景扫描 二、安全驱动的Vue组件创新架构 三、工程化组件体系构建指南 四、深度攻防对抗实战解析 五、安全性能平衡策略 结语:安全基因注入前端开发的未来展望 下期预告&…...
代发考试战报:4月份最新锐捷RCNA RCNP 考试通过战报
锐捷 RCNA云计算 R4111 考试通过,RCNA 安全 R3111 考试通过,RCNP无线 R5211考试通过,RCNP路由考试通过,等等 成绩单战报...
卫星互联网技术加速发展,遨游卫星电话为生命添一份“保险”
卫星互联网通过高中低轨卫星组网,实现了对海洋、沙漠、极地等“信息盲区”的全域覆盖。据国际电信联盟(ITU)统计,截至2024年底,全球在轨卫星数量已突破1万颗,其中我国“千帆星座”“GW星座”等低轨计划加速…...
文件IO7(中文字库的原理与应用/目录检索原理与应用/并发编程的原理与应用)
中文字库的原理与应用 ⦁ 基本概念 一般在项目中都会显示汉字,都采用中文简体字符集,计算机早期只有ANSI组织设计的ANSII码,其实也属于字符集,这套字符集并未收录中文,只收录256个字符。 所以后期中国国家标准总局设…...
达梦数据库-学习-16-常用SQL记录(持续更新)
目录 一、环境信息 二、介绍 三、查询SQL 1、数据库的总使用空间大小 2、各个表空间的总大小 3、使用空间最大的50个对象 4、使用率最高的50个sequence 5、使用空间率最高的50个自增列 6、定位锁 7、支持HINT 8、表数据页使用率 9、备份文件相关信息 10、初始化库参…...
使用setTimeout模拟setInterval
const SECOND 1000 const MINUTE 60 * SECOND const HOUR 60 * MINUTE const DAY 24 * HOUR/*** description: 根据传入的毫秒值格式化为时间* param {*} time:毫秒值* returns:{days, hours, minutes, seconds, milliseconds}*/ function parseTime…...
Cesium实现鹰眼图和主地图联动
本文是vuets实现的,想要转为react,只需要修改以下几部分内容 1. 将 reactive 定义的数据直接改写为 let定义 2. 将 watch 监听的内容改成对应的监听写法 3. 将 ref 定义的字段改写为对应的写法 该模块实现的功能: 通过点击鹰眼图的某一位置…...
文件IO6(开机动画的显示原理/触摸屏的原理与应用)
开机动画的显示原理 ⦁ 基本原理 一般电子产品在开机之后都会加深用户印象,一般开机之后都会播放一段开机动画(视频、GIF…),不管哪种采用形式,内部原理都是相同,都是利用人类的眼睛的视觉暂留效应实现的…...
Linux内核分页——线性地址结构
每个进程通过一个指针(即进程的mm_struct→pgd)指向其专属的页全局目录(PGD),该目录本身存储在一个物理页框中。这个页框包含一个类型为pgd_t的数组,该类型是与架构相关的数据结构,定义在<as…...
每日算法-250411
这是我今天的 LeetCode 刷题记录和心得,主要涉及了二分查找的应用。 3143. 正方形中的最多点数 题目简述: 思路 本题的核心思路是 二分查找。 解题过程 为什么可以二分? 我们可以对正方形的半边长 len 进行二分。当正方形的半边长 len 越大时&…...
虚幻基础:碰撞帧运算
能帮到你的话,就给个赞吧 😘 文章目录 碰撞碰撞盒线段检测 帧运算:每个程序流就是一帧的计算结果速度过快时(10000),导致每帧移动过大(83),从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…...
AI反检测如何在TikTok养号中发挥关键作用?
在 TikTok 这个全球性的短视频平台上,账号的养成和管理成为了创作者和品牌不可忽视的一环。随着平台对内容和账号行为的监管越来越严格,传统的养号方法已经难以适应新的挑战。在这一背景下,AI 反检测技术应运而生,它通过模拟人类行…...
鸿蒙案例---生肖抽卡
案例源码: Zodiac_cards: 鸿蒙生肖抽奖卡片 效果演示 初始布局 1. Badge 角标组件 此处为语雀内容卡片,点击链接查看:https://www.yuque.com/kevin-nzthp/lvl039/rccg0o4pkp3v6nua 2. Grid 布局 // 定义接口 interface ImageCount {url:…...
【AI编程技术爆发:从辅助工具到生产力革命】
目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比(2023年数据)结果分析 四、最…...
【前后端】npm包mysql2的使用__nodejs mysql包升级版
不定期更新,建议关注收藏点赞。 目录 简介使用说明 还在用mysql包吗?已经过时啦! 简介 mysql2 是一个用于 Node.js 的 MySQL 数据库驱动,它是 mysql 包的升级版,性能更好,支持 Promise 和 async/await&…...
基于LangChain的Native RAG简单样例
本文代码: Github 文章目录 1. 概述2. Native RAG 概述3. 实战:基于LangChain实现简单的Native RAG概述环境配置文档分割定义Embedding模型构建向量数据库与LLM交互 参考文献 1. 概述 众所周知, 大模型可以回答它知道的内容。但如果用户问的是它不知道…...
数据结构基础(2)
1.什么是算法? 算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 算法定义中,提到了指令,指令能被人或机器等计算装置执行。它可以是计算机指令&a…...
慢查询解决思路
1. 复现问题 慢查询的出现是常态还是偶尔?是否在业务允许范围内? "不要过早优化,先 Make it work / right,再 Make it fast。" 建议先将查询语句及其触发条件记录下来,便于后续测试、分析和对比。 2. 定位问题 2.1 单机数据库: explain查询执行计划 数据库默…...
前端下载文件时浏览器右上角没有保存弹窗及显示进度,下载完之后才会显示保存弹窗的问题定位及解决方案
需求背景 在开发过程中会发现,有的时候下载后端返回的文件,浏览器右上角不会进行保存弹窗的弹出及下载进度,而是接口响应后文件下载完才会弹出保存并且没有进度条效果,这就导致在点击下载后用户是不知道文件下载到什么进度了&…...
Streamlit在测试领域中的应用:构建自动化测试报告生成器
引言 Streamlit 在开发大模型AI测试工具方面具有显著的重要性,尤其是在简化开发流程、增强交互性以及促进快速迭代等方面。以下是几个关键点,说明了 Streamlit 对于构建大模型AI测试工具的重要性: 1. 快速原型设计和迭代 对于大模型AI测试…...
IP组播技术与internet
1.MAC地址分为三类:广播地址;组播地址;单播地址 2.由一个源向一组主机发送信息的传输方式称为组播。 3.组播MAC地址,第一个字节的最后一位为1; 单播MAC地址,第一个字节的最后一位为0; 4.不能…...
[Java基础]StringBuilder解析
StringBuilder简单总结与源码预览。 之前写StringBuilder对象默认简写为sb,被说是骂人不让用了,现在写成strBuilder了。大家一般写什么呢 StringBuilder预留空间设计 已知Redis的String结构是通过预留空间的形式来避免频繁地分配空间。 那么Java中有没有…...
国内智能外呼系统市场概况及技术发展趋势
根据最新行业报告和用户评价,国内智能外呼系统市场呈现快速增长态势,预计2025年市场规模将达到180亿元人民币,年复合增长率约20%。主要驱动因素包括AI技术成熟、企业降本增效需求以及政策扶持(如工信部《智能语音产业发展行动计划…...
小推桌面-一款全新的第三方电视桌面-全网通桌面
你是否渴望更高效、便捷地使用机顶盒桌面?小推桌面、乐看家桌面是绝佳之选!它们的界面简洁,操作轻松上手,能快速找到所需应用,大大节省时间。 小推桌面支持个性化定制,可按个人喜好调整布局、添加组件&…...
SQL实战篇,数据库在Kooboo中的实际应用(一)
本文将结合实际操作与代码示例,展示SQL 在 Kooboo 中的实际应用 仅需两步:动态创建表 基础查询,无需复杂配置,快速上手! 一、动态创建表:插入数据 Kooboo 支持多种数据库,以 SQLite 为例&…...
Matlab 调制信号和fft变换
1、内容简介 Matlab 194-调制信号和fft变换 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
2025年的Android NDK 快速开发入门
十年前写过一篇介绍NDK开发的文章《Android实战技巧之二十三:Android Studio的NDK开发》,今天看来已经发生了很多变化,NDK开发变得更加容易了。下面就写一篇当下NDK开发快速入门。 **原生开发套件 (NDK) **是一套工具,使开发者能…...