CLI tool for managing Google Cloud Managed Instance Groups
Project description
migs - Google Cloud MIG CLI Tool
A command-line tool that wraps the gcloud CLI to provide an easier experience for managing Google Cloud Managed Instance Groups.
Features
- List MIGs in your project
- Spin up/down VMs with exact custom names (auto-detects gcloud beta)
- Track your personal VMs
- Automatic SSH config management for VS Code Remote Explorer
- Easy file/directory uploads
- Multi-node cluster support with coordinated naming
Installation
pip install migs
Or to build from source:
git clone https://github.com/keatonelvins/migs.git
cd migs
pip install -e .
Prerequisites
- Python 3.8+
- gcloud CLI installed and authenticated (
gcloud auth login) - SSH keys configured for Google Compute Engine
- (Optional) gcloud beta component for exact VM naming (
gcloud components install beta)
Usage
List all MIGs
migs list
Spin up a VM
# With custom name (auto-detects gcloud beta availability)
migs up my-mig -n my-dev-vm # Creates VM named "my-dev-vm" if beta available
migs up my-mig -n my-dev-vm -d 2h # Auto-delete after 2 hours
migs up my-mig -n node -c 3 # Creates "node1", "node2", "node3"
# Without custom name (auto-generated)
migs up my-mig # Creates "my-mig-username-timestamp"
# Force stable API (bypass auto-detection)
migs up my-mig -n my-dev-vm --stable # Use stable API (VM gets random name, mapped locally)
List your VMs
migs vms
Sync VM state
migs sync # Sync local VM list with GCP state
migs sync --discover # Also discover and claim untracked VMs
Check VM connectivity
migs check my-dev-vm # Test SSH connectivity
SSH into a VM
migs ssh my-dev-vm
migs ssh my-dev-vm -- tmux attach # Pass additional SSH arguments
Run scripts
migs run my-dev-vm ./setup.sh # Runs in tmux session
migs run my-dev-vm ./deploy.sh --session deploy # Custom session name
migs run my-dev-vm ./script.sh arg1 arg2 # Pass arguments to script
Environment Variables (.env files)
Both ssh and run commands automatically detect and use .env files from your current directory:
# If .env exists in current directory, it will be uploaded and sourced
migs ssh my-dev-vm # Variables from .env available in shell
migs run my-dev-vm ./app.sh # Script runs with .env variables
The .env file is uploaded to /tmp/.env on the VM and sourced using set -a; source /tmp/.env; set +a to export all variables.
If $GITHUB_TOKEN exists in your .env, will also configure the gh cli.
Upload files
migs upload my-dev-vm ./myfile.txt
migs upload my-dev-vm ./mydir/ /home/user/
Download files
migs download my-dev-vm /remote/file.txt
migs download my-dev-vm /remote/dir/ ./local/
Spin down a VM
migs down my-dev-vm
Multi-Node Cluster
# Create 4-node cluster with coordinated names
migs up my-mig --name cluster -c 4 # Creates cluster1, cluster2, cluster3, cluster4
# SSH to specific nodes
migs ssh cluster1
migs ssh cluster2
# Run script on all nodes
migs run cluster train.py --all
# Shut down entire cluster
migs down cluster --all
Distributed Training (PyTorch)
The --torchrun flag automatically sets up environment variables for distributed training:
# Run distributed training script on all nodes
migs run cluster train.py --all --torchrun
# This automatically sets on each node:
- HEAD_NODE_IP: Internal IP of cluster1 (head node)
- HEAD_NODE_PORT: 5000
- NNODES: Total number of nodes
- NODE_RANK: 0 for head, 1+ for workers
- NPROC_PER_NODE: Auto-detected GPU count
# Your script can then use torchrun:
torchrun --nproc_per_node=$NPROC_PER_NODE \
--nnodes=$NNODES \
--node_rank=$NODE_RANK \
--master_addr=$HEAD_NODE_IP \
--master_port=$HEAD_NODE_PORT \
your_training_script.py
SSH Config
The tool automatically updates your ~/.ssh/config file with entries for your VMs, making them accessible in VS Code Remote Explorer.
Release Instructions
Setup and Installation
# Install development dependencies and tool in editable mode
make dev-install
# Or directly with pip
pip install -e .
# Install packaging tools (needed for building/releasing)
make install-tools
Building and Testing
# Build distribution packages
make build
# Clean build artifacts
make clean
Release Process
First increment the pyproject.toml and src/migs/__init__.py
# Test upload to PyPI
make test-upload
# Production upload to PyPI
make upload
# Full release (clean, build, upload)
make release
Add git version tag:
git tag v0.1.x
git push origin v0.1.x
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
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 migs-0.1.6.tar.gz.
File metadata
- Download URL: migs-0.1.6.tar.gz
- Upload date:
- Size: 19.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a11213f3b0fd065b9b6ddacc23ca1d20295ab33bffef4f50a0fc4422d65a0ef
|
|
| MD5 |
38eeb051dd0634efa50ca922dfb547f4
|
|
| BLAKE2b-256 |
c2cd3d68e1e0f8010b25d4a2cdb46b7bc00b3500b9b257a70ec342fb2f56c0ca
|
File details
Details for the file migs-0.1.6-py3-none-any.whl.
File metadata
- Download URL: migs-0.1.6-py3-none-any.whl
- Upload date:
- Size: 18.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4be9ec2743cc0e8e871a5ec7518c61158b11a4c159cecb28fa2a9c2bda90145
|
|
| MD5 |
3258845279f774506cfd21f4ae716556
|
|
| BLAKE2b-256 |
828dfc9e603a8db1615a47ad99ccfe2e27ce875533a7287d3d9de21b7ffdf4e0
|