in cdk-project/lib/images/processing-image/execute.py [0:0]
def run_notebook():
try:
notebook = os.environ[input_var]
output_notebook = os.environ[output_var]
params = json.loads(os.environ[params_var])
notebook_dir = os.path.dirname(notebook)
notebook_file = os.path.basename(notebook)
pause = randint(1,10)
print("Waiting {} seconds....".format(pause))
sleep(pause)
# If the user specified notebook path in S3, run with that path.
if notebook.startswith("s3://"):
print("Downloading notebook {}".format(notebook))
o = urlparse(notebook)
bucket = o.netloc
key = o.path[1:]
s3 = boto3.resource("s3")
try:
s3.Bucket(bucket).download_file(key, "/tmp/" + notebook_file)
notebook_dir = "/tmp"
except botocore.exceptions.ClientError as e:
if e.response["Error"]["Code"] == "404":
print("The notebook {} does not exist.".format(notebook))
raise
print("Download complete")
os.chdir(notebook_dir)
kernel = os.environ.get("PAPERMILL_KERNEL", None)
if not kernel:
nb_kernel = kernel_for(notebook_file)
avail_kernels = available_kernels()
print("The kernel found in the notebook metadata is: ", nb_kernel)
print("The kernels available to execute within jupyter are kernels are: ", ','.join(avail_kernels))
if nb_kernel is None or nb_kernel not in avail_kernels:
print("No default notebook kernel found or it is not available in the execution environment, picking from available kernels")
kernel = avail_kernels[0]
else:
print("Using notebook provided kernel: ", nb_kernel)
kernel = nb_kernel
print(
"Executing {} with output to {}{}".format(
notebook_file,
output_notebook,
(" using kernel " + kernel) if kernel else "",
)
)
print("Notebook params = {}".format(params))
arg_map = dict(kernel_name=kernel) if kernel else {}
papermill.execute_notebook(
input_path=notebook_file,
output_path=output_notebook,
parameters=params,
progress_bar=False,
log_output=True,
cwd=notebook_dir,
**arg_map,
)
print("Execution complete")
except Exception as e:
message = str(e)
if len(message) > 1024:
lines = message.splitlines()
ellipsis = "\n\n[...]\n\n"
error_message = ellipsis + lines[-1]
truncated_length = 1023 - len(error_message)
if truncated_length == 0:
message = lines[-1]
else:
message = message[:truncated_length] + error_message
# Write to an error file. This will be returned as the failureReason in the
# DescribeProcessingJob result.
with open("/opt/ml/output/message", "w") as failure:
failure.write(message)
# Print the stack trace to the Processing job CloudWatch logs.
trc = traceback.format_exc()
print(trc, file=sys.stderr)
# A non-zero exit code causes the Processing job to be marked as Failed.
sys.exit(1)
if not os.path.exists(output_notebook):
print("No output notebook was generated")
else:
print("Output was written to {}".format(output_notebook))