|
1 | 1 | import inspect |
2 | 2 | import json |
3 | 3 | import os |
| 4 | +import re |
4 | 5 | import sys |
5 | 6 | import tempfile |
6 | 7 | import time |
@@ -40,11 +41,13 @@ def print_json_pretty(res): |
40 | 41 |
|
41 | 42 |
|
42 | 43 | def method(category, method, params): |
| 44 | + params = params.copy() |
43 | 45 | if 'apiKey' in params: |
44 | | - config.PAPERSPACE_API_KEY = params['apiKey'] |
45 | | - del params['apiKey'] |
| 46 | + config.PAPERSPACE_API_KEY = params.pop('apiKey') |
46 | 47 | elif not config.PAPERSPACE_API_KEY: |
47 | 48 | config.PAPERSPACE_API_KEY = apikey() |
| 49 | + params.pop('tail', None) |
| 50 | + params.pop('no_logging', None) |
48 | 51 |
|
49 | 52 | if method in ['artifactsGet', 'artifactsList', 'getJob', 'getJobs', |
50 | 53 | 'getLogs']: |
@@ -121,11 +124,13 @@ def destroy(params): |
121 | 124 |
|
122 | 125 |
|
123 | 126 | def logs(params, tail=False, no_logging=False): |
| 127 | + params = params.copy() |
124 | 128 | if 'apiKey' in params: |
125 | | - config.PAPERSPACE_API_KEY = params['apiKey'] |
126 | | - del params['apiKey'] |
| 129 | + config.PAPERSPACE_API_KEY = params.pop('apiKey') |
127 | 130 | elif not config.PAPERSPACE_API_KEY: |
128 | 131 | config.PAPERSPACE_API_KEY = apikey() |
| 132 | + tail = params.pop('tail', False) or tail |
| 133 | + no_logging = params.pop('no_logging', False) or no_logging |
129 | 134 |
|
130 | 135 | last_line = 0 |
131 | 136 | PSEOF = False |
@@ -215,6 +220,7 @@ def waitfor(params): |
215 | 220 |
|
216 | 221 |
|
217 | 222 | def create(params, no_logging=False): |
| 223 | + no_logging = no_logging or params.get('no_logging', False) |
218 | 224 | job = method('jobs', 'createJob', params) |
219 | 225 | if no_logging: |
220 | 226 | return job |
@@ -252,6 +258,8 @@ def create(params, no_logging=False): |
252 | 258 |
|
253 | 259 |
|
254 | 260 | def artifactsGet(params, no_logging=False): |
| 261 | + params = params.copy() |
| 262 | + no_logging = no_logging or params.get('no_logging', False) |
255 | 263 | result = [] |
256 | 264 | if 'dest' in params: |
257 | 265 | dest = os.path.abspath(os.path.expanduser(params['dest'])) |
@@ -330,44 +338,76 @@ def run(params={}, no_logging=False): |
330 | 338 | if 'PS_JOB_RUNNER' in os.environ: |
331 | 339 | return |
332 | 340 |
|
333 | | - stack = inspect.stack() |
334 | | - obj = __import__(stack[1][0].f_globals['__name__']) |
335 | | - src = inspect.getsource(obj) |
336 | | - src_file = os.path.basename(inspect.getsourcefile(obj)) |
337 | | - |
338 | | - # TO DO: remove these replacements once we are auto importing paperspace on the job runner |
339 | | - src = src.replace('import paperspace', '# import paperspace') |
340 | | - src = src.replace('from paperspace', '# from paperspace') |
341 | | - src = src.replace('paperspace.config.PAPERSPACE_API_KEY', '_paperspace_config_PAPERSPACE_API_KEY') |
342 | | - src = src.replace('paperspace.config.CONFIG_HOST', '_paperspace_config_CONFIG_HOST') |
343 | | - src = src.replace('paperspace.config.CONFIG_LOG_HOST', '_paperspace_config_CONFIG_LOG_HOST') |
344 | | - src = src.replace('paperspace.jobs.run', '_paperspace_null_func') |
345 | | - src = src.replace('paperspace.run', '_paperspace_null_func') |
346 | | - src = src.replace('paperspace.login', '_paperspace_null_func') |
347 | | - src = src.replace('paperspace.logout', '_paperspace_null_func') |
348 | | - src = "def _paperspace_null_func(*args, **kwargs): return None\n" + src |
349 | | - |
350 | | - src_path = os.path.join(tempfile.gettempdir(), src_file) |
351 | | - with open(src_path, "w") as file: |
352 | | - file.write(src) |
| 341 | + params = params.copy() |
| 342 | + run_this = False |
| 343 | + if 'script' not in params: |
| 344 | + run_this = True |
| 345 | + |
| 346 | + stack = inspect.stack() |
| 347 | + obj = __import__(stack[1][0].f_globals['__name__']) |
| 348 | + src = inspect.getsource(obj) |
| 349 | + src_file = os.path.basename(inspect.getsourcefile(obj)) |
| 350 | + |
| 351 | + # TO DO: remove these replacements once we are auto importing paperspace on the job runner |
| 352 | + src, n = re.subn('^import paperspace', 'def _paperspace_null_func(*args, **kwargs): return None\n#import _paperspace', src, count=1, flags=re.MULTILINE) |
| 353 | + if n != 0: |
| 354 | + src = re.sub('^import paperspace*$', '', src, flags=re.MULTILINE) |
| 355 | + src = re.sub('import paperspace', 'pass #import _paperspace', src) |
| 356 | + src = re.sub('^from paperspace', '#from _paperspace', src, flags=re.MULTILINE) |
| 357 | + src = re.sub('from paperspace', 'pass #from _paperspace', src) |
| 358 | + src = src.replace('paperspace.config.PAPERSPACE_API_KEY', '_paperspace_config_PAPERSPACE_API_KEY') |
| 359 | + src = src.replace('paperspace.config.CONFIG_HOST', '_paperspace_config_CONFIG_HOST') |
| 360 | + src = src.replace('paperspace.config.CONFIG_LOG_HOST', '_paperspace_config_CONFIG_LOG_HOST') |
| 361 | + src = src.replace('paperspace.jobs.run', '_paperspace_null_func') |
| 362 | + src = src.replace('paperspace.run', '_paperspace_null_func') |
| 363 | + src = src.replace('paperspace.login', '_paperspace_null_func') |
| 364 | + src = src.replace('paperspace.logout', '_paperspace_null_func') |
| 365 | + |
| 366 | + # XXX TEST CODE |
| 367 | + #print(src) |
| 368 | + #sys.exit(0) |
| 369 | + |
| 370 | + src_path = os.path.join(tempfile.gettempdir(), src_file) |
| 371 | + with open(src_path, "w") as file: |
| 372 | + file.write(src) |
| 373 | + else: |
| 374 | + src_file = os.path.basename(params['script']) |
| 375 | + src_path = params.pop('script') |
353 | 376 |
|
354 | 377 | if 'project' not in params: |
355 | 378 | params['project'] = 'paperspace-python' |
356 | 379 | if 'machineType' not in params: |
357 | | - params['machineType'] = 'GPU+' |
| 380 | + params['machineType'] = 'P5000' |
358 | 381 | if 'container' not in params: |
359 | | - params['container'] = 'Test-Container' |
360 | | - params['command'] = 'python3 ' + src_file |
361 | | - params['workspace'] = src_path |
| 382 | + params['container'] = 'paperspace/tensorflow-python' |
| 383 | + if 'command' not in params: |
| 384 | + # TODO validate python version; handle no version, specific version |
| 385 | + python_ver = params['python'] if 'python' in params else str(sys.version_info[0]) |
| 386 | + params['command'] = 'python' + python_ver + ' ' + src_file |
| 387 | + if 'workspace' not in params or run_this: |
| 388 | + params['workspace'] = src_path |
| 389 | + |
| 390 | + # XXX TEST CODE |
| 391 | + #print(params) |
| 392 | + |
| 393 | + params.pop('python', None) |
| 394 | + params.pop('conda', None) |
| 395 | + params.pop('init', None) |
| 396 | + params.pop('req', None) |
| 397 | + params.pop('pipenv', None) |
| 398 | + |
| 399 | + # XXX TEST CODE |
| 400 | + #print('edited', params) |
| 401 | + #return {} |
362 | 402 |
|
363 | | - create(params, no_logging) |
364 | | - sys.exit(0) |
| 403 | + res = create(params, no_logging) |
| 404 | + if run_this: |
| 405 | + sys.exit(0) |
| 406 | + return res |
365 | 407 |
|
366 | 408 |
|
367 | 409 | # TO DO: |
368 | 410 | # automatic install of imported dependencies |
369 | | -# make console logging optional |
370 | 411 | # allow return results |
371 | | -# prevent interactive use |
372 | 412 | # combine local workspace with source |
373 | 413 | # detect/use python environment |
0 commit comments