Une petite bibliothèque pour obtenir une notification lorsque votre formation est terminée ou lorsqu'elle se bloque pendant le processus avec deux lignes de code supplémentaires.
Lors de la formation de modèles d'apprentissage en profondeur, il est courant d'utiliser une arrêt anticipé. Outre une estimation approximative, il est difficile de prédire quand la formation se terminera. Ainsi, il peut être intéressant de mettre en place des notifications automatiques pour votre formation. Il est également intéressant d'être informé lorsque votre formation se bloque au milieu du processus pour des raisons inattendues.
Installer avec pip ou équivalent.
pip install knockknockCe code n'a été testé qu'avec Python> = 3,6.
La bibliothèque est conçue pour être utilisée de manière transparente, avec une modification minimale de code: vous n'avez qu'à ajouter un décorateur en haut de votre appel principal. La valeur de retour (s'il y en a une) est également rapportée dans la notification.
Il existe actuellement douze façons de configurer les notifications:
| Plate-forme | Contributeurs externes |
|---|---|
| - | |
| Mou | - |
| Télégramme | - |
| Microsoft Teams | @noklam |
| Envoyer un SMS | @abhishekkrthakur |
| Discorde | @watkinsm |
| Bureau | @atakanyenel @eyalmazuz |
| Matrice | @jcklie |
| CHIME Amazon | @ Prabhakar267 |
| Dingtalk | @wuutiing |
| Rocketchat | @radao |
| WECHAT TRAVAIL | @jcyk |
Le service s'appuie sur Yagmail un client Gmail / SMTP. Vous aurez besoin d'une adresse e-mail Gmail pour l'utiliser (vous pouvez en configurer une ici, c'est gratuit). Je recommande en créer un nouveau (plutôt que votre habituel) car vous devrez modifier les paramètres de sécurité du compte pour permettre à la bibliothèque Python d'y accéder en activant les applications moins sécurisées.
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 Si sender_email n'est pas spécifié, le premier e-mail dans recipient_emails sera utilisé comme e-mail de l'expéditeur.
Notez que le lancement cela vous demandera le mot de passe de l'e-mail de l'expéditeur. Il sera stocké en toute sécurité dans le service de clés du système via la bibliothèque Python keyring .
De même, vous pouvez également utiliser Slack pour obtenir des notifications. Vous devrez obtenir votre URL de Slack Room Webhook et éventuellement votre ID utilisateur (si vous souhaitez vous étiqueter ou quelqu'un d'autre).
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 Vous pouvez également spécifier un argument facultatif pour marquer des personnes spécifiques: 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 Vous pouvez également spécifier un argument facultatif pour marquer des personnes spécifiques: --user-mentions <your_slack_id>,<grandma's_slack_id> .
Vous pouvez également utiliser Telegram Messenger pour obtenir des notifications. Vous devrez d'abord créer votre propre bot de notification en suivant les trois étapes fournies par Telegram ici et enregistrez votre TOKEN d'accès API.
Les robots télégrammes sont timides et ne peuvent pas envoyer le premier message, vous devrez donc faire la première étape. En envoyant le premier message, vous pourrez obtenir le chat_id requis (identification de votre salle de messagerie) en visitant https://api.telegram.org/bot<YourBOTToken>/getUpdates et obtenez l' int sous le message['chat']['id'] .
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 10Grâce à @noklam, vous pouvez également utiliser des équipes Microsoft pour obtenir des notifications. Vous devrez obtenir l'URL de votre canal d'équipe.
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 Vous pouvez également spécifier un argument facultatif pour marquer des personnes spécifiques: user_mentions=[<your_teams_id>, <grandma's_teams_id>] .
Grâce à @abhishekkrthakur, vous pouvez utiliser Twilio pour envoyer des notifications de SMS. Vous devrez configurer un compte Twilio ici, qui est un service payant à des prix compétitifs: par exemple aux États-Unis, obtenir un nouveau numéro et envoyer un SMS via ce service respectivement 1,00 $ et 0,0075 $. Vous devrez obtenir (a) un numéro de téléphone, (b) votre compte SID et (c) votre jeton d'authentification. Quelques détails ici.
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 10Grâce à @watkinsm, vous pouvez également utiliser Discord pour obtenir des notifications. Vous n'aurez qu'à obtenir l'URL de WEBHOOK de votre chaîne Discord.
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 10Vous pouvez également être notifié à partir d'une notification de bureau. Il n'est actuellement disponible que pour MacOS et Linux et Windows 10. Pour Linux, il utilise la commande nofity-end qui utilise libnotify, afin d'utiliser libnotify, vous devez installer un serveur de notification. La cannelle, la profondeur, l'illumination, le gnome, le flashback gnome et le plasma KDE utilisent leurs propres implémentations pour afficher les notifications. Dans d'autres environnements de bureau, le serveur de notification doit être lancé à l'aide de l'option "Autostart" de votre WM / DE.
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 Grâce à @jcklie, vous pouvez envoyer des notifications via la matrice. Le HomeServer est le serveur sur lequel votre utilisateur qui enverra des messages est enregistré. N'oubliez pas le schéma de l'URL ( http ou https ). Vous devrez obtenir le jeton d'accès pour un bot ou votre propre utilisateur. La façon la plus simple de l'obtenir est de se pencher sur des émeutes dans les paramètres d'émeute, Help & About , en bas est: Access Token:<click to reveal> . Vous devez également spécifier un alias de pièce à quels messages sont envoyés. Pour obtenir l'alias en émeute, créez une pièce que vous souhaitez utiliser, puis ouvrez les paramètres de la pièce sous Room Addresses et ajoutez un alias.
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 10Grâce à @ Prabhakar267, vous pouvez également utiliser Amazon Chime pour obtenir des notifications. Vous devrez obtenir URL de votre salle de carillon.
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 Vous pouvez également spécifier un argument facultatif pour marquer des personnes spécifiques: user_mentions=[<your_alias>, <grandma's_alias>] .
Dingtalk est maintenant pris en charge grâce à @wuutiing. Compte tenu de l'URL de WEBHOOK de Dingtalk Chatroom Robot et des mots secrètes / clés (au moins l'un d'entre eux est défini lors de la création d'un robot de chat), vos notifications seront envoyées pour atteindre n'importe qui dans ce salon de discussion.
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 Vous pouvez également spécifier un argument facultatif à des personnes spécifiques: user_mentions=["<list_of_phonenumbers_who_you_want_to_tag>"] .
Vous pouvez utiliser Rocketchat pour obtenir des notifications. Vous aurez besoin de ce qui suit avant de pouvoir publier des notifications:
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 valueVous pouvez également spécifier deux arguments facultatifs:
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 10WeChat Work est désormais soutenu grâce à @jcyk. Compte tenu de l'URL de webhook de WECHAT Work Chatroom Robot, vos notifications seront envoyées pour atteindre n'importe qui dans ce salon de discussion.
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 Vous pouvez également spécifier un argument facultatif pour marquer des personnes spécifiques: user-mentions=["<list_of_userids_you_want_to_tag>"] et / ou user-mentions-mobile=["<list_of_phonenumbers_you_want_to_tag>"] .
Lors de l'utilisation de la formation distribuée, un GPU est lié à son processus en utilisant la variable de rang locale. Étant donné que Knockknock fonctionne au niveau du processus, si vous utilisez 8 GPU, vous obtiendrez 8 notifications au début et 8 notifications à la fin ... pour contourner que, à l'exception des erreurs, seul le processus de maître est autorisé à envoyer des notifications afin de recevoir une seule notification au début et une notification à la fin.
Remarque: Dans Pytorch, le lancement de torch.distributed.launch met en place une variable d'environnement de rang pour chaque processus (voir ici). Ceci est utilisé pour détecter le processus maître, et pour l'instant, la seule façon simple que j'ai trouvé. Malheureusement, cela n'est pas destiné à être général pour toutes les plateformes, mais je discuterais avec plaisir de gérer la formation distribuée dans un numéro / PR.