Packages
snakepit
0.8.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
High-performance pooler and session manager for external language integrations. Supports Python, Node.js, Ruby, and more with gRPC streaming, session management, and production-ready process cleanup.
Current section
Files
Jump to
Current section
Files
guides/hardware-detection.md
# Hardware Detection
Snakepit provides automatic hardware detection for ML workloads,
supporting CPU, NVIDIA CUDA, Apple MPS, and AMD ROCm accelerators.
## Quick Start
```elixir
# Detect all hardware
info = Snakepit.Hardware.detect()
# => %{accelerator: :cuda, cpu: %{...}, cuda: %{...}, ...}
# Check capabilities
caps = Snakepit.Hardware.capabilities()
# => %{cuda: true, mps: false, avx2: true, ...}
# Select device
{:ok, device} = Snakepit.Hardware.select(:auto)
# => {:ok, {:cuda, 0}}
```
## Hardware Info Structure
The `detect/0` function returns a comprehensive map:
```elixir
%{
accelerator: :cuda, # Primary accelerator
platform: "linux-x86_64", # Platform string
cpu: %{
cores: 8,
threads: 16,
model: "Intel Core i7-...",
features: [:avx, :avx2, :sse4_2],
memory_total_mb: 32768
},
cuda: %{
version: "12.1",
driver_version: "535.104.05",
devices: [
%{
id: 0,
name: "NVIDIA GeForce RTX 3080",
memory_total_mb: 10240,
memory_free_mb: 9500,
compute_capability: "8.6"
}
],
cudnn_version: nil
},
mps: nil,
rocm: nil
}
```
## Device Selection
### Automatic Selection
```elixir
# Select best available device
{:ok, device} = Snakepit.Hardware.select(:auto)
```
### Specific Device
```elixir
# Request CUDA (fails if unavailable)
case Snakepit.Hardware.select(:cuda) do
{:ok, {:cuda, 0}} -> IO.puts("Using CUDA device 0")
{:error, :device_not_available} -> IO.puts("CUDA not available")
end
# Request specific CUDA device
{:ok, {:cuda, 1}} = Snakepit.Hardware.select({:cuda, 1})
```
### Fallback Strategy
```elixir
# Prefer CUDA, fall back to MPS, then CPU
{:ok, device} = Snakepit.Hardware.select_with_fallback([:cuda, :mps, :cpu])
```
## Capability Flags
```elixir
caps = Snakepit.Hardware.capabilities()
if caps.cuda do
IO.puts("CUDA version: #{caps.cuda_version}")
end
if caps.avx2 do
IO.puts("AVX2 available for optimized CPU operations")
end
```
## Lock File Identity
For reproducible environments, generate a hardware identity map:
```elixir
identity = Snakepit.Hardware.identity()
# => %{
# "platform" => "linux-x86_64",
# "accelerator" => "cuda",
# "cpu_features" => ["avx", "avx2"],
# "gpu_count" => 1
# }
# Save to lock file
File.write!("hardware.lock", Jason.encode!(identity))
```
## Caching
Hardware detection results are cached for performance:
```elixir
# Clear cache to force re-detection
Snakepit.Hardware.clear_cache()
```