Truffle Beginner Stable โ
What it is. Truffle finds and compares EC2 instance types. It's read-only โ it never launches anything.
When to use it. Any time before a launch, to answer "what should I run and what will it cost?" โ discover a family, filter by exact specs, compare Spot prices, and confirm your quota so a launch doesn't fail after you've waited.
First commands:
truffle find "amd genoa 64gb" # discover a family in plain language
truffle search "m8a.*" --min-vcpu 16 # filter by exact specs
truffle spot m8a.4xlarge # compare Spot prices across regions
truffle quotas --regions us-east-1 --family M # confirm you can launch it
truffle az p5.48xlarge # check per-AZ availabilityWhich command? find vs search vs spot vs quotas
findโ you know what you need in human terms ("amd genoa 64gb"). Put specs in the query string; filter flags like--min-vcpudon't apply here.searchโ you know the exact technical filters:search "m8a.*" --min-vcpu 16 --min-memory 64.spotโ you've picked a type and want to compare purchase options / regions.quotasโ run immediately before launch, so you don't wait for capacity you're not allowed to use.
find and search are not synonyms โ see Common mistakes.
Install โ
brew install spore-host/tap/truffleAWS profile & account โ
Like the rest of the suite, truffle honors the shared spore.host config: a global --profile (and --account guard), the SPORE_PROFILE/AWS_PROFILE env vars, and the [spore] table of ~/.config/spore/config.toml, resolved flag > env > file > default. An unset profile uses the ambient AWS credential chain. Region is per-request via --regions/--region. See AWS Authentication for the full model, and the command reference for every global flag.
Sub-commands โ
Truffle has distinct sub-commands for different tasks. They are not interchangeable โ flags available on one command may not exist on another.
truffle find โ natural language search โ
Discover instance families using plain language. Understands processor names, GPU models, network capabilities, and size descriptions.
truffle find "epyc genoa" # AMD EPYC Genoa (4th gen)
truffle find "h100 8gpu efa" # NVIDIA H100 with EFA networking
truffle find "graviton large" # ARM64 Graviton, large size class
truffle find "sapphire rapids 32 cores"
truffle find "milan 64gb"Include specs in the query string โ truffle find does not accept --min-vcpu or --min-memory:
truffle find "epyc genoa 16 cores" # โ
spec in query
truffle find "epyc genoa" --min-vcpu 16 # โ --min-vcpu not available on findFlags:
--skip-azsโ faster, skip AZ lookup--regionsโ limit to specific regions--app <name>โ find instances suitable for a catalog application
truffle search โ pattern search with filters โ
Search by instance type name pattern (wildcards and regex). Supports numeric filters.
truffle search "m8a.*" # all m8a sizes
truffle search "m8a.*" --min-vcpu 16 # โ
--min-vcpu works here
truffle search "m8a.*" --min-vcpu 16 --min-memory 64
truffle search "c7a.*" --architecture x86_64
truffle search "g5.*" --skip-azsThe pattern is anchored โ it must match the full instance type name. Wildcards (*, ?) are supported.
Flags: --min-vcpu, --min-memory, --architecture, --family, --show-price, --pick-first, --skip-azs
truffle spot โ current Spot prices โ
Get live Spot prices for a specific instance type across regions and AZs.
truffle spot m8a.4xlarge
truffle spot "m7a.*" --sort-by-price --active-only
truffle spot g5.xlarge --regions us-east-1,us-west-2 --show-savingstruffle quotas โ service quota check โ
Check vCPU quotas before launching to avoid capacity errors.
truffle quotas --regions us-east-1
truffle quotas --family Standard --regions us-east-1 # M, C, R, T instances
truffle quotas --family P --regions us-east-1 # P-family GPU instances
truffle quotas --service sagemaker --family g5 # SageMaker ml.g5.* quotas
truffle quotas --family Standard --request # generate increase commandsInstance family codes:
| Code | Instances |
|---|---|
Standard | A, C, D, H, I, M, R, T, Z (general purpose) |
G | g4dn, g5, g6 (graphics/GPU) |
P | p3, p4, p5 (GPU training) |
Inf | inf1, inf2 (Inferentia) |
Trn | trn1 (Trainium) |
truffle capacity โ capacity reservations you own โ
Check existing On-Demand Capacity Reservations and Capacity Blocks already in your account.
truffle capacity
truffle capacity --gpu-only
truffle capacity --instance-types p5.48xlarge,p4d.24xlarge
truffle capacity --blocks # Capacity Blocks you already owntruffle capacity-blocks โ discover purchasable Capacity Blocks โ
Find purchasable EC2 Capacity Block for ML offerings โ "what can I reserve?" (read-only; queries DescribeCapacityBlockOfferings). This is distinct from truffle capacity --blocks, which lists blocks you already own.
truffle capacity-blocks --instance-type p5.48xlarge --count 1 --duration-hours 24
truffle capacity-blocks --instance-type p5.48xlarge --count 2 --duration-hours 48 \
--region us-east-1 --start-after 2026-07-01T00:00:00ZEach offering shows its id (what spawn capacity-block purchase reserves), instance type/count, AZ, start/end, duration, and up-front price. --instance-type and --duration-hours are required. This is step 1 of the Capacity Block flow โ see Capacity Blocks for ML below.
Typical workflow: find โ search โ spot โ check quota โ launch โ
# 1. Discover the instance family
truffle find "epyc genoa"
# 2. Browse sizes within that family (with spec filters)
truffle search "m8a.*" --min-vcpu 16 --min-memory 64
# 3. Check current Spot prices
truffle spot m8a.4xlarge --sort-by-price --active-only
# 4. Verify you have quota (m8a is Standard family)
truffle quotas --family Standard --regions us-east-1
# 5. Launch
spawn launch my-job --instance-type m8a.4xlarge --spot --ttl 4hPiping to spawn โ
Use --pick-first to get a single instance type name for piping:
spawn launch my-job \
--instance-type $(truffle search "m8a.*" --min-vcpu 16 --pick-first) \
--spot --ttl 4hCapacity Blocks for ML โ
A Capacity Block reserves scarce GPU capacity (e.g. p5.48xlarge) for a future window. The flow spans all three tools โ truffle discovers, spawn buys, lagotto launches:
# 1. truffle โ find a purchasable offering (read-only)
truffle capacity-blocks --instance-type p5.48xlarge --count 1 --duration-hours 24
# 2. spawn โ purchase it (billed up front, NON-REFUNDABLE; three typed
# confirmations, interactive only; --dry-run to preview)
spawn capacity-block purchase <offering-id> --instance-type p5.48xlarge \
--count 1 --duration-hours 24 --region us-east-1
# 3. lagotto โ launch into it at the reserved start time
lagotto launch --at <block-start> --az <block-az> --spawn-config block.yamlTruffle stays read-only throughout โ the purchase (a real-money, non-refundable write) lives in spawn behind its confirmation gates.
Common mistakes โ
- Treating
findandsearchas synonyms.findis natural-language (specs go in the query);searchis pattern + flags (--min-vcpu). Filter flags don't exist onfind. - Confusing region and AZ. A type available in a region generally can still be unplaceable in a specific AZ โ use
truffle azand pin with--azwhen it matters. - Assuming quota means capacity.
truffle quotasshows permission to launch, not availability right now. You can be within quota and still getInsufficientInstanceCapacityโ that's what Lagotto is for.
See Troubleshooting & common mistakes for the full list.
How it connects โ
Truffle is the read-only front of the workflow: it tells you what to run. Spawn takes that and launches it (pipe with --pick-first, above). When the type you want has no capacity right now, Lagotto waits for it. Truffle never launches or spends money.