bin/ 230 CLI tools (ask-*, br-*, agent-*, roadid, carpool) scripts/ 99 automation scripts fleet/ Node configs and deployment workers/ Cloudflare Worker sources (roadpay, road-search, squad webhooks) roadc/ RoadC programming language roadnet/ Mesh network (5 APs, WireGuard) operator/ Memory system scripts config/ System configs dotfiles/ Shell configs docs/ Documentation BlackRoad OS — Pave Tomorrow. RoadChain-SHA2048: d1a24f55318d338b RoadChain-Identity: alexa@sovereign RoadChain-Full: d1a24f55318d338b24b60bad7be39286379c76ae5470817482100cb0ddbbcb97e147d07ac7243da0a9f0363e4e5c833d612b9c0df3a3cd20802465420278ef74875a5b77f55af6fe42a931b8b635b3d0d0b6bde9abf33dc42eea52bc03c951406d8cbe49f1a3d29b26a94dade05e9477f34a7d4d4c6ec4005c3c2ac54e73a68440c512c8e83fd9b1fe234750b898ef8f4032c23db173961fe225e67a0432b5293a9714f76c5c57ed5fdf35b9fb40fd73c03ebf88b7253c6a0575f5afb6a6b49b3bda310602fb1ef676859962dad2aebbb2875814b30eee0a8ba195e482d4cbc91d8819e7f38f6db53e8063401649c77bb994371473cabfb917fb53e8cbe73d60
187 lines
6.2 KiB
Bash
Executable File
187 lines
6.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# BlackRoad Hailo-8 AI Accelerator Manager
|
|
# Manage 2x Hailo-8 (52 TOPS total) across Cecilia + Octavia
|
|
# Usage: ./hailo.sh [scan|status|benchmark|models|info]
|
|
set -eo pipefail
|
|
|
|
source "$HOME/.blackroad/config/nodes.sh" 2>/dev/null || true
|
|
|
|
# Hailo nodes
|
|
HAILO_NODES=(cecilia octavia)
|
|
|
|
cmd_scan() {
|
|
printf '%bScanning for Hailo-8 devices across fleet...%b\n\n' "$PINK" "$RESET"
|
|
for node in "${HAILO_NODES[@]}"; do
|
|
local ip="${NODE_IP[$node]:-}"
|
|
local user="${NODE_USER[$node]:-}"
|
|
[[ -z "$ip" ]] && continue
|
|
|
|
printf '%b=== %s (%s) ===%b\n' "$BLUE" "$node" "$ip" "$RESET"
|
|
if ! br_ping "$node" 2>/dev/null; then
|
|
printf ' %bOFFLINE%b\n\n' "$RED" "$RESET"
|
|
continue
|
|
fi
|
|
|
|
local hailo_info
|
|
hailo_info=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "${user}@${ip}" "
|
|
if [ -e /dev/hailo0 ]; then
|
|
echo 'DEVICE: /dev/hailo0 FOUND'
|
|
hailortcli fw-control identify 2>/dev/null || echo 'hailortcli not available'
|
|
else
|
|
echo 'NO HAILO DEVICE'
|
|
fi
|
|
" 2>/dev/null) || hailo_info="SSH failed"
|
|
|
|
if echo "$hailo_info" | grep -q "FOUND"; then
|
|
printf ' %bHailo-8 detected%b (26 TOPS)\n' "$GREEN" "$RESET"
|
|
echo "$hailo_info" | grep -v "DEVICE:" | sed 's/^/ /'
|
|
else
|
|
printf ' %bNo Hailo device%b\n' "$AMBER" "$RESET"
|
|
fi
|
|
echo
|
|
done
|
|
}
|
|
|
|
cmd_status() {
|
|
printf '%b╔══════════════════════════════════════════╗%b\n' "$PINK" "$RESET"
|
|
printf '%b║ Hailo-8 AI Accelerator Status ║%b\n' "$PINK" "$RESET"
|
|
printf '%b╚══════════════════════════════════════════╝%b\n\n' "$PINK" "$RESET"
|
|
|
|
printf ' %bTotal capacity: 52 TOPS (2x Hailo-8 @ 26 TOPS each)%b\n\n' "$GREEN" "$RESET"
|
|
|
|
printf ' %-12s %-8s %-24s %-10s\n' "NODE" "STATUS" "SERIAL" "TOPS"
|
|
printf ' %-12s %-8s %-24s %-10s\n' "────" "──────" "──────" "────"
|
|
|
|
for node in "${HAILO_NODES[@]}"; do
|
|
local ip="${NODE_IP[$node]:-}"
|
|
local user="${NODE_USER[$node]:-}"
|
|
[[ -z "$ip" ]] && continue
|
|
|
|
printf ' %-12s ' "$node"
|
|
|
|
if ! br_ping "$node" 2>/dev/null; then
|
|
printf '%b%-8s%b %-24s %-10s\n' "$RED" "OFFLINE" "$RESET" "—" "—"
|
|
continue
|
|
fi
|
|
|
|
local serial
|
|
serial=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "${user}@${ip}" \
|
|
"hailortcli fw-control identify 2>/dev/null | grep -i serial | awk '{print \$NF}'" 2>/dev/null)
|
|
|
|
if [[ -n "$serial" ]]; then
|
|
printf '%b%-8s%b %-24s %-10s\n' "$GREEN" "ACTIVE" "$RESET" "$serial" "26"
|
|
else
|
|
local has_dev
|
|
has_dev=$(ssh -o ConnectTimeout=5 -o BatchMode=yes "${user}@${ip}" \
|
|
"test -e /dev/hailo0 && echo yes || echo no" 2>/dev/null)
|
|
if [[ "$has_dev" == "yes" ]]; then
|
|
printf '%b%-8s%b %-24s %-10s\n' "$AMBER" "DEVICE" "$RESET" "(no hailortcli)" "26"
|
|
else
|
|
printf '%b%-8s%b %-24s %-10s\n' "$RED" "NONE" "$RESET" "—" "—"
|
|
fi
|
|
fi
|
|
done
|
|
echo
|
|
}
|
|
|
|
cmd_benchmark() {
|
|
local node="${1:-cecilia}"
|
|
local ip="${NODE_IP[$node]:-}"
|
|
local user="${NODE_USER[$node]:-}"
|
|
|
|
printf '%bRunning inference benchmark on %s...%b\n\n' "$AMBER" "$node" "$RESET"
|
|
|
|
if ! br_ping "$node" 2>/dev/null; then
|
|
printf '%b%s is offline%b\n' "$RED" "$node" "$RESET"
|
|
return 1
|
|
fi
|
|
|
|
ssh -o ConnectTimeout=10 -o BatchMode=yes "${user}@${ip}" "
|
|
echo '=== Hailo-8 Benchmark ==='
|
|
echo ''
|
|
|
|
# Find a HEF model to benchmark
|
|
HEF=\$(find /usr/share/hailo-models/ /opt/hailo/ ~/hailo-models/ -name '*.hef' 2>/dev/null | head -1)
|
|
|
|
if [ -n \"\$HEF\" ]; then
|
|
echo \"Model: \$HEF\"
|
|
echo ''
|
|
hailortcli benchmark --hef \"\$HEF\" 2>/dev/null || echo 'Benchmark failed'
|
|
else
|
|
echo 'No HEF models found for benchmarking'
|
|
echo 'Check: /usr/share/hailo-models/ or ~/hailo-models/'
|
|
fi
|
|
" 2>/dev/null || printf '%bSSH failed to %s%b\n' "$RED" "$node" "$RESET"
|
|
}
|
|
|
|
cmd_models() {
|
|
printf '%bHailo HEF Models:%b\n\n' "$BLUE" "$RESET"
|
|
for node in "${HAILO_NODES[@]}"; do
|
|
local ip="${NODE_IP[$node]:-}"
|
|
local user="${NODE_USER[$node]:-}"
|
|
[[ -z "$ip" ]] && continue
|
|
|
|
printf '%b=== %s ===%b\n' "$AMBER" "$node" "$RESET"
|
|
if br_ping "$node" 2>/dev/null; then
|
|
ssh -o ConnectTimeout=5 -o BatchMode=yes "${user}@${ip}" \
|
|
"find /usr/share/hailo-models/ /opt/hailo/ ~/hailo-models/ -name '*.hef' 2>/dev/null | while read f; do echo \" \$(basename \"\$f\") (\$(du -h \"\$f\" | cut -f1))\"; done" 2>/dev/null || \
|
|
echo " (no models found)"
|
|
else
|
|
printf ' %boffline%b\n' "$RED" "$RESET"
|
|
fi
|
|
echo
|
|
done
|
|
}
|
|
|
|
cmd_info() {
|
|
local node="${1:-cecilia}"
|
|
local ip="${NODE_IP[$node]:-}"
|
|
local user="${NODE_USER[$node]:-}"
|
|
|
|
printf '%bHailo-8 detailed info on %s:%b\n\n' "$BLUE" "$node" "$RESET"
|
|
|
|
ssh -o ConnectTimeout=5 -o BatchMode=yes "${user}@${ip}" "
|
|
echo '--- Device ---'
|
|
ls -la /dev/hailo* 2>/dev/null || echo 'No /dev/hailo*'
|
|
echo ''
|
|
echo '--- Firmware ---'
|
|
hailortcli fw-control identify 2>/dev/null || echo 'hailortcli unavailable'
|
|
echo ''
|
|
echo '--- Packages ---'
|
|
dpkg -l 2>/dev/null | grep -i hailo || echo 'No hailo packages'
|
|
echo ''
|
|
echo '--- Power ---'
|
|
vcgencmd get_throttled 2>/dev/null
|
|
vcgencmd measure_volts 2>/dev/null
|
|
vcgencmd measure_temp 2>/dev/null
|
|
" 2>/dev/null || printf '%bFailed to reach %s%b\n' "$RED" "$node" "$RESET"
|
|
}
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
${PINK}hailo${RESET} - BlackRoad Hailo-8 AI Accelerator Manager
|
|
|
|
${BLUE}COMMANDS:${RESET}
|
|
scan Scan all nodes for Hailo devices
|
|
status Show accelerator status table
|
|
benchmark [node] Run inference benchmark (default: cecilia)
|
|
models List available HEF models
|
|
info [node] Detailed device info
|
|
|
|
${AMBER}FLEET:${RESET}
|
|
Cecilia — Hailo-8 (HLLWM2B233704667) 26 TOPS
|
|
Octavia — Hailo-8 (HLLWM2B233704606) 26 TOPS
|
|
Total: 52 TOPS
|
|
EOF
|
|
}
|
|
|
|
case "${1:-status}" in
|
|
scan) cmd_scan ;;
|
|
status|s) cmd_status ;;
|
|
benchmark|bench|b) cmd_benchmark "${2:-cecilia}" ;;
|
|
models|m) cmd_models ;;
|
|
info|i) cmd_info "${2:-cecilia}" ;;
|
|
-h|--help|help) usage ;;
|
|
*) echo "Unknown: $1"; usage; exit 1 ;;
|
|
esac
|