纪录一下Q&A(from deepseek & GPT)

[复制链接]
发表于 2025-9-22 05:10:55 | 显示全部楼层 |阅读模式
Q1:__init__.py文件

在 Python 中,当你在一个目次下创建 __init__.py 文件时,这个目次会被视为一个 包(Package)。包的存在使得 Python 可以或许通过点号(.)层级式地组织模块(.py 文件),从而实现模块的模块化管理和调用。以下是其核心原理和实现细节:
1. __init__.py 的作用


  •         标识包的存在:__init__.py 文件(纵然是空文件)会告诉 Python:“这个目次是一个包”。在 Python 3.3+ 中,虽然没有它也能形成命名空间包(Namespace Package),但显式添加该文件可以明白包的层级关系。
  •         初始化包:当包被导入时,__init__.py 中的代码会主动实行,常用于初始化包或界说包的公共接口。
  •         控制导入运动:可以在 __init__.py 中界说 __all__ 变量,指定 from package import * 时导入哪些模块。
2. 包的层级结构与点号调用

假设目次结构如下:
  1. my_project/
  2. ├── main.py
  3. └── my_package/
  4.     ├── __init__.py
  5.     ├── module1.py
  6.     └── sub_package/
  7.         ├── __init__.py
  8.         └── module2.py
复制代码

  •         模块的层级关系:通过包和子包的嵌套,模块被组织成树状结构。例如:

    •                 my_package 是顶级包。
    •                 sub_package 是 my_package 的子包。
    •                 module1.py 和 module2.py 是模块。
           
  •         点号调用的本质:点号 . 表现从包到子包或模块的层级关系。例如:
    1. from my_package.sub_package import module2  # 通过点号逐级访问
    复制代码
3. Python 的模块搜索路径

当实行 import 语句时,Python 会按以下序次搜索模块:

  •         内置模块(如 sys, math)。
  •         当前目次(即运行脚本的目次)。
  •         sys.path 中的路径(包罗环境变量 PYTHONPATH 界说的路径)。


  •         包目次的识别:假如目次中有 __init__.py,Python 会将其视为包,并将其路径到场模块搜索路径。例如:

    •                 当导入 my_package 时,Python 会在 my_project 目次下找到 my_package,并加载其 __init__.py。
           
4. 示例:通过点号调用其他文件夹的模块

假设 module1.py 中界说了一个函数:
  1. # module1.py
  2. def hello():
  3.     return "Hello from module1!"
复制代码
在 main.py 中调用:
  1. # main.py
  2. from my_package.module1 import hello
  3. print(hello())  # 输出: Hello from module1!
复制代码
假如须要在 module2.py 中调用 module1.py 的函数,可以利用相对导入:
  1. # module2.py
  2. from ..module1 import hello  # 从上级包导入
  3. def call_module1():
  4.     return hello()
复制代码
5. 关键机制总结

机制分析包标识__init__.py 将目次标志为包,允许层级式模块管理。命名空隔断离包内的模块通过点号形成独立命名空间,避免命名辩论(如 pkg1.utils 和 pkg2.utils)。模块路径剖析Python 通过包的层级关系剖析 import 语句中的点号路径。初始化逻辑__init__.py 可以编写初始化代码,例如预加载子模块或界说包级变量。6. 常见题目

Q1:没有 __init__.py 会怎样?


  •         在 Python 3.3+ 中,目次会被视为 命名空间包(Namespace Package),允许分散在多个路径中的包归并为一个逻辑包。但显式添加 __init__.py 更保举,由于它支持传统包的完备功能(如初始化代码)。
Q2:怎样控制 from package import * 的运动?


  •         在 __init__.py 中界说 __all__ 变量,指定可导出的模块列表:
    1. # my_package/__init__.py
    2. __all__ = ["module1", "sub_package"]
    复制代码
通过 __init__.py 文件,Python 实现了模块的层级化组织,使得代码结构更清晰、可维护性更高。点号调用本质上是包层级关系的语法表达,雷同于文件体系的路径访问。
Q2:监控监控GPU状态

通过任务管理器得到的状态大概并禁绝确,这时候可以通过命令行来查察GPU运行环境。
nvidia-smi(NVIDIA System Management Interface)是 NVIDIA 显卡驱动的命令行工具,用于监控监控和管理 NVIDIA GPU 装备的状态,广泛应用于深度学习、科学盘算、图形渲染等场景。以下是其用途及输出结果的详细表明:
一、nvidia-smi 的重要用途


  •         监控监控 GPU 状态
            实时查察 GPU 的利用率(Utilization)、显存占用(Memory Usage)、温度(Temperature)、功耗(Power Usage)等关键指标。
  •         管理 GPU 任务
            表现占用 GPU 的进程信息(如 PID、显存占用),支持停止指定进程(需管理员权限)。
  •         调解 GPU 设置
            设置 GPU 的运行模式(如恒久模式、盘算模式)、ECC 内存开关、风扇速率等(需权限)。
  •         调试与优化
            资助开发者诊断显存走漏、GPU 利用率低等题目,优化资源分配。
二、nvidia-smi 的输出结果表明

实行 nvidia-smi 后,输出通常分为两部分:GPU 状态表格进程信息表格
1. GPU 状态表格示例
  1. +-----------------------------------------------------------------------------+
  2. | NVIDIA-SMI 535.104.05   Driver Version: 535.104.05   CUDA Version: 12.2     |
  3. |-------------------------------+----------------------+----------------------+
  4. | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
  5. | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
  6. |===============================+======================+======================|
  7. |   0  NVIDIA RTX 4090    On   | 00000000:01:00.0 Off |                  Off |
  8. | 30%   45C    P0    70W / 450W|   10240MiB / 24576MiB |     50%      Default |
  9. +-------------------------------+----------------------+----------------------+
复制代码

  •         表头信息

    •                 Driver Version:NVIDIA 驱动版本
    •                 CUDA Version:支持的 CUDA 版本
           
  •         各列含义

    •                 Fan (%):风扇转速百分比(若为 N/A 表现主动控制)。
    •                 Temp:GPU 温度(摄氏度),通常 < 85°C 为安全范围。
    •                 Perf性能状态(P0=最高性能,P1/P2=节能模式)。
    •                 Pwr:Usage/Cap:当前功耗 / 最大功耗(单元:瓦特)。
    •                 Memory-Usage:显存利用量 / 总显存(例如 10240MiB / 24576MiB)。
    •                 GPU-Util:GPU 盘算单元利用率(如 50% 表现正在繁忙)。
    •                 Compute M.:盘算模式(Default=默认,Exclusive_Process=独占模式)。
           
  •         其他状态

    •                 Persistence-M:恒久模式(On 表现保持 GPU 唤醒状态,淘汰延伸)。
    •                 Volatile Uncorr. ECC:ECC 纠错功能状态(On/Off)。
           
2. 进程信息表格示例
  1. +-----------------------------------------------------------------------------+
  2. | Processes:                                                                  |
  3. |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
  4. |        ID   ID                                                   Usage      |
  5. |=============================================================================|
  6. |    0   N/A  N/A      1234      G   /usr/lib/xorg/Xorg                 256MiB |
  7. |    0   N/A  N/A      5678      C   python3                           9984MiB |
  8. +-----------------------------------------------------------------------------+
复制代码

  •         各列含义

    •                 GPU:GPU 编号(多卡时区分不同卡)。
    •                 PID:进程 ID。
    •                 Type:进程范例(G=图形任务,C=盘算任务,如 CUDA 程序)。
    •                 Process name:进程名称(如 python3 大概正在运行深度学习模子)。
    •                 GPU Memory Usage:该进程占用的显存。
           
三、常用命令参数


  •         nvidia-smi -l [秒数]:定时刷新输出(如 nvidia-smi -l 2 每 2 秒刷新)。
  •         nvidia-smi -q:表现详细信息(包罗 ECC 错误、时钟频率等)。
  •         nvidia-smi -i 0:指定 GPU 编号(例如监控第 0 号 GPU)。
  •         nvidia-smi --gpu-reset:重置 GPU(需权限,审慎利用)。
  •         nvidia-smi --query-gpu=memory.total,memory.used --format=csv :快速查察显存总量和已用显存
    1. nvidia-smi -q | findstr /C:"FB Memory Usage"
    2. nvidia-smi -q | findstr /C:"FB Memory Usage" /C:"Total" /C:"Used" :分步提取显存信息
    复制代码
四、典范应用场景


  •         训练模子时:通过 GPU-Util 和 Memory-Usage 确认是否需优化 batch size 或并行战略。
  •         显存走漏排查:观察显存是否随程序运行连续增长。
  •         多卡服务器管理:查察各卡负载,公道分配任务。
Q3:表明深度学习相干参数含义与作用
  1. # -- OPTIMIZATION
  2.    
  3. ema = args['optimization']['ema']
  4.    
  5. ipe_scale = args['optimization']['ipe_scale']  # scheduler scale factor (def: 1.0)
  6.    
  7. wd = float(args['optimization']['weight_decay'])
  8.    
  9. final_wd = float(args['optimization']['final_weight_decay'])
  10.    
  11. num_epochs = args['optimization']['epochs_up']
  12.    
  13. warmup = args['optimization']['warmup']
  14.     start_lr = args['optimization']['start_lr']
  15.     lr = args['optimization']['lr']
  16.     final_lr = args['optimization']['final_lr']
复制代码
📌 每个变量的含义
  1. ema = args['optimization']['ema']
复制代码

  •         EMA (Exponential Moving Average)

    •                 启用或设置指数滑动匀称。
    •                 在训练过程中,为模子的参数维护一个滑动匀称副本,可以在测试或推理时利用这个更稳固的匀称模子。
    •                 作用:进步模子鲁棒性,常用于 self-supervised learning 或 semi-supervised learning。
           
  1. ipe_scale = args['optimization']['ipe_scale']
复制代码

  •         IPE Scale (Iteration Per Epoch Scale)

    •                 通常用于调度器(Scheduler)内部的步长缩放,比如 warm-up 或 learning rate decay 的调控。
    •                 作用:调解调度器的节奏,使其更平滑或更快收敛。
           
  1. wd = float(args['optimization']['weight_decay'])
复制代码

  •         Weight Decay(权重衰减)

    •                 是 L2 正则化的一种情势,用于惩罚模子中权重的绝对值。
    •                 作用:防止模子过拟合,尤其在大模子中很常见。
    •                 举例:假如不设置 wd,模子大概会学出很大的权重以拟合训练集;加上 wd 后,大权重会被惩罚。
           
  1. final_wd = float(args['optimization']['final_weight_decay'])
复制代码

  •         终极的权重衰减值

    •                 偶然为了训练前期机动、后期收敛,可以从初始 wd 线性衰减到 final_wd。
    •                 比如 Cosine Decay + weight decay decay 组合。
           
  1. num_epochs = args['optimization']['epochs_up']
复制代码

  •         训练的总轮数(epochs)

    •                 一样平常指上游训练阶段(比如 encoder-pretraining)的 epoch 数目。
    •                 一个 epoch = 全部训练样本都被处置惩罚一次。
           
  1. warmup = args['optimization']['warmup']
复制代码

  •         Warm-up 步数或 epoch 数

    •                 训练开始时,学习率从一个较小值线性上升到目的值(lr)。
    •                 防止训练一开始就震荡或损失爆炸,尤其适合 Transformer 类模子。
    •                 举例:前 5 个 epoch 从 1e-6 -> 1e-4,然后保持/衰减。
           
  1. start_lr = args['optimization']['start_lr']
  2. lr = args['optimization']['lr']
  3. final_lr = args['optimization']['final_lr']
复制代码

  •         学习率相干参数

    •                 start_lr: 初始学习率(用于 warm-up 出发点)
    •                 lr: 主学习率(warm-up 到达的峰值)
    •                 final_lr: 终极学习率(用于后期收敛,常共同 CosineDecay)
           
📘 举个简单例子:学习率调度战略

假设你训练一个 Transformer 模子:
  1. optimizer = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=wd)
  2. scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs)
  3. # Warm-up
  4. warmup_scheduler = WarmupLR(optimizer, warmup_steps=warmup, start_lr=start_lr, base_lr=lr)
  5. for epoch in range(num_epochs):
  6.     train_one_epoch()
  7.     scheduler.step()
复制代码
调度过程如下:
训练阶段学习率权重衰减利用 EMA 吗?前 warmup 轮start_lr -> lr 线性上升wd启动 EMA(更新平滑权重)中期训练保持在 lr 或 Cosine 衰减wd -> final_wd继承更新 EMA末了阶段衰减到 final_lrfinal_wdEMA 完成终极平滑模子
📉 学习率调度图:Warm-up + Cosine Annealing
  1. <img alt=""  src="https://i-blog.csdnimg.cn/direct/64059c1b67c54d418cbc955c0ff525a6.png"  />
复制代码
这个调度战略可以拆解为:

  •         Warm-up:前几个 epoch/step 中,线性上升从 start_lr 到 lr,比如从 1e-6 到 1e-4。
  •         Cosine Annealing:从 lr 痴钝降落到 final_lr,依照半个余弦函数的外形。
这种组合非常适合 Transformer 和自监督任务,可以或许:

  •         防止训练初期震荡或梯度爆炸(warmup)
  •         进步终极模子稳固性(cosine annealing + final_lr)
  •         提升泛化本领(学习率降落促使模子收敛)
✅ 总结表

参数范例作用emaBool 或 Dict是否利用指数滑动匀称ipe_scalefloat学习率调度的节奏因子wdfloat初始权重衰减(正则)final_wdfloat终极权重衰减值num_epochsint总训练轮数warmupintwarm-up 步数或 epoch 数start_lrfloatwarm-up 初始学习率lrfloat峰值学习率final_lrfloat衰减尽头的学习率这些超参数在深度学习、特别是 自监督学习(Self-Supervised Learning, SSL) 中的选择确实是有履历范畴的,虽然它们不是绝对固定,但 通常在肯定范围内厘革,详细取决于:

  •         利用的模子架构(如 Transformer、CNN)
  •         数据规模(小样本 vs 大数据)
  •         训练任务(分类、预训练、对比学习等)

✅ 各参数的典范取值范围

参数名通常范围分析与保举值ema0.999 ~ 0.9999常见于 MoCo、BYOL;越大越“稳固”ipe_scale1.0(常为默认)可设为 num_steps_per_epoch / baseweight_decay (wd)1e-4 ~ 0.1通常 0.05 ~ 0.1 适合 Transformerfinal_weight_decay同 wd 或略小若利用衰减,可以降到 1e-5start_lr1e-6 ~ 5e-5warm-up 起始点,防爆炸lr1e-4 ~ 5e-4主学习率(AdamW)final_lr1e-6 ~ 5e-6衰减后的终极学习率warmup5 ~ 10 个 epoch 或 steps自监督中非常告急,太短容易震荡num_epochs100 ~ 800自监督训练时间较长(SimCLR:800)✅ 补充发起


  •         对于 大模子(如 ViT、MAE、SimCLR 等),较高的 wd 和较长 warmup 是须要的
  •         假如你利用 对比学习(如 MoCo, SimCLR),发起将 ema 设置为 0.999 或更大,越大越平滑
  •         若你训练 小模子或小数据集,适当减小 lr、wd、num_epochs 可加快实行调试。
Q4:学习率相干介绍

学习率(Learning Rate) 是深度学习中最核心的超参数之一,它控制了模子参数更新的速率,也就是每次反向流传时,模子在损失函数梯度方向上移动的“步长”:

📘 一句话界说:

学习率是控制权重更新步长的一个系数,决定了模子在每一步训练中对损失函数梯度的相应水平。

🧠 直观明白:

假设你在山谷中探求最低点(最小的 loss):

  •         假如步子太大(学习率太高),你大概会跳过最低点、乃至飞出去。
  •         假如步子太小(学习率太低),你会非常慢,训练服从低,还大概陷入局部最小值。

🧮 数学表达(梯度降落):

每个模子参数 θ会按如下方式更新:

此中:

  •         η:就是学习率(Learning Rate)
  •         L(θ):损失函数(Loss)
  •         ∇θL(θ):关于参数的梯度

🔧 在 PyTorch 中的实现:
  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. model = nn.Linear(10, 1)  # 一个简单的线性模型
  5. optimizer = optim.SGD(model.parameters(), lr=0.01)  # 设置学习率为 0.01
  6. loss_fn = nn.MSELoss()
  7. # 模拟一个训练步骤
  8. x = torch.randn(16, 10)
  9. y = torch.randn(16, 1)
  10. y_pred = model(x)
  11. loss = loss_fn(y_pred, y)
  12. loss.backward()         # 反向传播,计算梯度
  13. optimizer.step()        # 更新参数:就是使用了 lr=0.01
  14. optimizer.zero_grad()   # 清空梯度
复制代码

🧪 常用的学习率值范围:


  •         小模子(如 MLP/CNN):1e-3 ~ 1e-2
  •         Transformer 或大型模子:1e-4 ~ 1e-5
  •         自监督学习中乃至利用更小的 1e-6,通常共同 warmup 和调度器

📉 搭配调度器利用(PyTorch 示例):
  1. from torch.optim.lr_scheduler import CosineAnnealingLR
  2. scheduler = CosineAnnealingLR(optimizer, T_max=100)
  3. for epoch in range(100):
  4.     train(...)
  5.     scheduler.step()  # 自动调整学习率
复制代码

✅ 总结:

概念含义学习率(lr)决定每次参数更新的幅度学习率过高导致发散、不收敛学习率过低训练慢,容易卡在局部最优调度器(Scheduler)主动控制学习率厘革,比如 warmup、cosine、step decay 等学习率调度曲线:

上图展示的是典范的学习率调度曲线,结合了:

  •         Warmup 阶段(前10步,红色竖线前):

    •                 学习率从较小值 1e-4 线性上升到最大值 1e-3。
    •                 目的是稳固训练初期的梯度更新,防止网络震荡。
           
  •         Cosine Annealing 阶段

    •                 学习率从 1e-3 痴钝降落到 1e-5。
    •                 避免训练末期震荡,有助于模子收敛到更优的极小值。
           
这种调度战略广泛用于自监督学习(如 SimCLR、MAE)、迁徙学习和大规模预训练中。你可以根据总训练步数、模子规模等参数自界说调度战略。
🔍 为什么须要设置初始值(如利用 warmup)

1. 防止梯度爆炸 / 模子不稳固

在训练开始时,模子参数是随机初始化的,假如此时直接利用较大的学习率,会导致梯度变得不稳固或爆炸(尤其是 Transformer 模子中 LayerNorm 的敏感性较高)。

  •         ❌ 大学习率 → loss 振荡或 NaN
  •         ✅ 小学习率 → 稳固“入轨”
warmup 的作用就是从很小的 start_lr(如 1e-6)线性上升到主学习率(如 1e-4)

2. 让模子在初期慢慢顺应数据

训练初期,模子对数据险些一无所知,须要一段“顺应期”。此时大幅度地更新参数是伤害的。
想象一个刚开始学走路的孩子,刚开始应该走得慢一些,顺应之后才气加快。

🔻 为什么训练后期须要衰减学习率?

1. 收敛精度提升

在训练后期,模子已经靠近收敛。此时假如继承利用较大的学习率,会导致模子在最优解附近反复震荡,乃至跳出。
小的学习率可以或许资助模子在 loss 曲线低谷风雅微调,从而更精确收敛。

2. 淘汰过拟合风险

低落学习率后,模子更新变慢,过拟合的风险也随之低落。这有助于模子在验证集上更好地泛化。

🧠 总结为一句话:

初期小学习率是为了稳固训练,后期小学习率是为了进步精度与泛化。中期用较大学习率以加快训练。

🎓 类比表明(学习知识)


  •         刚开始学一个新概念(比如“微积分”),须要慢慢明白 → 类比 warmup
  •         中期把握了核心规律后,就可以快速推进学习 → 类比 主学习率
  •         临近考试,开始风雅复习与查缺补漏 → 类比 学习率衰减

🔧 小发起:

不同模子保举的战略:

  •         Transformer / 自监督模子(如 MAE、SimCLR):猛烈保举利用 warmup + cosine
  •         CNN 模子(如 ResNet):step decay 或 cosine 结果都不错
  •         小模子 / 小数据集:可以淘汰 warmup 步数、减小初始学习率





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表