Skip to main content

Python package for monitoring your python script & Model training status in real-time on slack & telegram.

Project description

Introducing slackker! :fire:

slackker-logo.png

Watching training metrics is a time killer and addictive. Have you ever found yourself walking back and forth to computer to monitor progress, only to find that the current epoch is not finished yet or that nothing has changed?

When you're in front of your screen, you start to look for patterns in the metrics to judge the progress, this way training spills over into the rest of your live. All the time the models are training, your brain works at 50% at most. So, I made slackker to make your life easy :grin:

PyPI - Version

Requirements: slack_sdk>=3.19.0 and matplotlib

slackker is a python package for monitoring your python script & ML model training status in real-time on Slack & Telegram. Features:

  • Integrate within any .py function/script: You can integrate slackker with any python script or function.
  • Real-time updates: Get updates on your training progress in real-time on Slack & Telegram.
  • Exported Plots: Exported plots of training metrics and send it to your Slack channel.
  • Customizable: Customize the metrics you want to track and notify.
  • Easy to use: Just import the package, setup the slack/telegram and you are good to go.

So now you don't have to sit in front of the machine all the time. You can quickly go and grab coffee :coffee: downstairs or run some errands and still keep tracking the progress while on the move without loosing your peace of mind.

Table of contents :notebook:

Installation :arrow_down:

  • Install slackker from PyPi is recommended. slackker is compatible with Python >= 3.6 and runs on Linux, MacOS X and Windows.
  • Installing slackker in your environment is easy. Just use below pip command:
pip install slackker

Getting started with slackker callbacks

Setup slackker

Use slackker callbacks for any python functions

python-banner Import basic slackker callbacks with following line:

from slackker.callbacks.basic import SlackUpdate # for slack
###################### OR ######################
from slackker.callbacks.basic import TelegramUpdate # for telegram

Create slackker object.

# for Slack
slackker = SlackUpdate(token="xoxb-123234234235-123234234235-adedce74748c3844747aed",
    channel="A04AAB77ABC")

or

# for Telegram
slackker = TelegramUpdate(token="1234567890:AAAAA_A111BBBBBCCC2DD3eEe44f5GGGgGG")
  • token: (string) Slack app/Telegram token
  • channel: (string) Slack channel where you want to receive updates
  • verbose: (int) default 0: You can sent the verbose level up to 3.
    • verbose = 0 No logging
    • verbose = 1 Info logging
    • verbose = 2 Debug/In-depth logging

Now you can wrap your function with this slackker object.

@slackker.notifier
def your_function():
    return value_1, value_2

following messages will be sent to your slack channel when the function executes. <<<<<<< HEAD

=======
```bash
>>>>>>> main
Function 'your_function' from Script: 'your_script.py' executed.
Execution time: 5.006 Seconds
Returned 2 outputs:
Output 0:
value_1

Output 1:
value_2

<<<<<<< HEAD You can also use slackker.notify(*args, **kwargs) at the end of your script to notify the end of script execution.

if __name__ == "__main__":
    your_function()
    slackker.notify(arg1, f"This is argument 2 = {arg2}", value="This is a string") 

following message will be sent to your slack channel when the script ends.

Your script: 'your_script.py' has been executed successfully at 14-10-2024 12:15:54

arg1

This is argument 2 = arg2

value: This is a string
=======
You can also use `slackker.notify(__file__)` at the end of your script to notify the end of script execution.
```python
if __name__ == "__main__":
    your_function()
    slackker.notify(__file__)

following message will be sent to your slack channel when the script ends.

Your script: 'your_script.py' has been executed successfully at 14-10-2024 12:15:54
>>>>>>> main

Final code for python function

from slackker.callbacks.basic import SlackUpdate
###################### OR ######################
from slackker.callbacks.basic import TelegramUpdate # for telegram

# for Slack
slackker = SlackUpdate(token="xoxb-123234234235-123234234235-adedce74748c3844747aed",
    channel="A04AAB77ABC")
###################### OR ######################
# for Telegram
slackker = TelegramUpdate(token="1234567890:AAAAA_A111BBBBBCCC2DD3eEe44f5GGGgGG")

@slackker.notifier
def your_function():
    return value_1, value_2

<<<<<<< HEAD
slackker.notify(f"This is value 1: {value_1}", value=value_2)
=======
>>>>>>> main

Use slackker callbacks with Keras

keras-banner

Import slackker for Keras

Import slackker callbacks for keras with following line:

from slackker.callbacks.keras import SlackUpdate # for slack
###################### OR ######################
from slackker.callbacks.keras import TelegramUpdate # for telegram

Create slackker object for keras

Create slackker object.

# for Slack
slackker = SlackUpdate(token="xoxb-123234234235-123234234235-adedce74748c3844747aed",
    channel="A04AAB77ABC",
    ModelName='Keras_NN',
    export='png',
    SendPlot=True)

or

# for Telegram
slackker = TelegramUpdate(token="1234567890:AAAAA_A111BBBBBCCC2DD3eEe44f5GGGgGG",
    ModelName='Simple_NN',
    export='png',
    SendPlot=True)
  • token: (string) Slack app/Telegram token
  • channel: (string) Slack channel where you want to receive updates
  • ModelName: (string) Name for your model. This same name will be used in future for title of the generated plots.
  • export: (string) default "png": Format for plots to be exported. (supported formats: eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff)
  • SendPlots: (Bool) default False: If set to True it will export history of model, both training and validation, save it in the format given in export argument and send graphs to slack channel when training ends. If set to False it will not send exported graphs to slack channel.
  • verbose: (int) default 0: You can sent the verbose level up to 3.
    • verbose = 0 No logging
    • verbose = 1 Info logging
    • verbose = 2 Debug/In-depth logging

Call slackker object into model.fit()

Now you can call slackker object into callbacks argument just like any other callbacks object.

history = model.fit(x_train, 
                    y_train,
                    epochs = 3,
                    batch_size = 16,
                    verbose=1,
                    validation_data=(x_val,y_val),
                    callbacks=[slackker])

Final code for Keras

# Import library for keras
from slackker.callbacks.keras import slackUpdate

# Train-Test split for your keras model
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8)
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train, train_size=0.8)

# Build keras model
model = Sequential()
model.add(Dense(8,activation='relu',input_shape = (IMG_WIDTH, IMG_HEIGHT, DEPTH)))
model.add(Dense(3,activation='softmax'))
model.compile(optimizer = 'rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

# Create Slackker object
slackker = slackUpdate(token="xoxb-123234234235-123234234235-adedce74748c3844747aed48499bb",
    channel="A04AAB77ABC",
    modelName='SampleModel',
    export='png',
    sendPlot=True)

# Call Slackker object in model.fit() callbacks
history = model.fit(x_train, 
                    y_train,
                    epochs = 3,
                    batch_size = 16,
                    verbose=1,
                    validation_data=(x_val,y_val),
                    callbacks=[slackker])

Use slackker callbacks with Lightning

lightning-banner

Import slackker for Lightning

Import slackker callbacks for PyTorch Lightning with following line:

from slackker.callbacks.lightning import SlackUpdate # for slack
###################### OR ######################
from slackker.callbacks.lightning import TelegramUpdate # for telegram

Log your metrics to track

Log Training loop metrics

self.log("train_loss", loss, on_epoch=True)
self.log("train_acc", accuracy, on_epoch=True)

Make sure to set on_epoch=True to in training step.

Log Validation loop metrics

self.log("val_loss", loss)
self.log("val_acc", accuracy)

In Validation step on_epoch=True by default.

Create slackker object for lightning

# for Slack
slackker = SlackUpdate(token="xoxb-123234234235-123234234235-adedce74748c3844747aed",
    channel="A04AAB77ABC",
    ModelName='Lightning NN',
    TrackLogs=['train_loss', 'train_acc', 'val_loss', 'val_acc'],
    monitor="val_loss",
    export='png',
    SendPlot=True)

or

# for Telegram
slackker = TelegramUpdate(token="1234567890:AAAAA_A111BBBBBCCC2DD3eEe44f5GGGgGG",
    ModelName="Lightning NN Testing",
    TrackLogs=['train_loss', 'train_acc', 'val_loss', 'val_acc'],
    monitor="val_loss",
    export='png',
    SendPlot=True)
  • token: (string) Slack app/Telegram token
  • channel: (string) Slack channel where you want to receive updates
  • ModelName: (string) Name for your model. This same name will be used in future for title of the generated plots.
  • TrackLogs: (list) List of metrics you want slackker to track & notify.
  • monitor: (string) This metric will be used to determine best Epoch
  • export: (string) default "png": Format for plots to be exported. (supported formats: eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff)
  • SendPlots: (Bool) default False: If set to True it will export history of model, both training and validation, save it in the format given in export argument and send graphs to slack channel when training ends. If set to False it will not send exported graphs to slack channel.
  • verbose: (int) default 0: You can sent the verbose level up to 3.
    • verbose = 0 No logging
    • verbose = 1 Info logging
    • verbose = 2 Debug/In-depth logging

Call slackker object in Trainer module

Now you can call slackker object into callbacks argument just like any other callbacks object.

trainer = Trainer(max_epochs=2,callbacks=[slackker])

Final code for Lightning

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
import torchvision as tv
import torch.nn.functional as F
from lightning.pytorch import LightningModule, Trainer
from lightning.pytorch.callbacks import ModelCheckpoint, Callback
from lightning.pytorch.loggers import CSVLogger

from slackker.callbacks.lightning import SlackUpdate
from slackker.callbacks.lightning import TelegramUpdate

class LightningModel(LightningModule):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(28*28,256)
        self.fc2 = nn.Linear(256,128)
        self.out = nn.Linear(128,10)

    def forward(self, x):
        batch_size, _, _, _ = x.size()
        x = x.view(batch_size,-1)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        return self.out(x)

    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
        return optimizer

    def training_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.forward(x)

        # calculate Loss
        loss = F.cross_entropy(y_hat,y)

        #calculate accuracy
        _, predictions = torch.max(y_hat, dim=1)
        correct_predictions = torch.sum(predictions == y)
        accuracy = correct_predictions / y.shape[0]

        self.log("train_loss", loss, on_epoch=True)
        self.log("train_acc", accuracy, on_epoch=True)

        return loss

    def validation_step(self, batch, batch_idx):
        x, y = batch
        y_hat = self.forward(x)

        # calculate Loss
        loss = F.cross_entropy(y_hat,y)

        #calculate accuracy
        _, predictions = torch.max(y_hat, dim=1)
        correct_predictions = torch.sum(predictions == y)
        accuracy = correct_predictions / y.shape[0]

        self.log("val_loss", loss)
        self.log("val_acc", accuracy)

        return loss

train_data = tv.datasets.MNIST(".", train=True, download=True, transform=tv.transforms.ToTensor())
test_data = tv.datasets.MNIST(".", train=False, download=True, transform=tv.transforms.ToTensor())
train_loader = DataLoader(train_data, batch_size=128)
test_loader = DataLoader(test_data, batch_size=128)

model = LightningModel()

# slackker checkpoint for slack
slackker = SlackUpdate(token="xoxb-123234234235-123234234235-adedce74748c3844747aed",
    channel="A04AAB77ABC",
    ModelName='Lightning NN',
    TrackLogs=['train_loss', 'train_acc', 'val_loss', 'val_acc'],
    monitor="val_loss",
    export='png',
    SendPlot=True)

trainer = Trainer(max_epochs=2, callbacks=[slackker])
trainer.fit(model, train_loader, test_loader)

Support :sparkles:

If you get stuck, we’re here to help. The following are the best ways to get assistance working through your issue:

  • Use our Github Issue Tracker for reporting bugs or requesting features. Contribution are the best way to keep slackker amazing :muscle:
  • If you want to contribute please refer Contributor's Guide for how to contribute in a helpful and collaborative way :innocent:

Citation :page_facing_up:

Please cite slackker in your publications if this is useful for your project/research. Here is an example BibTeX entry:

@misc{siddheshgunjal2023slackker,
  title={slackker},
  author={Siddhesh Gunjal},
  year={2023},
  howpublished={\url{https://github.com/siddheshgunjal/slackker}},
}

Maintainer :sunglasses:

Static Badge

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

slackker-1.2.33.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

slackker-1.2.33-py3-none-any.whl (18.7 kB view details)

Uploaded Python 3

File details

Details for the file slackker-1.2.33.tar.gz.

File metadata

  • Download URL: slackker-1.2.33.tar.gz
  • Upload date:
  • Size: 20.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for slackker-1.2.33.tar.gz
Algorithm Hash digest
SHA256 1ea8956b2f27263e44e4dae27704c339fb5a1d316b25fcbad8c1526b695b4df6
MD5 1c6f2492adba2ee3b717d26410356ce6
BLAKE2b-256 9d469ab54039d66ecc8154a7f076b175148e648c5670a8449f050ba98baff0e1

See more details on using hashes here.

File details

Details for the file slackker-1.2.33-py3-none-any.whl.

File metadata

  • Download URL: slackker-1.2.33-py3-none-any.whl
  • Upload date:
  • Size: 18.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for slackker-1.2.33-py3-none-any.whl
Algorithm Hash digest
SHA256 e4e1bb007d0848874505945ae1cc6f9f8335ca91c44acb9c97f7be5454a4ffa5
MD5 ec73fb6c755dd60b3f69bd3774d2a522
BLAKE2b-256 259ed26b0209569e8768d0655d65b25d720ccfbb1c84f19c9a9dda110e9959a7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page