mirror of
https://jihulab.com/mr-one/openpilot.git
synced 2026-10-27 13:03:42 +08:00
modeld_v2: big to small model fallback (#1974)
This commit is contained in:
committed by
Comma Device
parent
98dd4830df
commit
cbd075288c
@@ -1,6 +1,12 @@
|
||||
"""
|
||||
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
|
||||
|
||||
This file is part of sunnypilot and is licensed under the MIT License.
|
||||
See the LICENSE.md file in the root directory for more details.
|
||||
"""
|
||||
|
||||
import io
|
||||
import requests
|
||||
from unittest import mock
|
||||
|
||||
from openpilot.common.file_chunker import get_chunk_name
|
||||
from openpilot.common.hardware import hw
|
||||
@@ -22,8 +28,8 @@ class TestFallback(OpenpilotTestCase):
|
||||
(tmp_path / tsfdo_file).write_bytes(b'dskfajklsdjlsfka')
|
||||
|
||||
monkeypatch.setattr(hw.Paths, 'model_root', staticmethod(lambda: str(tmp_path)))
|
||||
big_bundle = DummyBundle(models=[DummyModel('supercombo', lebowski_file)], is_big=True)
|
||||
small_bundle = DummyBundle(models=[DummyModel('supercombo', tsfdo_file)], is_big=False)
|
||||
big_bundle = DummyBundle(models=[DummyModel('supercombo', lebowski_file)])
|
||||
small_bundle = DummyBundle(models=[DummyModel('supercombo', tsfdo_file)])
|
||||
big_pkl = modeld_module._find_driving_pkl(big_bundle)
|
||||
small_pkl = modeld_module._find_driving_pkl(small_bundle)
|
||||
|
||||
@@ -54,74 +60,3 @@ class TestFallback(OpenpilotTestCase):
|
||||
assert modeld_module.ModelState(CAM_W, CAM_H, chestnut=True).chestnut is True
|
||||
except Exception as e:
|
||||
assert "AMD" in str(e) or "device" in str(e).lower()
|
||||
|
||||
def test_runtime_fallback_from_big_to_small(self):
|
||||
params = mock.MagicMock()
|
||||
params.get_bool.return_value = True
|
||||
|
||||
big = mock.MagicMock(chestnut=True)
|
||||
big.run.side_effect = RuntimeError("eGPU error")
|
||||
|
||||
small = mock.MagicMock(chestnut=False)
|
||||
small.run.return_value = {"plan": []}
|
||||
|
||||
chestnut = mock.MagicMock(big=True)
|
||||
model, run_count = big, 50
|
||||
|
||||
try:
|
||||
model.run()
|
||||
except Exception:
|
||||
if not params.get_bool("chestnutActive"):
|
||||
raise
|
||||
params.put_bool("chestnutActive", False)
|
||||
model = small
|
||||
chestnut.big = False
|
||||
run_count = 0
|
||||
|
||||
assert model is small
|
||||
assert not chestnut.big
|
||||
assert run_count == 0
|
||||
params.put_bool.assert_called_with("chestnutActive", False)
|
||||
|
||||
model.run()
|
||||
small.run.assert_called_once()
|
||||
|
||||
def test_runtime_stays_on_big_model_if_no_errors(self):
|
||||
params = mock.MagicMock()
|
||||
params.get_bool.return_value = True
|
||||
|
||||
big = mock.MagicMock(chestnut=True)
|
||||
big.run.return_value = {"plan": [1, 2, 3]}
|
||||
|
||||
small = mock.MagicMock(chestnut=False)
|
||||
chestnut = mock.MagicMock(big=True)
|
||||
model, run_count = big, 50
|
||||
try:
|
||||
model.run()
|
||||
except Exception:
|
||||
if not params.get_bool("ChestnutActive"):
|
||||
raise
|
||||
params.put_bool("ChestnutActive", False)
|
||||
model = small
|
||||
chestnut.big = False
|
||||
run_count = 0
|
||||
|
||||
assert model is big
|
||||
assert chestnut.big is True
|
||||
assert run_count == 50
|
||||
params.put_bool.assert_not_called()
|
||||
small.run.assert_not_called()
|
||||
|
||||
def test_runtime_exception_on_small_model_raises(self):
|
||||
params = mock.MagicMock()
|
||||
params.get_bool.return_value = False
|
||||
|
||||
model = mock.MagicMock(chestnut=False)
|
||||
model.run.side_effect = RuntimeError("CPU error")
|
||||
|
||||
with self.assertRaises(RuntimeError):
|
||||
try:
|
||||
model.run()
|
||||
except Exception:
|
||||
if not params.get_bool("ChestnutActive"):
|
||||
raise
|
||||
|
||||
Reference in New Issue
Block a user