Windows下复现NWS CPU可用性预测:从网格调度到动态指数平滑

简介:时间序列预测是计算机系统与工程实践中应对资源动态变化的核心手段。在网格调度场景中,准确估计未来CPU可用性,比单纯依赖实时占用率更能避免任务被并发作业拖垮。NWS模型以历史检测值为基础,对下一时刻可分配时间片进行预测,却长期缺少Windows平台等价实现。工程实现上,通过GetSystemTimes或NtQuerySystemInformation等系统调用获取CPU各态时间差值,结合运行队列长度构成可用性公式,再以多模型动态选择机制输出最优预报值。针对负载突变,动态指数平滑通过误差自适应调整折中系数,显著提升峰值时刻的响应能力。CAPredictor作为NWS在Windows下的复现体系,可为集群调度评估、CPU负载建模及毕设复现提供可对照的实验基线。

1. 为什么要在Windows下复刻NWS:从网格调度到CPU可用性预测

做网格调度最怕的就是盲选CPU:监控面板显示节点很闲,任务投过去却被并发作业抢得七零八落,原本几分钟的活拖到几十分钟。这个问题不是靠加机器能解决的,核心在于调度前缺少对“未来CPU可用性”的估计。NWS(网络气象服务)模型的价值,就是拿历史检测值做时间序列预测,输出下一个时间段CPU还能分给新进程多少时间片;但它原生跑在Unix/Linux,Windows平台一直缺一个等价实现。论文设计并实现了CAPredictor,把NWS的可用性公式和预测模型整体移植到Windows,用系统调用采集CPU时间,按误差动态选择最优模型。适合做网格或集群调度评估、研究CPU预测建模、以及打算在毕设里复现经典预测算法的人读,文中的无负载/负载两组误差数据可以直接拿来做对照组。

2. 吃透NWS的CPU可用性定义:公式拆解、采样窗口与三个选择依据

CAPredictor的整个逻辑都建立在一个问题上:怎么定义“CPU可用性”。如果拿CPU使用率替代,你看到的只是过去一秒的占用情况,它回答不了“新任务上去后能分到多少时间片”。NWS的框架里,CPU可用性不是使用率的补数,而是一个带“竞争预期”的指标:把新进程放进系统,它到底能从CPU时间里分到多少。

2.1 CPU可用性的两种度量:使用率 vs 可分配时间片

CPU使用率描述的是已经发生的占用:采样周期内CPU花在用户态、系统态和空闲态的时间比例。它适合事后监控,不适合事前调度。CAPredictor采用另一种视角:一个新进程加入系统后,能从CPU时间中分得的时间片比例。原文给出的可用性公式,按“新进程加入后运行队列长度变为rp+1”的语义整理为:

available_cpu = (idle + user / (rp + 1) + W * system / (rp + 1)) * 100%

其中idle是CPU空闲时间百分比,user是用户态进程时间百分比,system是系统态时间百分比,rp是正在运行的进程数,W是系统态时间权重。公式的含义很直白:空闲时间新进程可以直接拿走;已经被user和system占用的时间,需要按运行队列长度瓜分,新进程作为“第rp+1个成员”只能竞争其中一份;system态通常由系统级任务构成,优先级偏高,所以用W把它放大一点。论文描述里W与user相关,但到底取多少并没有给死值,这是我复现时花时间最多的一个参数。

提示:原文PDF里这个公式排版有乱码,我按“新进程加入后运行队列长度为rp+1”的语义做了整理,复现时先用一个已知负载的机器验证一遍再往下走。

W的标定不能拍脑袋,我一般会在目标机器上跑一组固定计算任务,记录实际任务耗时和公式计算值,然后网格搜索0.3到0.9之间的W,让误差最小。不同机器上W的差异很大,尤其是有超线程的处理器,标定结果和关闭超线程时完全不同。

2.2 从Win32系统调用到可用性公式:NtQuerySystemInformation与两次采样求差值

公式里的idle、user、system不是任务管理器里那种即时的百分比,而是两个采样时刻之间的时间差值。论文原文用的是NtQuerySystemInformation(ZwQuerySystemInformation)查询系统处理器性能信息,拿到IdleTime、KernelTime、UserTime三个累加计数器。这里有个关键细节:KernelTime已经包含了IdleTime,所以真正的系统态时间是KernelTime减去IdleTime。

我复现时没有直接用未文档化的NtQuerySystemInformation,先用GetSystemTimes这个文档化封装把逻辑跑通,两者的数据源是同一套内核计数器。核心代码是这样:

// cap_sample.cpp // 用GetSystemTimes获取CPU时间差值,逻辑与NtQuerySystemInformation等价 #include <windows.h> #include <cstdint> struct CpuTimes { uint64_t idle; // 空闲时间 uint64_t kernel; // 内核态时间(包含idle) uint64_t user; // 用户态时间 }; bool GetCpuTimes(CpuTimes& out) { FILETIME idle, kernel, user; if (!GetSystemTimes(&idle, &kernel, &user)) { return false; } auto to64 = [](const FILETIME& ft) { return (uint64_t(ft.dwHighDateTime) << 32) | ft.dwLowDateTime; }; out.idle = to64(idle); out.kernel = to64(kernel); out.user = to64(user); return true; }

这段代码的逻辑不复杂:GetSystemTimes返回三个时间戳,FILETIME是64位整数,转换成uint64_t后直接做差值。采样间隔内idle的差值占总数比例就是idle百分比,system百分比等于kernel差值减去idle差值再除以总数,user百分比直接用user差值除以总数。

参数上要注意两点:一是采样间隔不能太短,Windows系统时间片本身是15.6毫秒级别,间隔小于100毫秒时差值噪声很大;论文实验按10秒检测一次,我能跑通的最保守间隔是1秒。二是rp的取值,Windows没有直接暴露“正在运行的进程数”这个量,我一般用系统性能计数器里的“Processor Queue Length”替代,它表示处理器就绪队列里的线程数,更接近调度器眼中的竞争压力。

表格如下:

字段 | 含义 | 来源 | 注意 idle | CPU空闲时间 | IdleTime差值 | 不能直接当可用性 user | 用户态时间 | UserTime差值 | 不含idle system | 系统态时间 | KernelTime与IdleTime差值 | KernelTime已包含IdleTime rp | 运行队列长度 | Processor Queue Length | 为0时用分母rp+1避免除零

2.3 三种获取方法的取舍:为什么选“进程加入后分得时间片”这个方法

NWS对CPU可用性定义了三种获取方法,论文明确说参考了这三种定义,但最终选的是“计算一个进程加入系统后可以分得的CPU时间片数量”。原因从工程角度看非常实际:Windows环境下,另外两种方法要么依赖内核模式的性能计数器扩展,要么要反复开启进程、捕获创建时间,系统开销扛不住。而“分得时间片数量”只需要在用户态读一次计数器差值,再套一个简单的公式,开销最小。

为什么不直接用idle百分比作为可用性?因为空闲率高不代表新进程能立刻上CPU。极端情况:系统里跑着十几个CPU密集的进程,它们频繁切换,idle可能短时间很高,但新进程的优先级不高的话,排到它还要好几个时间片。运行队列长度参与计算后,这种竞争压力能反映进预测值里。这也是CAPredictor和CPU Usage viewer这类监测工具的本质区别:后者显示“CPU现在忙不忙”,前者回答“新任务进去后能占到多少”。

另外,公式里用rp+1而不是rp,是为了避免除零,同时隐含“新进程加入后它自己也是运行队列一员”的语义。rp为0时,公式退化为idle+user+system,也就是100%,可用性看起来满格;实际复现时我会给rp设一个经验上限,超过10就按10处理,防止瞬时异常队列长度把可用性压成负数。这些边界条件在论文里没写,但复现时躲不开。

3. 复现CAPredictor的三个模块:Monitor、Predictor、Report的数据流与代码骨架

论文把系统拆成三个模块,这个划分就算拿到今天来看也足够干净:Monitor负责“看”,Predictor负责“算”,Report负责“选”。理解这三者之间的关系,是复现整个系统的入口。

3.1 模块划分与数据流:谁先跑、谁等谁

CAPredictor的数据流是单向加一根回灌线:Monitor把实时采集到的CPU可用性传给Predictor,Predictor调用所有预测模型算出下一时刻的预报值和误差,然后把结果交给Report;Report按误差排序选出最优模型,输出预测值,同时把预测值回馈给Predictor。这根回灌线容易被忽略,但动态指数平滑模型恰恰依赖它来计算上一轮“预测值与真实值的偏差”。

执行顺序上,每个预测周期内先采样、再预测、最后报告,不能并发乱抢。我复现时用了一个简单的状态机:Monitor每2秒采一次样,攒够5个点后触发一次Predictor;Predictor跑完所有模型,Report选出最优模型并输出。采样周期和预测周期解耦,是因为10秒一次采样对突变负载太钝,内部采样密一点、对外预测保持10秒节奏,能兼顾平滑和时效。

3.2 Monitor模块:周期采样与可用性显示

Monitor的目标就一句话:用最小的系统开销拿到CPU可用性时间序列。采样循环的骨架可以写成这样:

# cap_monitor.py import time # 这里只展示采样循环骨架,GetSystemTimes的封装逻辑见第2.2节 def sample_cpu_times(): # 返回(idle_delta, user_delta, system_delta, rp) pass def compute_available_cpu(cur, last): # 按第2.1节公式计算 pass last = None history = [] INTERNAL_SAMPLE_INTERVAL = 2.0 # 内部采样间隔,2秒 PREDICT_INTERVAL = 10.0 # 对外预测周期,10秒 last_predict_time = time.time() while True: cur = sample_cpu_times() if last is not None: available_cpu = compute_available_cpu(cur, last) history.append(available_cpu) last = cur now = time.time() if now - last_predict_time >= PREDICT_INTERVAL: # 触发Predictor,传入history trigger_predictor(history) last_predict_time = now time.sleep(INTERNAL_SAMPLE_INTERVAL)

这里的逻辑说明:采样和预测不在一个节奏上,采样是高频的,预测是低频的。compute_available_cpu先算三个时间差值占总时间的比例,再套入idle、user、system、rp公式。参数上,采样间隔2秒是经验值,低于1秒时Windows计时器精度问题会被放大,高于5秒则10秒一次的预测窗口里只有两个点,模型根本来不及反应。

3.3 Predictor模块:把历史可用性序列交给八个模型

Predictor是模块里的重头戏,它一次性跑完八个模型。论文原文列出了RUN_VG、LAST、SW_AVG、ADA_AVG、MEDIAN、ADAPT_MED、TRIM_MED这七个NWS模型,外加一个改进的动态指数平滑模型。原文没有逐一给出递推公式,我按NWS常见的时间序列预报方式补全实现。

模型 | 类型 | 预测思路 | 适用场景 LAST | 基线 | 上一时刻检测值直接作为下一时刻预测 | 平稳环境兜底 RUN_VG | 滑动均值 | 固定窗口内算术平均 | 缓慢漂移 SW_AVG | 加权滑动平均 | 越近的数据权重越大 | 有趋势变化 ADA_AVG | 自适应平均 | 按误差调整窗口长度 | 常规负载波动 MEDIAN | 窗口中位数 | 取窗口内中位数 | 短时尖峰较多 ADAPT_MED | 自适应中位数 | 动态调整窗口再取中位数 | 波动较剧烈 TRIM_MED | 截尾处理 | 去掉最大最小后取均值/中位数 | 有离群点时 动态指数平滑 | 改进模型 | 平滑系数随误差动态调整 | 突变场景

代码骨架如下:

# cap_predictor.py def last(seq): return seq[-1] def run_vg(seq, window=5): return sum(seq[-window:]) / window def sw_avg(seq, window=5): # 越近的数据权重越大,权重从1到window weights = list(range(1, window + 1)) return sum(w * x for w, x in zip(weights, seq[-window:])) / sum(weights) def median(seq, window=5): return sorted(seq[-window:])[window // 2] # 每个模型最后返回(pred_value, mse, mpe)

逻辑说明:每个模型都维护一个滑动窗口,窗口大小是核心参数。窗口太小,模型对噪声敏感;窗口太大,模型对趋势变化滞后。论文实验里5分钟跑30个采样点,窗口取5是合理折中。MSE是均方误差,惩罚大偏差;MPE是平均绝对百分比误差,反映相对偏差。Report选模型时靠的是这两个指标,所以每个模型除了预测值,必须把上一轮“预测值 vs 真实值”的误差算清楚。

这里有个容易混的点:Predictor算的误差是“上一个时刻对当前时刻的预测值”与“当前时刻检测值”的差,不是当前预测值与当前检测值的差。时间上错开一个周期,才能反映模型真实的预报能力。

3.4 Report模块:按MPE主键、MSE次键动态选择预测模型

Report的选择逻辑在论文里写得很明确:以MPE为主键排序,MPE最小者胜出;如果几个模型的MPE值并列,再用MSE排序。输出内容包括当前时刻、模型名称、预测值、MSE、MPE。这个策略的好处是稳健:MPE是相对误差,适合横向对比不同量级的模型表现;MSE作为次键,只在MPE打平时用来区分。

# cap_report.py def select_model(results): # results: [{'name': ..., 'pred': ..., 'mse': ..., 'mpe': ...}] best_mpe = min(r['mpe'] for r in results) candidates = [r for r in results if abs(r['mpe'] - best_mpe) < 1e-12] if len(candidates) == 1: return candidates[0] return min(candidates, key=lambda r: r['mse'])

逻辑说明:先按MPE过滤出最优候选集,再在候选集里按MSE取最小。这个顺序不能反过来,否则一个大绝对误差但相对误差小的模型会被误杀。参数说明:1e-12是浮点比较的容差,实际生产环境建议直接取MPE最小值的模型,并列概率极低,不需要过度设计。

Report选出的模型预测值会回馈给Predictor,用于下一轮误差计算。回馈的必须是“预测值”,不能把预测值混入检测值序列,否则下一轮的误差计算全乱套。检测值序列只来自Monitor,这是数据流的纪律。

4. 加进动态指数平滑:MSE从2冲到263后的自适应修正

论文的实验数据里有一个非常刺眼的数字:无负载时MSE最大只有2.125,但负载测试里MSE峰值到了263.989986。这个落差不是实现错误,而是固定窗口模型面对突变的必然反应。理解了这个数字,才算真正看懂了CAPredictor的改进点。

4.1 固定窗口模型为什么在突变点失灵

负载实验里,音频文件在时刻9开始播放,CPU使用率瞬间冲到51%,可用性检测值断崖式下跌。滑动均值、滑动中位数这些模型,预测值来自过去几个采样点的平均水平,它们的数学本质决定了只能响应“已经发生”的变化。突变发生的那个预测周期,所有模型拿到的还是突变前的高可用性历史数据,预测值自然高出一大截。等窗口滑过突变点,预测值才开始往真实值靠拢,这一个周期的滞后无法靠模型本身消除。

MPE在时刻9达到0.126042,相对误差12.6%,对调度决策已经是不可忽视的量级。MSE之所以冲到263,是因为这是一个突然出现的巨大偏差,平方之后被放大。论文的结论也很诚实:只能在突变前一时刻出现预测偏差,之后系统能自我调整。

4.2 动态指数平滑的改进思路

基础指数平滑公式是S_t = α·x_t + (1-α)·S_{t-1},α小则平滑性强,α大则灵敏性强。但固定α的问题和固定窗口一样:α取大了噪声多,取小了追不上突变。改进的思路是让α随预测误差动态变化:误差大的时候提高α,把当前检测值的信任度拉高;误差小的时候降低α,保持平滑。

# cap_dynamic_es.py def dynamic_exp_smooth(seq, alpha_min=0.2, alpha_max=0.9): s = seq[0] for i in range(1, len(seq)): error = abs(seq[i] - s) # 误差越大,alpha越大;50%作为归一化上限 alpha = alpha_min + (alpha_max - alpha_min) * min(error / 50.0, 1.0) s = alpha * seq[i] + (1 - alpha) * s return s

逻辑说明:error是当前检测值与上一轮平滑值的绝对差,单位是百分比。误差达到50个百分点时,α推到0.9,相当于对当前检测值给很高信任;误差为0时α回到0.2,保持平稳。参数说明:alpha_max不能取1.0,否则就退化成LAST模型;alpha_min取0.1到0.2之间,保留基础平滑能力。归一化上限50可以按实际CPU负载范围调整,低频负载环境建议改成30。

4.3 无负载与负载两组实验的误差对照

表格里的数据来自论文原文的实验记录,直接拿来做回归基线非常有用:

实验场景 | MSE范围 | MPE范围 | 说明 无负载 | 0~2.125000 | 0~0.006505 | 曲线平稳,预测与检测近似重叠 负载(时刻9突变) | 峰值263.989986后回落 | 最大0.126042 | 突变瞬间误差集中,随后系统自动调整

这两组数据的价值在于:平稳态下预测精度极高,MPE不超过0.65%,说明NWS模型在Windows平台的移植没有伤筋动骨;突变态下误差虽然大,但后续周期能回落,说明动态指数平滑和模型选择机制在起作用。工程上接入调度时,不要只看平均数,要盯住突变窗口的峰值误差,给预测值加一个置信度标记:MSE超过阈值时,调度器不应把预测值当硬指标用,而是回退到保守策略。

5. Windows下跑通CPU预测系统的避坑指南:五个经典翻车现场

复现这套系统的过程中,有五个坑几乎每次都有人踩。我按现象、原因、解决的顺序写清楚,能帮后面的人省掉至少一两天的调试时间。

5.1 KernelTime包含IdleTime,可用性估值偏低

现象:屏幕上available_cpu长期只有百分之四五十,但任务管理器显示CPU非常空闲,两者对不上账。

原因:直接把KernelTime当成系统态时间用,忽略了KernelTime本身就包含IdleTime。公式里的system被算高,分子变大,可用性被压下去。

解决:先对两个采样时刻的KernelTime和IdleTime分别做差值,再用SystemTime = KernelTime差值 - IdleTime差值。这个减法必须在差值之后做,不能在原始值上做,否则计数器基线的偏移会污染结果。

5.2 第一次采样没有历史值,预测窗口是空的

现象:程序启动后前几个预测周期输出0或者异常大的数,稳定运行一会后才正常。

原因:滑动窗口还没攒够数据,模型拿空列表直接算均值或中位数,Python里这类操作通常返回0或抛异常。Report拿到这个假预测值后,还会把它回馈给Predictor,污染后续误差计算。

解决:启动阶段只采集不预测,攒够一个窗口长度(论文实验是5个点)再开启Report窗口。第一个周期强制用LAST模型兜底,等第二个周期再进入MPE选择流程。

5.3 按MPE选模型,突变来时总是选错

现象:负载突变的那个时刻,选中的模型是上一轮MPE最小的模型,预测值严重偏离,好像越准的模型越误事。

原因:Report评价的是历史预测精度,它选出来的是“过去表现最好”的模型,对未来的突变没有感知能力。突变发生时,过去精度再高也帮不上忙。

解决:在Report前面加一级变化率检测:当前检测值相对上个采样点变化超过15%时,跳过MPE选择,强制使用动态指数平滑或LAST,等误差稳定两个周期后再恢复MPE选择。这个阈值要做成配置项,不同负载特征下最优阈值差异很大。

5.4 W权值拍脑袋设,system占用一高就把可用性压没了

现象:后台杀毒或系统索引进程跑起来时,预测可用性跌到接近0,但实际新起一个进程速度很快,预测值和真实体验严重不符。

原因:公式里system乘了权重W,如果W取1.0,意味着一个系统进程占用的时间和一个用户进程完全等价,竞争权重的分配脱离了实际调度优先级。

解决:在目标机器上做W标定,跑一组固定计算任务,对比实测耗时和公式计算值,用网格搜索在0.3到0.8之间找残差最小的W。注意标定结果不能跨机器复用,尤其是虚拟机和物理机的调度差异极大。

5.5 虚拟机和笔记本的频率缩放让计数器不单调

现象:available_cpu偶尔算出负值或超过100%,曲线在100%边缘出现毛刺。

原因:宿主机抢占、睿频/省电状态切换都会导致两次采样计数器差值不是单调递增。同一时间内,idle差值大于总时间差值,占比就超过100%。

解决:对差值做下限钳制,负值归0;可用性计算结果钳制在0到100之间。做性能评测时把电源计划设为高性能,虚拟机里测出来的绝对数值不可信,只用来观察变化趋势。

6. 调度接入前先做三轮验证:离线回放、负载注入与联调收益

预测系统在实验室里误差再小,接入调度前也必须过三轮验证,否则上线就是给自己挖坑。

6.1 第一轮:离线回放,先看稳态误差

把真实采样数据存成CSV,用你的模型实现逐点回放,画出MSE和MPE的曲线。先确认稳态MSE是否落在原文无负载实验的0~2.125区间附近。如果差太远,优先排查公式里的idle、user、system是不是算错了,或者rp取值口径不一致。回放阶段不接调度,只看数值,这是成本最低的纠错手段。

6.2 第二轮:注入突增负载,看模型切换速度

用一个死循环进程制造CPU占用突增,持续两三个采样周期后停止,记录Report在哪个周期切换模型、MSE多久回落到正常水平。原文负载实验的时刻9和时刻19说明,突变前一时刻预测误差会被放大,你要衡量的是峰值误差和恢复时间,而不是平均误差。恢复时间超过两个预测周期,说明动态指数平滑的alpha_max设得太保守。

6.3 第三轮:调度联调,量收益而不是量误差

把预测值接到一个简单调度器上:任务按“预测可用性最高”选节点跑一批,同时另一组按“当前使用率最低”选节点跑同一批,对比完成时间。预测误差再小,如果没转化成任务完成时间的收益,那这套系统在调度场景里就是白搭。误差指标只是中间产物,调度效率才是终点。

从那以后我每次跑通一套预测系统,都强制走一遍这三轮:离线回放查基数对不对,负载注入看模型切换够不够快,调度联调看收益真不真实。少一轮,我心里都没底。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

ArcGIS国土三调VCT工具箱部署与排错指南(10.6–10.8.2专用)

ArcGIS国土三调VCT工具箱部署与排错指南(10.6–10.8.2专用)

简介&#xff1a;本资源是面向国土调查一线技术人员与GIS从业者的ArcGIS专用工具箱&#xff0c;专为第三次全国土地调查&#xff08;国土三调&#xff09;中VCT格式数据转换与质检任务设计&#xff0c;有效解决土地分类、边界校正、属性赋值等高频痛点。压缩包共7个文件&#x…

2026/10/20 1:13:46 阅读更多 →
如何快速部署 GLM-5.3-Flash-NVFP4:2× DGX Spark(GB10)上 10 分钟跑通 SGLang 的完整教程

如何快速部署 GLM-5.3-Flash-NVFP4:2× DGX Spark(GB10)上 10 分钟跑通 SGLang 的完整教程

【免费下载链接】GLM-5.3-Flash-NVFP4 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/LibertAIDAI/GLM-5.3-Flash-NVFP4 点击查看 免费下载 在 2 NVIDIA DGX Spark&#xff08;GB10&#xff0c;sm_121&#xff09;上用 SGLang 部署 GLM-5.3-Flash-NVFP4&#xff0c…

2026/10/20 1:13:46 阅读更多 →
MATLAB手写OFDM基带链路仿真:端到端可调试完整实现

MATLAB手写OFDM基带链路仿真:端到端可调试完整实现

简介&#xff1a;本资源是一套完整的OFDM通信系统MATLAB仿真程序&#xff0c;面向通信工程专业本科生、研究生及无线通信方向初/中级工程师&#xff0c;用于深入理解正交频分复用技术的核心原理与工程实现。程序覆盖符号生成、QPSK/QAM调制、IFFT/FFT变换、循环前缀添加、多径信…

2026/10/20 1:12:42 阅读更多 →

最新新闻

AI大模型自动化测试实战:全流程智能测试设计与落地

AI大模型自动化测试实战:全流程智能测试设计与落地

我在一线做测试自动化和质量保障已经快十年&#xff0c;说实话&#xff0c;前八年大部分时间都花在写脚本、调框架、跟环境和用例维护作斗争上。最近这两年&#xff0c;AI大模型自动化这个方向确实改变了我的工作节奏。之前接手某个跨平台系统&#xff0c;每个版本回归要花上两…

2026/10/20 6:24:32 阅读更多 →
基于博途S7-1200的四病房八床位呼叫控制系统设计与梯形图实现

基于博途S7-1200的四病房八床位呼叫控制系统设计与梯形图实现

做PLC项目这些年&#xff0c;呼叫提示类的控制系统看着不难&#xff0c;但真落到实处&#xff0c;要照顾的细节远比想象中多。最近完成的一套“No.101 博途1200 PLC四病房八床位呼叫控制系统”&#xff0c;就是典型的中小型离散控制任务&#xff1a;四间病房、八个床位&#xf…

2026/10/20 6:24:32 阅读更多 →
Artcraft:数字创作中的手工感与参数直觉

Artcraft:数字创作中的手工感与参数直觉

1. “Artcraft”不是新软件&#xff0c;而是一类被长期低估的创作范式最近在几个设计类社区和开源项目讨论区里&#xff0c;“artcraft”这个词突然高频出现&#xff0c;但翻遍主流技术文档、设计手册甚至英文维基&#xff0c;都找不到一个权威定义。它既不指代某款刚发布的AI绘…

2026/10/20 6:24:32 阅读更多 →
演示文稿自动化工具设计:模板驱动与数据填充实战

演示文稿自动化工具设计:模板驱动与数据填充实战

1. 从零拆解一个演示文稿自动化工具的设计思路第一次看到 "ppt-master" 这个命名&#xff0c;我的直觉是&#xff1a;这大概率是一个围绕演示文稿&#xff08;PPT&#xff09;做自动化生成或批量处理的工具项目。在办公自动化这个领域摸爬滚打这些年&#xff0c;我见…

2026/10/20 6:24:32 阅读更多 →
WSL2 + pnpm 环境下部署 Paperclip:从 Node 版本到权限控制

WSL2 + pnpm 环境下部署 Paperclip:从 Node 版本到权限控制

WSL2 pnpm 环境下部署 Paperclip&#xff1a;从 Node 版本到权限控制 【免费下载链接】paperclip The open-source app everyone uses to manage agents at work 项目地址: https://gitcode.com/GitHub_Trending/papercl/paperclip Paperclip 把自己定位为"每个人…

2026/10/20 6:24:32 阅读更多 →
AEI@DC解决方案

AEI@DC解决方案

面向未来&#xff0c;数据中心运维需要从“人力密集型”向“技术密集型”演进&#xff0c;借助Agentic AI技术打造全新的智能运维体系。实现全栈数据采集、全局统一可视&#xff0c;更早地发现风险、更快地解决问题、更极致的算效和能效、更精准的运营决策&#xff0c;最终实现…

2026/10/20 6:23:32 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →