forked from karpathy/nanoGPT
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
shuttling the poor mans configurator aside into its own file and addi…
…ng it to all of train,sample,bench. because i am leaving args in globals() so i can avoid having to prepend every single variable with an args., i have to exec the configurator and the optional configs. so we're left with something very gross by standard convention but also quite simple and functional. *ducks*
- Loading branch information
Showing
5 changed files
with
59 additions
and
41 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
""" | ||
Poor Man's Configurator. Probably a terrible idea. Example usage: | ||
$ python train.py config/override_file.py --batch_size=32 | ||
this will first run config/override_file.py, then override batch_size to 32 | ||
The code in this file will be run as follows from e.g. train.py: | ||
>>> exec(open('configurator.py').read()) | ||
So it's not a Python module, it's just shuttling this code away from train.py | ||
The code in this script then overrides the globals() | ||
I know people are not going to love this, I just really dislike configuration | ||
complexity and having to prepend config. to every single variable. If someone | ||
comes up with a better simple Python solution I am all ears. | ||
""" | ||
|
||
import sys | ||
from ast import literal_eval | ||
|
||
for arg in sys.argv[1:]: | ||
if '=' not in arg: | ||
# assume it's the name of a config file | ||
assert not arg.startswith('--') | ||
config_file = arg | ||
print(f"Overriding config with {config_file}:") | ||
with open(config_file) as f: | ||
print(f.read()) | ||
exec(open(config_file).read()) | ||
else: | ||
# assume it's a --key=value argument | ||
assert arg.startswith('--') | ||
key, val = arg.split('=') | ||
key = key[2:] | ||
if key in globals(): | ||
try: | ||
# attempt to eval it it (e.g. if bool, number, or etc) | ||
attempt = literal_eval(val) | ||
except (SyntaxError, ValueError): | ||
# if that goes wrong, just use the string | ||
attempt = val | ||
# ensure the types match ok | ||
assert type(attempt) == type(globals()[key]) | ||
# cross fingers | ||
print(f"Overriding: {key} = {attempt}") | ||
globals()[key] = attempt | ||
else: | ||
raise ValueError(f"Unknown config key: {key}") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters