knockknock
knockknock 是一款专为深度学习训练过程设计的轻量级通知工具。在训练大型模型时,由于常使用早停机制或遭遇意外崩溃,开发者很难准确预估任务结束时间,往往需要时刻盯着屏幕或频繁手动检查进度。knockknock 完美解决了这一痛点,它能在训练完成或中途报错时,立即通过多种渠道向你发送提醒,让你从枯燥的等待中解放出来。
这款工具主要面向 AI 研究人员、数据科学家及后端开发者。其最大的技术亮点在于极致的易用性:无需重构现有代码逻辑,只需在主训练函数上方添加两行装饰器代码即可生效。此外,它还支持将函数的返回值一并包含在通知内容中,方便快速了解训练结果。
为了适应不同的协作环境,knockknock 提供了高达十二种通知方式,涵盖电子邮件、Slack、Telegram、微信企业版、钉钉、短信以及桌面弹窗等主流平台。无论是个人单机实验还是团队协同开发,你都能找到适合的通知渠道。作为一个由 Hugging Face 社区支持的开源项目,knockknock 以最小的代码侵入性,显著提升了模型训练的工作流效率,是深度学习从业者提升生产力的实用小助手。
使用场景
某算法工程师正在训练一个需要运行 12 小时的大型语言模型微调任务,期间无法时刻守在屏幕前监控进度。
没有 knockknock 时
- 无效等待与焦虑:不敢离开座位去休息或开会,必须频繁手动刷新日志查看是否结束,精神高度紧张。
- 意外崩溃无感知:若训练在第 10 小时因显存溢出意外中断,由于无人值守,直到第二天上班才发现,浪费了整整一晚的算力资源。
- 时间估算困难:由于使用了早停(Early Stopping)策略,实际结束时间难以精确预测,导致无法合理安排后续工作或生活节奏。
- 结果获取滞后:训练完成后无法第一时间获取评估指标,必须登录服务器查看日志文件才能确认模型效果,流程繁琐。
使用 knockknock 后
- 解放注意力:只需在训练函数前添加两行装饰器代码,即可安心去吃饭、睡觉或处理其他工作,无需时刻盯着进度条。
- 实时故障报警:一旦训练过程中发生崩溃,knockknock 会立即通过邮件、Slack 或钉钉发送报错通知,确保能立刻介入修复,避免算力空转。
- 精准掌握时机:无论训练因达到最大轮次还是触发早停而结束,都会收到即时提醒,完美衔接后续的实验部署或数据分析工作。
- 自动汇报结果:通知消息中直接包含函数的返回值(如最终准确率或 Loss),无需额外登录服务器查询,核心数据一目了然。
knockknock 用极简的代码接入,将被动且焦虑的“守株待兔”式训练监控,转变为高效、安心的自动化闭环管理。
运行环境要求
- Linux
- macOS
- Windows 10
未说明
未说明

快速开始
敲敲门
一个小型库,只需添加两行代码,即可在训练完成或过程中发生崩溃时收到通知。
在训练深度学习模型时,通常会使用早停策略。除了粗略的估计外,很难预测训练何时会结束。因此,为训练设置自动通知功能非常有用。此外,当训练因意外原因中途崩溃时,也能及时收到通知,这同样很有意义。
安装
使用 pip 或其他等效工具进行安装。
pip install knockknock
此代码仅在 Python >= 3.6 上进行了测试。
使用方法
该库的设计旨在无缝集成,只需对代码进行最少的修改:只需在主函数调用上方添加一个装饰器即可。返回值(如果有)也会包含在通知中。
目前共有 十二 种通知方式:
电子邮件
该服务依赖于 Yagmail,一个 GMAIL/SMTP 客户端。您需要一个 Gmail 邮箱地址才能使用它(您可以在此处创建一个 这里,免费)。建议您创建一个新的邮箱(而不是常用的邮箱),因为您需要修改账户的安全设置,以允许 Python 库通过启用不安全的应用程序访问您的邮箱。
Python
from knockknock import email_sender
@email_sender(recipient_emails=["<your_email@address.com>", "<your_second_email@address.com>"], sender_email="<grandma's_email@gmail.com>")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选的返回值
命令行
knockknock email \
--recipient-emails <your_email@address.com>,<your_second_email@address.com> \
--sender-email <grandma's_email@gmail.com> \
sleep 10
如果未指定 sender_email,则会使用 recipient_emails 中的第一个邮箱作为发件人邮箱。
请注意,运行此命令时会要求您输入发件人邮箱的密码。该密码将通过 keyring Python 库 安全地存储在系统的密钥环服务中。
Slack
同样,您也可以使用 Slack 接收通知。您需要获取 Slack 工作区的 Webhook URL,并可选择性地提供您的 用户 ID(如果您想标记自己或其他人)。
Python
from knockknock import slack_sender
webhook_url = "<webhook_url_to_your_slack_room>"
@slack_sender(webhook_url=webhook_url, channel="<your_favorite_slack_channel>")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选的返回值
您还可以指定一个可选参数来标记特定人员:user_mentions=[<your_slack_id>, <grandma's_slack_id>]。
命令行
knockknock slack \
--webhook-url <webhook_url_to_your_slack_room> \
--channel <your_favorite_slack_channel> \
sleep 10
您也可以指定一个可选参数来标记特定人员:--user-mentions <your_slack_id>,<grandma's_slack_id>。
Telegram
您还可以使用 Telegram Messenger 接收通知。首先,您需要按照 Telegram 提供的三个步骤 这里 创建自己的通知机器人,并保存您的 API 访问 TOKEN。
Telegram 机器人比较害羞,无法发送第一条消息,因此您需要先发送一条消息。通过发送第一条消息,您可以访问 https://api.telegram.org/bot<YourBOTToken>/getUpdates 来获取所需的 chat_id(即您的聊天室标识符),并在 message['chat']['id'] 键下找到对应的整数值。
Python
from knockknock import telegram_sender
CHAT_ID: int = <your_messaging_room_id>
@telegram_sender(token="<your_api_token>", chat_id=CHAT_ID)
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选的返回值
命令行
knockknock telegram \
--token <your_api_token> \
--chat-id <your_messaging_room_id> \
sleep 10
Microsoft Teams
感谢 @noklam,你也可以使用 Microsoft Teams 接收通知。你需要获取你的团队频道的 webhook URL。
Python
from knockknock import teams_sender
@teams_sender(token="<webhook_url_to_your_teams_channel>")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10)
return {'loss': 0.9} # 可选返回值
命令行
knockknock teams \
--webhook-url <webhook_url_to_your_teams_channel> \
sleep 10
你还可以指定一个可选参数来标记特定人员:user_mentions=[<your_teams_id>, <grandma's_teams_id>]。
短信 (SMS)
感谢 @abhishekkrthakur,你可以使用 Twilio 发送短信通知。你需要在此处设置一个 Twilio 账户 这里,这是一项收费服务,价格具有竞争力:例如在美国,获取一个新的号码和通过该服务发送一条短信分别需要花费 1.00 美元和 0.0075 美元。你需要获取 (a) 一个电话号码,(b) 你的 account SID 和 (c) 你的 authentification token。详细信息请参阅 这里。
Python
from knockknock import sms_sender
ACCOUNT_SID: str = "<your_account_sid>"
AUTH_TOKEN: str = "<your_auth_token>"
@sms_sender(account_sid=ACCOUNT_SID, auth_token=AUTH_TOKEN, recipient_number="<recipient's_number>", sender_number="<sender's_number>")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10)
return {'loss': 0.9} # 可选返回值
命令行
knockknock sms \
--account-sid <your_account_sid> \
--auth-token <your_account_auth_token> \
--recipient-number <recipient_number> \
--sender-number <sender_number>
sleep 10
Discord
感谢 @watkinsm,你也可以使用 Discord 接收通知。你只需要获取你的 Discord 频道的 webhook URL。
Python
from knockknock import discord_sender
webhook_url = "<webhook_url_to_your_discord_channel>"
@discord_sender(webhook_url=webhook_url)
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选返回值
命令行
knockknock discord \
--webhook-url <webhook_url_to_your_discord_channel> \
sleep 10
桌面通知
你也可以通过桌面通知接收提醒。目前仅适用于 MacOS、Linux 和 Windows 10。
对于 Linux,它使用 notify-send 命令,该命令依赖于 libnotify。要使用 libnotify,你需要安装一个通知服务器。Cinnamon、Deepin、Enlightenment、GNOME、GNOME Flashback 和 KDE Plasma 都有自己的通知显示实现。在其他桌面环境中,你需要通过你的窗口管理器或桌面环境的“自动启动”选项来启动通知服务器。
Python
from knockknock import desktop_sender
@desktop_sender(title="Knockknock Desktop Notifier")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {"loss": 0.9}
命令行
knockknock desktop \
--title 'Knockknock Desktop Notifier' \
sleep 2
Matrix
感谢 @jcklie,你可以通过 Matrix 发送通知。homeserver 是你将发送消息的用户所注册的服务器。不要忘记 URL 的协议(http 或 https)。
你需要获取机器人或你自己的用户的访问令牌。最简单的方法是在 Riot 中查看,进入设置中的“帮助与关于”,在底部可以看到:“访问令牌:<点击以显示>”。你还需要指定一个房间别名,用于发送消息。要在 Riot 中获取别名,创建一个你想使用的房间,然后在“房间地址”中打开房间设置并添加一个别名。
Python
from knockknock import matrix_sender
HOMESERVER = "<url_to_your_home_server>" # 例如 https://matrix.org
TOKEN = "<your_auth_token>" # 例如 WiTyGizlr8ntvBXdFfZLctyY
ROOM = "<room_alias" # 例如 #knockknock:matrix.org
@matrix_sender(homeserver=HOMESERVER, token=TOKEN, room=ROOM)
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选返回值
命令行
knockknock matrix \
--homeserver <homeserver> \
--token <token> \
--room <room> \
sleep 10
Amazon Chime
感谢 @prabhakar267,你也可以使用 Amazon Chime 接收通知。你需要获取你的 Chime 会议室的 webhook URL。
Python
from knockknock import chime_sender
@chime_sender(webhook_url="<webhook_url_to_your_chime_room>")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10)
return {'loss': 0.9} # 可选返回值
命令行
knockknock chime \
--webhook-url <webhook_url_to_your_chime_room> \
sleep 10
你还可以指定一个可选参数来标记特定人员:user_mentions=[<your_alias>, <grandma's_alias>]。
钉钉
现在也支持钉钉通知,感谢 @wuutiing。只需提供钉钉聊天机器人 webhook URL 和密钥/关键词(至少在创建聊天机器人时设置其中一个),你的通知就会发送到该聊天室中的任何一人。
Python
from knockknock import dingtalk_sender
webhook_url = "<webhook_url_to_your_dingtalk_chatroom_robot>"
@dingtalk_sender(webhook_url=webhook_url, secret="<your_robot_secret_if_set>", keywords=["<list_of_keywords_if_set>"])
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选返回值
命令行
knockknock dingtalk \
--webhook-url <webhook_url_to_your_dingtalk_chatroom_robot> \
--secret <your_robot_secret_if_set> \
sleep 10
你还可以指定一个可选参数来标记特定人员:user_mentions=["<list_of_phonenumbers_who_you_want_to_tag>"]。
RocketChat
您可以使用 RocketChat 接收通知。在发送通知之前,您需要准备以下内容:
- 一个 RocketChat 服务器,例如 rocketchat.yourcompany.com
- 一个 RocketChat 用户 ID(您可以在下一步创建个人访问令牌时查看您的用户 ID)
- 一个 RocketChat 个人访问令牌(请按照此指南创建)
- 一个 RocketChat 频道
Python
from knockknock import rocketchat_sender
@rocketchat_sender(
rocketchat_server_url="<您的 RocketChat 服务器地址>",
rocketchat_user_id="<您的 RocketChat 用户 ID>",
rocketchat_auth_token="<您的 RocketChat 认证令牌>",
channel="<频道名称>")
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选返回值
您还可以指定两个可选参数:
- 标记特定用户:
user_mentions=[<您的用户名>, <奶奶的用户名>] - 使用通知别名:
alias="我的别名"
命令行
knockknock rocketchat \
--rocketchat-server-url <您的 RocketChat 服务器地址> \
--rocketchat-user-id <您的 RocketChat 用户 ID> \
--rocketchat-auth-token <您的 RocketChat 认证令牌> \
--channel <频道名称> \
sleep 10
微信企业号
感谢 @jcyk 的支持,现在也支持微信企业号了。只需提供微信企业号聊天室机器人的 Webhook 地址,您的通知就会发送到该聊天室中的所有人。
Python
from knockknock import wechat_sender
webhook_url = "<您的微信企业号聊天室机器人 Webhook 地址>"
@wechat_sender(webhook_url=webhook_url)
def train_your_nicest_model(your_nicest_parameters):
import time
time.sleep(10000)
return {'loss': 0.9} # 可选返回值
命令行
knockknock wechat \
--webhook-url <您的微信企业号聊天室机器人 Webhook 地址> \
sleep 10
您还可以指定一个可选参数来标记特定人员:user-mentions=["<您想要标记的用户ID列表>"] 和/或 user-mentions-mobile=["<您想要标记的手机号码列表>"]。
关于分布式训练的说明
在使用分布式训练时,每个 GPU 都会通过本地 rank 变量绑定到其对应的进程。由于 knockknock 是在进程级别工作的,如果您使用 8 个 GPU,那么在训练开始和结束时都会收到 8 条通知……为了解决这个问题,除了出现错误的情况外,只有主进程可以发送通知,这样您就只会分别在训练开始和结束时各收到一条通知。
注意: 在 PyTorch 中,torch.distributed.launch 的启动会为每个进程设置一个 RANK 环境变量(详见 此处)。这个变量用于识别主进程,目前这也是我想到的唯一简单方法。遗憾的是,这种方法并不适用于所有平台,但我非常乐意在 issue 或 PR 中与大家讨论更智能、更好的分布式训练处理方式。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

