A Python-based fan control daemon for headless NVIDIA GPUs, designed for high-power AI workloads.
- Multiple fan curves - From quiet idle to maximum cooling
- Headless operation - Works without X11/display (uses NVML directly)
- Multiple modes - Choose between quiet, aggressive, performance, or max cooling
- Systemd service - Runs automatically on boot
- Graceful shutdown - Restores automatic fan control when stopped
Matches NVIDIA default at idle, ramps aggressively under load.
| Temperature | Fan Speed |
|---|---|
| ≤40°C | 30% |
| 45°C | 40% |
| 50°C | 55% |
| 55°C | 75% |
| 60°C | 90% |
| 65°C+ | 100% |
| Temperature | Fan Speed |
|---|---|
| 30°C | 40% |
| 40°C | 50% |
| 50°C | 65% |
| 55°C | 75% |
| 60°C | 85% |
| 65°C | 95% |
| 70°C+ | 100% |
| Temperature | Fan Speed |
|---|---|
| 25°C | 50% |
| 35°C | 60% |
| 45°C | 75% |
| 50°C | 85% |
| 55°C | 95% |
| 60°C+ | 100% |
Always runs fans at 100%.
- NVIDIA GPU with fan control support
- Python 3.8+
pynvmlpackage- Root/sudo access (required for fan control)
sudo apt install python3-pynvmlsudo mkdir -p /opt/nvidia-fan-control
sudo cp nvidia-fan-control.py /opt/nvidia-fan-control/
sudo chmod +x /opt/nvidia-fan-control/nvidia-fan-control.pysudo cp nvidia-fan-control.service /etc/systemd/system/
sudo systemctl daemon-reloadsudo systemctl enable nvidia-fan-control.service
sudo systemctl start nvidia-fan-control.servicesudo systemctl status nvidia-fan-controljournalctl -u nvidia-fan-control -fsudo systemctl stop nvidia-fan-controlEdit the service file to change the mode:
sudo nano /etc/systemd/system/nvidia-fan-control.serviceChange the ExecStart line:
# For quiet mode (default - silent idle, aggressive ramp):
ExecStart=/usr/bin/python3 /opt/nvidia-fan-control/nvidia-fan-control.py --mode quiet --interval 1
# For aggressive mode (always audible):
ExecStart=/usr/bin/python3 /opt/nvidia-fan-control/nvidia-fan-control.py --mode aggressive --interval 1
# For performance mode (louder, cooler):
ExecStart=/usr/bin/python3 /opt/nvidia-fan-control/nvidia-fan-control.py --mode performance --interval 1
# For max cooling (100% always):
ExecStart=/usr/bin/python3 /opt/nvidia-fan-control/nvidia-fan-control.py --mode max --interval 1Then reload and restart:
sudo systemctl daemon-reload
sudo systemctl restart nvidia-fan-controlYou can also run the script manually:
# Run once and exit (fans return to auto after a few minutes)
sudo python3 nvidia-fan-control.py --once
# Run as daemon with custom interval
sudo python3 nvidia-fan-control.py --mode performance --interval 2
# Show help
python3 nvidia-fan-control.py --help| Option | Description |
|---|---|
--mode, -m |
Fan curve mode: quiet (default), aggressive, performance, or max |
--interval, -i |
Poll interval in seconds (default: 2.0) |
--once |
Set fans once and exit (don't run as daemon) |
sudo systemctl stop nvidia-fan-control
sudo systemctl disable nvidia-fan-control
sudo rm /etc/systemd/system/nvidia-fan-control.service
sudo rm -rf /opt/nvidia-fan-control
sudo systemctl daemon-reloadCheck logs:
journalctl -u nvidia-fan-control -n 50 --no-pagerThe service must run as root. Check that the service file has User=root.
Ensure NVIDIA persistence daemon is running:
sudo systemctl status nvidia-persistencedThis is expected behavior - the script restores automatic fan control when stopped.
MIT