Friendly Environment for Neural Networks (fenn) is a simple framework that automates ML/DL workflows by providing prebuilt trainers, templates, logging, configuration management, and much more.
Project description
Fenn: Friendly Environment for Neural Networks
The open engine for deep learning workflows.
Friendly Environment for Neural Networks (fenn) is a simple framework that automates ML/DL workflows by providing prebuilt trainers, templates, logging, configuration management, and much more. With fenn, you can focus on your model and data while it takes care of the rest.
Support fenn
If fenn is useful for your work or research, consider supporting its development.
You can support the project by starring the repository on GitHub. It improves visibility and helps others discover fenn.
Sponsorship also helps fund maintenance, improvements, and new features.
Support the project: https://github.com/sponsors/blkdmr
Why fenn?
-
Auto-Configuration: YAML files are automatically parsed and injected into your entrypoint with CLI override support. No more hardcoded hyperparameters or scattered config logic.
-
Unified Logging: All logs, print statements, and experiment metadata are automatically captured to local files and remote tracking backends simultaneously with no manual setup required.
-
Backend Monitoring: Native integration with industry-standard trackers like Weights & Biases (W&B) for centralized experiment tracking and TensorBoard for real-time metric visualization
-
Instant Notifications: Get real-time alerts on Discord and Telegram when experiments start, complete, or fail—no polling or manual checks.
-
Trainers: Built-in support for training loops, validation, and testing with minimal boilerplate. Just define your model and data, and let fenn handle the rest.
-
Template Ready: Built-in support for reproducible, shareable experiment templates.
Quickstart
Install the fenn library using
pip install fenn
or
uv pip install fenn
Initialize a Project
Use the CLI to discover and download a project template.
1. List available templates
fenn list
This fetches the directory listing from pyfenn/templates and prints the templates you can use.
2. Pull a template
fenn pull <template> [path]
Examples:
fenn pull empty # pull into the current directory
fenn pull empty ./my-proj # pull into ./my-proj (created if missing)
Each template ships at least a main.py entrypoint and a fenn.yaml configuration file in the target directory. Most templates also include a README.md, a requirements.txt, and a modules/ directory with example model and dataset code.
To avoid clobbering work, fenn pull refuses to write into a non-empty target directory. Pass --force to overwrite existing files:
fenn pull empty --force
Hidden entries (those starting with ., such as .git) do not count as "non-empty".
3. Customize and run
Open the generated fenn.yaml and adjust hyperparameters, paths, logging, and integrations for your project (see Configuration below). Then run the entrypoint:
python main.py
Common issues
Template <name> not found— The template name doesn't match a directory inpyfenn/templates. Runfenn listto see valid names.Refusing to pull into non-empty directory— Either pull into an empty directory, pointpathat a fresh one, or pass--forceto overwrite.Network error/Failed to check template existence— Check connectivity. The CLI uses the unauthenticated GitHub API to look up and download templates, which is subject to GitHub's rate limit.fenn: command not foundafter installation — Your Python scripts directory may not be on yourPATH. Try running withpython -m fenninstead, or add the scripts directory to your PATH. On most systems:export PATH="$HOME/.local/bin:$PATH".fenn.yaml not foundwhen runningmain.py— Make sure you are running the script from the same directory that containsfenn.yaml. fenn looks for the config file in the current working directory by default.KeyErroronargs['section']['key']— The key referenced in your code does not exist infenn.yaml. Double-check spelling in both files. YAML is case-sensitive.ModuleNotFoundErrorafter pulling a template —fennautomatically attempts to install template dependencies during the pull process. If an environment issue prevents this, navigate into your project directory and runpip install -r requirements.txtmanually.- GitHub API rate limit exceeded during
fenn listorfenn pull— The unauthenticated GitHub API allows 60 requests/hour per IP. Wait a few minutes and try again, or set aGITHUB_TOKENenvironment variable if your fenn version supports authenticated requests.
Configuration
fenn relies on a simple YAML structure to define hyperparameters, paths, logging options, and integrations. You can configure the fenn.yaml file with the hyperparameters and options for your project.
The structure of the fenn.yaml file is:
# ---------------------------------------
# Fenn Configuration (Modify Carefully)
# ---------------------------------------
project: empty
# ---------------------------
# Logging & Tracking
# ---------------------------
logger:
dir: logger
export:
dir: exports
# ---------------------------------------
# Example of User Section
# ---------------------------------------
train:
lr: 0.001
Write Your Code
Use the @app.entrypoint decorator. Your configuration variables are automatically passed via args.
from fenn import Fenn
app = Fenn()
@app.entrypoint
def main(args):
# 'args' contains your fenn.yaml configurations
print(f"Training with learning rate: {args['train']['lr']}")
# Your logic here...
if __name__ == "__main__":
app.run()
By default, fenn will look for a configuration file named fenn.yaml in the current directory. If you would like to use a different name, a different location, or have multiple configuration files for different configurations, you can call set_config_file() and update the path or the name of your configuration file. You must assign the filename before calling run().
The optional export.dir setting centralizes where artifacts are written. Components that export files can use this shared directory instead of requiring an output path to be passed through every call.
app = Fenn()
app.set_config_file("my_file.yaml")
Run It
You can run your code as usual
python main.py
and fenn will take care of the rest for you.
Training Models
Use built-in trainers to handle your training loops with minimal boilerplate.
import torch.nn as nn
import torch.optim as optim
from fenn.nn.trainers import ClassificationTrainer
from fenn.nn.utils import Checkpoint
@app.entrypoint
def main(args):
# Define your data
train_loader = DataLoader(train_dataset, batch_size=args["train"]["batch"], shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=args["test"]["batch"], shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=args["test"]["batch"], shuffle=False)
# Define your model
model = nn.Sequential( ... )
loss = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(),
lr=float(args["train"]["lr"]))
# Initialize a ClassificationTrainer
trainer = ClassificationTrainer(
model=model,
loss_fn=loss,
optim=optimizer,
num_classes=4
)
# Train and predict your model
trainer.fit(train_loader, epochs=10, val_loader=val_loader)
preds = trainer.predict(test_loader)
CLI Reference
A quick reference for all available fenn CLI commands.
| Command | Description |
|---|---|
fenn auth |
Manage credentials for the Fenn remote service |
fenn dashboard |
Launch the local log-browser web UI |
fenn grid <path> |
By setting grid/train section in template, you can run a Fenn project several times, with all possible grid hyperparams. Also, it is possible to specify path to main.py file (e.g. my_temp/main.py) |
fenn list |
List all available templates from pyfenn/templates |
fenn pull <template> |
Pull a template into the current directory |
fenn pull <template> <path> |
Pull a template into the specified path (created if missing) |
fenn pull <template> --force |
Pull a template and overwrite existing files |
Cite fenn
If you use fenn in your work or research, please cite the project as:
@software{fenn,
author = {Alessio Russo},
title = {pyfenn/fenn: Release v0.2.0},
month = may,
year = 2026,
publisher = {Zenodo},
version = {v0.2.0},
doi = {10.5281/zenodo.20178660},
url = {https://doi.org/10.5281/zenodo.20178660},
}
Contributing
Contributions are welcome!
Interested in contributing? Join the community on Discord.
We can then discuss a possible contribution together, answer any questions, and help you get started!
Please consult our CONTRIBUTING.md and CODE_OF_CONDUCT.md before opening a pull request.
Maintainers
The development and long-term direction of fenn is guided by the following maintainers:
| Maintainer | Role |
|---|---|
| @blkdmr | Creator & Project Administrator |
| @giuliaOddi | Project Administrator |
Maintainers oversee the project roadmap, review pull requests, coordinate releases, and ensure the long-term stability and quality of the framework.
Thank you for supporting the project.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fenn-0.2.2.tar.gz.
File metadata
- Download URL: fenn-0.2.2.tar.gz
- Upload date:
- Size: 314.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ad89f2ed995464a9a7c9b16aa34fae9a6b2f46cf68a25fc8ee4b120e914e117
|
|
| MD5 |
8c2f75f9cc28931120ad17c1eeb37be6
|
|
| BLAKE2b-256 |
7c86405ff5206bcd6ee2e193f25ed26251ef59b32375b9bd09574036f760ab08
|
File details
Details for the file fenn-0.2.2-py3-none-any.whl.
File metadata
- Download URL: fenn-0.2.2-py3-none-any.whl
- Upload date:
- Size: 382.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03ef858023eadfa2084119fa087754ed81f9dab01ba856ec9286e4cdc5d5b3e3
|
|
| MD5 |
c92294257dd6515be979a954b82f439f
|
|
| BLAKE2b-256 |
5519d1982158184834ecd05dbc10286e0f05239dc6f540ca73d941a37ff6fd16
|