modeld: autodetect tinygrad backend

tmp-jenkins-35405
Andrei Radulescu 2 months ago
parent 04115b6417
commit 3c76ebf23f
  1. 3
      .gitignore
  2. 44
      selfdrive/modeld/SConscript
  3. 7
      selfdrive/modeld/dmonitoringmodeld.py
  4. 8
      selfdrive/modeld/modeld.py
  5. 2
      tools/mac_setup.sh

3
.gitignore vendored

@ -70,9 +70,8 @@ flycheck_*
cppcheck_report.txt cppcheck_report.txt
comma*.sh comma*.sh
selfdrive/modeld/thneed/compile
selfdrive/modeld/models/*.thneed
selfdrive/modeld/models/*.pkl selfdrive/modeld/models/*.pkl
selfdrive/modeld/models/*.json
*.bz2 *.bz2
*.zst *.zst

@ -14,9 +14,11 @@ common_src = [
"transforms/transform.cc", "transforms/transform.cc",
] ]
# OpenCL is a framework on Mac
if arch == "Darwin": if arch == "Darwin":
# OpenCL is a framework on Mac
frameworks += ['OpenCL'] frameworks += ['OpenCL']
# Fix for "Error: $HOME must be set to run brew"
lenv['ENV']['HOME'] = os.environ['HOME']
else: else:
libs += ['OpenCL'] libs += ['OpenCL']
@ -47,22 +49,40 @@ def tg_compile(flags, model_name):
f'{pythonpath_string} {flags} python3 {Dir("#tinygrad_repo").abspath}/examples/openpilot/compile3.py {fn}.onnx {fn}_tinygrad.pkl' f'{pythonpath_string} {flags} python3 {Dir("#tinygrad_repo").abspath}/examples/openpilot/compile3.py {fn}.onnx {fn}_tinygrad.pkl'
) )
# Compile small models def tg_dump_flags(flags, prefix):
for model_name in ['driving_vision', 'driving_policy', 'dmonitoring_model']: flags_dict = {}
flags = { for flag_pair in flags.split():
'larch64': 'QCOM=1', k, v = flag_pair.split('=')
'Darwin': 'CPU=1 IMAGE=0 JIT=2', flags_dict[k] = v
}.get(arch, 'LLVM=1 LLVMOPT=1 BEAM=0 IMAGE=0 JIT=2') import json
tg_compile(flags, model_name) with open(f'models/{prefix}_flags.json', 'w') as f:
json.dump(flags_dict, f)
# Compile BIG model if USB GPU is available
import subprocess import subprocess
from tinygrad import Device
# because tg doesn't support multi-process # because tg doesn't support multi-process
devs = subprocess.check_output('python3 -c "from tinygrad import Device; print(list(Device.get_available_devices()))"', shell=True) devs = subprocess.check_output('python3 -c "from tinygrad import Device; print(list(Device.get_available_devices()))"', shell=True)
print("Available tinygrad devices:", devs)
if b"QCOM" in devs:
flags = 'QCOM=1'
elif b"METAL" in devs:
flags = 'METAL=1 IMAGE=0 NOLOCALS=0'
elif b"GPU" in devs:
flags = 'GPU=1'
elif b"LLVM" in devs:
flags = 'LLVM=1 LLVMOPT=1 BEAM=0 IMAGE=0 JIT=2'
else:
flags = 'CPU=1 IMAGE=0 JIT=2'
# Compile small models
for model_name in ['driving_vision', 'driving_policy', 'dmonitoring_model']:
tg_compile(flags, model_name)
tg_dump_flags(flags, 'dmonitoringmodeld')
# Compile BIG model if USB GPU is available
if b"AMD" in devs: if b"AMD" in devs:
del Device
print("USB GPU detected... building") print("USB GPU detected... building")
flags = "AMD=1 AMD_IFACE=USB AMD_LLVM=1 NOLOCALS=0 IMAGE=0" flags = "AMD=1 AMD_IFACE=USB AMD_LLVM=1 NOLOCALS=0 IMAGE=0"
bp = tg_compile(flags, "big_driving_policy") bp = tg_compile(flags, "big_driving_policy")
@ -70,3 +90,5 @@ if b"AMD" in devs:
lenv.SideEffect('lock', [bp, bv]) # tg doesn't support multi-process so build serially lenv.SideEffect('lock', [bp, bv]) # tg doesn't support multi-process so build serially
else: else:
print("USB GPU not detected... skipping") print("USB GPU not detected... skipping")
tg_dump_flags(flags, 'modeld')

@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os
from pathlib import Path
from openpilot.system.hardware import TICI from openpilot.system.hardware import TICI
from tinygrad.tensor import Tensor from tinygrad.tensor import Tensor
from tinygrad.dtype import dtypes from tinygrad.dtype import dtypes
@ -7,13 +8,15 @@ if TICI:
from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address
os.environ['QCOM'] = '1' os.environ['QCOM'] = '1'
else: else:
os.environ['LLVM'] = '1' import json
with open(Path(__file__).parent / 'models/dmonitoringmodeld_flags.json') as f:
flags = json.load(f)
os.environ.update(flags)
import math import math
import time import time
import pickle import pickle
import ctypes import ctypes
import numpy as np import numpy as np
from pathlib import Path
from setproctitle import setproctitle from setproctitle import setproctitle
from cereal import messaging from cereal import messaging

@ -1,5 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import os import os
from pathlib import Path
from openpilot.system.hardware import TICI from openpilot.system.hardware import TICI
USBGPU = "USBGPU" in os.environ USBGPU = "USBGPU" in os.environ
if USBGPU: if USBGPU:
@ -9,8 +10,10 @@ elif TICI:
from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address from openpilot.selfdrive.modeld.runners.tinygrad_helpers import qcom_tensor_from_opencl_address
os.environ['QCOM'] = '1' os.environ['QCOM'] = '1'
else: else:
os.environ['LLVM'] = '1' import json
os.environ['JIT'] = '2' with open(Path(__file__).parent / 'models/modeld_flags.json') as f:
flags = json.load(f)
os.environ.update(flags)
from tinygrad.tensor import Tensor from tinygrad.tensor import Tensor
from tinygrad.dtype import dtypes from tinygrad.dtype import dtypes
import time import time
@ -18,7 +21,6 @@ import pickle
import numpy as np import numpy as np
import cereal.messaging as messaging import cereal.messaging as messaging
from cereal import car, log from cereal import car, log
from pathlib import Path
from setproctitle import setproctitle from setproctitle import setproctitle
from cereal.messaging import PubMaster, SubMaster from cereal.messaging import PubMaster, SubMaster
from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf

@ -43,7 +43,7 @@ brew "glfw"
brew "libarchive" brew "libarchive"
brew "libusb" brew "libusb"
brew "libtool" brew "libtool"
brew "llvm" brew "llvm@19"
brew "openssl@3.0" brew "openssl@3.0"
brew "qt@5" brew "qt@5"
brew "zeromq" brew "zeromq"

Loading…
Cancel
Save