Skip to content

Commit cb32793

Browse files
haraschaxfredyshox
andauthored
OP model (#37740)
* Off policy model * 2f70b996-c604-4a46-9ac9-13ce7534605b/100 * misc fixes * 1cc1791b-4555-41ce-a5cb-ce046967075a/100 * fix model * 6ab6fae5-fbbd-4ad0-928a-b33794f60dba/100 * recomp * update models * qxfinally correct * b8b96ac6-7918-401a-a862-eaf1fdbba88d/100 * wrong plan * wrong plan * Vf9b3fb5f-4d0d-4dcb-bc3a-5e94d1fdcdaa/200 * bump dbc * ready to merge * rename to on-policy * Just cleanup big models for now --------- Co-authored-by: Kacper Rączy <gfw.kra@gmail.com>
1 parent d8569b0 commit cb32793

File tree

10 files changed

+52
-35
lines changed

10 files changed

+52
-35
lines changed

scripts/reporter.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ def get_checkpoint(f):
3838
continue
3939

4040
fn = os.path.basename(f)
41-
master = get_checkpoint(MASTER_PATH + MODEL_PATH + fn)
41+
master_path = MASTER_PATH + MODEL_PATH + fn
42+
if os.path.exists(master_path):
43+
master = get_checkpoint(master_path)
44+
master_col = f"[{master}](https://reporter.comma.life/experiment/{master})"
45+
else:
46+
master_col = "N/A (new model)"
4247
pr = get_checkpoint(BASEDIR + MODEL_PATH + fn)
43-
print("|", fn, "|", f"[{master}](https://reporter.comma.life/experiment/{master})", "|", f"[{pr}](https://reporter.comma.life/experiment/{pr})", "|")
48+
print("|", fn, "|", master_col, "|", f"[{pr}](https://reporter.comma.life/experiment/{pr})", "|")

selfdrive/modeld/SConscript

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ tg_flags = {
2121
}.get(arch, 'DEV=CPU CPU_LLVM=1 THREADS=0')
2222

2323
# Get model metadata
24-
for model_name in ['driving_vision', 'driving_policy', 'dmonitoring_model']:
24+
for model_name in ['driving_vision', 'driving_off_policy', 'driving_on_policy', 'dmonitoring_model']:
2525
fn = File(f"models/{model_name}").abspath
2626
script_files = [File(Dir("#selfdrive/modeld").File("get_model_metadata.py").abspath)]
2727
cmd = f'{tg_flags} python3 {Dir("#selfdrive/modeld").abspath}/get_model_metadata.py {fn}.onnx'
@@ -59,19 +59,5 @@ def tg_compile(flags, model_name):
5959
)
6060

6161
# Compile small models
62-
for model_name in ['driving_vision', 'driving_policy', 'dmonitoring_model']:
62+
for model_name in ['driving_vision', 'driving_off_policy', 'driving_on_policy', 'dmonitoring_model']:
6363
tg_compile(tg_flags, model_name)
64-
65-
# Compile BIG model if USB GPU is available
66-
if "USBGPU" in os.environ:
67-
import subprocess
68-
# because tg doesn't support multi-process
69-
devs = subprocess.check_output('python3 -c "from tinygrad import Device; print(list(Device.get_available_devices()))"', shell=True, cwd=env.Dir('#').abspath)
70-
if b"AMD" in devs:
71-
print("USB GPU detected... building")
72-
flags = "DEV=AMD AMD_IFACE=USB AMD_LLVM=1 NOLOCALS=0 IMAGE=0"
73-
bp = tg_compile(flags, "big_driving_policy")
74-
bv = tg_compile(flags, "big_driving_vision")
75-
lenv.SideEffect('lock', [bp, bv]) # tg doesn't support multi-process so build serially
76-
else:
77-
print("USB GPU not detected... skipping")

selfdrive/modeld/modeld.py

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@
3434
PROCESS_NAME = "selfdrive.modeld.modeld"
3535
SEND_RAW_PRED = os.getenv('SEND_RAW_PRED')
3636

37-
VISION_PKL_PATH = Path(__file__).parent / 'models/driving_vision_tinygrad.pkl'
38-
POLICY_PKL_PATH = Path(__file__).parent / 'models/driving_policy_tinygrad.pkl'
39-
VISION_METADATA_PATH = Path(__file__).parent / 'models/driving_vision_metadata.pkl'
40-
POLICY_METADATA_PATH = Path(__file__).parent / 'models/driving_policy_metadata.pkl'
4137
MODELS_DIR = Path(__file__).parent / 'models'
38+
VISION_PKL_PATH = MODELS_DIR / 'driving_vision_tinygrad.pkl'
39+
VISION_METADATA_PATH = MODELS_DIR / 'driving_vision_metadata.pkl'
40+
ON_POLICY_PKL_PATH = MODELS_DIR / 'driving_on_policy_tinygrad.pkl'
41+
ON_POLICY_METADATA_PATH = MODELS_DIR / 'driving_on_policy_metadata.pkl'
42+
OFF_POLICY_PKL_PATH = MODELS_DIR / 'driving_off_policy_tinygrad.pkl'
43+
OFF_POLICY_METADATA_PATH = MODELS_DIR / 'driving_off_policy_metadata.pkl'
4244

4345
LAT_SMOOTH_SECONDS = 0.0
4446
LONG_SMOOTH_SECONDS = 0.3
@@ -151,7 +153,13 @@ def __init__(self):
151153
self.vision_output_slices = vision_metadata['output_slices']
152154
vision_output_size = vision_metadata['output_shapes']['outputs'][1]
153155

154-
with open(POLICY_METADATA_PATH, 'rb') as f:
156+
with open(OFF_POLICY_METADATA_PATH, 'rb') as f:
157+
off_policy_metadata = pickle.load(f)
158+
self.off_policy_input_shapes = off_policy_metadata['input_shapes']
159+
self.off_policy_output_slices = off_policy_metadata['output_slices']
160+
off_policy_output_size = off_policy_metadata['output_shapes']['outputs'][1]
161+
162+
with open(ON_POLICY_METADATA_PATH, 'rb') as f:
155163
policy_metadata = pickle.load(f)
156164
self.policy_input_shapes = policy_metadata['input_shapes']
157165
self.policy_output_slices = policy_metadata['output_slices']
@@ -175,11 +183,13 @@ def __init__(self):
175183
self.vision_output = np.zeros(vision_output_size, dtype=np.float32)
176184
self.policy_inputs = {k: Tensor(v, device='NPY').realize() for k,v in self.numpy_inputs.items()}
177185
self.policy_output = np.zeros(policy_output_size, dtype=np.float32)
186+
self.off_policy_output = np.zeros(off_policy_output_size, dtype=np.float32)
178187
self.parser = Parser()
179188
self.frame_buf_params : dict[str, tuple[int, int, int, int]] = {}
180189
self.update_imgs = None
181190
self.vision_run = pickle.loads(read_file_chunked(str(VISION_PKL_PATH)))
182-
self.policy_run = pickle.loads(read_file_chunked(str(POLICY_PKL_PATH)))
191+
self.policy_run = pickle.loads(read_file_chunked(str(ON_POLICY_PKL_PATH)))
192+
self.off_policy_run = pickle.loads(read_file_chunked(str(OFF_POLICY_PKL_PATH)))
183193

184194
def slice_outputs(self, model_outputs: np.ndarray, output_slices: dict[str, slice]) -> dict[str, np.ndarray]:
185195
parsed_model_outputs = {k: model_outputs[np.newaxis, v] for k,v in output_slices.items()}
@@ -228,9 +238,17 @@ def run(self, bufs: dict[str, VisionBuf], transforms: dict[str, np.ndarray],
228238

229239
self.policy_output = self.policy_run(**self.policy_inputs).contiguous().realize().uop.base.buffer.numpy().flatten()
230240
policy_outputs_dict = self.parser.parse_policy_outputs(self.slice_outputs(self.policy_output, self.policy_output_slices))
231-
combined_outputs_dict = {**vision_outputs_dict, **policy_outputs_dict}
241+
242+
self.off_policy_output = self.off_policy_run(**self.policy_inputs).contiguous().realize().uop.base.buffer.numpy()
243+
off_policy_outputs_dict = self.parser.parse_off_policy_outputs(self.slice_outputs(self.off_policy_output, self.off_policy_output_slices))
244+
off_policy_outputs_dict.pop('plan')
245+
246+
247+
combined_outputs_dict = {**vision_outputs_dict, **off_policy_outputs_dict, **policy_outputs_dict}
248+
if 'planplus' in combined_outputs_dict and 'plan' in combined_outputs_dict:
249+
combined_outputs_dict['plan'] = combined_outputs_dict['plan'] + combined_outputs_dict['planplus']
232250
if SEND_RAW_PRED:
233-
combined_outputs_dict['raw_pred'] = np.concatenate([self.vision_output.copy(), self.policy_output.copy()])
251+
combined_outputs_dict['raw_pred'] = np.concatenate([self.vision_output.copy(), self.policy_output.copy(), self.off_policy_output.copy()])
234252

235253
return combined_outputs_dict
236254

selfdrive/modeld/models/big_driving_policy.onnx

Lines changed: 0 additions & 1 deletion
This file was deleted.

selfdrive/modeld/models/big_driving_vision.onnx

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:eb6992bd60bada6162fea298e1a414b6b3d6a326db4eda46b9de62bcd8554754
3+
size 13393859
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:86680a657bbb34f997034d1930bb2cb65c38b9222cea199732f72bd45791cfad
3+
size 13022803

selfdrive/modeld/models/driving_policy.onnx

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:940e9006a25f27f0b6e85da798e6a8fd1f6dd492dd7d0b9ff1a9436460f46129
3-
size 46887794
2+
oid sha256:7af05e03fd170653ff5771baf373a2c57b363da12c4c411cd416dee067b4cf58
3+
size 23266366

selfdrive/modeld/parse_model_outputs.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,17 @@ def parse_vision_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndar
9696
self.parse_mdn('pose', outs, in_N=0, out_N=0, out_shape=(ModelConstants.POSE_WIDTH,))
9797
self.parse_mdn('wide_from_device_euler', outs, in_N=0, out_N=0, out_shape=(ModelConstants.WIDE_FROM_DEVICE_WIDTH,))
9898
self.parse_mdn('road_transform', outs, in_N=0, out_N=0, out_shape=(ModelConstants.POSE_WIDTH,))
99+
self.parse_categorical_crossentropy('desire_pred', outs, out_shape=(ModelConstants.DESIRE_PRED_LEN,ModelConstants.DESIRE_PRED_WIDTH))
100+
self.parse_binary_crossentropy('meta', outs)
101+
return outs
102+
103+
def parse_off_policy_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
104+
plan_mhp = self.is_mhp(outs, 'plan', ModelConstants.IDX_N * ModelConstants.PLAN_WIDTH)
105+
plan_in_N, plan_out_N = (ModelConstants.PLAN_MHP_N, ModelConstants.PLAN_MHP_SELECTION) if plan_mhp else (0, 0)
106+
self.parse_mdn('plan', outs, in_N=plan_in_N, out_N=plan_out_N, out_shape=(ModelConstants.IDX_N, ModelConstants.PLAN_WIDTH))
99107
self.parse_mdn('lane_lines', outs, in_N=0, out_N=0, out_shape=(ModelConstants.NUM_LANE_LINES,ModelConstants.IDX_N,ModelConstants.LANE_LINES_WIDTH))
100108
self.parse_mdn('road_edges', outs, in_N=0, out_N=0, out_shape=(ModelConstants.NUM_ROAD_EDGES,ModelConstants.IDX_N,ModelConstants.LANE_LINES_WIDTH))
101109
self.parse_binary_crossentropy('lane_lines_prob', outs)
102-
self.parse_categorical_crossentropy('desire_pred', outs, out_shape=(ModelConstants.DESIRE_PRED_LEN,ModelConstants.DESIRE_PRED_WIDTH))
103-
self.parse_binary_crossentropy('meta', outs)
104110
self.parse_binary_crossentropy('lead_prob', outs)
105111
lead_mhp = self.is_mhp(outs, 'lead', ModelConstants.LEAD_MHP_SELECTION * ModelConstants.LEAD_TRAJ_LEN * ModelConstants.LEAD_WIDTH)
106112
lead_in_N, lead_out_N = (ModelConstants.LEAD_MHP_N, ModelConstants.LEAD_MHP_SELECTION) if lead_mhp else (0, 0)
@@ -120,5 +126,6 @@ def parse_policy_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndar
120126

121127
def parse_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]:
122128
outs = self.parse_vision_outputs(outs)
129+
outs = self.parse_off_policy_outputs(outs)
123130
outs = self.parse_policy_outputs(outs)
124131
return outs

0 commit comments

Comments
 (0)