一个小库在完成培训时或在此过程中使用另外两行代码崩溃时收到通知。
在训练深度学习模型时,通常会尽早停止。除了粗略的估计外,很难预测培训何时完成。因此,为您的培训设置自动通知可能会很有趣。出于意外的原因,当您的培训在过程中间崩溃时,被通知也很有趣。
使用pip或等效安装。
pip install knockknock该代码仅使用Python> = 3.6进行了测试。
该库的设计旨在以无缝的方式使用,并进行最小的代码修改:您只需要在主函数调用上添加装饰器即可。通知中还报告了回报值(如果有一个)。
当前有十二种设置通知的方法:
| 平台 | 外部贡献者 |
|---|---|
| 电子邮件 | - |
| 松弛 | - |
| 电报 | - |
| 微软团队 | @noklam |
| 短信 | @abhishekkrthakur |
| 不和谐 | @watkinsm |
| 桌面 | @atakanyenel @eyalmazuz |
| 矩阵 | @jcklie |
| 亚马逊钟 | @prabhakar267 |
| dingtalk | @wuutiing |
| Rocketchat | @radao |
| 微信工作 | @jcyk |
该服务依赖于yagmail gmail/smtp客户端。您需要一个Gmail电子邮件地址来使用它(您可以在此处设置一个,它是免费的)。我建议创建一个新的(而不是通常的),因为您必须修改帐户的安全设置,以允许Python库通过打开较不安全的应用程序来访问它。
from knockknock import email_sender
@ email_sender ( recipient_emails = [ "<[email protected]>" , "<[email protected]>" ], sender_email = "<grandma'[email protected]>" )
def train_your_nicest_model ( your_nicest_parameters ):
import time
time . sleep ( 10000 )
return { 'loss' : 0.9 } # Optional return value knockknock email
--recipient-emails < [email protected] > , < [email protected] >
--sender-email < grandma ' [email protected]>
sleep 10如果未指定sender_email ,则将使用recipient_emails中的第一封电子邮件作为发件人的电子邮件。
请注意,启动此功能将向您索要发件人的电子邮件密码。它将通过keyring Python库安全地存储在系统键环服务中。
同样,您也可以使用Slack获取通知。您必须获取Slack Room Webhook URL,并选择您的用户ID(如果您想标记自己或其他人)。
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 } # Optional return value您还可以指定一个可选的参数来标记特定人员: 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> 。
您也可以使用电报使者获取通知。首先,您必须按照此处的电报提供的三个步骤来创建自己的通知机器人,并保存API访问TOKEN 。
电报机器人很害羞,无法发送第一条消息,因此您必须执行第一步。通过发送第一条消息,您可以通过访问https://api.telegram.org/bot<YourBOTToken>/getUpdates yourbottoken>/getupdates来获取chat_id (识别您的消息室),并在关键message['chat']['id']下获取int 。
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 } # Optional return value knockknock telegram
--token < your_api_token >
--chat-id < your_messaging_room_id >
sleep 10多亏了@noklam,您也可以使用Microsoft团队获取通知。您必须获取团队频道Webhook URL。
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 } # Optional return value knockknock teams
--webhook-url < webhook_url_to_your_teams_channel >
sleep 10您还可以指定一个可选的参数来标记特定人员: user_mentions=[<your_teams_id>, <grandma's_teams_id>] 。
感谢@Abhishekkrthakur,您可以使用Twilio发送短信通知。您必须在此处设置一个Twilio帐户,该帐户的价格具有竞争力的价格:例如,在美国,获得一个新号码并通过此服务发送一条短信的价格为$ 1.00和0.0075美元。您需要获取(a)电话号码,(b)您的帐户SID和(c)您的身份验证令牌。这里一些细节。
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 } # Optional return value knockknock sms
--account-sid < your_account_sid >
--auth-token < your_account_auth_token >
--recipient-number < recipient_number >
--sender-number < sender_number >
sleep 10多亏了@Watkinsm,您也可以使用Discord获取通知。您只需要获取Discord频道的Webhook URL即可。
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 } # Optional return value knockknock discord
--webhook-url < webhook_url_to_your_discord_channel >
sleep 10您还可以从桌面通知中获得通知。目前,它仅适用于MacOS,Linux和Windows 10。对于Linux,它使用使用libnotify的Nofity-Send命令,以便使用libnotify,您必须安装通知服务器。肉桂,陶丁,启蒙,侏儒,侏儒闪回和KDE等离子体使用自己的实现来显示通知。在其他桌面环境中,需要使用WM/DE的“ AutoStart”选项启动通知服务器。
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感谢@jcklie,您可以通过矩阵发送通知。 HOMESERVER是您将要发送消息的用户注册的服务器。不要忘记URL的模式( http或https )。您必须获得机器人或您自己的用户的访问令牌。获取它的最简单方法是查看在防暴设置中查看骚乱, Help & About ,底部是: Access Token:<click to reveal> 。您还需要指定向发送消息的房间别名。要获取Riot的别名,请创建一个要使用的房间,然后在Room Addresses下打开房间设置并添加别名。
from knockknock import matrix_sender
HOMESERVER = "<url_to_your_home_server>" # e.g. https://matrix.org
TOKEN = "<your_auth_token>" # e.g. WiTyGizlr8ntvBXdFfZLctyY
ROOM = "<room_alias" # e.g. #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 } # Optional return value knockknock matrix
--homeserver < homeserver >
--token < token >
--room < room >
sleep 10多亏了 @Prabhakar267,您也可以使用Amazon Chime获取通知。您必须获得钟声旋转网址。
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 } # Optional return value knockknock chime
--webhook-url < webhook_url_to_your_chime_room >
sleep 10您还可以指定一个可选的参数来标记特定人员: user_mentions=[<your_alias>, <grandma's_alias>] 。
@wuutiing现在支持DingTalk。鉴于DingTalk聊天室机器人的Webhook URL和Secret/关键字(创建聊天室机器人时至少设置了其中一个),您的通知将被发送到该聊天室中的任何一个。
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 } # Optional return value 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获取通知。您需要以下内容,然后才能发布通知:
from knockknock import rocketchat_sender
@ rocketchat_sender (
rocketchat_server_url = "<url_to_your_rocketchat_server>" ,
rocketchat_user_id = "<your_rocketchat_user_id>" ,
rocketchat_auth_token = "<your_rocketchat_auth_token>" ,
channel = "<channel_name>" )
def train_your_nicest_model ( your_nicest_parameters ):
import time
time . sleep ( 10000 )
return { 'loss' : 0.9 } # Optional return value您还可以指定两个可选参数:
user_mentions=[<your_user_name>, <grandma's_user_name>]alias="My Alias" knockknock rocketchat
--rocketchat-server-url < url_to_your_rocketchat_server >
--rocketchat-user-id < your_rocketchat_user_id >
--rocketchat-auth-token < your_rocketchat_auth_token >
--channel < channel_name >
sleep 10由于@JCyk,现在支持微信工作。鉴于微信工作聊天室机器人的网络旋转网址,您的通知将被发送到该聊天室中的任何人。
from knockknock import wechat_sender
webhook_url = "<webhook_url_to_your_wechat_work_chatroom_robot>"
@ wechat_sender ( webhook_url = webhook_url )
def train_your_nicest_model ( your_nicest_parameters ):
import time
time . sleep ( 10000 )
return { 'loss' : 0.9 } # Optional return value knockknock wechat
--webhook-url < webhook_url_to_your_wechat_work_chatroom_robot >
sleep 10您还可以指定一个可选的参数来标记特定人员: user-mentions=["<list_of_userids_you_want_to_tag>"]和/或/或user-mentions-mobile=["<list_of_phonenumbers_you_want_to_tag>"] 。
当使用分布式培训时,GPU使用局部排名变量绑定到其过程。由于KnockKnock在过程级别上工作,因此,如果您使用8个GPU,则在开始时您将收到8个通知,最后在8个通知中进行了通知...为了避免使用错误,除了错误,只有允许主过程发送通知,以便您在开始时只在开始时仅收到一个通知,最后一个通知。
注意:在pytorch中, torch.distributed.launch的启动为每个过程设置了等级环境变量(请参见此处)。这用于检测主过程,而目前,我想出的唯一简单的方式。不幸的是,这并不是要在所有平台上都是一般的,但是我很乐意讨论在问题/PR中处理分布式培训的更智能/更好的方法。