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. 包的层级结构与点号调用
假设目次结构如下:- my_project/
- ├── main.py
- └── my_package/
- ├── __init__.py
- ├── module1.py
- └── sub_package/
- ├── __init__.py
- └── module2.py
复制代码
- 模块的层级关系:通过包和子包的嵌套,模块被组织成树状结构。例如:
- my_package 是顶级包。
- sub_package 是 my_package 的子包。
- module1.py 和 module2.py 是模块。
- 点号调用的本质:点号 . 表现从包到子包或模块的层级关系。例如:
- 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 中界说了一个函数:- # module1.py
- def hello():
- return "Hello from module1!"
复制代码 在 main.py 中调用:- # main.py
- from my_package.module1 import hello
- print(hello()) # 输出: Hello from module1!
复制代码 假如须要在 module2.py 中调用 module1.py 的函数,可以利用相对导入:- # module2.py
- from ..module1 import hello # 从上级包导入
- def call_module1():
- 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__ 变量,指定可导出的模块列表:
- # my_package/__init__.py
- __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 状态表格示例
- +-----------------------------------------------------------------------------+
- | NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |
- |-------------------------------+----------------------+----------------------+
- | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
- | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
- |===============================+======================+======================|
- | 0 NVIDIA RTX 4090 On | 00000000:01:00.0 Off | Off |
- | 30% 45C P0 70W / 450W| 10240MiB / 24576MiB | 50% Default |
- +-------------------------------+----------------------+----------------------+
复制代码
- 表头信息:
- 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. 进程信息表格示例
- +-----------------------------------------------------------------------------+
- | Processes: |
- | GPU GI CI PID Type Process name GPU Memory |
- | ID ID Usage |
- |=============================================================================|
- | 0 N/A N/A 1234 G /usr/lib/xorg/Xorg 256MiB |
- | 0 N/A N/A 5678 C python3 9984MiB |
- +-----------------------------------------------------------------------------+
复制代码
- 各列含义:
- 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 :快速查察显存总量和已用显存
- nvidia-smi -q | findstr /C:"FB Memory Usage"
- nvidia-smi -q | findstr /C:"FB Memory Usage" /C:"Total" /C:"Used" :分步提取显存信息
复制代码 四、典范应用场景
- 训练模子时:通过 GPU-Util 和 Memory-Usage 确认是否需优化 batch size 或并行战略。
- 显存走漏排查:观察显存是否随程序运行连续增长。
- 多卡服务器管理:查察各卡负载,公道分配任务。
Q3:表明深度学习相干参数含义与作用
- # -- OPTIMIZATION
-
- ema = args['optimization']['ema']
-
- ipe_scale = args['optimization']['ipe_scale'] # scheduler scale factor (def: 1.0)
-
- wd = float(args['optimization']['weight_decay'])
-
- final_wd = float(args['optimization']['final_weight_decay'])
-
- num_epochs = args['optimization']['epochs_up']
-
- warmup = args['optimization']['warmup']
- start_lr = args['optimization']['start_lr']
- lr = args['optimization']['lr']
- final_lr = args['optimization']['final_lr']
复制代码 📌 每个变量的含义
- ema = args['optimization']['ema']
复制代码
- EMA (Exponential Moving Average)
- 启用或设置指数滑动匀称。
- 在训练过程中,为模子的参数维护一个滑动匀称副本,可以在测试或推理时利用这个更稳固的匀称模子。
- 作用:进步模子鲁棒性,常用于 self-supervised learning 或 semi-supervised learning。
- ipe_scale = args['optimization']['ipe_scale']
复制代码
- IPE Scale (Iteration Per Epoch Scale)
- 通常用于调度器(Scheduler)内部的步长缩放,比如 warm-up 或 learning rate decay 的调控。
- 作用:调解调度器的节奏,使其更平滑或更快收敛。
- wd = float(args['optimization']['weight_decay'])
复制代码
- Weight Decay(权重衰减)
- 是 L2 正则化的一种情势,用于惩罚模子中权重的绝对值。
- 作用:防止模子过拟合,尤其在大模子中很常见。
- 举例:假如不设置 wd,模子大概会学出很大的权重以拟合训练集;加上 wd 后,大权重会被惩罚。
- final_wd = float(args['optimization']['final_weight_decay'])
复制代码
- 终极的权重衰减值
- 偶然为了训练前期机动、后期收敛,可以从初始 wd 线性衰减到 final_wd。
- 比如 Cosine Decay + weight decay decay 组合。
- num_epochs = args['optimization']['epochs_up']
复制代码
- 训练的总轮数(epochs)
- 一样平常指上游训练阶段(比如 encoder-pretraining)的 epoch 数目。
- 一个 epoch = 全部训练样本都被处置惩罚一次。
- warmup = args['optimization']['warmup']
复制代码
- Warm-up 步数或 epoch 数
- 训练开始时,学习率从一个较小值线性上升到目的值(lr)。
- 防止训练一开始就震荡或损失爆炸,尤其适合 Transformer 类模子。
- 举例:前 5 个 epoch 从 1e-6 -> 1e-4,然后保持/衰减。
- start_lr = args['optimization']['start_lr']
- lr = args['optimization']['lr']
- final_lr = args['optimization']['final_lr']
复制代码
- 学习率相干参数
- start_lr: 初始学习率(用于 warm-up 出发点)
- lr: 主学习率(warm-up 到达的峰值)
- final_lr: 终极学习率(用于后期收敛,常共同 CosineDecay)
📘 举个简单例子:学习率调度战略
假设你训练一个 Transformer 模子:- optimizer = torch.optim.AdamW(model.parameters(), lr=lr, weight_decay=wd)
- scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=num_epochs)
- # Warm-up
- warmup_scheduler = WarmupLR(optimizer, warmup_steps=warmup, start_lr=start_lr, base_lr=lr)
- for epoch in range(num_epochs):
- train_one_epoch()
- scheduler.step()
复制代码 调度过程如下:
训练阶段学习率权重衰减利用 EMA 吗?前 warmup 轮start_lr -> lr 线性上升wd启动 EMA(更新平滑权重)中期训练保持在 lr 或 Cosine 衰减wd -> final_wd继承更新 EMA末了阶段衰减到 final_lrfinal_wdEMA 完成终极平滑模子
📉 学习率调度图:Warm-up + Cosine Annealing
- <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 中的实现:
- import torch
- import torch.nn as nn
- import torch.optim as optim
- model = nn.Linear(10, 1) # 一个简单的线性模型
- optimizer = optim.SGD(model.parameters(), lr=0.01) # 设置学习率为 0.01
- loss_fn = nn.MSELoss()
- # 模拟一个训练步骤
- x = torch.randn(16, 10)
- y = torch.randn(16, 1)
- y_pred = model(x)
- loss = loss_fn(y_pred, y)
- loss.backward() # 反向传播,计算梯度
- optimizer.step() # 更新参数:就是使用了 lr=0.01
- optimizer.zero_grad() # 清空梯度
复制代码 🧪 常用的学习率值范围:
- 小模子(如 MLP/CNN):1e-3 ~ 1e-2
- Transformer 或大型模子:1e-4 ~ 1e-5
- 自监督学习中乃至利用更小的 1e-6,通常共同 warmup 和调度器
📉 搭配调度器利用(PyTorch 示例):
- from torch.optim.lr_scheduler import CosineAnnealingLR
- scheduler = CosineAnnealingLR(optimizer, T_max=100)
- for epoch in range(100):
- train(...)
- 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企服之家,中国第一个企服评测及商务社交产业平台。
|