|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to PyLet will be documented in this file. |
| 4 | + |
| 5 | +## [0.4.0] - 2025-12-26 |
| 6 | + |
| 7 | +### Added |
| 8 | + |
| 9 | +- **`venv` parameter**: Activate a pre-existing Python virtualenv for instance execution |
| 10 | + - CLI: `pylet submit "python train.py" --venv /path/to/venv` |
| 11 | + - Python API: `pylet.submit("python train.py", venv="/path/to/venv")` |
| 12 | + - Solves environment isolation between worker and instances |
| 13 | + - Users are responsible for creating/maintaining venvs on shared filesystem |
| 14 | + |
| 15 | +### Technical Details |
| 16 | + |
| 17 | +- Added `venv` field to `InstanceSubmissionRequest`, `Instance`, and `DesiredInstance` schemas |
| 18 | +- Worker activates venv via `source {venv}/bin/activate && {command}` |
| 19 | +- Path validation: must be absolute path, no `..` allowed |
| 20 | +- 46 new tests for comprehensive coverage |
| 21 | + |
| 22 | +## [0.3.0] - 2024-12-25 |
| 23 | + |
| 24 | +### Added |
| 25 | + |
| 26 | +- **SLLM Integration Support (Phase 2.5)**: Storage-aware GPU scheduling for inference instances |
| 27 | + - `gpu_indices` in instance response (expose physical GPU assignment) |
| 28 | + - `target_worker` parameter (explicit node placement) |
| 29 | + - `gpu_indices` in submission (request specific GPUs) |
| 30 | + - `exclusive` flag (non-exclusive GPU allocation for sllm-store daemon) |
| 31 | + - `labels` + filtering (custom metadata, e.g., `model_id`) |
| 32 | + - `env` parameter in submission (custom environment variables) |
| 33 | + - `available_gpu_indices` in worker response (which specific GPUs are free) |
| 34 | + |
| 35 | +## [0.2.0] - 2024-12-24 |
| 36 | + |
| 37 | +### Added |
| 38 | + |
| 39 | +- **TOML Configuration File Support**: Load settings from `pylet.toml` or `~/.config/pylet/config.toml` |
| 40 | + |
| 41 | +## [0.1.0] - 2024-12-22 |
| 42 | + |
| 43 | +### Initial Release |
| 44 | + |
| 45 | +PyLet is a simple distributed task execution system for GPU servers. Like Ray/K8s but much simpler. |
| 46 | + |
| 47 | +### Features |
| 48 | + |
| 49 | +- **Head/Worker Architecture**: Distributed system with a head node for coordination and worker nodes for execution |
| 50 | +- **GPU-aware Scheduling**: Automatic GPU allocation via `CUDA_VISIBLE_DEVICES` environment variable |
| 51 | +- **Service Discovery**: Instances receive a `PORT` environment variable; endpoints discoverable via `get-endpoint` command |
| 52 | +- **Real-time Logs**: Stream logs from running instances with `pylet logs --follow` |
| 53 | +- **Graceful Shutdown**: SIGTERM with configurable grace period before SIGKILL |
| 54 | +- **SQLite Persistence**: State survives head node restarts (WAL mode for performance) |
| 55 | +- **Long-poll Heartbeats**: Efficient worker-controller communication with generation-based protocol |
| 56 | +- **Attempt-based Fencing**: Correctness guarantees for instance execution |
| 57 | + |
| 58 | +### CLI Commands |
| 59 | + |
| 60 | +- `pylet start` - Start head node |
| 61 | +- `pylet start --head <ip:port> --gpu-units N` - Start worker with N GPUs |
| 62 | +- `pylet submit <cmd> --gpu-units N --name <name>` - Submit instance |
| 63 | +- `pylet get-instance --name <name>` - Get instance status |
| 64 | +- `pylet get-endpoint --name <name>` - Get instance endpoint (host:port) |
| 65 | +- `pylet logs <id>` - View instance logs |
| 66 | +- `pylet logs <id> --follow` - Follow logs in real-time |
| 67 | +- `pylet cancel <id>` - Cancel instance |
| 68 | +- `pylet list-workers` - List registered workers |
| 69 | + |
| 70 | +### Python Support |
| 71 | + |
| 72 | +- Python 3.9, 3.10, 3.11, 3.12, 3.13 |
| 73 | + |
| 74 | +### Dependencies |
| 75 | + |
| 76 | +- FastAPI for REST API |
| 77 | +- Pydantic v2 for data validation |
| 78 | +- aiosqlite for async database access |
| 79 | +- httpx for async HTTP client |
| 80 | +- aiohttp for worker HTTP server |
| 81 | +- Click for CLI |
0 commit comments