大模型量化部署全攻略:从显存优化到GPTQ/AWQ/GGUF实战

量化这事,做大模型部署的基本都绕不开。我去年底第一次想在本地把一个大模型跑起来的时候,一看权重文件动辄十几个GB,再看看手头显卡那点显存,瞬间理解了什么叫"看得见吃不着"。后来折腾了一遍量化,从4bit加载到GPTQ离线量化、再到GGUF在CPU上跑,踩了一堆坑,也把原理吃透了。今天这篇就把我从"为什么量化"到"怎么具体操作"的全过程拆开讲,适合手里有显卡但显存紧张、想跑本地推理或者做低成本部署的朋友,也适合那些刚入坑、对各种量化名词一头雾水的同学。

1. 为什么要做量化:先把显存账算清楚

1.1 一个7B模型到底吃掉多少显存

很多人第一反应是"模型多大就占多大显存",实际算下来比这狠多了。一个7B参数的模型,如果用FP16精度存权重,每个参数占2个字节,光权重就是 7×10^9×2 ≈ 14GB。这还不算激活值、KV cache和运行时开销。普通消费级显卡,12GB都显得紧张,16GB勉强能跑个短上下文。

如果把精度压到INT8,权重直接砍半,约7GB;压到INT4,约3.5GB。这就完全不一样了。同样是本地推理,量化前后的差别就是"装不下"和"不但装得下,还能把上下文窗口调大一点"的区别。

1.2 KV cache:一个容易被忽略的显存黑洞

除了权重,推理时还有一个吃显存大户叫KV cache。每生成一个token,模型每一层的注意力都要缓存Key和Value矩阵。上下文越长,缓存越大。计算公式大致是:2×层数×注意力头数×头维度×序列长度×每个元素占字节。

举个例子,一个13B模型跑2048 token上下文,KV cache轻松吃掉好几个GB。这也是为什么很多人量化之后跑长文本还是OOM——不是权重超了,是KV cache爆了。量化权重解决了大头,但KV cache这块也得心里有数,后面实操部分我会详细说怎么优化。

1.3 推理速度为什么也会变快

还有一个容易被忽视的点:token生成是带宽密集型任务。自回归推理每一步都要把所有权重读一遍,显存带宽就成了瓶颈。权重从FP16换成INT4,需要搬运的数据量直接少75%,显存带宽不变的情况下,token生成速度理论能翻好几倍。我在实测中看到,同一个7B模型在同等硬件上,FP16大约十几token/s,INT4能到二十多甚至三十多token/s,收益非常直观。

所以量化解决的是两个问题:放得下(显存够用)和跑得快(带宽压力小)。这决定了它几乎每个做本地部署的人都绕不开。

2. 量化的核心原理:别被"几乎无损"忽悠

2.1 量化到底在做什么

量化本质上是一个映射过程:把高精度浮点数的取值空间,映射到低精度整数(或者更少bit的浮点)的取值空间。FP16能表示的范围非常广,因为有指数位;INT8只有256个离散取值,INT4只有16个取值。拿256个点去逼近一整段连续区间,必然有误差,这就是量化误差的根源。

一个标准的对称量化公式长这样:

x_quant = round(x / scale)

反量化:

x_dequant = x_quant × scale

scale = max(|x|) / (2^(bits-1) - 1)

非对称量化会多一个zero_point参数,用来处理激活值分布偏移的情况。原理不复杂,核心就是找到一组scale和zero_point,让量化前后数值差最小。

2.2 为什么大模型量化特别难搞:离群值

通用量化算法很多,为什么大模型量化会单独成为一门学问?因为LLM的权重和激活值有一个特点:分布不是均匀的,存在明显的离群值。某些通道的数值特别大,大部分通道数值集中在小范围。如果对整个张量用一个scale,离群值会撑大scale,导致普通数值的精度被严重压缩,整个模型的输出质量急剧下降。

这就是为什么量化的粒度很重要。per-tensor是对整个矩阵用一个scale,简单但效果差;per-channel是对每个输出通道单独算scale,效果好一大截;更精细的group-wise量化,比如每隔128个参数分一组,每组独立scale,精度还能进一步提升,代价是存储scale的额外开销变大。

2.3 校准:量化的关键一步

无论是静态量化还是GPTQ、AWQ这类算法,都离不开校准数据。所谓校准,就是用一批有代表性的文本数据喂进模型,观察权重和激活值的分布,从而确定最优的量化参数。校准集不需要很大,几百条文本就够,但要有代表性,覆盖模型日常会遇到的场景。如果校准集跟实际用途差距太大,量化参数就不准,模型输出质量会明显变差。

2.4 常用量化数据类型

现在主流的主要有这几种:

  • INT8:8位整数,量化损失较小,常用于权重和激活同时量化。
  • INT4:4位整数,显存占用极低,但精度损失需要靠算法弥补。
  • NF4(NormalFloat4):bitsandbytes提出的一种4bit数据类型,基于信息论思想,让4个bit能表达的高斯分布数值更合理,专门适配神经网络权重的分布特性。
  • FP4:4位浮点,保留一定动态范围,部分场景下对离群值更友好。
  • GGUF的K-quant系列:比如Q4_K_M、Q5_K_S这些,结合了M和S变体的优势,针对不同层采用不同量化策略。

NF4和FP4的差别,可以理解为:一个假设权重近似高斯分布,按概率密度分配量化点;另一个保留浮点结构,能覆盖更大数值范围。做4bit加载的时候选哪个,直接影响模型输出质量,后面实操部分会讲。

3. 主流量化方案怎么选:bitsandbytes、GPTQ、AWQ、GGUF

3.1 四种方案一张表看清

方案量化方式适合场景模型质量推理速度上手难度
bitsandbytes运行时动态4bit/8bitTransformers生态直接加载、微调中上中等最容易
GPTQ离线权重量化(基于二阶信息)GPU上4bit推理,部署高高中等
AWQ离线激活感知量化GPU上4bit推理,追求质量很高高中等偏难
GGUF离线量化 + K-quantCPU部署、低配混合部署中上CPU友好中等

3.2 bitsandbytes:适合临时用和微调

bitsandbytes最方便的点,就是不需要预先量化,加载模型的时候传一个参数就行。它会在模型加载过程中动态把权重转成4bit或8bit,推理完释放显存,特别适合想快速体验、临时跑一下的场景,也适合做参数高效微调。

缺点是它的二次量化精度相比离线量化方案略逊一筹,而且推理时有额外的反量化开销,token生成速度不如优化好的GPTQ方案。我的看法是:如果你只是想本地跑起来玩玩,或者要基于模型做LoRA微调,bitsandbytes足够好;如果要做稳定高效的推理服务,往下看GPTQ。

3.3 GPTQ:GPU推理的主流选择

GPTQ是目前GPU上4bit推理最成熟的方案之一。它的思路是逐层量化,用Hessian矩阵(二阶信息)来找到对模型输出影响最小的量化路径,在量化权重的同时做误差补偿。简单说,它不是简单round,而是会算"这个权重量化错了,对后续输出影响有多大",然后做修正。

GPTQ有几个关键参数:group size(分组大小)、desc_act(是否按通道激活顺序处理)、calibration样本数量。group size越小,精度越高,但推理时计算开销越大,主流默认128。desc_act开启后精度会略好,但kernel兼容性要确认。

我用GPTQ量化过一个7B模型,4bit下质量损失控制得很好,跑通用问答和代码补全基本能接受。部署用的Marlin kernel在部分显卡上加速明显。

3.4 AWQ:把激活值也考虑进去

AWQ的全称是Activation-aware Weight Quantization,核心洞察是:不是所有权重都同等重要,那些对应到大数值激活通道的权重,应该被保护。AWQ通过分析激活值统计,找到敏感通道,对它们的权重做缩放保护,量化时优先保护这些通道。

实测下来,在同为4bit的前提下,AWQ的精度通常比GPTQ稳定,特别在复杂推理任务上差异更明显。代价是需要先跑一遍激活统计,量化时间稍长。如果你对推理质量要求高、硬件资源又够,AWQ是很好的选择。

3.5 GGUF:CPU和混合部署救星

GGUF是llama.cpp生态的模型格式,特点是支持CPU推理,也支持CPU+GPU混合负载,量化等级非常丰富,从Q2_K到Q8_0都有。这种细颗粒度的量化档位,让我能在"显存只够塞下部分层"的情况下,把一部分层放GPU、一部分放CPU,依然把模型跑起来。

如果在纯CPU机器上跑大模型,GGUF基本是唯一选择。我看到不少人在低配机器上用Q4_K_M档位跑7B模型,速度虽然不快,但至少能跑,而且质量可接受。

3.6 我的选型逻辑

给个直接可抄的结论:

  • 临时体验/微调:bitsandbytes 4bit
  • GPU推理部署:GPTQ或AWQ,追求极致速度选GPTQ,追求质量选AWQ
  • CPU部署/老机器:GGUF Q4_K_M或Q5_K_M
  • 实在拿不准:先用bitsandbytes跑通,再决定要不要离线量化

4. 实操:从权重到落地部署

4.1 用bitsandbytes做4bit运行时加载

先装好依赖,把transformers、accelerate、bitsandbytes都装上。然后用一行配置搞定:

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig import torch bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True, ) model_id = "your/model/path_or_name" tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained( model_id, quantization_config=bnb_config, device_map="auto", torch_dtype=torch.float16, )

这里几个参数说明一下。quant_type选nf4,适配权重的高斯分布,是我默认的选择;compute_dtype用float16,因为计算时还是用浮点,只是权重存储用4bit;use_double_quant开启双重量化,把scale参数再量化一遍,能省一部分额外显存。

实测一个7B模型用这个配置加载,显存占用大约在4~5GB,加上KV cache也能在8GB显卡上跑起来。

4.2 用GPTQ做离线量化并部署推理

离线量化更适合正式部署。我用auto_gptq来做,步骤分两步:先在合适的机器上量化,再保存量化后的模型,推理时直接加载。

量化阶段的简化代码:

from auto_gptq import AutoGPTQForCausalLM from transformers import AutoTokenizer model_id = "your/model/path_or_name" quant_config = { "bits": 4, "group_size": 128, "desc_act": False, "damp_percent": 0.01, "static_groups": False, "sym": True, } model = AutoGPTQForCausalLM.from_pretrained( model_id, quantize_config=quant_config, ) # 校准数据:取一些代表性文本 calibration_texts = load_calibration_samples() # 约128条即可 tokenizer = AutoTokenizer.from_pretrained(model_id) inputs = tokenizer(calibration_texts, max_length=2048, return_tensors="pt", padding=True) model.quantize(inputs.to("cuda")) model.save_quantized("quantized_model_path")

这里两个参数值得细说。group_size设128是精度与性能的平衡点,设64精度更高但显存和计算开销变大,设256则省显存但质量下降。desc_act默认False是为了kernel兼容性和推理速度,追求质量可以开True,但部分环境会报kernel不支持。

推理阶段简单很多:

from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained( "quantized_model_path", device_map="auto", trust_remote_code=True, ) # 正常走generate流程即可

GPTQ量化后模型推理速度明显快于bitsandbytes的4bit加载,有机会我会专门写一篇benchmark对比。

4.3 用GGUF在CPU或者低配机器上跑

遇到CPU部署场景,GGUF是真救星。流程是先把原模型转成GGUF格式,再按需要量化到指定档位。

如果你手头是HuggingFace格式的模型,先用transformers导出成fp16的GGUF,再跑量化:

# 转格式(以llama.cpp生态的脚本为例) python convert_hf_to_gguf.py your/model/path --outfile model_fp16.gguf --outtype f16 # 量化到Q4_K_M ./llama-quantize model_fp16.gguf model_q4_k_m.gguf Q4_K_M

量化档位选择上,我的经验是:

  • Q4_K_M:质量/体积比最优,7B模型大约4GB出头
  • Q5_K_M:质量更好一点,体积大约5GB,显存有余裕就选这个
  • Q8_0:几乎无损,体积接近FP16的一半
  • Q3_K以下:除非实在没空间,不建议,输出质量下降很明显

推理用llama.cpp的server模式或者直接命令行都行,也可以把GPU部分层数调出来加速:

./llama-server -m model_q4_k_m.gguf --ctx-size 4096 -ngl 20

-ngl参数控制把多少层放到GPU,前提是显存够。我实测把20层放GPU、其余在CPU,速度和纯CPU比提升明显,显存占用也能控制住。

5. 常见问题与排查实录

5.1 量化后模型变笨了,怎么量化损失才最小

这是遇到最多的问题。首先明确:任何量化都有损失,只是能不能接受。我的排查顺序是:

  • 先跑几个典型任务,对比量化前后的输出。如果回答质量明显下降,优先检查是不是校准集不合适。
  • GPTQ的校准集尽量覆盖你实际场景。如果用来写代码,校准集里就别全是新闻语料。
  • 其次调group size,从128降到64,损失明显变小时说明128对这个模型太粗了。
  • 最后考虑换方案,AWQ在同等bit数下通常更稳。实在不行退回到8bit,显存压力大不了多少,精度几乎无损。

5.2 量化后显存降了,但速度反而变慢

这个坑我踩过。现象是4bit加载后显存确实少了,但token生成速度还不如FP16。原因通常是:bitsandbytes的4bit反量化是每次计算前先把权重解回高精度,产生了额外开销,老显卡上尤其明显。

解决办法:一是确认GPU算力够不够,太老的显卡对4bit支持差;二是部署场景改用GPTQ或AWQ量化,它们的kernel做了内存访问优化,不存在这个问题;三是看看是不是把compute_dtype设成了float32,改成float16能明显提速。

5.3 GPTQ量化过程中OOM

离线量化比推理更吃显存,因为它要保存原始权重、校准信息和量化中间变量。我就遇到过16GB显存量化13B模型直接爆掉的情况。

解决思路是把几种缓解手段组合用:

  • 调低校准文本的max_length,比如从2048降到1024
  • 减少校准样本数量,但别低于64条,否则精度受影响
  • 用incremental量化,分块处理
  • 换更大的机器量化,量化完再部署到小显存机器上,这是最省心的路子

5.4 长上下文生成时还是OOM

前面提过KV cache的问题。长上下文OOM基本是KV cache爆了,跟权重量化得好不好没关系。我常用的方案:

  • 调低max_new_tokens,限制单次生成长度
  • 用支持paged attention的实现,通过分页机制减少碎片化显存占用
  • 或者干脆用GGUF方案,把部分KV cache放CPU上,用显存换上下文

顺带说一个实测细节:量化后省下来的显存,与其无脑加长上下文,不如先留给batch size。推理吞吐量在batch size上来后提升更明显。

5.5 加载报错:版本、算力、依赖三连

  • 报"bitsandbytes not supported on CPU":bitsandbytes的量化只在GPU上有完整支持,CPU上老老实实用GGUF
  • 报"CUDA compute capability too low":太老的显卡不支持某些量化kernel,看下算力是否≥7.5,不行就换低bit方案或者换模型
  • 报transformers版本跟bitsandbytes版本不兼容:升级的时候别只升一个,把transformers、accelerate、bitsandbytes一起升

5.6 量化模型质量评估超实用方法

评估量化损失别光看perplexity。perplexity是整体指标,但某些任务表现可能特别差。我的方法是准备一个固定测试集,包含通用问答、代码、逻辑推理、长文本总结四类,量化前后分别跑一遍,对比输出。不用搞得像跑benchmark那么复杂,但覆盖面要够,否则容易出现"perplexity没涨多少,但代码能力崩了"的尴尬情况。

6. 一些踩坑后想说的话

最后分享几点我在实际折腾中得出的体会。

第一,量化方案的"最优"是高度依赖硬件的。同一份4bit模型,在A卡和N卡上、在不同算力档位上,速度和质量的相对关系都会变化。网上别人说的"效果很好",不代表你的环境也一样。唯一靠谱的办法是自己在目标硬件上实测。

第二,4bit是"够用"和"省显存"的甜点档位,但如果你跑的模型原本能力就比较勉强,再量化到4bit容易雪上加霜。我在一些数学推理场景下对比过,一个原本70分能力的模型,4bit量化后可能掉到65分以下,而8bit基本还能保持70分。遇到模型本身能力就紧巴巴的,宁可用8bit,也别强行追求最低bit。

第三,量化后的模型如果出现偶发的输出异常,先别急着怀疑模型坏了。先看有没有开回退逻辑、采样参数是否合理,再看量化前后的对比测试。很多"量化后变蠢"其实是采样参数变了,或者上下文管理出了问题,不一定是量化本身的锅。

我现在的标准流程是:先用bitsandbytes跑通验证,确认任务效果后再决定是否离线量化;离线量化优先试GPTQ,质量不稳就换AWQ;CPU相关场景直接用GGUF,不折腾别的。这个流程帮我在多个项目里少踩了不少坑,你们也可以按这个思路来,能省下不少试错时间。

相关新闻

联想Y7000-I5装Ubuntu 22.04实战避坑指南

联想Y7000-I5装Ubuntu 22.04实战避坑指南

1. 项目概述:为什么一台游戏本装Linux需要专门写注意事项?“联想拯救者Y7000-I5装Ubuntu”这个标题背后,藏着的不是一句简单的“换系统”,而是一场硬件兼容性、驱动生态与用户预期之间的三方拉锯战。我从2018年起陆续帮二十多位朋…

2026/10/20 5:08:59 阅读更多 →
本体驱动开发:让大模型在业务规则内稳定输出

本体驱动开发:让大模型在业务规则内稳定输出

做AI原生应用的朋友应该都有过这种体验:大模型单看很聪明,一落到具体业务场景里就开始“自由发挥”。今天让它输出结构化数据,它给你来一段带Markdown的散文;明天让它按业务规则做判断,它又擅自改了规则里的边界条件。…

2026/10/20 5:08:59 阅读更多 →
AGENTS.md:用代码上下文工程给AI定规矩,避免架构破坏

AGENTS.md:用代码上下文工程给AI定规矩,避免架构破坏

让 AI 在项目里加一个"修改订单状态"的接口,它一分钟就交差了。你打开 diff 一看,HTTP 路由层直接 import 了数据访问层的查询函数,业务规则层那套状态机校验全被绕了过去。代码能跑,review 绝对过不了。这种场景我遇到…

2026/10/20 5:08:59 阅读更多 →

最新新闻

HTTP请求头伪造入门:从SWPUCTF新生赛题看Web安全

HTTP请求头伪造入门:从SWPUCTF新生赛题看Web安全

1. 题目初印象:从名字里能读出什么先说结论:这道[SWPUCTF 2021 新生赛]Do_you_know_http是一道典型的、面向新手的Web安全入门题,核心考察的是对HTTP协议基础知识的理解与抓包改包能力。它不会要求你掌握复杂的漏洞利用链,也不涉及…

2026/10/20 5:43:15 阅读更多 →
用Python打造PPT生成工具:Markdown转pptx的架构设计与实现

用Python打造PPT生成工具:Markdown转pptx的架构设计与实现

1. 为什么我要自己动手做一个PPT生成工具先说说我做这个项目的起因。我在一家中型公司做技术方案相关的工作,平均每周要出三到五份PPT,有的是给客户讲架构,有的是给内部做技术评审,还有的是给管理层做汇报。时间长了就发现一个很尴…

2026/10/20 5:43:15 阅读更多 →
AI生产力全链路:数据、模型与工程三位一体落地方案

AI生产力全链路:数据、模型与工程三位一体落地方案

“三位一体”这个词在AI圈被说得有点烂了,但真正能讲清楚、能落地的方案并不多。我最近在梳理一个叫 Joker AIx 的全链路方案,越做越觉得它其实代表了一种趋势,核心就是围绕数据、模型、工程这三根支柱,把AI生产力这件事从头到尾串…

2026/10/20 5:43:15 阅读更多 →
OpenSSL证书实战:从自签名到私有CA搭建与信任配置

OpenSSL证书实战:从自签名到私有CA搭建与信任配置

先看浏览器地址栏里的小锁图标,再看那些打着“不受信任”警告的自签名证书页面。很多人在内网部署系统、做联调、跑测试环境时,就是用OpenSSL随手生成一个证书顶着用,结果要么被浏览器拦得死死的,要么被同事吐槽“就这&#xff1f…

2026/10/20 5:43:15 阅读更多 →
主动式AI驱动服务器支持:从故障响应到预测性维护的服务升级

主动式AI驱动服务器支持:从故障响应到预测性维护的服务升级

“永不停机”这四个字放在过去,基本属于销售话术。但这次认真看了联想这套 Premier Support Plus 服务之后,我得承认,底层的逻辑确实变了:服务器支持从“等用户打电话说坏了再响应”,变成了“用主动式 AI 提前发现问题…

2026/10/20 5:43:15 阅读更多 →
小白程序员必看:如何成为高薪AI全栈工程师?

小白程序员必看:如何成为高薪AI全栈工程师?

本文介绍了AI全栈工程师这一新兴高薪岗位,解释了其概念、所需技能以及为何如此火爆。文章指出,AI全栈工程师能够使用AI编程工具独立完成从界面到上线的整个系统开发,降低了行业门槛,提升了个人不可替代性。文章还澄清了关于AI全栈…

2026/10/20 5:42:15 阅读更多 →

日新闻

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实现详解

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →