Skip to content
This repository was archived by the owner on Aug 11, 2020. It is now read-only.

Commit bf75aae

Browse files
committed
fix run imports handling; add run entrypoint support; fix params mutations; default to P5000 machineType and paperspace/tensorflow-python container
1 parent 39d7cc5 commit bf75aae

File tree

1 file changed

+72
-32
lines changed

1 file changed

+72
-32
lines changed

paperspace/jobs.py

Lines changed: 72 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import inspect
22
import json
33
import os
4+
import re
45
import sys
56
import tempfile
67
import time
@@ -40,11 +41,13 @@ def print_json_pretty(res):
4041

4142

4243
def method(category, method, params):
44+
params = params.copy()
4345
if 'apiKey' in params:
44-
config.PAPERSPACE_API_KEY = params['apiKey']
45-
del params['apiKey']
46+
config.PAPERSPACE_API_KEY = params.pop('apiKey')
4647
elif not config.PAPERSPACE_API_KEY:
4748
config.PAPERSPACE_API_KEY = apikey()
49+
params.pop('tail', None)
50+
params.pop('no_logging', None)
4851

4952
if method in ['artifactsGet', 'artifactsList', 'getJob', 'getJobs',
5053
'getLogs']:
@@ -121,11 +124,13 @@ def destroy(params):
121124

122125

123126
def logs(params, tail=False, no_logging=False):
127+
params = params.copy()
124128
if 'apiKey' in params:
125-
config.PAPERSPACE_API_KEY = params['apiKey']
126-
del params['apiKey']
129+
config.PAPERSPACE_API_KEY = params.pop('apiKey')
127130
elif not config.PAPERSPACE_API_KEY:
128131
config.PAPERSPACE_API_KEY = apikey()
132+
tail = params.pop('tail', False) or tail
133+
no_logging = params.pop('no_logging', False) or no_logging
129134

130135
last_line = 0
131136
PSEOF = False
@@ -215,6 +220,7 @@ def waitfor(params):
215220

216221

217222
def create(params, no_logging=False):
223+
no_logging = no_logging or params.get('no_logging', False)
218224
job = method('jobs', 'createJob', params)
219225
if no_logging:
220226
return job
@@ -252,6 +258,8 @@ def create(params, no_logging=False):
252258

253259

254260
def artifactsGet(params, no_logging=False):
261+
params = params.copy()
262+
no_logging = no_logging or params.get('no_logging', False)
255263
result = []
256264
if 'dest' in params:
257265
dest = os.path.abspath(os.path.expanduser(params['dest']))
@@ -330,44 +338,76 @@ def run(params={}, no_logging=False):
330338
if 'PS_JOB_RUNNER' in os.environ:
331339
return
332340

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')
353376

354377
if 'project' not in params:
355378
params['project'] = 'paperspace-python'
356379
if 'machineType' not in params:
357-
params['machineType'] = 'GPU+'
380+
params['machineType'] = 'P5000'
358381
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 {}
362402

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
365407

366408

367409
# TO DO:
368410
# automatic install of imported dependencies
369-
# make console logging optional
370411
# allow return results
371-
# prevent interactive use
372412
# combine local workspace with source
373413
# detect/use python environment

0 commit comments

Comments
 (0)