Python Tricks

场景:插件系统中,需要给插件的函数绑定on_message,当收到消息时候调用函数。

一切都是绑定方法未绑定方法的处理

方案1:

  1. @on_message装饰器给需要的插件添加metadata
  2. __init__中,遍历全部成员函数,如果有metadata,就从self上getattr下来这个绑定方法
  3. 在加载插件时候实例化插件类

方案2:

Python 异步编程

方法 适用场景 是否要求协程中运行 Python 3.10+ 行为
asyncio.get_running_loop() 在协程/任务中获取当前运行的事件循环 ✅ 必须在事件循环中调用 ✅ 推荐 抛错如果没有运行的 loop
asyncio.get_event_loop() 早期通用方式 ❌ 可在同步代码中用 ⚠️ 不推荐新项目用 自动创建事件循环(旧行为)

官方推荐(Python 3.10+)

估算模型需要的显存

到底需要多少算力才能部署一个模型,这是一个非常常见的问题。我们就从训练和推理两个场景,分析一下如何估计模型所需要的显存。

训练显存大致分为以下四部分:

  1. 模型权重:取决于存储的精度,常见的 BF16 和 FP16 占用大小为 2B
  2. 梯度:反向传播计算的梯度,和权重一样常见情况下占用 2B
  3. 优化器状态:常见的 Adam 会为每个参数都保存它的 Momentum、Variance 和 Master weights,精度为 FP32 所以总计 12B
  4. 中间激活值:简单来说就是为了计算反向传播的梯度,需要把前向计算的中间值存储起来,具体计算见下文。

因此使用 AdamW 优化器 + 混合精度训练的经验公式为: