Небольшая библиотека, чтобы получить уведомление, когда ваше обучение будет завершено или когда оно вылетает во время процесса с двумя дополнительными строками кода.
При обучении моделей глубокого обучения часто используют раннюю остановку. Помимо приблизительной оценки, трудно предсказать, когда закончится обучение. Таким образом, может быть интересно настроить автоматические уведомления для вашего обучения. Также интересно быть уведомленным, когда ваше обучение сбивается с падением в середине процесса по неожиданным причинам.
Установите с помощью pip или эквивалентного.
pip install knockknockЭтот код был протестирован только с Python> = 3.6.
Библиотека предназначена для использования бесшовным образом, с минимальной модификацией кода: вам нужно только добавить декоратор сверху основным вызовом функции. Возвращаемое значение (если оно есть) также сообщается в уведомлении.
В настоящее время существует двенадцать способов настройки уведомлений:
| Платформа | Внешние участники |
|---|---|
| электронная почта | - |
| Пролечить | - |
| Телеграмма | - |
| Microsoft Teams | @noklam |
| Текстовое сообщение | @abhishekkrthakur |
| Раздор | @watkinsm |
| Настольный компьютер | @atakanyenel @eyalmazuz |
| Матрица | @jcklie |
| Amazon Chime | @prabhakar267 |
| Dingtalk | @wuutiing |
| Rocketchat | @radao |
| WeChat Work | @jcyk |
Служба опирается на клиент Yagmail A 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 System через библиотеку Python keyring .
Точно так же вы также можете использовать Slack, чтобы получить уведомления. Вам придется получить URL -адрес Webhook Slack Room и, необязательно, ваш идентификатор пользователя (если вы хотите пометить себя или кого -то еще).
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> .
Вы также можете использовать Telegram Messenger для получения уведомлений. Сначала вам придется создать свой собственный бот уведомлений, выполнив три шага, предоставленные Telegram здесь и сохранить ваш TOKEN API Access.
Боты телеграммы застенчивы и не могут отправить первое сообщение, поэтому вам придется сделать первый шаг. Отправляя первое сообщение, вы сможете получить необходимый chat_id (идентификация вашей комнаты для обмена сообщениями), посетив https://api.telegram.org/bot<YourBOTToken>/getUpdates yourbottoken>/getupdates и получите int под ключевым 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 10Благодаря @Noklam, вы также можете использовать команды Microsoft для получения уведомлений. Вам придется получить URL вашей команды Webhook Channel.
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) номер телефона, (б) ваш аккаунт 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 для получения уведомлений. Вам просто нужно получить URL вашего Webhook вашего канала 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 10Вы также можете получить уведомление о настольном уведомлении. В настоящее время он доступен только для MacOS и Linux и Windows 10. Для Linux он использует команду nofity-send, которая использует Libnotify, для использования 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, вы можете отправить уведомления через Matrix. HomeServer - это сервер, на котором зарегистрирован ваш пользователь, который будет отправлять сообщения. Не забывайте схему для URL ( http или https ). Вам придется получить токен доступа для бота или вашего собственного пользователя. Самый простой способ получить его - посмотреть на бутылки, глядя в настройки бунта, Help & About , внизу: Access Token:<click to reveal> . Вам также необходимо указать псевдоним комнаты, в какие сообщения отправляются. Чтобы получить псевдоним в бунте, создайте комнату, которую вы хотите использовать, затем откройте настройки комнаты по 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 Cankume для получения уведомлений. Вам придется получить URL вашего Webhook Room Room.
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>] .
Dingtalk теперь поддерживается благодаря @wuutiing. Учитывая URL и секретные/ключевые слова Dingtalk Chatroom Robot (по крайней мере, один из них устанавливается при создании робота в чате), ваши уведомления будут отправлены, чтобы добраться до любого в этом чате.
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 10WeChat Work теперь поддерживается благодаря @jcyk. Учитывая Url WeChat Work Cth Cth Room Robot Webhook, ваши уведомления будут отправлены, чтобы охватить любого в этом чате.
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>"] .
При использовании распределенного обучения графический процессор связан с его процессом, используя переменную локального ранга. Поскольку Knocknock работает на уровне процесса, если вы используете 8 графических процессоров, вы получите 8 уведомлений в начале и 8 уведомлений в конце ... чтобы обойти это, за исключением ошибок, только мастер -процесс разрешается отправлять уведомления, чтобы вы получали только одно уведомление в начале и одно уведомление в конце.
Примечание. В Pytorch запуск torch.distributed.launch устанавливает переменную среды ранга для каждого процесса (см. Здесь). Это используется для обнаружения главного процесса, и пока, единственный простой способ, который я придумал. К сожалению, это не предназначено для того, чтобы быть общим для всех платформ, но я бы с радостью обсудил бы более умные/лучшие способы справиться с распределенным обучением в проблеме/PR.