Packages
snakepit
0.8.1
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/error-handling.md
# Error Handling
Snakepit provides structured exceptions for ML workloads with
automatic parsing of Python errors.
## Error Types
### Shape Mismatch
```elixir
# Create shape error
error = Snakepit.Error.Shape.shape_mismatch(
[3, 224, 224], # expected
[3, 256, 256], # got
"conv2d" # operation
)
# Pattern match
case result do
{:error, %Snakepit.Error.ShapeMismatch{dimension: dim}} ->
Logger.error("Mismatch at dimension #{dim}")
end
```
### Device Mismatch
```elixir
# Create device error
error = Snakepit.Error.Device.device_mismatch(
:cpu, # expected
{:cuda, 0}, # got
"matmul" # operation
)
# Pattern match
case result do
{:error, %Snakepit.Error.DeviceMismatch{expected: exp, got: got}} ->
Logger.error("Device mismatch: expected #{exp}, got #{got}")
end
```
### Out of Memory
```elixir
# OOM errors include recovery suggestions
error = Snakepit.Error.Device.out_of_memory(
{:cuda, 0},
1024 * 1024 * 1024, # requested: 1GB
512 * 1024 * 1024 # available: 512MB
)
error.suggestions
# => ["Reduce batch size", "Use gradient checkpointing", ...]
```
## Parsing Python Errors
The parser automatically detects error patterns:
```elixir
# Parse from raw error data
{:ok, error} = Snakepit.Error.Parser.parse(%{
"type" => "RuntimeError",
"message" => "shape mismatch: expected [3, 224, 224], got [3, 256, 256]"
})
# Returns ShapeMismatch with extracted shapes
%Snakepit.Error.ShapeMismatch{
expected: [3, 224, 224],
got: [3, 256, 256]
} = error
```
### Supported Patterns
The parser detects these patterns:
- **Shape mismatch**: "expected [1, 2], got [3, 4]"
- **CUDA OOM**: "CUDA out of memory. Tried to allocate 2.00 GiB"
- **Device mismatch**: "Expected all tensors on same device"
### From gRPC Errors
```elixir
{:ok, error} = Snakepit.Error.Parser.from_grpc_error(%{
status: :internal,
message: "ValueError: Invalid input"
})
```
## Python Exception Types
Standard Python exceptions are mapped to Elixir structs:
| Python | Elixir |
|--------|--------|
| `ValueError` | `Snakepit.Error.ValueError` |
| `TypeError` | `Snakepit.Error.TypeError` |
| `KeyError` | `Snakepit.Error.KeyError` |
| `RuntimeError` | `Snakepit.Error.RuntimeError` |
| `ImportError` | `Snakepit.Error.ImportError` |
```elixir
case result do
{:error, %Snakepit.Error.ValueError{message: msg}} ->
Logger.error("Invalid value: #{msg}")
{:error, %Snakepit.Error.TypeError{message: msg}} ->
Logger.error("Type error: #{msg}")
end
```
## Telemetry Events
Error creation emits telemetry:
```elixir
:telemetry.attach(
"error-handler",
[:snakepit, :error, :shape_mismatch],
fn _event, _measurements, metadata, _config ->
Logger.warning(
"Shape mismatch in #{metadata.operation}: " <>
"expected #{inspect(metadata.expected)}, got #{inspect(metadata.got)}"
)
end,
nil
)
```
Available events:
- `[:snakepit, :error, :shape_mismatch]`
- `[:snakepit, :error, :device]`
- `[:snakepit, :error, :oom]`
- `[:snakepit, :error, :dtype_mismatch]`