Mercurial > repos > siwaa > wine_quality_train_eval
comparison fidle__init__.py @ 13:2f6c77865180 draft
planemo upload for repository https://forgemia.inra.fr/nathalie.rousse/use/-/tree/dnn/DNN/galaxy-tools/wine_quality_train_eval commit 1906137478520a9f71a4d8996c0a8827f27aed16-dirty
author | siwaa |
---|---|
date | Thu, 05 Dec 2024 18:28:28 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
12:60778af2dd78 | 13:2f6c77865180 |
---|---|
1 # ================================================================== | |
2 # ______ _ _ _ __ __ _ | |
3 # | ____(_) | | | | \/ | | | | |
4 # | |__ _ __| | | ___ | \ / | ___ __| | | |
5 # | __| | |/ _` | |/ _ \ | |\/| |/ _ \ / _` | | |
6 # | | | | (_| | | __/ | | | | (_) | (_| | | |
7 # |_| |_|\__,_|_|\___| |_| |_|\___/ \__,_| | |
8 # | |
9 # ================================================================== | |
10 # A simple module to host usefull functions for Fidle practical work | |
11 # Jean-Luc Parouty CNRS/MIAI/SIMaP 2022 | |
12 # Contributed by Achille Mbogol Touye MIAI/SIMAP 2023 (PyTorch support) | |
13 | |
14 import os,sys,platform | |
15 import glob | |
16 import shutil | |
17 import pathlib | |
18 | |
19 from random import randint | |
20 import matplotlib | |
21 | |
22 from IPython.display import display,HTML | |
23 | |
24 import fidle.config | |
25 import fidle.scrawler | |
26 import fidle.utils | |
27 | |
28 from fidle.Chrono import Chrono | |
29 | |
30 | |
31 __version__ = fidle.config.VERSION | |
32 | |
33 __run_id = None | |
34 __run_dir = None | |
35 __datasets_dir = None | |
36 | |
37 utils = fidle.utils | |
38 plot = fidle.scrawler | |
39 config = fidle.config | |
40 chrono = Chrono() | |
41 | |
42 | |
43 # ------------------------------------------------------------- | |
44 # init | |
45 # ------------------------------------------------------------- | |
46 # | |
47 ''' | |
48 Initialization with parameters run_id and run_dir. | |
49 These two parameters can be overridden via environment variables | |
50 FIDLE_OVERRIDE_run_id and FIDLE_OVERRIDE_run_dir. | |
51 datasets_dir is retrieved via the environment variable <datasets_env_var>. | |
52 params: | |
53 run_id : Run id for the notebook (random number if None) (None) | |
54 run_dir : Run directory (./run/{run_id} if None) (None) | |
55 datasets_env_var : Name of env. var. specifying the location of the datasets (FIDLE_DATASETS_DIR) | |
56 return: | |
57 run_id, run_dir, datasets_dir | |
58 ''' | |
59 def init(run_id=None, run_dir=None, datasets_env_var='FIDLE_DATASETS_DIR'): | |
60 global __run_id | |
61 global __run_dir | |
62 global __datasets_dir | |
63 | |
64 # ---- run_id | |
65 # | |
66 # If None, we choose | |
67 __run_id = str(randint(10000,99999)) if run_id is None else run_id | |
68 | |
69 # Overrided ? | |
70 __run_id = __get_override_env('run_id', __run_id) | |
71 | |
72 # ---- run_dir | |
73 # | |
74 # If None, we set it | |
75 __run_dir = f'./run/{__run_id}' if run_dir is None else run_dir | |
76 | |
77 # Override run_dir ? | |
78 __run_dir = __get_override_env('run_dir', __run_dir) | |
79 | |
80 # Create run_dir | |
81 utils.mkdir(__run_dir) | |
82 | |
83 # ---- Parameters from config.py | |
84 # | |
85 mplstyle = config.FIDLE_MPLSTYLE | |
86 cssfile = config.FIDLE_CSSFILE | |
87 | |
88 # ---- Load matplotlib style and css | |
89 # | |
90 module_dir = pathlib.Path(__file__).parent | |
91 matplotlib.style.use(f'{module_dir}/{mplstyle}') | |
92 __load_cssfile(f'{module_dir}/{cssfile}') | |
93 | |
94 # ---- Get datasets location | |
95 # From env var or by looking for | |
96 # Raise an exception if cannot be found. | |
97 # | |
98 __datasets_dir=utils.get_datasets_dir(datasets_env_var) | |
99 | |
100 # ---- Update Keras cache | |
101 # | |
102 updated_keras = __update_keras_cache() | |
103 | |
104 # ---- Update torch cache | |
105 # | |
106 updated_torch = __update_torch_cache() | |
107 | |
108 # ---- Tensorflow log level | |
109 # | |
110 log_level = int(os.getenv('TF_CPP_MIN_LOG_LEVEL', 0 )) | |
111 str_level = ['Info + Warning + Error','Warning + Error','Error only'][log_level] | |
112 | |
113 # ---- Today, now and hostname | |
114 # | |
115 chrono.start('__global__') | |
116 h = platform.uname() | |
117 | |
118 # ---- Save figs | |
119 # | |
120 save_figs = os.getenv('FIDLE_SAVE_FIGS', str(config.SAVE_FIGS) ) | |
121 save_figs = (save_figs.lower() == 'true') | |
122 figs_dir = f'{__run_dir}/figs' | |
123 | |
124 plot.set_save_fig( save = save_figs, | |
125 figs_dir = figs_dir, | |
126 figs_name = f'fig_{__run_id}_', | |
127 figs_id = 0 ) | |
128 | |
129 # ---- Hello world | |
130 # | |
131 utils.display_md('<br>**FIDLE - Environment initialization**') | |
132 print('Version :', config.VERSION) | |
133 print('Run id :', __run_id) | |
134 print('Run dir :', __run_dir) | |
135 print('Datasets dir :', __datasets_dir) | |
136 print('Start time :', chrono.get_start('__global__')) | |
137 print('Hostname :', f'{h[1]} ({h[0]})') | |
138 print('Tensorflow log level :', str_level,f' (={log_level})') | |
139 print('Update keras cache :', updated_keras) | |
140 print('Update torch cache :', updated_torch) | |
141 print('Save figs :', figs_dir, f'({save_figs})') | |
142 | |
143 # ---- Modules versions | |
144 # | |
145 for m in config.USED_MODULES: | |
146 if m in sys.modules: | |
147 print(f'{m:21s}:', sys.modules[m].__version__) | |
148 | |
149 # ---- Overrided ? | |
150 # | |
151 if run_id != __run_id: | |
152 print(f'\n** run_id has been overrided from {run_id} to {__run_id}') | |
153 | |
154 | |
155 return __run_id, __run_dir, __datasets_dir | |
156 | |
157 # ------------------------------------------------------------------ | |
158 # Update keras cache | |
159 # ------------------------------------------------------------------ | |
160 # Try to sync ~/.keras/cache with datasets/keras_cache | |
161 # because sometime, we cannot access to internet... (IDRIS..) | |
162 # | |
163 def __update_keras_cache(): | |
164 updated = False | |
165 if os.path.isdir(f'{__datasets_dir}/keras_cache'): | |
166 from_dir = f'{__datasets_dir}/keras_cache/*.*' | |
167 to_dir = os.path.expanduser('~/.keras/datasets') | |
168 utils.mkdir(to_dir) | |
169 for pathname in glob.glob(from_dir): | |
170 filename=os.path.basename(pathname) | |
171 destname=f'{to_dir}/{filename}' | |
172 if not os.path.isfile(destname): | |
173 shutil.copy(pathname, destname) | |
174 updated=True | |
175 return updated | |
176 | |
177 | |
178 # ------------------------------------------------------------------ | |
179 # Update torch cache | |
180 # ------------------------------------------------------------------ | |
181 # Try to sync ~/data/MNIST/raw with datasets/torch_cache | |
182 # because sometime, we cannot access to internet... (IDRIS..) | |
183 # | |
184 | |
185 def __update_torch_cache(): | |
186 updated = False | |
187 if os.path.isdir(f'{__datasets_dir}/torch_cache/MNIST/raw'): | |
188 from_dir = f'{__datasets_dir}/torch_cache/MNIST/raw/*' | |
189 to_dir = os.getcwd() + '/data/MNIST/raw' | |
190 utils.mkdir(to_dir) | |
191 for pathname in glob.glob(from_dir): | |
192 filename=os.path.basename(pathname) | |
193 destname=f'{to_dir}/{filename}' | |
194 if not os.path.isfile(destname): | |
195 shutil.copy(pathname, destname) | |
196 updated=True | |
197 return updated | |
198 | |
199 | |
200 # ------------------------------------------------------------------ | |
201 # Override | |
202 # ------------------------------------------------------------------ | |
203 # | |
204 | |
205 def override(*names, module_name='__main__', verbose=True, return_attributes=False): | |
206 ''' | |
207 Try to override attributes given par name with environment variables. | |
208 Environment variables name must be : FIDLE_OVERRIDE_<NAME> | |
209 If no env variable is available for a given name, nothing is change. | |
210 If type is str, substitution is done with 'notebook_id' and 'datasets_dir' | |
211 Example : override('image_size','nb_epochs') | |
212 params: | |
213 names : list of attributes names as a str list | |
214 if empty, all attributes can be override | |
215 return : | |
216 dict {name=new value} | |
217 ''' | |
218 # ---- Where to override | |
219 # | |
220 module=sys.modules[module_name] | |
221 | |
222 # ---- No names : mean all | |
223 # | |
224 if len(names)==0: | |
225 names=[] | |
226 for name in dir(module): | |
227 if name.startswith('_'): continue | |
228 v=getattr(module,name) | |
229 if type(v) not in [str, int, float, bool, tuple, list, dict]: continue | |
230 names.append(name) | |
231 | |
232 # ---- Search for names | |
233 # | |
234 overrides={} | |
235 for name in names: | |
236 | |
237 # ---- Variable doesn't exist | |
238 # | |
239 if not hasattr(module,name): | |
240 print(f'** Warning : You try to override an inexistant variable ({name})') | |
241 continue | |
242 | |
243 # ---- Get override environment variable name | |
244 # | |
245 env_value = __get_override_env(name, None) | |
246 | |
247 # ---- Environment variable doesn't exist | |
248 # | |
249 if env_value is None: continue | |
250 | |
251 # ---- Environment variable and variable exist both | |
252 # | |
253 value_old = getattr(module,name) | |
254 value_type = type(value_old) | |
255 | |
256 if value_type in [ str ] : | |
257 new_value = env_value.format(datasets_dir=__datasets_dir, run_id=__run_id) | |
258 | |
259 if value_type in [ int, float, bool, tuple, list, dict, type(None)]: | |
260 new_value = eval(env_value) | |
261 | |
262 # ---- Override value | |
263 # | |
264 setattr(module,name,new_value) | |
265 overrides[name]=new_value | |
266 | |
267 if verbose and len(overrides)>0: | |
268 print('** Overrided parameters : **') | |
269 for name,value in overrides.items(): | |
270 print(f'{name:20s} : {value}') | |
271 | |
272 if return_attributes: | |
273 return overrides | |
274 | |
275 | |
276 def __get_override_env(name, default_value=None): | |
277 env_name = f'FIDLE_OVERRIDE_{name}' | |
278 env_value = os.environ.get(env_name, default_value) | |
279 return env_value | |
280 | |
281 | |
282 # def __has_override_env(name): | |
283 # env_name = f'FIDLE_OVERRIDE_{name}' | |
284 # return (env_name in os.environ) | |
285 | |
286 | |
287 | |
288 def __load_cssfile(cssfile): | |
289 if cssfile is None: return | |
290 styles = open(cssfile, "r").read() | |
291 display(HTML(styles)) | |
292 | |
293 | |
294 | |
295 | |
296 | |
297 def end(): | |
298 chrono.stop('__global__') | |
299 end_time = chrono.get_end('__global__') | |
300 duration = chrono.get_delay('__global__', format='human') | |
301 site_url = "https://fidle.cnrs.fr" | |
302 md = f'**End time :** {end_time} \n' | |
303 md+= f'**Duration :** {duration} \n' | |
304 md+= f'This notebook ends here :-) \n' | |
305 md+= f'[{site_url}]({site_url})' | |
306 utils.display_md(md) | |
307 | |
308 |