103 lines
3.0 KiB
Python
103 lines
3.0 KiB
Python
"""
|
|
Copyright © IQ.Lvbs, apart of Project Teal Lvbs, All Rights Reserved, licensed under https://konn3kt.com/tos/
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import glob
|
|
import os
|
|
os.environ.setdefault("XDG_CACHE_HOME", "/data/.cache")
|
|
import time
|
|
|
|
from iqpilot.common.params import Params
|
|
from iqpilot.common.swaglog import cloudlog
|
|
from iqpilot.selfdrive.iqmodeld.egpu_helpers import (download_precompiled, egpu_oob_pkl_path, egpu_policy_pkl_path, patch_tinygrad_fetch_fw,
|
|
usbgpu_present)
|
|
from iqpilot.selfdrive.iqmodeld.egpu_model import resolve_egpu_model
|
|
|
|
POLL_S = 30.0
|
|
RETRY_S = 120.0
|
|
|
|
|
|
def _selected_meta(params: Params) -> dict | None:
|
|
key = params.get("IQEmacModel", encoding="utf8")
|
|
try:
|
|
return resolve_egpu_model(params, key)
|
|
except Exception as e:
|
|
cloudlog.warning(f"egpu_prefetch cannot resolve {key!r}: {e}")
|
|
return None
|
|
|
|
|
|
def _drop_stale_partials(keep: str) -> None:
|
|
root = os.path.dirname(keep)
|
|
partial_globs = ("egpu_*_amd_policy.pkl.part", "egpu_*_amd_policy_oob.pkl.part", "big_driving_supercombo_*.onnx.part")
|
|
for path in [p for g in partial_globs for p in glob.glob(os.path.join(root, g))]:
|
|
if not path.startswith(keep):
|
|
try:
|
|
os.remove(path)
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
def prefetch_once(params: Params) -> bool:
|
|
if params.get_bool("IQEgpuDisabled"):
|
|
return False
|
|
meta = _selected_meta(params)
|
|
if meta is None:
|
|
return False
|
|
oob = bool(meta.get("egpu_oob_artifact"))
|
|
dst = egpu_oob_pkl_path(meta) if oob else egpu_policy_pkl_path(meta)
|
|
if os.path.isfile(dst):
|
|
return True
|
|
if not oob and not meta.get("egpu_policy_artifact"):
|
|
return False
|
|
_drop_stale_partials(dst)
|
|
params.put("UsbGpuSetupProgress", "0.0")
|
|
last = [-1.0]
|
|
|
|
def _prog(p: float) -> None:
|
|
if p - last[0] >= 0.02 or p >= 1.0:
|
|
last[0] = p
|
|
params.put("UsbGpuSetupProgress", f"{p:.3f}")
|
|
|
|
cloudlog.warning(f"egpu_prefetch downloading {meta['key']} {'streamable' if oob else 'policy'} artifact offroad")
|
|
out = download_precompiled(meta, progress_cb=_prog, policy=not oob, oob=oob)
|
|
cloudlog.warning(f"egpu_prefetch ready -> {out}")
|
|
return out is not None
|
|
|
|
|
|
_firmware_warm = False
|
|
|
|
|
|
def warm_firmware() -> None:
|
|
global _firmware_warm
|
|
if _firmware_warm or not usbgpu_present():
|
|
return
|
|
os.environ.setdefault("DEV", "USB+AMD:LLVM")
|
|
os.environ.setdefault("GMMU", "0")
|
|
patch_tinygrad_fetch_fw()
|
|
from tinygrad.device import Device
|
|
Device["AMD"]
|
|
_firmware_warm = True
|
|
cloudlog.warning("egpu_prefetch: dock opened offroad; firmware cached and mirrored")
|
|
|
|
|
|
def main() -> None:
|
|
params = Params()
|
|
while True:
|
|
try:
|
|
warm_firmware()
|
|
except Exception as e:
|
|
cloudlog.warning(f"egpu_prefetch firmware warm failed: {e}")
|
|
try:
|
|
prefetch_once(params)
|
|
except Exception as e:
|
|
cloudlog.warning(f"egpu_prefetch failed: {e}")
|
|
params.put("UsbGpuLastError", str(e)[:512])
|
|
time.sleep(RETRY_S)
|
|
continue
|
|
time.sleep(POLL_S)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|