* docs: deep audit — fix stale config keys, missing commands, and registry drift Cross-checked ~80 high-impact docs pages (getting-started, reference, top-level user-guide, user-guide/features) against the live registries: hermes_cli/commands.py COMMAND_REGISTRY (slash commands) hermes_cli/auth.py PROVIDER_REGISTRY (providers) hermes_cli/config.py DEFAULT_CONFIG (config keys) toolsets.py TOOLSETS (toolsets) tools/registry.py get_all_tool_names() (tools) python -m hermes_cli.main <subcmd> --help (CLI args) reference/ - cli-commands.md: drop duplicate hermes fallback row + duplicate section, add stepfun/lmstudio to --provider enum, expand auth/mcp/curator subcommand lists to match --help output (status/logout/spotify, login, archive/prune/ list-archived). - slash-commands.md: add missing /sessions and /reload-skills entries + correct the cross-platform Notes line. - tools-reference.md: drop bogus '68 tools' headline, drop fictional 'browser-cdp toolset' (these tools live in 'browser' and are runtime-gated), add missing 'kanban' and 'video' toolset sections, fix MCP example to use the real mcp_<server>_<tool> prefix. - toolsets-reference.md: list browser_cdp/browser_dialog inside the 'browser' row, add missing 'kanban' and 'video' toolset rows, drop the stale '38 tools' count for hermes-cli. - profile-commands.md: add missing install/update/info subcommands, document fish completion. - environment-variables.md: dedupe GMI_API_KEY/GMI_BASE_URL rows (kept the one with the correct gmi-serving.com default). - faq.md: Anthropic/Google/OpenAI examples — direct providers exist (not just via OpenRouter), refresh the OpenAI model list. getting-started/ - installation.md: PortableGit (not MinGit) is what the Windows installer fetches; document the 32-bit MinGit fallback. - installation.md / termux.md: installer prefers .[termux-all] then falls back to .[termux]. - nix-setup.md: Python 3.12 (not 3.11), Node.js 22 (not 20); fix invalid 'nix flake update --flake' invocation. - updating.md: 'hermes backup restore --state pre-update' doesn't exist — point at the snapshot/quick-snapshot flow; correct config key 'updates.pre_update_backup' (was 'update.backup'). user-guide/ - configuration.md: api_max_retries default 3 (not 2); display.runtime_footer is the real key (not display.runtime_metadata_footer); checkpoints defaults enabled=false / max_snapshots=20 (not true / 50). - configuring-models.md: 'hermes model list' / 'hermes model set ...' don't exist — hermes model is interactive only. - tui.md: busy_indicator -> tui_status_indicator with values kaomoji|emoji|unicode|ascii (not kawaii|minimal|dots|wings|none). - security.md: SSH backend keys (TERMINAL_SSH_HOST/USER/KEY) live in .env, not config.yaml. - windows-wsl-quickstart.md: there is no 'hermes api' subcommand — the OpenAI-compatible API server runs inside hermes gateway. user-guide/features/ - computer-use.md: approvals.mode (not security.approval_level); fix broken ./browser-use.md link to ./browser.md. - fallback-providers.md: top-level fallback_providers (not model.fallback_providers); the picker is subcommand-based, not modal. - api-server.md: API_SERVER_* are env vars — write to per-profile .env, not 'hermes config set' which targets YAML. - web-search.md: drop web_crawl as a registered tool (it isn't); deep-crawl modes are exposed through web_extract. - kanban.md: failure_limit default is 2, not '~5'. - plugins.md: drop hard-coded '33 providers' count. - honcho.md: fix unclosed quote in echo HONCHO_API_KEY snippet; document that 'hermes honcho' subcommand is gated on memory.provider=honcho; reconcile subcommand list with actual --help output. - memory-providers.md: legacy 'hermes honcho setup' redirect documented. Verified via 'npm run build' — site builds cleanly; broken-link count went from 149 to 146 (no regressions, fixed a few in passing). * docs: round 2 audit fixes + regenerate skill catalogs Follow-up to the previous commit on this branch: Round 2 manual fixes: - quickstart.md: KIMI_CODING_API_KEY mentioned alongside KIMI_API_KEY; voice-mode and ACP install commands rewritten — bare 'pip install ...' doesn't work for curl-installed setups (no pip on PATH, not in repo dir); replaced with 'cd ~/.hermes/hermes-agent && uv pip install -e ".[voice]"'. ACP already ships in [all] so the curl install includes it. - cli.md / configuration.md: 'auxiliary.compression.model' shown as 'google/gemini-3-flash-preview' (the doc's own claimed default); actual default is empty (= use main model). Reworded as 'leave empty (default) or pin a cheap model'. - built-in-plugins.md: added the bundled 'kanban/dashboard' plugin row that was missing from the table. Regenerated skill catalogs: - ran website/scripts/generate-skill-docs.py to refresh all 163 per-skill pages and both reference catalogs (skills-catalog.md, optional-skills-catalog.md). This adds the entries that were genuinely missing — productivity/teams-meeting-pipeline (bundled), optional/finance/* (entire category — 7 skills: 3-statement-model, comps-analysis, dcf-model, excel-author, lbo-model, merger-model, pptx-author), creative/hyperframes, creative/kanban-video-orchestrator, devops/watchers, productivity/shop-app, research/searxng-search, apple/macos-computer-use — and rewrites every other per-skill page from the current SKILL.md. Most diffs are tiny (one line of refreshed metadata). Validation: - 'npm run build' succeeded. - Broken-link count moved 146 -> 155 — the +9 are zh-Hans translation shells that lag every newly-added skill page (pre-existing pattern). No regressions on any en/ page.
351 lines
9.1 KiB
Markdown
351 lines
9.1 KiB
Markdown
---
|
|
title: "Huggingface Accelerate — Simplest distributed training API"
|
|
sidebar_label: "Huggingface Accelerate"
|
|
description: "Simplest distributed training API"
|
|
---
|
|
|
|
{/* This page is auto-generated from the skill's SKILL.md by website/scripts/generate-skill-docs.py. Edit the source SKILL.md, not this page. */}
|
|
|
|
# Huggingface Accelerate
|
|
|
|
Simplest distributed training API. 4 lines to add distributed support to any PyTorch script. Unified API for DeepSpeed/FSDP/Megatron/DDP. Automatic device placement, mixed precision (FP16/BF16/FP8). Interactive config, single launch command. HuggingFace ecosystem standard.
|
|
|
|
## Skill metadata
|
|
|
|
| | |
|
|
|---|---|
|
|
| Source | Optional — install with `hermes skills install official/mlops/accelerate` |
|
|
| Path | `optional-skills/mlops/accelerate` |
|
|
| Version | `1.0.0` |
|
|
| Author | Orchestra Research |
|
|
| License | MIT |
|
|
| Dependencies | `accelerate`, `torch`, `transformers` |
|
|
| Platforms | linux, macos, windows |
|
|
| Tags | `Distributed Training`, `HuggingFace`, `Accelerate`, `DeepSpeed`, `FSDP`, `Mixed Precision`, `PyTorch`, `DDP`, `Unified API`, `Simple` |
|
|
|
|
## Reference: full SKILL.md
|
|
|
|
:::info
|
|
The following is the complete skill definition that Hermes loads when this skill is triggered. This is what the agent sees as instructions when the skill is active.
|
|
:::
|
|
|
|
# HuggingFace Accelerate - Unified Distributed Training
|
|
|
|
## Quick start
|
|
|
|
Accelerate simplifies distributed training to 4 lines of code.
|
|
|
|
**Installation**:
|
|
```bash
|
|
pip install accelerate
|
|
```
|
|
|
|
**Convert PyTorch script** (4 lines):
|
|
```python
|
|
import torch
|
|
+ from accelerate import Accelerator
|
|
|
|
+ accelerator = Accelerator()
|
|
|
|
model = torch.nn.Transformer()
|
|
optimizer = torch.optim.Adam(model.parameters())
|
|
dataloader = torch.utils.data.DataLoader(dataset)
|
|
|
|
+ model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
|
|
|
|
for batch in dataloader:
|
|
optimizer.zero_grad()
|
|
loss = model(batch)
|
|
- loss.backward()
|
|
+ accelerator.backward(loss)
|
|
optimizer.step()
|
|
```
|
|
|
|
**Run** (single command):
|
|
```bash
|
|
accelerate launch train.py
|
|
```
|
|
|
|
## Common workflows
|
|
|
|
### Workflow 1: From single GPU to multi-GPU
|
|
|
|
**Original script**:
|
|
```python
|
|
# train.py
|
|
import torch
|
|
|
|
model = torch.nn.Linear(10, 2).to('cuda')
|
|
optimizer = torch.optim.Adam(model.parameters())
|
|
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)
|
|
|
|
for epoch in range(10):
|
|
for batch in dataloader:
|
|
batch = batch.to('cuda')
|
|
optimizer.zero_grad()
|
|
loss = model(batch).mean()
|
|
loss.backward()
|
|
optimizer.step()
|
|
```
|
|
|
|
**With Accelerate** (4 lines added):
|
|
```python
|
|
# train.py
|
|
import torch
|
|
from accelerate import Accelerator # +1
|
|
|
|
accelerator = Accelerator() # +2
|
|
|
|
model = torch.nn.Linear(10, 2)
|
|
optimizer = torch.optim.Adam(model.parameters())
|
|
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32)
|
|
|
|
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader) # +3
|
|
|
|
for epoch in range(10):
|
|
for batch in dataloader:
|
|
# No .to('cuda') needed - automatic!
|
|
optimizer.zero_grad()
|
|
loss = model(batch).mean()
|
|
accelerator.backward(loss) # +4
|
|
optimizer.step()
|
|
```
|
|
|
|
**Configure** (interactive):
|
|
```bash
|
|
accelerate config
|
|
```
|
|
|
|
**Questions**:
|
|
- Which machine? (single/multi GPU/TPU/CPU)
|
|
- How many machines? (1)
|
|
- Mixed precision? (no/fp16/bf16/fp8)
|
|
- DeepSpeed? (no/yes)
|
|
|
|
**Launch** (works on any setup):
|
|
```bash
|
|
# Single GPU
|
|
accelerate launch train.py
|
|
|
|
# Multi-GPU (8 GPUs)
|
|
accelerate launch --multi_gpu --num_processes 8 train.py
|
|
|
|
# Multi-node
|
|
accelerate launch --multi_gpu --num_processes 16 \
|
|
--num_machines 2 --machine_rank 0 \
|
|
--main_process_ip $MASTER_ADDR \
|
|
train.py
|
|
```
|
|
|
|
### Workflow 2: Mixed precision training
|
|
|
|
**Enable FP16/BF16**:
|
|
```python
|
|
from accelerate import Accelerator
|
|
|
|
# FP16 (with gradient scaling)
|
|
accelerator = Accelerator(mixed_precision='fp16')
|
|
|
|
# BF16 (no scaling, more stable)
|
|
accelerator = Accelerator(mixed_precision='bf16')
|
|
|
|
# FP8 (H100+)
|
|
accelerator = Accelerator(mixed_precision='fp8')
|
|
|
|
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
|
|
|
|
# Everything else is automatic!
|
|
for batch in dataloader:
|
|
with accelerator.autocast(): # Optional, done automatically
|
|
loss = model(batch)
|
|
accelerator.backward(loss)
|
|
```
|
|
|
|
### Workflow 3: DeepSpeed ZeRO integration
|
|
|
|
**Enable DeepSpeed ZeRO-2**:
|
|
```python
|
|
from accelerate import Accelerator
|
|
|
|
accelerator = Accelerator(
|
|
mixed_precision='bf16',
|
|
deepspeed_plugin={
|
|
"zero_stage": 2, # ZeRO-2
|
|
"offload_optimizer": False,
|
|
"gradient_accumulation_steps": 4
|
|
}
|
|
)
|
|
|
|
# Same code as before!
|
|
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
|
|
```
|
|
|
|
**Or via config**:
|
|
```bash
|
|
accelerate config
|
|
# Select: DeepSpeed → ZeRO-2
|
|
```
|
|
|
|
**deepspeed_config.json**:
|
|
```json
|
|
{
|
|
"fp16": {"enabled": false},
|
|
"bf16": {"enabled": true},
|
|
"zero_optimization": {
|
|
"stage": 2,
|
|
"offload_optimizer": {"device": "cpu"},
|
|
"allgather_bucket_size": 5e8,
|
|
"reduce_bucket_size": 5e8
|
|
}
|
|
}
|
|
```
|
|
|
|
**Launch**:
|
|
```bash
|
|
accelerate launch --config_file deepspeed_config.json train.py
|
|
```
|
|
|
|
### Workflow 4: FSDP (Fully Sharded Data Parallel)
|
|
|
|
**Enable FSDP**:
|
|
```python
|
|
from accelerate import Accelerator, FullyShardedDataParallelPlugin
|
|
|
|
fsdp_plugin = FullyShardedDataParallelPlugin(
|
|
sharding_strategy="FULL_SHARD", # ZeRO-3 equivalent
|
|
auto_wrap_policy="TRANSFORMER_AUTO_WRAP",
|
|
cpu_offload=False
|
|
)
|
|
|
|
accelerator = Accelerator(
|
|
mixed_precision='bf16',
|
|
fsdp_plugin=fsdp_plugin
|
|
)
|
|
|
|
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
|
|
```
|
|
|
|
**Or via config**:
|
|
```bash
|
|
accelerate config
|
|
# Select: FSDP → Full Shard → No CPU Offload
|
|
```
|
|
|
|
### Workflow 5: Gradient accumulation
|
|
|
|
**Accumulate gradients**:
|
|
```python
|
|
from accelerate import Accelerator
|
|
|
|
accelerator = Accelerator(gradient_accumulation_steps=4)
|
|
|
|
model, optimizer, dataloader = accelerator.prepare(model, optimizer, dataloader)
|
|
|
|
for batch in dataloader:
|
|
with accelerator.accumulate(model): # Handles accumulation
|
|
optimizer.zero_grad()
|
|
loss = model(batch)
|
|
accelerator.backward(loss)
|
|
optimizer.step()
|
|
```
|
|
|
|
**Effective batch size**: `batch_size * num_gpus * gradient_accumulation_steps`
|
|
|
|
## When to use vs alternatives
|
|
|
|
**Use Accelerate when**:
|
|
- Want simplest distributed training
|
|
- Need single script for any hardware
|
|
- Use HuggingFace ecosystem
|
|
- Want flexibility (DDP/DeepSpeed/FSDP/Megatron)
|
|
- Need quick prototyping
|
|
|
|
**Key advantages**:
|
|
- **4 lines**: Minimal code changes
|
|
- **Unified API**: Same code for DDP, DeepSpeed, FSDP, Megatron
|
|
- **Automatic**: Device placement, mixed precision, sharding
|
|
- **Interactive config**: No manual launcher setup
|
|
- **Single launch**: Works everywhere
|
|
|
|
**Use alternatives instead**:
|
|
- **PyTorch Lightning**: Need callbacks, high-level abstractions
|
|
- **Ray Train**: Multi-node orchestration, hyperparameter tuning
|
|
- **DeepSpeed**: Direct API control, advanced features
|
|
- **Raw DDP**: Maximum control, minimal abstraction
|
|
|
|
## Common issues
|
|
|
|
**Issue: Wrong device placement**
|
|
|
|
Don't manually move to device:
|
|
```python
|
|
# WRONG
|
|
batch = batch.to('cuda')
|
|
|
|
# CORRECT
|
|
# Accelerate handles it automatically after prepare()
|
|
```
|
|
|
|
**Issue: Gradient accumulation not working**
|
|
|
|
Use context manager:
|
|
```python
|
|
# CORRECT
|
|
with accelerator.accumulate(model):
|
|
optimizer.zero_grad()
|
|
accelerator.backward(loss)
|
|
optimizer.step()
|
|
```
|
|
|
|
**Issue: Checkpointing in distributed**
|
|
|
|
Use accelerator methods:
|
|
```python
|
|
# Save only on main process
|
|
if accelerator.is_main_process:
|
|
accelerator.save_state('checkpoint/')
|
|
|
|
# Load on all processes
|
|
accelerator.load_state('checkpoint/')
|
|
```
|
|
|
|
**Issue: Different results with FSDP**
|
|
|
|
Ensure same random seed:
|
|
```python
|
|
from accelerate.utils import set_seed
|
|
set_seed(42)
|
|
```
|
|
|
|
## Advanced topics
|
|
|
|
**Megatron integration**: See [references/megatron-integration.md](https://github.com/NousResearch/hermes-agent/blob/main/optional-skills/mlops/accelerate/references/megatron-integration.md) for tensor parallelism, pipeline parallelism, and sequence parallelism setup.
|
|
|
|
**Custom plugins**: See [references/custom-plugins.md](https://github.com/NousResearch/hermes-agent/blob/main/optional-skills/mlops/accelerate/references/custom-plugins.md) for creating custom distributed plugins and advanced configuration.
|
|
|
|
**Performance tuning**: See [references/performance.md](https://github.com/NousResearch/hermes-agent/blob/main/optional-skills/mlops/accelerate/references/performance.md) for profiling, memory optimization, and best practices.
|
|
|
|
## Hardware requirements
|
|
|
|
- **CPU**: Works (slow)
|
|
- **Single GPU**: Works
|
|
- **Multi-GPU**: DDP (default), DeepSpeed, or FSDP
|
|
- **Multi-node**: DDP, DeepSpeed, FSDP, Megatron
|
|
- **TPU**: Supported
|
|
- **Apple MPS**: Supported
|
|
|
|
**Launcher requirements**:
|
|
- **DDP**: `torch.distributed.run` (built-in)
|
|
- **DeepSpeed**: `deepspeed` (pip install deepspeed)
|
|
- **FSDP**: PyTorch 1.12+ (built-in)
|
|
- **Megatron**: Custom setup
|
|
|
|
## Resources
|
|
|
|
- Docs: https://huggingface.co/docs/accelerate
|
|
- GitHub: https://github.com/huggingface/accelerate
|
|
- Version: 1.11.0+
|
|
- Tutorial: "Accelerate your scripts"
|
|
- Examples: https://github.com/huggingface/accelerate/tree/main/examples
|
|
- Used by: HuggingFace Transformers, TRL, PEFT, all HF libraries
|