Skip to content

Commit bc59e18

Browse files
committed
tools: Autotuner: Implement Vizier support
Signed-off-by: Eryk Szpotanski <[email protected]>
1 parent c43c4a4 commit bc59e18

File tree

3 files changed

+670
-125
lines changed

3 files changed

+670
-125
lines changed

tools/AutoTuner/src/autotuner/distributed.py

Lines changed: 2 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
from itertools import product
3333
from uuid import uuid4 as uuid
3434
from collections import namedtuple
35-
from multiprocessing import cpu_count
3635

3736
import numpy as np
3837
import torch
@@ -51,6 +50,7 @@
5150
from ax.service.ax_client import AxClient
5251

5352
from autotuner.utils import (
53+
add_common_args,
5454
openroad,
5555
consumer,
5656
parse_config,
@@ -69,8 +69,6 @@
6969
ORFS_FLOW_DIR = os.path.abspath(
7070
os.path.join(os.path.dirname(__file__), "../../../../flow")
7171
)
72-
# URL to ORFS GitHub repository
73-
ORFS_URL = "https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts"
7472

7573

7674
class AutoTunerBase(tune.Trainable):
@@ -203,30 +201,9 @@ def parse_arguments():
203201
tune_parser = subparsers.add_parser("tune")
204202
_ = subparsers.add_parser("sweep")
205203

206-
# DUT
207-
parser.add_argument(
208-
"--design",
209-
type=str,
210-
metavar="<gcd,jpeg,ibex,aes,...>",
211-
required=True,
212-
help="Name of the design for Autotuning.",
213-
)
214-
parser.add_argument(
215-
"--platform",
216-
type=str,
217-
metavar="<sky130hd,sky130hs,asap7,...>",
218-
required=True,
219-
help="Name of the platform for Autotuning.",
220-
)
204+
add_common_args(parser)
221205

222206
# Experiment Setup
223-
parser.add_argument(
224-
"--config",
225-
type=str,
226-
metavar="<path>",
227-
required=True,
228-
help="Configuration file that sets which knobs to use for Autotuning.",
229-
)
230207
parser.add_argument(
231208
"--experiment",
232209
type=str,
@@ -235,74 +212,13 @@ def parse_arguments():
235212
help="Experiment name. This parameter is used to prefix the"
236213
" FLOW_VARIANT and to set the Ray log destination.",
237214
)
238-
parser.add_argument(
239-
"--timeout",
240-
type=float,
241-
metavar="<float>",
242-
default=None,
243-
help="Time limit (in hours) for each trial run. Default is no limit.",
244-
)
245215
tune_parser.add_argument(
246216
"--resume",
247217
action="store_true",
248218
help="Resume previous run. Note that you must also set a unique experiment\
249219
name identifier via `--experiment NAME` to be able to resume.",
250220
)
251221

252-
# Setup
253-
parser.add_argument(
254-
"--git_clean",
255-
action="store_true",
256-
help="Clean binaries and build files."
257-
" WARNING: may lose previous data."
258-
" Use carefully.",
259-
)
260-
parser.add_argument(
261-
"--git_clone",
262-
action="store_true",
263-
help="Force new git clone."
264-
" WARNING: may lose previous data."
265-
" Use carefully.",
266-
)
267-
parser.add_argument(
268-
"--git_clone_args",
269-
type=str,
270-
metavar="<str>",
271-
default="",
272-
help="Additional git clone arguments.",
273-
)
274-
parser.add_argument(
275-
"--git_latest", action="store_true", help="Use latest version of OpenROAD app."
276-
)
277-
parser.add_argument(
278-
"--git_or_branch",
279-
type=str,
280-
metavar="<str>",
281-
default="",
282-
help="OpenROAD app branch to use.",
283-
)
284-
parser.add_argument(
285-
"--git_orfs_branch",
286-
type=str,
287-
metavar="<str>",
288-
default="master",
289-
help="OpenROAD-flow-scripts branch to use.",
290-
)
291-
parser.add_argument(
292-
"--git_url",
293-
type=str,
294-
metavar="<url>",
295-
default=ORFS_URL,
296-
help="OpenROAD-flow-scripts repo URL to use.",
297-
)
298-
parser.add_argument(
299-
"--build_args",
300-
type=str,
301-
metavar="<str>",
302-
default="",
303-
help="Additional arguments given to ./build_openroad.sh.",
304-
)
305-
306222
# ML
307223
tune_parser.add_argument(
308224
"--algorithm",
@@ -361,45 +277,6 @@ def parse_arguments():
361277
help="Random seed. (0 means no seed.)",
362278
)
363279

364-
# Workload
365-
parser.add_argument(
366-
"--jobs",
367-
type=int,
368-
metavar="<int>",
369-
default=int(np.floor(cpu_count() / 2)),
370-
help="Max number of concurrent jobs.",
371-
)
372-
parser.add_argument(
373-
"--openroad_threads",
374-
type=int,
375-
metavar="<int>",
376-
default=16,
377-
help="Max number of threads openroad can use.",
378-
)
379-
parser.add_argument(
380-
"--server",
381-
type=str,
382-
metavar="<ip|servername>",
383-
default=None,
384-
help="The address of Ray server to connect.",
385-
)
386-
parser.add_argument(
387-
"--port",
388-
type=int,
389-
metavar="<int>",
390-
default=10001,
391-
help="The port of Ray server to connect.",
392-
)
393-
394-
parser.add_argument(
395-
"-v",
396-
"--verbose",
397-
action="count",
398-
default=0,
399-
help="Verbosity level.\n\t0: only print Ray status\n\t1: also print"
400-
" training stderr\n\t2: also print training stdout.",
401-
)
402-
403280
arguments = parser.parse_args()
404281
if arguments.mode == "tune":
405282
arguments.algorithm = arguments.algorithm.lower()

tools/AutoTuner/src/autotuner/utils.py

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import argparse
12
import glob
23
import json
34
import os
@@ -32,6 +33,8 @@
3233
CONSTRAINTS_SDC = "constraint.sdc"
3334
# Name of the TCL script run before routing
3435
FASTROUTE_TCL = "fastroute.tcl"
36+
# URL to ORFS GitHub repository
37+
ORFS_URL = "https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts"
3538
DATE = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
3639

3740

@@ -296,6 +299,27 @@ def openroad(
296299
return metrics_file
297300

298301

302+
STAGES = list(
303+
enumerate(
304+
[
305+
"synth",
306+
"floorplan",
307+
"floorplan_io",
308+
"floorplan_tdms",
309+
"floorplan_macro",
310+
"floorplan_tap",
311+
"floorplan_pdn",
312+
"globalplace",
313+
"detailedplace",
314+
"cts",
315+
"globalroute",
316+
"detailedroute",
317+
"finish",
318+
]
319+
)
320+
)
321+
322+
299323
def read_metrics(file_name):
300324
"""
301325
Collects metrics to evaluate the user-defined objective function.
@@ -312,6 +336,7 @@ def read_metrics(file_name):
312336
design_area = "ERR"
313337
die_area = "ERR"
314338
core_area = "ERR"
339+
last_stage = -1
315340
for stage_name, value in data.items():
316341
if stage_name == "constraints" and len(value["clocks__details"]) > 0:
317342
clk_period = float(value["clocks__details"][0].split()[1])
@@ -333,6 +358,10 @@ def read_metrics(file_name):
333358
core_area = value["design__core__area"]
334359
if stage_name == "finish" and "design__die__area" in value:
335360
die_area = value["design__die__area"]
361+
for i, stage_name in reversed(STAGES):
362+
if stage_name in data and [d for d in data[stage_name].values() if d != "ERR"]:
363+
last_stage = i
364+
break
336365
ret = {
337366
"clk_period": clk_period,
338367
"worst_slack": worst_slack,
@@ -467,6 +496,20 @@ def read_tune_pbt(name, this):
467496
if this["type"] == "float":
468497
return tune.uniform(min_, max_)
469498

499+
def read_vizier(this):
500+
dict_ = {}
501+
min_, max_ = this["minmax"]
502+
dict_["value"] = (min_, max_)
503+
if "scale_type" in this:
504+
dict_["scale_type"] = this["scale_type"]
505+
if min_ == max_:
506+
dict_["type"] = "fixed"
507+
elif this["type"] == "int":
508+
dict_["type"] = "int"
509+
elif this["type"] == "float":
510+
dict_["type"] = "float"
511+
return dict_
512+
470513
# Check file exists and whether it is a valid JSON file.
471514
assert os.path.isfile(file_name), f"File {file_name} not found."
472515
try:
@@ -513,6 +556,8 @@ def read_tune_pbt(name, this):
513556
config[key] = read_tune_pbt(key, value)
514557
elif mode == "tune":
515558
config[key] = read_tune(value)
559+
elif mode == "vizier":
560+
config[key] = read_vizier(value)
516561
if mode == "tune":
517562
config = apply_condition(config, data)
518563
return config, sdc_file, fr_file
@@ -651,3 +696,129 @@ def consumer(queue):
651696
print(f"[INFO TUN-0007] Scheduling run for parameter {name}.")
652697
ray.get(openroad_distributed.remote(*next_item))
653698
print(f"[INFO TUN-0008] Finished run for parameter {name}.")
699+
700+
701+
def add_common_args(parser: argparse.ArgumentParser):
702+
# DUT
703+
parser.add_argument(
704+
"--design",
705+
type=str,
706+
metavar="<gcd,jpeg,ibex,aes,...>",
707+
required=True,
708+
help="Name of the design for Autotuning.",
709+
)
710+
parser.add_argument(
711+
"--platform",
712+
type=str,
713+
metavar="<sky130hd,sky130hs,asap7,...>",
714+
required=True,
715+
help="Name of the platform for Autotuning.",
716+
)
717+
# Experiment Setup
718+
parser.add_argument(
719+
"--config",
720+
type=str,
721+
metavar="<path>",
722+
required=True,
723+
help="Configuration file that sets which knobs to use for Autotuning.",
724+
)
725+
parser.add_argument(
726+
"--timeout",
727+
type=float,
728+
metavar="<float>",
729+
default=None,
730+
help="Time limit (in hours) for each trial run. Default is no limit.",
731+
)
732+
# Workload
733+
parser.add_argument(
734+
"--openroad_threads",
735+
type=int,
736+
metavar="<int>",
737+
default=16,
738+
help="Max number of threads openroad can use.",
739+
)
740+
parser.add_argument(
741+
"-v",
742+
"--verbose",
743+
action="count",
744+
default=0,
745+
help="Verbosity level.\n\t0: only print status\n\t1: also print"
746+
" training stderr\n\t2: also print training stdout.",
747+
)
748+
749+
# Setup
750+
parser.add_argument(
751+
"--git_clean",
752+
action="store_true",
753+
help="Clean binaries and build files."
754+
" WARNING: may lose previous data."
755+
" Use carefully.",
756+
)
757+
parser.add_argument(
758+
"--git_clone",
759+
action="store_true",
760+
help="Force new git clone."
761+
" WARNING: may lose previous data."
762+
" Use carefully.",
763+
)
764+
parser.add_argument(
765+
"--git_clone_args",
766+
type=str,
767+
metavar="<str>",
768+
default="",
769+
help="Additional git clone arguments.",
770+
)
771+
parser.add_argument(
772+
"--git_latest", action="store_true", help="Use latest version of OpenROAD app."
773+
)
774+
parser.add_argument(
775+
"--git_or_branch",
776+
type=str,
777+
metavar="<str>",
778+
default="",
779+
help="OpenROAD app branch to use.",
780+
)
781+
parser.add_argument(
782+
"--git_orfs_branch",
783+
type=str,
784+
metavar="<str>",
785+
default="master",
786+
help="OpenROAD-flow-scripts branch to use.",
787+
)
788+
parser.add_argument(
789+
"--git_url",
790+
type=str,
791+
metavar="<url>",
792+
default=ORFS_URL,
793+
help="OpenROAD-flow-scripts repo URL to use.",
794+
)
795+
parser.add_argument(
796+
"--build_args",
797+
type=str,
798+
metavar="<str>",
799+
default="",
800+
help="Additional arguments given to ./build_openroad.sh.",
801+
)
802+
803+
# Workload
804+
parser.add_argument(
805+
"--jobs",
806+
type=int,
807+
metavar="<int>",
808+
default=int(np.floor(cpu_count() / 2)),
809+
help="Max number of concurrent jobs.",
810+
)
811+
parser.add_argument(
812+
"--server",
813+
type=str,
814+
metavar="<ip|servername>",
815+
default=None,
816+
help="The address of Ray server to connect.",
817+
)
818+
parser.add_argument(
819+
"--port",
820+
type=int,
821+
metavar="<int>",
822+
default=10001,
823+
help="The port of Ray server to connect.",
824+
)

0 commit comments

Comments
 (0)