From fb2e64bafe24ec9e9b6b8bc7d544b92082e1857a Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 25 Aug 2023 11:29:23 -0400 Subject: [PATCH 01/27] attempt 1 at full changes for msm --- .../stack_config_template.json | 2 +- .../utils_stack/print_privatekey.sh | 0 ncap_iac/protocols/submit_start.py | 420 +++++++++++++++++- 3 files changed, 419 insertions(+), 3 deletions(-) mode change 100644 => 100755 ncap_iac/ncap_blueprints/utils_stack/print_privatekey.sh diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 9a376166..85721f69 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -4,7 +4,7 @@ "STAGE": "websubstack", "Lambda": { "CodeUri": "../../protocols", - "Handler": "submit_start.handler_develop", + "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { "AMI": "ami-08f59b6fdb19d0344", diff --git a/ncap_iac/ncap_blueprints/utils_stack/print_privatekey.sh b/ncap_iac/ncap_blueprints/utils_stack/print_privatekey.sh old mode 100644 new mode 100755 diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index 35ba79a7..bd43aaac 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -613,6 +613,237 @@ def compute_volumesize(self): else: self.full_volumesize = default_size + +class Submission_multisession(Submission_dev): + """ + Specific lambda for purposes of development. + + :param bucket_name: name of the S3 bucket that this is a submission for (corresponds to an analysis). + :param key: key of submit file within this bucket. + :param time: some unique identifier that distinguishes this job from all others. + :ivar bucket_name: initial_value: bucket_name + :ivar path: name of the group responsible for this job. + :ivar time: initial value: time ## TODO Remove this field. + :ivar jobname: "job_{}_{}_{}".format(submit_name,bucket_name,self.timestamp) + :ivar jobpath: os.path.join(path,"outputs",jobname) + :ivar logger: s3.Logger object + :ivar instance_type: either given in submit file, or default option of analysis. + :ivar data_name: submit file's dataname field. + :ivar config_name: submit file's configname field. + """ + def __init__(self,bucket_name,key,time): + super().__init__(bucket_name,key,time) + + def get_costmonitoring(self): + """ + Gets the cost incurred by a given group so far by looking at the logs bucket of the appropriate s3 folder. + + """ + ## first get the path to the log folder we should be looking at. + group_name = self.path + assert len(group_name) > 0; "[JOB TERMINATE REASON] Can't locate the group that triggered analysis, making it impossible to determine incurred cost." + logfolder_path = "logs/{}/".format(group_name) + full_reportpath = os.path.join(logfolder_path,"i-") + ## now get all of the computereport filenames: + all_files = utilsparams3.ls_name(self.bucket_name,full_reportpath) + + ## for each, we extract the contents: + jobdata = {} + cost = 0 + ## now calculate the cost: + for jobfile in all_files: + instanceid = jobfile.split(full_reportpath)[1].split(".json")[0] + jobdata = utilsparams3.load_json(self.bucket_name,jobfile) + price = jobdata["price"] + start = jobdata["start"] + end = jobdata["end"] + try: + starttime = datetime.strptime(start, "%Y-%m-%dT%H:%M:%SZ") + endtime = datetime.strptime(end, "%Y-%m-%dT%H:%M:%SZ") + diff = endtime-starttime + duration = abs(diff.seconds) + instcost = price*duration/3600. + except TypeError: + ## In rare cases it seems one or the other of these things don't actually have entries. This is a problem. for now, charge for the hour: + message = " [Internal (get_costmonitoring)] Duration of past jobs not found. Pricing for an hour" + self.logger.append(message) + self.logger.printlatest() + instcost = price + cost+= instcost + + ## Now compare against the cost of the job you're currently running: + ## need duration from config (self.parse_config) and self.instance_type + ## By assuming they're all standard instances we upper bound the cost. + try: + price = utilsparampricing.get_price(utilsparampricing.get_region_name(utilsparampricing.region_id),self.instance_type,os = "Linux") + if self.jobduration is None: + duration = defaultduration/60 ## in hours. + else: + duration = self.jobduration/60 + jobpricebound = duration*price + cost += jobpricebound + except Exception as e: + print(e) + raise Exception(" [Internal (get_costmonitoring)] Unexpected Error: Unable to estimate cost of current job.") + + ## Now compare agains the expected cost of instances with the current ami: + try: + ami = os.environ["AMI"] + total_activeprice = self.prices_active_instances_ami(ami) + + except Exception as e: + print(e) + try: + activeprice = utilsparampricing.get_price(utilsparampricing.get_region_name(utilsparampricing.region_id),self.instance_type,os = "Linux") + number = len([i for i in utilsparamec2.get_active_instances_ami(ami)]) + activeduration = defaultduration*number/60 ## default to the default duration instead if not given. + total_activeprice = activeprice*activeduration + except Exception as e: + print(e) + raise Exception(" [Internal (get_costmonitoring)] Unexpected Error: Unable to estimate cost of active jobs.") + + cost += total_activeprice + + ## Now compare with budget: + try: + budget = float(utilsparamssm.get_budget_parameter(self.path,self.bucket_name)) + except ClientError as e: + try: + assert e.response["Error"]["Code"] == "ParameterNotFound" + budget = float(os.environ["MAXCOST"]) + message = " [Internal (get_costmonitoring)] Customized budget not found. Using default budget value of {}".format(budget) + self.logger.append(message) + self.logger.printlatest() + except: + raise Exception(" [Internal (get_costmonitoring)] Unexpected Error: Unable to get budget.") + except Exception: + raise Exception(" [Internal (get_costmonitoring)] Unexpected Error: Unable to get budget.") + + if cost < budget: + message = " [Internal (get_costmonitoring)] Projected total costs: ${}. Remaining budget: ${}".format(cost,budget-cost) + self.logger.append(message) + self.logger.printlatest() + self.logger.write() + validjob = True + elif cost >= budget: + message = " [Internal (get_costmonitoring)] Projected total costs: ${}. Over budget (${}), cancelling job. Contact administrator.".format(cost,budget) + self.logger.append(message) + self.logger.printlatest() + self.logger.write() + validjob = False + return validjob + + def acquire_instances(self): + """ + Streamlines acquisition, setting up of multiple instances. Better exception handling when instances cannot be launched, and spot instances with defined duration when avaialble. + + """ + nb_instances = 1 #all datafiles will be used to train a single core model + + ## Check how many instances are running. + active = utilsparamec2.count_active_instances(self.instance_type) + ## Ensure that we have enough bandwidth to support this request: + if active +nb_instances < int(os.environ['DEPLOY_LIMIT']): + pass + else: + self.logger.append(" [Internal (acquire_instances)] RESOURCE ERROR: Instance requests greater than pipeline bandwidth. Please contact NeuroCAAS admin.") + self.logger.printlatest() + self.logger.write() + raise ValueError("[JOB TERMINATE REASON] Instance requests greater than pipeline bandwidth. Too many simultaneously deployed analyses.") + + instances = utilsparamec2.launch_new_instances_with_tags_additional( + instance_type=self.instance_type, + ami=os.environ['AMI'], + logger= self.logger, + number = nb_instances, + add_size = self.full_volumesize, + duration = self.jobduration, + group = self.path, + analysis = self.bucket_name, + job = self.jobname + ) + #instances = utilsparamec2.launch_new_instances_with_tags( + #instance_type=self.instance_type, + #ami=os.environ['AMI'], + #logger= self.logger, + #number = nb_instances, + #add_size = self.full_volumesize, + #duration = self.jobduration + #) + + ## Even though we have a check in place, also check how many were launched: + try: + assert len(instances) > 0 + except AssertionError: + self.logger.append(" [Internal (acquire_instances)] RESOURCE ERROR: Instances not launched. AWS capacity reached. Please contact NeuroCAAS admin.") + self.logger.printlatest() + self.logger.write() + raise AssertionError("[JOB TERMINATE REASON] Instance requests greater than pipeline bandwidth (base AWS capacity). Too many simultaneously deployed analyses") + + self.instances = instances + + return instances + + def process_inputs(self,dryrun=False): + """ Initiates Processing On Previously Acquired EC2 Instance. This version requires that you include a config (fourth) argument """ + try: + os.environ['COMMAND'].format("a","b","c","d") + except IndexError as ie: + msg = " [Internal (process_inputs)] INPUT ERROR: not enough arguments in the COMMAND argument." + self.logger.append(msg) + self.logger.printlatest() + self.logger.write() + raise ValueError("[JOB TERMINATE REASON] Not the correct format for arguments. Protocols for job manager are misformatted.") + + ## input bucket: + if self.bypass_data["input"]["bucket"] is not None: + input_bucket = self.bypass_data["input"]["bucket"] + data_check_path = os.path.dirname(self.bypass_data["input"]["datapath"][0]) #use the path to the directory instead of the file paths + config_check_path = self.bypass_data["input"]["configpath"] + else: + input_bucket = self.bucket_name + data_check_paths = os.path.dirname(self.data_name_list[0]) #use the path to the directory instead of the file paths + config_check_path = self.config_name + + if self.bypass_data["output"]["bucket"] is not None: + output_bucket = self.bypass_data["output"]["bucket"] + result_check_paths = self.bypass_data["output"]["resultpath"] + outpath_full = "s3://{}/{}".format(output_bucket,os.path.join(result_check_paths,self.jobname)) + else: + outpath_full = os.path.join(os.environ['OUTDIR'],self.jobname) + + + ## Bypass: + #self.bucket_name -> input_bucket + #self.filenames -> data_check_paths + #outpath_full -> resultpath(FULL) + #self.config_name -> config_check_path + + ## Should we vectorize the log here? + #outpath_full = os.path.join(os.environ['OUTDIR'],self.jobname) + commands = [os.environ['COMMAND'].format( + input_bucket, filename, outpath_full, config_check_path + ) for filename in data_check_paths] + + print(commands,"command to send") + if not dryrun: + for f,dirname in enumerate(data_check_paths): #there will only be one + response = utilsparamssm.execute_commands_on_linux_instances( + commands=[os.environ['COMMAND'].format( + input_bucket, dirname, outpath_full, config_check_path + )], # TODO: variable outdir as option + instance_ids=[self.instances[f].instance_id], + working_dirs=[os.environ['WORKING_DIRECTORY']], + log_bucket_name=input_bucket, + log_path=os.path.join(self.jobpath,'internal_ec2_logs') + ) + self.logger.initialize_datasets_dev(dirname,self.instances[f].instance_id,response["Command"]["CommandId"]) + self.logger.append(" [Internal (process_inputs)] Starting analysis {} with parameter set {}".format(f+1,os.path.basename(dirname))) + self.logger.printlatest() + self.logger.write() + self.logger.append(" [Internal (process_inputs)] All jobs submitted. Processing...") + return commands + ## We are no longer using this function. It depends upon automation documents that can be found in the cfn utils_stack template. Consider using this as a reference when switching to automation documents instead of pure runcommand. def add_volumes(self): """ @@ -699,8 +930,6 @@ def process_inputs(self): self.logger.write() self.logger.append(" [Internal (process_inputs)] All jobs submitted. Processing...") pass - - def process_upload_dev(bucket_name, key,time): """ @@ -1079,6 +1308,167 @@ def process_upload_deploy(bucket_name, key,time): submission.inputlogger.write() submission.submitlogger.write() +def process_upload_multisession(bucket_name,key,time): + exitcode = 99 + + donemessage = "[Job Manager] {s}: DONE" + awserrormessage = "[Job Manager] {s}: AWS ERROR. {e}\n[Job Manager] Shutting down job." + internalerrormessage = "[Job Manager] {s}: INTERNAL ERROR. {e}\n[Job Manager] Shutting down job." + + + ## Step 1: Initialization. Most basic checking for submit file. If this fails, will not generate a certificate. + step = "STEP 1/4 (Initialization)" + try: + if os.environ['LAUNCH'] == 'true': + ## Make submission object + print("creating submission object") + submission = Submission_multisession(bucket_name, key, time) + print("created submission object") + elif os.environ["LAUNCH"] == 'false': + raise NotImplementedError("This option not available for configs. ") + submission.logger.append(donemessage.format(s = step)) + submission.logger.printlatest() + submission.logger.write() + except ClientError as ce: + e = ce.response["Error"] + print(awserrormessage.format(s= step,e = e)) + return exitcode + except Exception: + e = traceback.format_exc() + print(internalerrormessage.format(s= step,e = e)) + return exitcode + + ## Step 2: Validation. If we the data does not exist, or we are over cost limit, this will fail. + step = "STEP 2/4 (Validation)" + try: + submission.check_existence() + submission.parse_config() + valid = submission.get_costmonitoring() + assert valid + submission.logger.append(donemessage.format(s = step)) + submission.logger.printlatest() + submission.logger.write() + except AssertionError as e: + print(e) + e = "Error: Job is not covered by budget. Contact NeuroCAAS administrator." + submission.logger.append(internalerrormessage.format(s= step,e = e)) + submission.logger.printlatest() + submission.logger.write() + return exitcode + except ClientError as ce: + e = ce.response["Error"] + submission.logger.append(awserrormessage.format(s = step,e = e)) + submission.logger.printlatest() + submission.logger.write() + return exitcode + except Exception: + e = traceback.format_exc() + submission.logger.append(internalerrormessage.format(s = step,e = e)) + submission.logger.printlatest() + submission.logger.write() + return exitcode + + # Step 3: Setup: Getting the volumesize, hardware specs of immutable analysis environments. + step = "STEP 3/4 (Environment Setup)" + try: + submission.compute_volumesize() + submission.logger.append(donemessage.format(s = step)) + submission.logger.printlatest() + submission.logger.write() + except ClientError as ce: + e = ce.response["Error"] + submission.logger.append(awserrormessage.format(s = step,e = e)) + submission.logger.printlatest() + submission.logger.write() + utilsparams3.write_endfile(submission.bucket_name,submission.jobpath) + return exitcode + except Exception: + e = traceback.format_exc() + submission.logger.append(internalerrormessage.format(s = step,e = e)) + submission.logger.printlatest() + submission.logger.write() + utilsparams3.write_endfile(submission.bucket_name,submission.jobpath) + return exitcode + + # Step 4: Processing: Creating the immutable analysis environments, sending the commands to them. + step = "STEP 4/4 (Initialize Processing)" + try: + ## From here on out, if something goes wrong we will terminate all created instances. + instances=submission.acquire_instances() + submission.logger.printlatest() + submission.logger.write() + jobs = submission.log_jobs() + submission.logger.printlatest() + submission.logger.write() + ## NOTE: IN LAMBDA, JSON BOOLEANS ARE CONVERTED TO STRING + if os.environ["MONITOR"] == "true": + submission.put_instance_monitor_rule() + elif os.environ["MONITOR"] == "false": + submission.logger.append(" [Internal (monitoring)] Skipping monitor.") + submission.logger.write() + submission.start_instance() + submission.logger.write() + submission.process_inputs() + submission.logger.append(donemessage.format(s = step)) + submission.logger.printlatest() + submission.logger.write() + submission.logger.append("JOB MONITOR LOG COMPLETE. SEE TOP FOR LIVE PER-DATASET MONITORING") + submission.logger.initialize_monitor() + ## should be a success at this point. + exitcode = 0 + except ClientError as ce: + e = ce.response["Error"] + ## We occasianally get "Invalid Instance Id calls due to AWS side errors." + if e["Code"] == "InvalidInstanceId": + e = "Transient AWS Communication Error. Please Try Again" + submission.logger.append(awserrormessage.format(s = step,e = e)) + submission.logger.printlatest() + submission.logger.write() + ## We need to separately attempt all of the relevant cleanup steps. + try: + ## In this case we need to delete the monitor log: + [utilsparams3.delete_active_monitorlog(submission.bucket_name,"{}.json".format(inst.id)) for inst in instances] + except Exception: + se = traceback.format_exc() + message = "While cleaning up from AWS Error, another error occured: {}".format(se) + submission.logger.append(internalerrormessage.format(s = step,e = message)) + submission.logger.printlatest() + submission.logger.write() + try: + ## We also need to delete the monitor rule: + utilsparamevents.full_delete_rule(submission.rulename) + except Exception: + se = traceback.format_exc() + message = "While cleaning up from AWS Error, another error occured: {}".format(se) + submission.logger.append(internalerrormessage.format(s = step,e = message)) + submission.logger.printlatest() + submission.logger.write() + ## We finally need to terminate the relevant instances: + for inst in instances: + try: + inst.terminate() + except Exception: + se = traceback.format_exc() + message = "While cleaning up from AWS Error, another error occured: {}".format(se) + submission.logger.append(internalerrormessage.format(s = step,e = message)) + submission.logger.printlatest() + submission.logger.write() + continue + except Exception: + e = traceback.format_exc() + try: + [inst.terminate() for inst in instances] + except UnboundLocalError: + submission.logger.append("No instances to terminate") + submission.logger.printlatest() + submission.logger.write() + + submission.logger.append(internalerrormessage.format(s = step,e = e)) + submission.logger.printlatest() + submission.logger.write() + + return exitcode + ## Actual lambda handlers. def handler_develop(event,context): """ @@ -1124,3 +1514,29 @@ def handler_ensemble(event,context): print("processing returned exit code {}".format(exitcode)) return exitcode +def handler_multisession(event,context): + """ + Handler for multisession modeling. + """ + for record in event['Records']: + time = record['eventTime'] + bucket_name = record['s3']['bucket']['name'] + key = record['s3']['object']['key'] + submit_file = utilsparams3.load_json(bucket_name, key) + configpath = submit_file["configname"] + try: + configfile = utilsparams3.load_yaml(bucket_name, configpath) + except Exception: + raise Exception("Config must be a valid YAML file.") + try: + if configfile["multisession"] == "True": + print("Creating a single machine image for multisession modeling.") + exitcode = process_upload_multisession(bucket_name, key, time) + print("process returned exit code {}".format(exitcode)) + else: + exitcode = process_upload_dev(bucket_name, key, time) + print("process returned with exit code {}".format(exitcode)) + except KeyError: + raise Exception("Config file does not specify \"multisession\" param.") + + return exitcode \ No newline at end of file From fe77fab0c68f85ba42025bb035342a0fccd35ea6 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 29 Aug 2023 14:06:58 -0400 Subject: [PATCH 02/27] stash for testing --- .neurocaas_contrib_dataconfig.json | 1 + .../__pycache__/calculate_cost.cpython-36.pyc | Bin 32419 -> 32453 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 145 -> 143 bytes .../__pycache__/__init__.cpython-36.pyc | Bin 139 -> 137 bytes .../protocols/__pycache__/log.cpython-36.pyc | Bin 590 -> 2941 bytes .../__pycache__/postprocess.cpython-36.pyc | Bin 6601 -> 9518 bytes .../__pycache__/submit_start.cpython-36.pyc | Bin 20569 -> 44716 bytes tests/protocol_tests/test_submit_start.py | 2 ++ 8 files changed, 3 insertions(+) create mode 100644 .neurocaas_contrib_dataconfig.json diff --git a/.neurocaas_contrib_dataconfig.json b/.neurocaas_contrib_dataconfig.json new file mode 100644 index 00000000..bf302cf3 --- /dev/null +++ b/.neurocaas_contrib_dataconfig.json @@ -0,0 +1 @@ +{"configpath": "s3://bucketname/groupname/configs/config.json", "datapath": "s3://bucketname/groupname/inputs/data.txt"} \ No newline at end of file diff --git a/experiments/__pycache__/calculate_cost.cpython-36.pyc b/experiments/__pycache__/calculate_cost.cpython-36.pyc index 0e4026b4ec9c69377c632df3c0f822a8772ce363..b1b268e1b13008a3eb2ec82d64f77dfa3ec6b099 100644 GIT binary patch delta 6540 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 delta 36 rcmeBV>}KRJ=H=y@^?GI8L=JNS3;odI)S_bjlElpP#Kff3iM}=f$!!bL diff --git a/ncap_iac/protocols/__pycache__/log.cpython-36.pyc b/ncap_iac/protocols/__pycache__/log.cpython-36.pyc index 2f99bff5a1e70620a94a8ec7ab5741d0454d8a4b..a46054bf979c9798076fc1e720dee467cc17eaed 100644 GIT binary patch literal 2941 zcmZuzTW{mW73NT+NKqH-;2yGn6k0N`hz3+|Haim+$aFyY2n^ zU@JS`rZ5Hv?0*wV6*=Dt5XJxENaGknrI5cQuXt3); zBe+35b|WUiO?HdjToKguk6;r@g3V7iKQS`%lgp9*r~PV#HfifiBe+f5v;*xON9ob7d`^(n)HxURpyi zCo!OBtqgQGn84XnmW*di)hUx|RWj4Xk8AFN?w=lG#B#opYAvQ?YPB zc?o)tY-P`7oC=P52hERpEZI{g!Cd$_WmRTxDyEDhCWB*)z%Uipo1b5YB7r z^P7AoGWY}M& zmDpbyr3G$7m(^vxtkcF0oFJVemzPy<>12yrc=lnQ)`8;YMA!kykcXHIUj%`t%xVK)1jqF4&|c2gzpH0cl~8!&`? zL8!Ov0gAn08FELX*nfzzL=@YG^*3Q1Adc4O7On#XxlL~``+r*FMcISo@E5=Je0cWQ z2@}#kW?Vq>`uTxhMUg+tvseNUWK&-rhSHxG6tY721!wozvsg%+!F(C}o|dFTo;M(l zzLRJR=lOD+h&VD^A!Y@K zfHW4boOgYBS}=c}iFtvz#OP~2sDk^(%1QEl+;T=9Dl$zp;NFEZe)X*%zx9jV z!2V$G{SSV3Mn=j)-64-786UHkh(?RX)9TL8ml2+e4`x1I3DZRU1jrOpZA1;xP6atW3%SOh*;G<0Ra zBJnZ;4faMR--ed&02y6ZHdL5Q@*m;Q4}d6#WydjxfVd02pjT-*St|`*0n`RJL&cID zyaXDn&O1Udj@9J}7OBcm?tUnk22h8yB85_;OwN>Z5N9+@Q~pCd%bXo62a7;)GzG{{ z87oxx(g9Vh2g4~~@mc{!C+DawR4vR-gYLmRO(&G4OtJ}|rz~h|te!vtIEYiGyg!8L zoN3im45JZMaLJ})%85zRS=LOp@G z39Jly=xo%3UJSXYkzT!dq4#8-QO32ds)3~%awN}`%b6(hOn}Cc@flQj5Tsm8p(v+J z5vGIdJkT)4)W-LM>2(+szX4)+7IF34A|4bN&-6$aUZmTkW4dG;MsAzcSVzx$q;KN7 zt(pl%sRO&QAZ-zjKLR6PhX;QEJY)eNhHB_Ph<*5#s0{c9PI;H^(}h`w5y$!!v@fUN zcZXZw8-srzj)~5Hj--yWy~`czA0hrGPQD97-8!$e8itI6NuyrOV zo6cv2P+pb86ZR|$JV>DR4-t28X$_Y0SMew;$Jzi@X6y96$Z_R9n&lKc{1_2Q+y_z_ b9jIxVP}lX_1w($fw+V*rf`MOi-QNEI3fdh@ delta 361 zcmYjMJxc>Y5S^Lb`_Lp3@T&=8dxf45D-jW_Y%CO;E0oRcAxSO?++Hl?#3I_+UFGkw z_XliimDW;FoQ+LpcyD>j+j+A;TOabN+iI=8zTDsZ62K=c6>B(Um;)va8goegPfT#3 zDIrZ-m>~iyQ4eVkZT&`_hP1)7?B~XGZT(LBDC;je+Fj>S--q$F$qEyfs(+_c zFN@Q1e4DFLPpkS|L=O#@*Jc6{ViTJrQBoV%u-N3gD6lj!Ru0T$Y*)%crCCpPrRy diff --git a/ncap_iac/protocols/__pycache__/postprocess.cpython-36.pyc b/ncap_iac/protocols/__pycache__/postprocess.cpython-36.pyc index 6959a889a7f7925e5701ae6f9b2b55414bb55e13..f2e013d9052b20b20b8552a62ac9abb378ad01b5 100644 GIT binary patch literal 9518 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 IEqDEY0d2}1WdHyG literal 6601 zcmds5&2JmW72hwCt0hHIvMhfzO}2I#gn=trk{hIg;YOD2+Gr{VmW=>gB*codl$IiQ z*E367qL(M8Xo@00d+05;nxc^cP0<`mVrOS(XXoS1 z@4er9Z*zX$`t#MnXE)wfl)o!eKMnN{afxRrn8MVa;$(N#QRTDdX!5Q*hP;=YvbRsatg&AL}ca*U@(tfRU zRIEY&+)Omtq9;0LD7!CIMX_xBwuKnX(Zj8dS5Bz6dU`K9zXh)$R#CR3T7u|3_ zYYscMn|E^qw|63Zv1-e~J_^GlVL$idLqCw;^umM5H*yBy_C34!>KbayZifRo3+4_6 z{e6$yn1H#lE4McUuviisNr(9ygNFP>F44u#dF;0bm|?Qze6V2&k`ZfdoPzw(G1JlR;Sx(I4se*C zS|c@4yUOpir^cT0C#9*T`jL0i)KYErdaC-IzL3Ssn`=*m$HiLg`UkGN@2$1tpw)Bx z`^;Sn+HTbH-S%3HT6>x zg;Tq;{djxt?&H?(_Al<9{u4j!wj`pSAE%axAx}Z*YHGZM?y1_t0xBd*h&~fX1?}8K zaT!;>lV&N^LXjGDUa8Rqs?$ma0Fjn~u-M~GBQ0mgpH}jdPEEJhYti6oEti3OlJhiG zzCbh4bZPypplUQTEkT*9>ld{pm0v=AqRR9M31|nGxR2sM8EMD25~%E_?~imSv6ARe zUL!HO>KG>Ik}@jAT31g>Xe}pN*GS4FM5Z6X*r>`=>k}o>pw@=_*Fvp#4!t&1kyM4y z3DLy^VgK^V-jki3yL)?AuGv=}?Ajkcdib+P`QyFq2Or(NbLCUgKKjHDnE%XY1Gh)m z&JDzK&+b9TZMRTA|GQGZ=@Wns5(1m{woP|hF?14IEXXVs+T0oRdeZnzELdSwa%o80 zvMPon5ySKgH_CAiZ`7>(2o5u$aOj# z#L^VW0bzl{p63RzKY49>Y54-MZqIEWO4}jleD2bb4FZ-AnHsl4c9NE}{%IvYJ>a?g zP#UmQKk#BeT7*Gr^g@@VWjBhvfHf=pJfOu%pB*#%-V><~IH%EPVbyQ!OkqphX zHesigee))Pw2nft4AsKFhHFLR@1SLZXhJjTqeS$3s4!5^gp#1_gkGRlO|-E#A*YOr zO70(KFzaXdYl~-gCerLY06p(GBBM=4*@kWwBq8j5j}E=#2fjE2LAadYi|zo27qq=x znmJbG`Fv+gfrSwVn0IY^ za7{XX8x5=RG5J|=v@+X6szU@oAHH&F{vULx;PZk%rWGh-$=68azg8k{0TQR=QJoTE zPDuk!$ylBepiT)rr{pV~5`0gobJKDfcW$(HHd`NUw4Q9Nx42lJw5+3LbGBvugV~mi z8)sT*oU<($XZg?Y%8bp4osq**HV?uv)d=vVM@gQ9|=;}y=vzEJXT@8Az zQ*;Oy4`j%siwD=Qbi9=quoiQ_f=dS%@IB~#DT^DS^#-eqWh}?cOE9ma3M@rAK^xq@ zo1efkbWL&#VG*q1KO{G7Py7-J+`QwMyWmWMH}`tpGdGB#;P7GkF8MAQnUYm4B05P* zXSMx*A6#JpbZ|v*m6_#&EDIf!Dk`HocmV}1PT`AhK=xAK&M+3Kon$QH1Ibt>F;*6M zyaGcJQvdo6@=}y)Pdg? z^B+)M3!=2-a_*iqP03biC6|md2PPFQiQl)WtHHzP!l{x;qXmc2Nvfj>Nr>!eW&>$0 zM}l1NXBa_{I203r)-Bagm((}Zy2?obCcq|JMVF+u>!@S|##DLN6F_{d0pv>I+kvVG zo;k%w2At$KKBFQR{6tSmxokhCVidxexi{D1e1V0pfOblZK z9C-XeBI8+@xocz`DT;+Tgu8@j*1%Q5vynfS@m!(Um*QJOoOG4SSu8PKk^!Xu2+mfw zlvLn8&B{lDBiFKs? zPUU}N)$V*!#kaBz&f9!k?=Fn$Oc^cUY8*RB4ZC_YT8tYQV-e#nB}=S^JgQewg>)J7}V z36h0!CuXuz)bc(C-Yt$nEm*(OJ(n1H`wChSdv%v5E!0nAOJ8a1+?TKSUe0eHJHh~bXhOP=esNH68g^L4eSHE{1s&^zPIaC z9)a&U6V9B6#AE!}2kgjQ%Iu#ZVR)6E$r8O(w}$!;H@AnEK?VX55~3ucg(9+-KFCd( zUmU_cxRxhAU>B&T7_=$nwPn8;U6a1Cbd<9!$%_$b*^7}g*A9bc9zXEd<5a!xScg$d z>fWF~toPkx`;b&olH_c3la_DG{G+4)99cTmv36jU_hi0tSoI>G##!x0H->ND_9$zC zVJP5#G0IY=$TUbhj)v8ZyQ{+wgD}qWhTn24!zCKw1X)z(#h^?NX@%3jK#Ifj$ZZPu zz{?~-!lPPKb127#M9~g8V8%Xj56uf{RlwoQ^QQbBoy5e>q!r}diLuN?2;^zC&PW-KR5cNuP6W^6Z!}t68H-uSvcctXfE_2}ipx zoJ!W)cN)TTdHb-Hr8*!^r&>(i7YDPpw+Gf6X$?CG(tFH{U{e`Cp}D2(17B diff --git a/ncap_iac/protocols/__pycache__/submit_start.cpython-36.pyc b/ncap_iac/protocols/__pycache__/submit_start.cpython-36.pyc index 3ee6923e16aca4610e8ca81e776996efd0093a68..8efa35892b09536286c99bbb763d2e47dbac938b 100644 GIT binary patch literal 44716 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 WXNvjqH;iu>UqRT(ujCi= Date: Thu, 31 Aug 2023 20:56:15 -0400 Subject: [PATCH 03/27] post-testing changes --- .../stack_config_template.json | 2 +- .../__pycache__/submit_start.cpython-36.pyc | Bin 44716 -> 44658 bytes ncap_iac/protocols/submit_start.py | 10 +- tests/protocol_tests/test_submit_start.py | 394 +++++++++++++++++- 4 files changed, 392 insertions(+), 14 deletions(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 85721f69..9a376166 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -4,7 +4,7 @@ "STAGE": "websubstack", "Lambda": { "CodeUri": "../../protocols", - "Handler": "submit_start.handler_multisession", + "Handler": "submit_start.handler_develop", "Launch": true, "LambdaConfig": { "AMI": "ami-08f59b6fdb19d0344", diff --git a/ncap_iac/protocols/__pycache__/submit_start.cpython-36.pyc b/ncap_iac/protocols/__pycache__/submit_start.cpython-36.pyc index 8efa35892b09536286c99bbb763d2e47dbac938b..ab066ef2ef279939e1c4352adbbf12d9585c879c 100644 GIT binary patch delta 7264 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 delta 7656 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 wtHus 0 + + ## Check bucket name and path are not altered for all other processing: + assert sd.bucket_name == bucket_name + assert sd.path == re.findall('.+?(?=/'+os.environ["SUBMITDIR"]+')',skipsubmit)[0] + sd.parse_config() + sd.compute_volumesize() + sd.acquire_instances() + #sd.start_instance() + commands = sd.process_inputs(dryrun=True) + reference_command = os.environ["COMMAND"].format(sep_bucket_multi,"sep_inputs","s3://independent-multi/sep_results/job__test-submitlambda-analysis-multi_testtimestamp","sep_configs/configsep.json") + print(f"\n\n\n\n\n commands 0: {commands[0]} \n\n\n\n the command: {reference_command} \n\n\n\n\n") + assert commands[0] == reference_command + info= ec2_client.describe_instances(InstanceIds = [i.id for i in sd.instances]) + #for instanceinfo in info["Reservations"][0]["Instances"]: + # tags = instanceinfo["Tags"] + # assert {"Key":"PriceTracking","Value":"On"} in tags + # assert {"Key":"Timeout","Value":"360"} in tags + # assert {"Key":"group","Value":sd.path} in tags + # assert {"Key":"job","Value":sd.jobname} in tags + # assert {"Key":"analysis","Value":sd.bucket_name} in tags From f92f4ff7b0221a8093d1503f9e30db4b259f4714 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 5 Sep 2023 14:47:11 -0400 Subject: [PATCH 04/27] test --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 9a376166..95dc6707 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -4,7 +4,7 @@ "STAGE": "websubstack", "Lambda": { "CodeUri": "../../protocols", - "Handler": "submit_start.handler_develop", + "Handler": "submit_start.handler_multssion", "Launch": true, "LambdaConfig": { "AMI": "ami-08f59b6fdb19d0344", From 74153566babee0c21bd722f7caf2a828e16a77a8 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 5 Sep 2023 14:47:42 -0400 Subject: [PATCH 05/27] fix --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 95dc6707..85721f69 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -4,7 +4,7 @@ "STAGE": "websubstack", "Lambda": { "CodeUri": "../../protocols", - "Handler": "submit_start.handler_multssion", + "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { "AMI": "ami-08f59b6fdb19d0344", From f185ba719d2dcf815ca2e129acd7efd5346712b9 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 3 Oct 2023 16:52:49 -0400 Subject: [PATCH 06/27] automatic commit to document pipeline stack_config_template.json before update at 2023-10-03 16:52:48.997520 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 85721f69..b224058a 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -13,7 +13,7 @@ "IAM_ROLE": "SSMRole", "KEY_NAME": "testkeystack-custom-dev-key-pair", "WORKING_DIRECTORY": "~/bin", - "COMMAND": "cd /home/ubuntu; sudo -u ubuntu neurocaas_contrib/run_main_cli.sh \"{}\" \"{}\" \"{}\" \"{}\" \"lfads-torch/run_main.sh\"; . neurocaas_contrib/ncap_utils/workflow.sh;", + "COMMAND": "cd /home/ubuntu; sudo -u ubuntu neurocaas_contrib/run_main_cli.sh \"{}\" \"{}\" \"{}\" \"{}\" \"lfads-torch/run_main.py\"; . neurocaas_contrib/ncap_utils/workflow.sh;", "EXECUTION_TIMEOUT": 900, "SSM_TIMEOUT": 172000 } From 0cb782eac8b87affb43bf668f27786a6591b55e5 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 3 Oct 2023 16:52:49 -0400 Subject: [PATCH 07/27] automatic commit to document pipeline stack_config_template.json after update at 2023-10-03 16:52:49.268505. Purpose: test. AMI: ami-05ddab33dd696e7d0 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index b224058a..b4f66ef5 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-08f59b6fdb19d0344", + "AMI": "ami-05ddab33dd696e7d0", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 4ea3decc80db91376b6eb824cf3306ead7e0990a Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Wed, 4 Oct 2023 11:00:56 -0400 Subject: [PATCH 08/27] automatic commit to document pipeline stack_config_template.json after update at 2023-10-04 11:00:56.540733. Purpose: setup before first single run. AMI: ami-076b9ecc29502b344 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index b4f66ef5..a27da1a1 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-05ddab33dd696e7d0", + "AMI": "ami-076b9ecc29502b344", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 7700632f298aaae1299e01d812fa964fbbf109ec Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Mon, 9 Oct 2023 17:07:12 -0400 Subject: [PATCH 09/27] automatic commit to document pipeline stack_config_template.json after update at 2023-10-09 17:07:12.925453. Purpose: upgraded CUDA. AMI: ami-0295578a40774d483 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index a27da1a1..c01b0144 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-076b9ecc29502b344", + "AMI": "ami-0295578a40774d483", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 6f3c55dc4db11f366724e0de0c43e71b99f07115 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Mon, 9 Oct 2023 17:40:31 -0400 Subject: [PATCH 10/27] automatic commit to document pipeline stack_config_template.json after update at 2023-10-09 17:40:31.179587. Purpose: updated cuda and got sklearn. AMI: ami-0163b17cdfa51a9f5 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index c01b0144..0e859da9 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0295578a40774d483", + "AMI": "ami-0163b17cdfa51a9f5", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 33edce2c5e4d2c9ec411f9f53f0f7700bec3c77d Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 10 Oct 2023 17:08:18 -0400 Subject: [PATCH 11/27] automatic commit to document pipeline stack_config_template.json after update at 2023-10-10 17:08:18.822096. Purpose: final test on local single and multi. AMI: ami-0ccfff108ae8de464 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 0e859da9..964ea13e 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0163b17cdfa51a9f5", + "AMI": "ami-0ccfff108ae8de464", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From b031c66c84d724f67ae3363922bf639c6b9673a9 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 31 Oct 2023 11:11:13 -0400 Subject: [PATCH 12/27] no multisession field in config defaults to false --- ncap_iac/protocols/submit_start.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index e74a8947..f3ec22a0 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -1529,7 +1529,7 @@ def handler_multisession(event,context): except Exception: raise Exception("Config must be a valid YAML file.") try: - if configfile["multisession"] == "True": + if "multisession" in configfile and configfile["multisession"] == "True": print("Creating a single machine image for multisession modeling.") exitcode = process_upload_multisession(bucket_name, key, time) print("process returned exit code {}".format(exitcode)) From 025c8f8150f1aadc91e06cbe6c0f25a80f732b11 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 31 Oct 2023 14:18:09 -0400 Subject: [PATCH 13/27] automatic commit to document pipeline stack_config_template.json after update at 2023-10-31 14:18:09.494446. Purpose: multisession entry no longer needed in config. AMI: ami-0699e307bc81482db --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 964ea13e..35026e12 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0ccfff108ae8de464", + "AMI": "ami-0699e307bc81482db", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 39badb96ef1bdb350f7bb7a408f8d6742260719d Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 10 Nov 2023 15:49:37 -0500 Subject: [PATCH 14/27] automatic commit to document pipeline stack_config_template.json after update at 2023-11-10 15:49:37.826420. Purpose: fixed lfads-torch import. AMI: ami-0893ac69ba200a546 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 35026e12..952d959f 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0699e307bc81482db", + "AMI": "ami-0893ac69ba200a546", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 6400428f8c1567a16c341ad942472a12aa1b00f4 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Thu, 16 Nov 2023 13:55:30 -0500 Subject: [PATCH 15/27] automatic commit to document pipeline stack_config_template.json after update at 2023-11-16 13:55:30.184299. Purpose: fixed issues with access for root/SSM user. AMI: ami-017465330c3757649 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 952d959f..48ac7734 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0893ac69ba200a546", + "AMI": "ami-017465330c3757649", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 1540f23bf09233061dbd3547e2f9f543d3f80c78 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Thu, 16 Nov 2023 14:25:10 -0500 Subject: [PATCH 16/27] automatic commit to document pipeline stack_config_template.json after update at 2023-11-16 14:25:10.865461. Purpose: root path fix fix?. AMI: ami-0754772739da3a57d --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 48ac7734..4f8151d0 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-017465330c3757649", + "AMI": "ami-0754772739da3a57d", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 3207d974fa926b391aea876634792ed291606981 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 28 Nov 2023 15:22:51 -0500 Subject: [PATCH 17/27] drive run_main.py with run_main.sh --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 4f8151d0..87d63c79 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -13,7 +13,7 @@ "IAM_ROLE": "SSMRole", "KEY_NAME": "testkeystack-custom-dev-key-pair", "WORKING_DIRECTORY": "~/bin", - "COMMAND": "cd /home/ubuntu; sudo -u ubuntu neurocaas_contrib/run_main_cli.sh \"{}\" \"{}\" \"{}\" \"{}\" \"lfads-torch/run_main.py\"; . neurocaas_contrib/ncap_utils/workflow.sh;", + "COMMAND": "cd /home/ubuntu; sudo -u ubuntu neurocaas_contrib/run_main_cli.sh \"{}\" \"{}\" \"{}\" \"{}\" \"lfads-torch/run_main.sh\"; . neurocaas_contrib/ncap_utils/workflow.sh;", "EXECUTION_TIMEOUT": 900, "SSM_TIMEOUT": 172000 } From 51303b641855801508ceffa4b95a987b20285415 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 28 Nov 2023 17:12:13 -0500 Subject: [PATCH 18/27] automatic commit to document pipeline stack_config_template.json after update at 2023-11-28 17:12:13.330582. Purpose: fixed single dataset run; command broken for multisession. AMI: ami-024a73c9849ee99e4 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 87d63c79..84da9e8e 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0754772739da3a57d", + "AMI": "ami-024a73c9849ee99e4", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From a02e41dc7ca8056535356a8467c2fc7c42ef11e9 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 1 Dec 2023 21:09:51 -0500 Subject: [PATCH 19/27] automatic commit to document pipeline stack_config_template.json after update at 2023-12-01 21:09:51.895815. Purpose: new multisession post-tutorial. AMI: ami-0825772e0ac2e67c8 --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 84da9e8e..5b81f1b9 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-024a73c9849ee99e4", + "AMI": "ami-0825772e0ac2e67c8", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 1b2d5338ce2b98e55dbd0dc552142cac3d4f92d0 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 5 Dec 2023 22:16:10 -0500 Subject: [PATCH 20/27] automatic commit to document pipeline stack_config_template.json after update at 2023-12-05 22:16:10.678782. Purpose: successful ssm test on multisession via nc_contrib hotfix 51. AMI: ami-0cebcfea203997fcf --- .../ncap_blueprints/autolfads-torch/stack_config_template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json index 5b81f1b9..c4286fe0 100644 --- a/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json +++ b/ncap_iac/ncap_blueprints/autolfads-torch/stack_config_template.json @@ -7,7 +7,7 @@ "Handler": "submit_start.handler_multisession", "Launch": true, "LambdaConfig": { - "AMI": "ami-0825772e0ac2e67c8", + "AMI": "ami-0cebcfea203997fcf", "INSTANCE_TYPE": "p2.8xlarge", "REGION": "us-east-1", "IAM_ROLE": "SSMRole", From 66762a60a66648b23b944d1a501a9b2e7e0d4216 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Thu, 7 Dec 2023 16:05:36 -0500 Subject: [PATCH 21/27] fix self.data_name_list in submission object for multisession submitted on web --- ncap_iac/protocols/submit_start.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index f3ec22a0..ec308dfa 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -168,6 +168,18 @@ def __init__(self,bucket_name,key,time): raise ValueError("[JOB TERMINATE REASON] 'configname' field not given in submit.json file") msg = " [Internal (init)] Analysis request with dataset(s): {}, config file {}".format(self.data_name,self.config_name) + + # Edit self.data_name_list to directory name in case of multisession run via website + configpath = submit_file["configname"] + try: + configfile = utilsparams3.load_yaml(bucket_name, configpath) + except Exception: + raise Exception("Config must be a valid YAML file.") + if "multisession" in configfile and configfile["multisession"] == "True": + # Assumes upload from website => list of data paths. Result is [path/to/dataDirPrefix] + self.data_name_list = ["/".join(self.data_name_list[0].split("/")[:-1])] + + self.logger.append(msg) self.logger.printlatest() self.logger.write() @@ -1530,7 +1542,7 @@ def handler_multisession(event,context): raise Exception("Config must be a valid YAML file.") try: if "multisession" in configfile and configfile["multisession"] == "True": - print("Creating a single machine image for multisession modeling.") + print("Creating a single instance for multisession modeling.") exitcode = process_upload_multisession(bucket_name, key, time) print("process returned exit code {}".format(exitcode)) else: From 4d3fb928ab4f95d88e6663ed46a2c277d49bd30e Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Tue, 12 Dec 2023 16:10:24 -0500 Subject: [PATCH 22/27] incorporated Taiga's suggestions to code enabling multisession via web interface --- ncap_iac/protocols/submit_start.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index ec308dfa..c335b8d9 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -169,17 +169,6 @@ def __init__(self,bucket_name,key,time): msg = " [Internal (init)] Analysis request with dataset(s): {}, config file {}".format(self.data_name,self.config_name) - # Edit self.data_name_list to directory name in case of multisession run via website - configpath = submit_file["configname"] - try: - configfile = utilsparams3.load_yaml(bucket_name, configpath) - except Exception: - raise Exception("Config must be a valid YAML file.") - if "multisession" in configfile and configfile["multisession"] == "True": - # Assumes upload from website => list of data paths. Result is [path/to/dataDirPrefix] - self.data_name_list = ["/".join(self.data_name_list[0].split("/")[:-1])] - - self.logger.append(msg) self.logger.printlatest() self.logger.write() @@ -646,6 +635,21 @@ class Submission_multisession(Submission_dev): def __init__(self,bucket_name,key,time): super().__init__(bucket_name,key,time) + # Edit self.data_name_list to directory name in case of multisession run via website + try: + configfile = utilsparams3.load_yaml(bucket_name, self.config_name) + except Exception: + raise Exception("Config must be a valid YAML file.") + if "multisession" in configfile and configfile["multisession"] == "True" and self.bucket_name == "autolfads-torch": + # Assumes upload from website => list of data paths. Result is [path/to/dataDirPrefix] + self.data_name_list = ["/".join(self.data_name_list[0].split("/")[:-1])] + self.data_name = self.data_name_list[0] + + msg = " [Internal (init)] UPDATED: Multisession mode. Analysis request with dataset(s): {}, config file {}".format(self.data_name,self.config_name) + self.logger.append(msg) + self.logger.printlatest() + self.logger.write() + def get_costmonitoring(self): """ Gets the cost incurred by a given group so far by looking at the logs bucket of the appropriate s3 folder. From e40d9fbd813364523e9f28b92fbc533b503b77a3 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 15 Dec 2023 14:56:23 -0500 Subject: [PATCH 23/27] debug logs for multisession logic --- ncap_iac/protocols/submit_start.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index c335b8d9..47b7579b 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -640,6 +640,13 @@ def __init__(self,bucket_name,key,time): configfile = utilsparams3.load_yaml(bucket_name, self.config_name) except Exception: raise Exception("Config must be a valid YAML file.") + + + msg = f" [Internal (init)] Multisession in config file: {str('multisession' in configfile)}. Configfile \"multisession\" value: {str(configfile['multisession'])}. Bucket name: {str(self.bucket_name)}." + self.logger.append(msg) + self.logger.printlatest() + self.logger.write() + if "multisession" in configfile and configfile["multisession"] == "True" and self.bucket_name == "autolfads-torch": # Assumes upload from website => list of data paths. Result is [path/to/dataDirPrefix] self.data_name_list = ["/".join(self.data_name_list[0].split("/")[:-1])] From dd0885d43984eee5782809dadb82c4fed62c1531 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 15 Dec 2023 15:23:49 -0500 Subject: [PATCH 24/27] debug messages in handler --- ncap_iac/protocols/submit_start.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index 47b7579b..f5fcb540 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -1547,6 +1547,7 @@ def handler_multisession(event,context): key = record['s3']['object']['key'] submit_file = utilsparams3.load_json(bucket_name, key) configpath = submit_file["configname"] + print(f"#########\nDEBUGGING MULTISESSION:\nmultisession in config file: {'multisession' in configfile}\nconfig[\"multisession\"]: {configfile['multisession']}") try: configfile = utilsparams3.load_yaml(bucket_name, configpath) except Exception: @@ -1557,6 +1558,7 @@ def handler_multisession(event,context): exitcode = process_upload_multisession(bucket_name, key, time) print("process returned exit code {}".format(exitcode)) else: + print("DEBUG: REACHED DEV PATH") exitcode = process_upload_dev(bucket_name, key, time) print("process returned with exit code {}".format(exitcode)) except KeyError: From beac528ddbdbb28da5b0623d5597e56912999105 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 15 Dec 2023 15:40:37 -0500 Subject: [PATCH 25/27] moved debug print statement in multi handler --- ncap_iac/protocols/submit_start.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index f5fcb540..556dbcf5 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -1547,11 +1547,11 @@ def handler_multisession(event,context): key = record['s3']['object']['key'] submit_file = utilsparams3.load_json(bucket_name, key) configpath = submit_file["configname"] - print(f"#########\nDEBUGGING MULTISESSION:\nmultisession in config file: {'multisession' in configfile}\nconfig[\"multisession\"]: {configfile['multisession']}") try: configfile = utilsparams3.load_yaml(bucket_name, configpath) except Exception: raise Exception("Config must be a valid YAML file.") + print(f"#########\nDEBUGGING MULTISESSION:\nmultisession in config file: {'multisession' in configfile}\nconfig[\"multisession\"]: {configfile['multisession']}") try: if "multisession" in configfile and configfile["multisession"] == "True": print("Creating a single instance for multisession modeling.") From 88080031d2bb51846c36146e2ac581c4afdbdfd9 Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 15 Dec 2023 15:57:24 -0500 Subject: [PATCH 26/27] changed True to boolean --- ncap_iac/protocols/submit_start.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index 556dbcf5..d480ccee 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -1553,7 +1553,7 @@ def handler_multisession(event,context): raise Exception("Config must be a valid YAML file.") print(f"#########\nDEBUGGING MULTISESSION:\nmultisession in config file: {'multisession' in configfile}\nconfig[\"multisession\"]: {configfile['multisession']}") try: - if "multisession" in configfile and configfile["multisession"] == "True": + if "multisession" in configfile and configfile["multisession"] == True: print("Creating a single instance for multisession modeling.") exitcode = process_upload_multisession(bucket_name, key, time) print("process returned exit code {}".format(exitcode)) From f6842d8a5904b44e2bce22235d1b220e54ed420d Mon Sep 17 00:00:00 2001 From: claytonwashington Date: Fri, 15 Dec 2023 16:02:34 -0500 Subject: [PATCH 27/27] changed True to boolean again --- ncap_iac/protocols/submit_start.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ncap_iac/protocols/submit_start.py b/ncap_iac/protocols/submit_start.py index d480ccee..666542ba 100644 --- a/ncap_iac/protocols/submit_start.py +++ b/ncap_iac/protocols/submit_start.py @@ -647,7 +647,7 @@ def __init__(self,bucket_name,key,time): self.logger.printlatest() self.logger.write() - if "multisession" in configfile and configfile["multisession"] == "True" and self.bucket_name == "autolfads-torch": + if "multisession" in configfile and configfile["multisession"] == True and self.bucket_name == "autolfads-torch": # Assumes upload from website => list of data paths. Result is [path/to/dataDirPrefix] self.data_name_list = ["/".join(self.data_name_list[0].split("/")[:-1])] self.data_name = self.data_name_list[0]