# Track real-time metrics of TensorFlow Model during training using Notifly

** Notifly ** is a Pypi package designed to track the model metrics during real-time training using a wrapper over Tensorflow callbacks, which plots the accuracy and loss over each epoch. Notifly also tracks the system resources over the runtime thus providing details about the training in runtime, It can also share the details over *Discord, Telegram, Teams and Slack*.


#### Built with [Python 3](https://www.python.org/)

### Prerequisites:
* Python
It is preinstalled in Ubuntu 20.04. To check the version use command:
```shell
python3 --version
```
If it is not preinstalled for some reason, proceed [here](https://www.python.org/) and download as per requirement.
Run the following command in terminal to download the required packages for running the tool locally :
* Using requirements file :

```shell
pip3 install -r requirements.txt
```
* Directly download packages:
```shell
pip3 install requests==2.24.0
pip3 install matplotlib==3.2.2
pip3 install slackclient==2.9.3
```

## Install the package

Run the following terminal commands to install the package on the given distros.

* Terminal:
shell

```shell
pkg install python3 
```

```shell
pip3 install notifly
```

* Ubuntu/Debian

```shell
sudo apt install python3-pip
```

```shell
pip3 install notifly
```

* Arch

```shell
sudo pacman -S python3-pip
```

```shell
pip3 install notifly
```

***This may take a while depending on the network speed.***

## Working of the tool

### Telegram

To see how the tool works,

1. Create the [telegram bot][2].
2. Getting the bot API token
   1. Search and go to ```_@Botfather_``` .
   1. Message ```/mybots``` .
   1. Select the bot.
   1. Select the *API token* displayed in message.
   1. Copy and use in sample code.

   ```python
   from notifly import telegram              #import the package    
   x = telegram.Notifier('bot API token')   #create object of class Notifier
   x.send_message('message')                #send message
   x.send_image("image address")            #send image(.jpg or .png format)
   x.send_file("file address")              #send document
   x.session_dump()                         #creates folder named 'downloads' in local folder, downloads/saves message,chat details for current session in 'sessio_dump.json' file
    ```
3. Run sample code.

### Discord

To see how the tool works,

1. Create server.
2. Create and copy server webhooks [instruction](https://discordjs.guide/popular-topics/webhooks.html#creating-webhooks) and use in sample code.

   ```python
   from notifly import discord
   x = discord.Notifier(r'webhook')         #create object of class Notifier
   x.send_message('message')                #send message
   x.send_file("file address")              #send file
   x.send_file("image address")             #send image
   ```
3. Run sample code.

### Slack

To see how the tool works,

1. Create app. Follow these steps,
    1. Go [here](https://api.slack.com/) to create a new API for slack.
    2. Choose to  ```Create an App``` .
    3. Enter *App Name* and select workspace. Click ```Create App```.
    4. Under **Add features and functionality** select ```Incoming Webhooks``` and **Activate Incoming Webhooks**.
    5. Scroll down, select ```Add New Webhook to Workspace``` and select a channel from the drop down.This channel name is used as an argument in the sample code. Click ```Allow```.
    6. Select **OAuth & Permissions** from left-sidebar.
    7. Under **Scopes** > **Bot Token Scopes**  click ```Add an OAuth Scope``` and add the following scopes,
       <br>```chat:write``` &nbsp; ```chat:write.public``` &nbsp; ```files:write``` &nbsp; ```users:write```
    8. Scroll up, under **OAuth Tokens for Your Team** copy the *Bot User OAuth Access Token* to use in sample code.
    9. Click ```Reinstall to Workspace```, select channel and click ```Allow```.
2. Write sample code.

   ```python
   from notifly import slack
   x= slack.Notifier('token', channel='channel-name')      #create object of class Notiflier
   x.send_message('message')      #send message
   x.send_file("image or file address")      #send image/file
   ```
3. Run sample code.


### Tensorflow Integration

Plug and play feature for your tensorflow callbacks

```python
# create your notifier using above methods
from notifly import discord
notifier = discord.Notifier(r'webhook') 
class MyNotifierCallback:

    @notifier.notify_on_epoch_begin(epoch_interval=1, graph_interval=1, hardware_stats_interval=1)
    def on_epoch_begin(self, epoch, logs=None):
        pass

    @notifier.notify_on_epoch_end(epoch_interval=1, graph_interval=1, hardware_stats_interval=1)
    def on_epoch_end(self, epoch, logs=None):
        pass

    @notifier.notify_on_train_begin()
    def on_train_begin(self, logs=None):
        pass

    @notifier.notify_on_train_end()
    def on_train_end(self, logs=None):
        pass

model.fit(callbacks=[MyNotifierCallback()])
```

## Learn more about Notifly ✨

Read the [wiki pages](https://github.com/rexdivakar/Notifly/wiki) which has all the above steps in great detail with some examples as well 🤩🎉.

## Contributing

1. Fork the Project
1. Create your Feature Branch
   >git checkout -b feature/mybranch
1. Commit your Changes
    >git commit -m 'Add something'
1. Push to the Branch
    >git push origin feature/mybranch
1. Open a Pull Request<br><br>
Follow the given commands or use the amazing ***GitHub GUI***<br>
**Happy Contributing**

[contributors-shield]: https://img.shields.io/github/contributors/rexdivakar/Telegram-Notifly.svg?style=flat-square
[contributors-url]: https://github.com/rexdivakar/Telegram-Notifly/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/rexdivakar/Telegram-Notifly.svg?style=flat-square
[forks-url]: https://github.com/rexdivakar/Telegram-Notifly/network/members
[stars-shield]: https://img.shields.io/github/stars/rexdivakar/Telegram-Notifly.svg?style=flat-square
[stars-url]: https://github.com/rexdivakar/Telegram-Notifly/stargazers
[issues-shield]: https://img.shields.io/github/issues/rexdivakar/Telegram-Notifly.svg?style=flat-square
[issues-url]: https://github.com/rexdivakar/Telegram-Notifly/issues
[license-shield]: https://img.shields.io/github/license/rexdivakar/Telegram-Notifly.svg?style=flat-square
[license-url]: https://github.com/rexdivakar/Telegram-Notifly/blob/master/LICENSE.txt
[1]:https://www.python.org/
[2]:https://telegram.org/blog/bot-revolution
[4]:https://www.python.org/downloads/
[5]:https://discordjs.guide/popular-topics/webhooks.html#fetching-all-webhooks-of-a-guild
[6]:https://api.slack.com/

