乐于分享
好东西不私藏

吐血整理!DNABERT 训练参数说明:从能跑到会调

吐血整理!DNABERT 训练参数说明:从能跑到会调
上一篇我们把 DNABERT-2 启动子预测跑通了用 DNABERT 做启动子预测:从概念到代码(下)
跑通之后,真正的问题才开始出现:这些参数到底是什么意思?
MAX_LENGTH 为什么是 128?
BATCH_SIZE 为什么是 16?
LEARNING_RATE 为什么写成 3e-5?
NUM_EPOCHS 到底跑几轮合适?
num_labels 改错了会怎样?
很多人第一次微调 BERT 类模型,最容易进入一种状态:代码能跑,但参数像一排旋钮,每个都不敢碰。今天这篇就专门把这些旋钮拆开看一下。
这篇不只针对启动子预测。只要你以后还要微调 DNABERT、ProtBERT、BioBERT、scBERT,或者其他 Transformer 模型,大部分参数的逻辑都是一样的。
温馨提示:文章篇幅较长,吐血整理。可以收藏慢慢看哦~

PART 01

先把训练过程放在脑子里
在讲参数之前,先记住一条主线:
数据 → tokenizer → 模型 → loss → optimizer → scheduler → 验证指标 → 保存模型
每一类参数都对应这条线上的一个环节。
  • 数据参数决定“喂什么给模型”。
  • tokenizer 参数决定“输入怎么切、保留多长”。
  • 模型参数决定“模型要解决什么任务”。
  • 训练参数决定“模型怎么学、学多快、学多久”。
  • 评估参数决定“我们怎么看它学得好不好”。
所以调参不是玄学。你看到一个参数,先问一句:它管的是哪一段?

PART 02

数据相关参数
先说最基础,也最容易被忽略的部分。
train.csv、dev.csv、test.csv
在我们的示例里,数据分成三个文件:
  • train.csv
  • dev.csv
  • test.csv
它们不是随便拆出来的。
  • train.csv 是训练集,模型会直接用它更新参数。
  • dev.csv 是验证集,训练过程中用来观察模型有没有学起来。
  • test.csv 是测试集,最后才用来评估模型最终表现。
最常见的错误,是一边调参数一边反复看 test 结果。这样 test 就不再是“最后考试”,而变成了“练习题”。结果会显得更好看,但泛化能力可能是假的。
一个简单原则:
  • 训练时看 train loss 和 dev 指标。
  • 调参数时主要参考 dev。
  • 最终写结果时再看 test。
sequence 和 label
我们的 CSV 只有两列:
sequence,label
ATCG...,1
GCTA...,0
  • sequence 是输入序列。
  • label 是任务标签。
如果是二分类,label 通常写成 0 和 1。
如果是三分类,label 可以写成 0、1、2。
如果是五分类,就写 0 到 4。
这里有一个硬规则:label 的取值必须和 num_labels 对上。
如果你的 label 里有 0、1、2 三种值,但模型里还写:
`num_labels=2`
训练就会出问题。因为模型只准备了两个输出位置,却遇到了第三类标签。
所以换任务时,先看标签有几类,再改 num_labels。
正负样本比例
二分类任务里,正负样本比例很重要。
比如启动子预测:
  • label=1 是启动子
  • label=0 是非启动子
如果你有 10000 条非启动子,只有 100 条启动子,模型就很容易学成“全部预测成非启动子”。这样准确率看起来可能很高,但对真正关心的启动子完全没用。
这时 accuracy 就会骗人。
比如 10000 条里只有 100 条是启动子,模型全部预测非启动子,也能有 99% accuracy。但这个模型没有任何实际价值。
所以类别不平衡时,要重点看:
  • precision
  • recall
  • F1
尤其是 recall。如果你关心“不要漏掉启动子”,recall 很重要。
负样本怎么选
这是生物任务里非常关键的一点。
在示例代码里,我们用随机 DNA 当负样本。这只是为了跑通流程。
真实项目里,随机 DNA 往往太简单。模型可能不是学会了“什么是启动子”,而是学会了“人工构造数据和随机序列有什么差别”。
更合理的负样本可以是:
  • 基因内部序列
  • 远离 TSS 的基因组窗口
  • 非启动子的调控区
  • 长度和 GC 含量匹配的背景序列
负样本设计会直接影响模型学到什么。
这是很多生物 AI 任务里最容易被低估的参数。它不写在代码顶部,但比很多超参数都重要。

PART 03

输入长度参数
MAX_LENGTH
这是 BERT 类模型里最常见的参数之一。
在我们的脚本里:
`MAX_LENGTH = 128`
它的意思是:每条序列经过 tokenizer 后,最多保留 128 个 token。
注意:DNABERT-2 的 tokenizer 基于 BPE,一个 token 可能对应多个碱基,所以 MAX_LENGTH=128 实际能覆盖的序列长度通常大于 128 bp。如果你关心确切的碱基窗口,建议先 tokenize 几条样本,统计 token 数量与原始长度的关系。
如果序列短于 128,就 padding 补齐。
如果序列长于 128,就 truncation 截断。
代码里对应这一段:
encoding = tokenizer(
sequence,
truncation=True,
padding="max_length",
max_length=MAX_LENGTH,
return_tensors="pt",
)
MAX_LENGTH 太小会怎样?
模型看不到完整序列。
比如你截取了 TSS 上下游 500 bp,但 MAX_LENGTH 设得太小,真正有用的 motif 可能被截掉。模型不是学不会,而是压根没看到。
MAX_LENGTH 太大会怎样?
显存占用上升,训练变慢。
Transformer 的 attention 计算和序列长度关系很密切。长度越长,计算越重。你把 128 改成 512,不只是多 4 倍那么简单,attention 部分的开销会明显上去。
标准 Transformer self-attention 的复杂度是 O(L²),128→512 长度变为 4 倍,理论计算量变为 16 倍。
怎么选 MAX_LENGTH?
先看你的生物问题。
如果你只看 E. coli σ70 启动子的 -35 区和 -10 区附近,几十到一百多 bp 通常够做演示。
如果你想看更宽的启动子上下游区域,比如 TSS 前后 500 bp,就要把 MAX_LENGTH 调大。
如果你不知道该设多少,一个实用做法是先统计序列长度分布:
`print(df["sequence"].str.len().describe())`
然后让 MAX_LENGTH 覆盖大部分序列,不要盲目拉到很大。
truncation
truncation=True 的意思是:超过最大长度就截断。
它让代码更稳,不会因为个别超长序列直接报错。
但它也有风险:你可能截掉了关键信息。
如果你的任务里关键 motif 可能出现在序列后半段,就要小心 truncation。必要时应该提前统一截取窗口,而不是把一条很长序列直接丢给 tokenizer。
padding
padding="max_length" 的意思是:每条序列都补到同样长度。
深度学习训练通常是按 batch 算的。一个 batch 里有多条序列,长度不一样就不好堆成一个矩阵,所以需要 padding。
padding 本身没有生物意义。它只是补齐用的空位。
attention_mask
attention_mask 用来告诉模型:
  • 1 表示真实 token
  • 0 表示 padding 出来的空位
模型计算 attention 时,应该忽略 padding 位置。
这就是为什么数据集类里要返回:
  • input_ids
  • attention_mask
  • labels
input_ids 是序列内容。
attention_mask 是哪些位置有效。
labels 是正确答案。

PART 04

模型相关参数
MODEL_NAME
在我们的脚本里:
`MODEL_NAME = "zhihan1996/DNABERT-2-117M"`
这表示从 HuggingFace 加载 DNABERT-2 的 117M 参数版本。
换模型时,改的就是这里。
比如你以后不用 DNABERT-2,而是换成另一个适合 DNA 或蛋白的预训练模型,第一步就是改 MODEL_NAME。
但要注意:不是所有模型都能直接套同一套代码。
这里先解释两个词。
  • base model 可以理解成“负责读序列的主体模型”。它会把 DNA、蛋白或者文本序列变成一组向量表示,但它本身不一定知道你要做二分类、三分类,还是回归。
  • classification head 可以理解成“接在主体模型后面的分类器”。它拿到 base model 输出的向量,再输出每个类别的分数。比如启动子预测里,它最后输出两个分数:非启动子一分,启动子一分。
所以换模型时,要看它提供到哪一步。
  • 如果模型支持 `AutoModelForSequenceClassification`,说明 HuggingFace 可以直接帮你加载“主体模型 + 分类头”。这种最省事,基本可以沿用这篇的训练代码。
  • 如果模型只有 base model,说明它只提供了“读序列的主体模型”,没有最后的分类器。你就需要自己接一个 classification head,否则模型只能输出向量,不能直接输出类别。
  • 如果模型需要特殊 tokenizer 或特殊输入格式,那数据处理也要跟着改。比如有的模型要求先切 k-mer,有的模型要求输入蛋白氨基酸序列,有的模型对大小写、特殊符号有要求。这个时候不能只改 MODEL_NAME,还要检查 tokenizer 和 Dataset 这两块。
trustremotecode
DNABERT-2 需要:
`trustremotecode=True`
这表示允许 HuggingFace 执行模型仓库里自定义的 Python 代码。
为什么需要?
因为 DNABERT-2 不是一个完全标准的 BERT 实现,它有自己的模型代码。不开这个参数,可能加载不了。
但这个参数也意味着:你在执行远程仓库提供的代码。
所以实际使用时,最好确认模型来源可信。教学里我们用的是公开的 DNABERT-2 模型,问题不大,但这个习惯要有。
num_labels
这是分类任务里最重要的模型参数。
在我们的任务里:
`num_labels=2`
意思是模型最后输出两个分数:
  • 第 0 类:非启动子
  • 第 1 类:启动子
如果换成三分类,就改成:
`num_labels=3`
这时模型最后输出三个分数。
num_labels 不决定模型“懂不懂 DNA”,它决定最后分类头有几个输出口。
这也是微调和预训练的区别之一:
  • DNABERT-2 主体负责理解序列。
  • classification head 负责把这种理解映射到你的具体标签。
是否冻结模型
我们的脚本没有冻结模型,所以默认会更新整个 DNABERT-2。
这叫 full fine-tuning。
还有一种做法是冻结预训练模型主体,只训练最后的分类头。
大概逻辑是:
for param in model.base_model.parameters():param.requires_grad = False
冻结的好处是快、省显存、小数据时不容易把预训练知识冲坏。
坏处是模型适配新任务的能力弱一些。
小白阶段可以先不冻结,等数据很少、过拟合明显、显存紧张时再考虑。

PART 05

训练相关参数
先解释 loss
后面会反复提到 loss,先把它讲清楚。
loss 可以理解成“模型这一次预测错得有多离谱”。
训练时,模型先对一批序列做预测,然后拿预测结果和真实 label 对比,算出一个 loss。loss 越小,说明预测和真实标签越接近。
训练的目标,就是让 loss 逐渐下降。
所以你看到:
  • Loss=0.6985
  • Loss=0.6241
大致可以理解成:模型比一开始错得少了一点。
但 loss 不是唯一指标。训练集 loss 下降,只能说明模型在训练集上学到了东西;它在新数据上好不好,还要看 dev/test 上的 F1、precision、recall。
BATCH_SIZE
在我们的脚本里:
`BATCH_SIZE = 16`
它表示一次训练喂给模型多少条样本。
batch size 大一点,训练更稳定,速度可能更好。
batch size 小一点,占用显存更少,但梯度波动更大。
最常见的场景是 `CUDA out of memory`。
如果报显存不够,第一反应不是换模型,而是把 BATCH_SIZE 调小:
`16 → 8 → 4 → 2`
只要能跑起来,就先跑通。
batch size 会不会影响结果?
会。
batch size 太小,loss 会抖一点。
batch size 太大,有时泛化反而不好,而且学习率可能也要跟着调。
但入门时不用一上来想太复杂。先用显存允许的最大稳定 batch size。
LEARNING_RATE
在我们的脚本里:
`LEARNING_RATE = 3e-5`
学习率决定每次更新参数时,步子迈多大。
学习率太大,模型可能震荡,loss 不降,甚至越训越差。
学习率太小,模型学得很慢,看起来像没动。
BERT 类模型微调时,常见范围是:
  • 1e-5
  • 2e-5
  • 3e-5
  • 5e-5
3e-5 是一个常见起点。
如果你训练时看到:
  • Loss 完全不降:可能学习率太小,也可能数据或标签有问题。
  • Loss 忽上忽下很厉害:可能学习率太大。
  • 训练集 Loss 降得很好,验证集不涨:可能过拟合,不一定是学习率问题。
学习率是最值得认真调的参数之一。
NUM_EPOCHS
在我们的脚本里:
`NUM_EPOCHS = 5`
epoch 是训练轮数。
1 个 epoch 表示模型完整看完一遍训练集。
5 个 epoch 表示完整看 5 遍。
epoch 不是越多越好。
太少,模型还没学会。
太多,模型可能开始背训练集。
所以要看验证集。
如果 train loss 继续下降,但 dev F1 不涨甚至下降,说明继续训练意义不大,可能已经过拟合。
正式训练时,可以加 early stopping:
如果验证集 F1 连续几轮没有提升,就停止训练。
这比固定写死 20 个 epoch 更稳。
optimizer
我们的脚本用的是:
`optimizer = torch.optim.AdamW(model.parameters(), lr=LEARNING_RATE)`
AdamW 是微调 Transformer 时很常见的优化器。
你可以把 optimizer 理解成“根据梯度更新参数的规则”。
  • SGD 是老派基础款。
  • Adam 是自适应学习率。
  • AdamW 是 Adam 的改进版,对权重衰减处理更合理。
BERT 类模型微调,AdamW 基本是默认选择。
weight_decay
我们的脚本没有显式设置 weight_decay。
它的作用是给模型参数一点惩罚,防止参数长得太夸张,有一定正则化效果。
常见设置:
`weight_decay=0.01`
可以这样写:
optimizer = torch.optim.AdamW(
model.parameters(),
lr=LEARNING_RATE,
weight_decay=0.01
)
小数据、容易过拟合时,可以考虑加。
但不要期待它解决所有问题。数据质量和负样本设计通常更关键。
scheduler
我们的脚本里用了:
scheduler = get_linear_schedule_with_warmup(
optimizer,
num_warmup_steps=int(0.1*total_steps),
num_training_steps=total_steps,
)
scheduler 是学习率调度器。
它不改变模型结构,只改变训练过程中学习率怎么变化。
这里的策略是:
前 10% steps 逐渐升高学习率,叫 warmup。
后面再线性下降。
为什么要 warmup?
预训练模型刚开始微调时,如果一上来学习率就很猛,可能会把原来的参数冲乱。warmup 相当于先慢慢热身。
numwarmupsteps
我们的写法是:
numwarmupsteps = int(0.1*total_steps)
意思是总训练步数的 10% 用来 warmup。
这是常见起点。
如果训练很短,比如总共才几十步,warmup 的影响会比较明显。小数据演示里不用太纠结,真实训练时可以试 0%、5%、10%。
total_steps
代码里:
totalsteps = len(trainloader)*NUM_EPOCHS
`len(train_loader)` 是每个 epoch 有多少个 batch。
乘以 `NUM_EPOCHS`,就是总共更新多少次参数。
这个值会影响 scheduler。
如果你改了 `BATCHSIZE` 或 `NUMEPOCHS`,`total_steps` 也会跟着变。

PART 06

梯度相关参数
zero_grad
训练循环里有:
`optimizer.zerograd(setto_none=True)`
PyTorch 默认会累积梯度。
如果不清空,上一个 batch 的梯度会叠到下一个 batch 上,训练就不对了。
所以每个 batch 前都要 `zero_grad`。
`settonone=True` 是一种更省内存的写法,不影响理解。
loss.backward
这一步是反向传播:
`loss.backward()`
它根据 loss 计算每个参数的梯度。
这里的“方向”,指的是每个参数应该往哪边调,才可能让 loss 变小。
可以把模型参数想成一堆旋钮。模型预测错了,loss 变大。backward 要做的事,就是反过来检查:刚才哪些旋钮对这个错误有贡献?每个旋钮如果往上调一点,loss 会变大还是变小?如果往下调一点呢?
梯度就是这个信息。
它不是直接告诉模型“正确答案是什么”,而是告诉模型:在当前这一小步里,每个参数朝哪个方向改,loss 更可能下降。
没有 backward,模型只知道“我错了”,但不知道“应该怎么改参数”。
optimizer.step
这一步是真正更新参数:
`optimizer.step()`
backward 只是算出“该怎么改”。
step 才是“真的改了”。
训练循环里最核心的顺序就是:
  1. zero_grad
  2. forward
  3. loss
  4. backward
  5. optimizer.step
  6. scheduler.step
顺序别乱。
gradient accumulation
如果显存不够,但又想模拟更大的 batch,可以用梯度累积。
比如 `BATCH_SIZE=4`,但累积 4 次再更新,相当于有效 batch size 是 16。
这属于进阶参数。小白阶段先知道它存在就行。
什么时候需要?
  • 模型大
  • 序列长
  • 显存小
  • batch size 被迫设得很小

PART 07

设备和精度参数
DEVICE
我们的脚本里:
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
这表示有 GPU 就用 GPU,没有就用 CPU。
训练 BERT 类模型,GPU 基本是刚需。CPU 能跑,但会慢到怀疑人生。
每个 tensor 都要放到同一个设备上:
input_ids = batch["input_ids"].to(DEVICE)
attention_mask = batch["attention_mask"].to(DEVICE)
labels = batch["labels"].to(DEVICE)
model.to(DEVICE)
如果模型在 GPU,数据在 CPU,就会报 device mismatch。
fp16 / mixed precision
我们的脚本没有开混合精度。
混合精度通常用 fp16 或 bf16 来减少显存、加快训练。
在 HuggingFace Trainer 里常见参数是:
  • `fp16=True`
  • `bf16=True`
手写 PyTorch 也可以用 `autocast` 和 `GradScaler`。
什么时候考虑?
  • 模型大
  • 序列长
  • 显存紧张
  • 想加速
但混合精度也可能带来数值稳定问题。教学脚本先不用,是为了减少变量。
DNABERT-2 的 flash attention 兼容处理
我们的脚本里有一段:
def disable_dnabert2_flash_attention():
...
它的作用是关闭 DNABERT-2 默认的 Triton flash attention 加速路径。
这个参数很特殊。
它不是训练超参数,也不改变模型结构。它只是在某些环境里避免训练卡住或 Triton 报错。
可以这样理解:
  • 普通 attention 是原始路线。
  • flash attention 是高速路线。
  • 高速路线在不同 CUDA / Triton / PyTorch 组合下可能堵车。
  • 我们为了教程稳定,走普通路线。
BERT 的 self-attention 还在,DNABERT-2 还是 DNABERT-2。

PART 08

评估相关参数
下面几张图是教学示意图,不是这次 toy 数据跑出来的真实结果。它们的作用是帮你理解:一个“看起来比较健康”的二分类模型,各项指标大概应该长什么样。
先看总览。二分类任务最底层的统计其实来自混淆矩阵:
优秀二分类模型的混淆矩阵示意
TP、TN 越高,说明真正例和真反例判断得越多。FP、FN 越低,说明误报和漏报越少。后面的 accuracy、precision、recall、F1,本质上都是从这四个数算出来的。
accuracy
accuracy 是准确率。
预测对的样本数 / 总样本数。
它最直观,但也最容易被类别不平衡骗。
如果正负样本平衡,accuracy 有参考价值。
如果类别严重不平衡,accuracy 可能很好看但没意义。
accuracy 在类别平衡和类别不平衡时的差异
这张图想说明的是:accuracy 高不一定代表模型真的好。尤其在正负样本比例差很多时,一个只会预测多数类的模型,也可能拿到很好看的 accuracy。
precision
precision 是查准率。
模型预测为启动子的序列里,有多少是真的启动子。
如果 precision 低,说明假阳性多。
在实验验证成本高的任务里,precision 很重要。因为你不想拿一堆假阳性去做后续实验。
precision 示意图
Precision 关注的是“模型预测为阳性的样本里,有多少是真的”。如果你后续要做实验验证,precision 高通常意味着候选列表更干净。
recall
recall 是召回率。
真实启动子里,有多少被模型找出来了。
如果 recall 低,说明漏掉了很多真启动子。
在筛选候选位点时,recall 往往很重要。宁愿多筛一些,再后续过滤,也不想一开始就漏掉。
recall 示意图
Recall 关注的是“真实阳性里,有多少被模型找出来”。如果你的目标是初筛候选位点,recall 通常不能太低。
F1
F1 是 precision 和 recall 的折中。
它适合用来快速观察二分类模型整体表现。
但 F1 也不是唯一答案。
  • 如果你的任务更怕假阳性,就重点看 precision。
  • 如果更怕漏掉真阳性,就重点看 recall。
F1 与 precision/recall 平衡关系
F1 的价值在于提醒你:只把 precision 或 recall 其中一个做高,不一定代表整体模型更好。一个比较健康的模型,通常 precision 和 recall 都不能太差。
classification_report
我们的脚本最后输出:
`classificationreport(testlabels, testpreds, targetnames=["非启动子", "启动子"])`
它会把每个类别的 precision、recall、F1、support 都列出来。
support 是每个类别在测试集里有多少条。
看到 support 很小,就要谨慎解读结果。
比如测试集只有 30 条,准确率从 0.60 到 0.67,可能只是多预测对了两条。不要过度兴奋,也不要过度悲伤。
classificationreport 里的 support 和各类别指标
classification_report 不要只看最后一行 accuracy。更稳的读法是:先看每个类别的 support,再看每个类别自己的 precision、recall、F1。某个类别 support 很小的时候,它的指标波动会很大。

PART 09

预测相关参数
MODEL_PATH
预测脚本里:
MODELPATH = "./promotermodel"
这是训练后保存的模型目录。
训练脚本最后有:
model.save_pretrained("./promoter_model")
tokenizer.save_pretrained("./promoter_model")
预测时加载的就是这个目录。
如果你把模型保存到别的地方,预测脚本也要改 `MODEL_PATH`。
softmax
预测脚本里:
probs = torch.softmax(outputs.logits, dim=1)
模型原始输出叫 logits。
logits 不是概率,可以是任意实数。
比如二分类时,模型可能先输出两个原始分数:
非启动子:1.2
启动子:3.0
这两个数只表示“模型更偏向哪一类”,还不是概率。它们不会自动加起来等于 1,也不能直接理解成 1.2% 或 3.0%。
softmax 的作用,就是把这些原始分数转换成一组相对概率,并且让所有类别的概率加起来等于 1。
转换后可能变成:
非启动子:0.14
启动子:0.86
这时我们才可以说:模型认为这条序列更像启动子,启动子这一类的概率更高。
所以 softmax 做的是“把模型原始分数变成可比较的类别概率”。
注意,这里的概率是模型根据当前训练结果算出来的置信分数,不等于真实世界里的绝对概率。模型也可能很自信地判断错。
argmax
预测脚本里:
pred = torch.argmax(probs, dim=1).item()
argmax 是取概率最大的类别。
二分类里,如果第 1 类概率更高,就预测启动子。
confidence
代码里:
confidence = probs[0][pred].item()
这是模型对当前预测类别的概率。
但要注意,confidence 不等于真实可信度。
深度学习模型经常会“很自信地犯错”。如果要把概率当成可靠风险评分,还需要做概率校准。
threshold
我们的脚本默认用 argmax,也就是谁概率大选谁。
二分类里,有时你会想手动设置阈值。
比如:
  • 如果启动子概率 > 0.8,才认为是启动子。这样 precision 可能提高,但 recall 可能下降。
  • 如果启动子概率 > 0.3,就先纳入候选。这样 recall 可能提高,但假阳性也会变多。
阈值不是固定答案,要看任务目标。
  • 如果你后续实验很贵,可以设高一点。
  • 如果你是初筛候选位点,可以设低一点。
threshold 对 precision、recall 和 F1 的影响
这张图可以帮助你理解阈值的作用:阈值越高,模型越“保守”,precision 往往会上升,但 recall 往往会下降。阈值越低,模型越“宽松”,recall 往往会上升,但假阳性也会更多。

PART 10

哪些参数最值得小白先调?
如果你刚开始,不要同时调十几个参数。
优先级可以这样排:
第一,数据和标签。数据质量永远排第一。真实数据、合理负样本、清楚标签,比乱调学习率重要得多。
第二,MAX_LENGTH。它决定模型能看到多少序列上下文。生物任务里,窗口截取方式常常比模型本身还关键。
第三,BATCH_SIZE。它首先受显存限制。跑不动就调小。
第四,LEARNING_RATE。从 3e-5 开始,再试 1e-5、2e-5、5e-5。
第五,NUM_EPOCHS。看 dev F1。不要只看 train loss。
第六,评估指标和阈值。想清楚你更怕假阳性,还是更怕漏掉真阳性。

PART 11

一个最小调参流程
如果下次你换了一个新任务,可以按这个顺序来:
  1. 先准备小数据,确认代码能跑通。
  2. 检查 sequence 和 label 是否正确。
  3. 设置 num_labels。
  4. 根据序列长度设置 MAX_LENGTH。
  5. 从 BATCH_SIZE=16 开始,显存不够就降。
  6. 从 LEARNINGRATE=3e-5、NUMEPOCHS=5 开始。
  7. 看 train loss 是否下降。
  8. 看 dev F1 是否提升。
  9. 如果 train 好、dev 差,考虑过拟合和数据问题。
  10. 最后只在确定方案后看 test。
这套流程比“凭感觉改参数”稳很多。

PART 12

回到这次 DNABERT 启动子预测
我们这次的参数是:
MODEL_NAME = "zhihan1996/DNABERT-2-117M"
MAX_LENGTH = 128
BATCH_SIZE = 16
LEARNING_RATE = 3e-5
NUM_EPOCHS = 5
num_labels = 2
这些参数的含义现在可以连起来看:
  • 用 DNABERT-2 作为预训练模型。
  • 每条序列最多保留 128 个 token。
  • 每次训练 16 条序列。
  • 用 3e-5 的学习率微调。
  • 完整看训练集 5 遍。
  • 最后输出两个类别:非启动子和启动子。
这不是一套“永远正确”的参数。
它只是一个适合小数据教学 demo 的起点。
真正做项目时,参数应该服务于数据:
  • 序列窗口多长,决定 MAX_LENGTH。
  • 类别有几个,决定 num_labels。
  • 显存多大,影响 BATCH_SIZE。
  • 验证集表现,决定 LEARNINGRATE 和 NUMEPOCHS。
  • 任务目标,决定看 precision、recall 还是 F1。

PART 13

参数不是玄学旋钮
很多人第一次看训练脚本,会觉得参数很多。
但拆开以后,其实每个参数都有自己的管辖范围。
  • MAX_LENGTH 管输入多长。
  • BATCH_SIZE 管一次吃多少。
  • LEARNING_RATE 管学得多快。
  • NUM_EPOCHS 管学几遍。
  • num_labels 管输出几类。
  • optimizer 管怎么更新。
  • scheduler 管学习率怎么变。
  • metrics 管怎么判断结果。
理解到这一步,你就不再只是“跑了一段 DNABERT 代码”。你开始知道,下一次换任务时,该从哪里下手。这才是实操最重要的收获。
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-06 01:04:41 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/714084.html
  2. 运行时间 : 0.125031s [ 吞吐率:8.00req/s ] 内存消耗:4,683.20kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=f18a591644ff2b976515d07743ffdf9f
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000590s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000719s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000308s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000262s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000469s ]
  6. SELECT * FROM `set` [ RunTime:0.000203s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000519s ]
  8. SELECT * FROM `article` WHERE `id` = 714084 LIMIT 1 [ RunTime:0.000469s ]
  9. UPDATE `article` SET `lasttime` = 1780679081 WHERE `id` = 714084 [ RunTime:0.000702s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000216s ]
  11. SELECT * FROM `article` WHERE `id` < 714084 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000398s ]
  12. SELECT * FROM `article` WHERE `id` > 714084 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000436s ]
  13. SELECT * FROM `article` WHERE `id` < 714084 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003544s ]
  14. SELECT * FROM `article` WHERE `id` < 714084 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001240s ]
  15. SELECT * FROM `article` WHERE `id` < 714084 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001241s ]
0.128937s