# DGX Lab: Supercharge Your Shell with 50+ ML Productivity Aliases <div class="callout" data-callout="info"> <parameter name="callout-title">Lab Session Info</div> <div class="callout-content"> **Date**: October 18, 2025 **DGX System**: NVIDIA DGX Workstation **Session Duration**: ~30 minutes **Primary Focus**: Shell environment optimization for ML workflows </div> </div> ## Why Your Shell Environment Matters You open a terminal dozens of times a day. You type `nvidia-smi` to check GPU status. You activate virtual environments. You navigate directories. You check git status. These small actions add up to hundreds of keystrokes daily. What if you could cut that by 70%? Today's session is about transforming the default Ubuntu `.bashrc` into a productivity powerhouse optimized for ML and GPU development. No fancy tools required—just smart configuration that takes 5 minutes to set up and benefits you forever. ## The Quick Win Here's what changed in this 30-minute session: - **50+ productivity aliases** added - **10+ custom functions** for common tasks - **GPU monitoring shortcuts** for instant status checks - **Enhanced command history** (10K commands with timestamps) - **Smart Python helpers** for virtual environment management The result? Commands that took 10-15 keystrokes now take 2-3. ## The Essential Aliases ### GPU Monitoring (The Most Used) ```bash # Basic GPU check alias gpu='nvidia-smi' # Real-time monitoring (updates every second) alias gpuw='watch -n 1 nvidia-smi' # Memory-focused view alias gpumem='nvidia-smi --query-gpu=memory.used,memory.total --format=csv' ``` **Impact**: `gpu` instead of `nvidia-smi` saves 9 keystrokes. If you check GPU status 50 times a day, that's **450 keystrokes saved daily**. ### Python Environment Management ```bash # Python shortcuts alias py='python3' alias pip='pip3' alias venv='python3 -m venv' alias activate='source venv/bin/activate' ``` **Real-world usage:** ```bash # Before: 47 keystrokes python3 -m venv myenv source myenv/bin/activate # After: 23 keystrokes venv myenv activate ``` **50% keystroke reduction** for virtual environment creation. ### Git Workflow Shortcuts ```bash alias g='git' alias gs='git status' alias ga='git add' alias gc='git commit' alias gp='git push' alias gl='git log --oneline --graph --decorate' alias gd='git diff' ``` **Typical workflow:** ```bash # Before: 67 keystrokes git status git add . git commit -m "update model" git push # After: 33 keystrokes gs ga . gc -m "update model" gp ``` **50% reduction** in common git operations. ### Smart Navigation ```bash # Quick parent directory navigation alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias .....='cd ../../../..' # Enhanced directory listing alias ll='ls -lh' # Human-readable sizes alias la='ls -lhA' # Include hidden files alias lt='ls -lhrt' # Sort by time, newest last alias lz='ls -lhS' # Sort by size alias ld='ls -lrta' # All files, by time (oldest first) ``` ### Safety Nets ```bash # Confirm before destructive operations alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Create parent directories automatically alias mkdir='mkdir -pv' ``` These have saved me from countless accidental deletions. ## Custom Functions (The Power Tools) ### mkcd - Create and Enter Directory ```bash mkcd() { mkdir -p "$1" && cd "$1" } ``` **Usage:** ```bash # Before: two commands mkdir -p ~/projects/new-experiment cd ~/projects/new-experiment # After: one command mkcd ~/projects/new-experiment ``` ### extract - Universal Archive Handler ```bash extract() { if [ -f $1 ]; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "'$1' cannot be extracted via extract()" ;; esac else echo "'$1' is not a valid file" fi } ``` **No more googling** "how to extract .tar.bz2 files"—just `extract file.tar.bz2`. ### pyvenv - Fast Python Environment Setup ```bash pyvenv() { if [ -z "$1" ]; then echo "Usage: pyvenv <env_name>" return 1 fi python3 -m venv "$1" source "$1/bin/activate" pip install --upgrade pip echo "Python virtual environment '$1' created and activated" } ``` **Usage:** ```bash pyvenv ml-project # Creates venv, activates it, upgrades pip—all in one command ``` ### gpucheck - Comprehensive GPU Status ```bash gpucheck() { echo "=== GPU Information ===" nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv,noheader echo -e "\n=== CUDA Version ===" nvcc --version 2>/dev/null | grep "release" || echo "nvcc not found" echo -e "\n=== GPU Utilization ===" nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total --format=csv echo -e "\n=== Running GPU Processes ===" nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv } ``` **Output:** ``` === GPU Information === NVIDIA A100-PCIE-40GB, 535.129.03, 40960 MiB === CUDA Version === Cuda compilation tools, release 12.1, V12.1.105 === GPU Utilization === index, name, utilization.gpu [%], memory.used [MiB], memory.total [MiB] 0, NVIDIA A100-PCIE-40GB, 85 %, 32768 MiB, 40960 MiB === Running GPU Processes === pid, process_name, used_gpu_memory [MiB] 12345, python, 32256 MiB ``` One command gives you **everything you need** to know about GPU status. ### sysinfo - Complete System Overview ```bash sysinfo() { echo "=== System Information ===" echo "OS: $(lsb_release -d | cut -f2)" echo "Kernel: $(uname -r)" echo "Uptime: $(uptime -p)" echo -e "\n=== CPU ===" lscpu | grep "Model name" | cut -d':' -f2 | xargs echo "Cores: $(nproc)" echo -e "\n=== Memory ===" free -h | grep "Mem:" | awk '{print "Total: "$2" | Used: "$3" | Available: "$7}' echo -e "\n=== Disk Usage ===" df -h / | tail -1 | awk '{print "Root: "$3" used / "$2" total ("$5" full)"}' echo -e "\n=== GPU ===" nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo "No GPU detected" } ``` Perfect for **quick health checks** or sharing system specs with collaborators. ## History Enhancements ```bash # Increase history size from 1,000 to 10,000 commands export HISTSIZE=10000 export HISTFILESIZE=20000 # Add timestamps to history export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " # Avoid duplicates export HISTCONTROL=ignoredups:erasedups # Append to history file (don't overwrite) shopt -s histappend ``` **Why this matters for ML:** - Track which hyperparameters you tested and when - Find that perfect training command from last week - Debug "what did I run yesterday at 3pm?" ### History Search Tips ```bash # Search history with timestamps history | grep "python train.py" # Re-run command by number !1234 # Re-run last command starting with "git" !git # Edit and re-run last command ^wrong^right ``` ## Environment Variables That Matter ### CUDA Configuration ```bash export CUDA_HOME=/usr/local/cuda export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH ``` Ensures `nvcc` is accessible and CUDA libraries are found by PyTorch/TensorFlow. ### Python Optimization ```bash # Real-time output (critical for training logs) export PYTHONUNBUFFERED=1 # Prevent .pyc file creation export PYTHONDONTWRITEBYTECODE=1 ``` **PYTHONUNBUFFERED=1** is **crucial** for ML training: - See training progress in real-time - Monitor loss curves as they happen - Catch errors immediately Without it, logs buffer and you might not see output for minutes. ### Enhanced Prompt with Git Branch ```bash # Show git branch in prompt (yellow) parse_git_branch() { git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ ' ``` **Result:** ```bash bioinfo@dgx:~/projects/ml-experiment (feature-branch)$ ``` Always know which experiment branch you're on. ## The Complete Setup Want this configuration? Here's the full enhanced `.bashrc`: <div class="callout" data-callout="tip"> <div class="callout-title">Quick Setup</div> <div class="callout-content"> 1. **Backup your existing .bashrc:** ```bash cp ~/.bashrc ~/.bashrc.backup ``` 2. **Add the aliases and functions** (see full file below) 3. **Reload your shell:** ```bash source ~/.bashrc ``` 4. **Test it out:** ```bash gpu # Check GPU status gs # Git status mkcd test # Create and enter directory sysinfo # System overview ``` </div> </div> ### Core Additions to .bashrc ```bash # ============================================ # History Configuration # ============================================ export HISTSIZE=10000 export HISTFILESIZE=20000 export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S " export HISTCONTROL=ignoredups:erasedups shopt -s histappend # ============================================ # Shell Options # ============================================ shopt -s globstar # Enable ** for recursive matching shopt -s nocaseglob # Case-insensitive filename completion bind "set show-all-if-ambiguous on" bind "set mark-symlinked-directories on" # ============================================ # GPU Monitoring Aliases # ============================================ alias gpu='nvidia-smi' alias gpuw='watch -n 1 nvidia-smi' alias gpumem='nvidia-smi --query-gpu=memory.used,memory.total --format=csv' # ============================================ # Python Shortcuts # ============================================ alias py='python3' alias pip='pip3' alias venv='python3 -m venv' alias activate='source venv/bin/activate' # ============================================ # Git Shortcuts # ============================================ alias g='git' alias gs='git status' alias ga='git add' alias gc='git commit' alias gp='git push' alias gl='git log --oneline --graph --decorate' alias gd='git diff' # ============================================ # Directory Navigation # ============================================ alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias .....='cd ../../../..' # ============================================ # Enhanced Listing # ============================================ alias ll='ls -lh' alias la='ls -lhA' alias lt='ls -lhrt' alias lz='ls -lhS' alias ld='ls -lrta' # ============================================ # Safety Nets # ============================================ alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' alias mkdir='mkdir -pv' # ============================================ # System Information # ============================================ alias myip='curl -s ifconfig.me' alias meminfo='free -h' alias cpuinfo='lscpu' alias diskusage='df -h' alias topcpu='ps aux --sort=-%cpu | head -n 11' alias topmem='ps aux --sort=-%mem | head -n 11' # ============================================ # Environment Variables # ============================================ export CUDA_HOME=/usr/local/cuda export PATH=$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH export EDITOR=nano export VISUAL=nano export PYTHONUNBUFFERED=1 export PYTHONDONTWRITEBYTECODE=1 export LESS='-R -X -F' # ============================================ # Custom Functions # ============================================ # Create directory and cd into it mkcd() { mkdir -p "$1" && cd "$1" } # Universal archive extraction extract() { if [ -f $1 ]; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "'$1' cannot be extracted" ;; esac else echo "'$1' is not a valid file" fi } # Find files by name ff() { find . -type f -iname "*$1*" } # Find directories by name fd() { find . -type d -iname "*$1*" } # Recursive grep with line numbers grepn() { grep -rn "$1" . } # Display PATH in readable format showpath() { echo $PATH | tr ':' '\n' | nl } # Quick Python venv setup pyvenv() { if [ -z "$1" ]; then echo "Usage: pyvenv <env_name>" return 1 fi python3 -m venv "$1" source "$1/bin/activate" pip install --upgrade pip echo "Python virtual environment '$1' created and activated" } # Comprehensive GPU check gpucheck() { echo "=== GPU Information ===" nvidia-smi --query-gpu=gpu_name,driver_version,memory.total --format=csv,noheader echo -e "\n=== CUDA Version ===" nvcc --version 2>/dev/null | grep "release" || echo "nvcc not found" echo -e "\n=== GPU Utilization ===" nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total --format=csv echo -e "\n=== Running GPU Processes ===" nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv } # Python environment info pyinfo() { echo "=== Python Environment ===" echo "Python: $(python3 --version)" echo "Location: $(which python3)" echo "Pip: $(pip3 --version | cut -d' ' -f1-2)" [ -n "$VIRTUAL_ENV" ] && echo "Active venv: $VIRTUAL_ENV" || echo "No active venv" echo -e "\nInstalled packages:" pip3 list | head -n 10 } # Complete system overview sysinfo() { echo "=== System Information ===" echo "OS: $(lsb_release -d | cut -f2)" echo "Kernel: $(uname -r)" echo "Uptime: $(uptime -p)" echo -e "\n=== CPU ===" lscpu | grep "Model name" | cut -d':' -f2 | xargs echo "Cores: $(nproc)" echo -e "\n=== Memory ===" free -h | grep "Mem:" | awk '{print "Total: "$2" | Used: "$3" | Available: "$7}' echo -e "\n=== Disk Usage ===" df -h / | tail -1 | awk '{print "Root: "$3" used / "$2" total ("$5" full)"}' echo -e "\n=== GPU ===" nvidia-smi --query-gpu=name,memory.total --format=csv,noheader 2>/dev/null || echo "No GPU detected" } # ============================================ # Enhanced Prompt with Git Branch # ============================================ parse_git_branch() { git branch 2>/dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[33m\]$(parse_git_branch)\[\033[00m\]\$ ' # ============================================ # Colored GCC Output # ============================================ export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' # ============================================ # Welcome Message # ============================================ if [ -f /usr/bin/nvidia-smi ]; then echo "🖥️ DGX Workstation - $(nvidia-smi --query-gpu=gpu_name --format=csv,noheader | head -1)" echo "🐍 Python $(python3 --version | cut -d' ' -f2)" echo "⚡ CUDA $(nvcc --version 2>/dev/null | grep release | cut -d' ' -f5 | sed 's/,//' || echo 'N/A')" echo "" echo "Quick commands: gpu | gpuw | gpucheck | sysinfo | pyinfo" fi ``` ## Real-World Impact After implementing this configuration: **Keystroke Savings:** - GPU checks: 450 keystrokes/day - Git operations: 200 keystrokes/day - Python venv: 150 keystrokes/day - Directory navigation: 100 keystrokes/day **Total: ~900 keystrokes saved daily** = **23,400 keystrokes/month** **Time Savings:** - ~5-10 minutes per day from faster command entry - ~10 minutes per day from quick status checks - ~5 minutes per day from not googling extraction commands **Total: ~20 minutes/day = 7 hours/month** ## What I Learned ### 1. Small Optimizations Compound Each alias saves 5-10 keystrokes. Over hundreds of daily uses, this adds up to significant time savings. ### 2. Muscle Memory Matters Keep aliases short and memorable: - `gpu` (not `checkgpu` or `gpustatus`) - `gs` (not `gits` or `gstat`) - `..` (not `up` or `back`) Your fingers will thank you. ### 3. Safety First The `-i` flag on `rm`, `cp`, and `mv` has saved me countless times. Confirmation prompts are worth the extra keystroke. ### 4. Documentation Through Code Good alias names are self-documenting: - `gpumem` → obviously checks GPU memory - `topcpu` → obviously shows top CPU processes - `extract` → obviously extracts archives ## Next Steps Try adding these to your `.bashrc` and see which ones you use most. After a week, you'll wonder how you ever lived without them. **Pro tip**: Start with just the GPU monitoring aliases if you're on a GPU system, or just the Python helpers if you do a lot of ML work. Add more as you need them. --- ## Related Articles [[Practical Applications/dgx-lab-intelligent-gateway-heuristics-vs-ml-day-1|DGX Lab Day 1: Intelligent Gateway with Heuristics]] [[Practical Applications/building-production-ml-workspace-part-1-structure|Building Production ML Workspaces: Part 1]] [[Practical Applications/⌂ Practical Applications|Practical Applications Hub]] <div class="callout" data-callout="tip"> <div class="callout-title">Try It Yourself</div> <div class="callout-content"> **5-Minute Setup:** 1. `cp ~/.bashrc ~/.bashrc.backup` - Backup current config 2. Add the aliases from this article to your `.bashrc` 3. `source ~/.bashrc` - Reload shell 4. Try `gpu`, `gs`, `mkcd test`, `sysinfo` **Bonus**: Track which aliases you use most with `history | cut -d' ' -f2 | sort | uniq -c | sort -rn | head -20` </div> </div> --- *This is Day 2 of the DGX Lab Chronicles, documenting real AI infrastructure setup on NVIDIA DGX hardware.*